第一章:Jenkins 简介与核心概念
1.1 什么是 Jenkins
| 概念名称 | 说明 | 注意事项 |
|---|
| Jenkins | 开源的自动化服务器,用于支持软件项目的持续集成和持续交付(CI/CD)。它通过插件架构提供高度可扩展性,能够自动化构建、测试、部署等任务。 | Jenkins 使用 Java 编写,需运行在 Java 环境(JRE/JDK)之上;适用于各种平台和开发语言。 |
| 自动化服务器 | 一种能够在代码变更后自动执行预定义任务(如编译、测试、部署)的服务程序。 | 不同于普通脚本调度工具,Jenkins 提供 Web 界面、任务依赖管理、日志追踪和丰富的插件生态。 |
| CI/CD 支持 | Jenkins 的核心用途是实现持续集成与持续交付流程的自动化。 | 它本身不强制使用特定流程模型,用户可根据项目需求自定义流水线逻辑。 |
| 插件架构 | Jenkins 功能主要通过插件扩展,拥有超过 1800 个官方插件。 | 插件质量参差不齐,部分插件可能不再维护,安装前应检查兼容性和更新记录。 |
1.2 持续集成(CI)与持续交付(CD)概述
| 概念名称 | 说明 | 注意事项 |
|---|
| 持续集成(Continuous Integration, CI) | 开发人员频繁地(通常每天多次)将代码集成到共享主干(mainline),每次集成都通过自动化构建(包括编译、测试)来验证,以便尽早发现集成错误。 | 必须配合版本控制系统(如 Git)使用;建议每次提交都触发一次构建。 |
| 持续交付(Continuous Delivery, CD) | 在持续集成的基础上,确保软件可以随时以安全、可靠的方式发布到生产环境。通常包括自动化测试、预发布环境部署、人工审批等环节。 | 强调”可发布”状态,但不一定自动发布;发布决策可由团队控制。 |
| 持续部署(Continuous Deployment) | 是持续交付的延伸,指每一次通过自动化测试的代码变更都会自动部署到生产环境,无需人工干预。 | 对测试覆盖率和自动化程度要求极高;适用于高成熟度团队。 |
| 构建(Build) | 将源代码转换为可执行程序或部署包的过程,例如 Java 项目中的编译、打包(jar/war)。 | “构建”在 Jenkins 中泛指一次任务执行,不仅限于编译。 |
| 测试自动化 | 在 CI 阶段自动运行单元测试、集成测试等,确保新代码不会破坏现有功能。 | 建议结合代码覆盖率工具(如 JaCoCo)监控测试质量。 |
| 反馈快速化 | CI/CD 的目标之一是让开发人员尽快获得构建和测试结果反馈,通常在几分钟内完成。 | 构建时间过长会影响开发效率,应优化构建流程。 |
1.3 Jenkins 架构与核心组件
| 组件名称 | 说明 | 注意事项 |
|---|
| 主节点(Master Node) | Jenkins 的核心控制节点,负责管理任务调度、用户界面展示、插件加载、代理节点协调等工作。 | 主节点不应直接执行构建任务,以免资源争用影响系统稳定性。 |
| Web UI(Web 用户界面) | 基于 Web 的图形化操作界面,用于配置任务、查看构建历史、管理插件和用户权限。 | 默认监听 8080 端口;可通过反向代理增强安全性。 |
| Job/Task(任务) | Jenkins 中的基本执行单元,代表一个自动化流程,如构建、测试或部署。 | 支持多种类型:自由风格项目、Pipeline、多分支 Pipeline 等。 |
| Plugin System(插件系统) | Jenkins 功能扩展机制,几乎所有外部集成(Git、Docker、Kubernetes)都通过插件实现。 | 插件之间可能存在依赖关系,升级时需注意兼容性。 |
| Build Queue(构建队列) | 当没有可用代理节点或资源不足时,任务会进入等待队列,按优先级排队执行。 | 可通过标签(Label)和节点分配策略优化调度效率。 |
| Configuration as Code | Jenkins 支持将配置保存为 XML 文件或 Jenkinsfile,便于版本化管理和迁移。 | 推荐使用”Job DSL”或”Configuration as Code (CasC)“插件实现完全代码化配置。 |
1.4 Jenkins 主节点与代理节点(Master-Agent)模型
| 概念名称 | 说明 | 注意事项 |
|---|
| 代理节点(Agent Node) | 又称”从节点”或”执行节点”,是实际执行构建任务的工作机器,可以是物理机、虚拟机或容器。 | 代理节点必须能与主节点网络互通,并安装 Java 运行环境。 |
| 分布式构建 | 利用多个代理节点并行执行不同任务,提升整体构建效率和资源利用率。 | 适合大型团队或高并发构建场景。 |
| 节点通信方式 | 主节点与代理节点之间通过 JNLP(Java Network Launch Protocol)或 SSH 协议建立连接。 | JNLP 需要开放特定端口;SSH 方式更常见于 Linux 环境。 |
| 标签(Label) | 为代理节点打上标签(如 linux、docker、high-mem),任务可指定在具有特定标签的节点上运行。 | 合理使用标签可实现精细化资源调度,例如前端项目指定 nodejs 标签节点。 |
| 临时代理(Ephemeral Agent) | 动态创建的代理节点,常用于 Kubernetes 或云环境,任务结束后自动销毁。 | 节省资源,适合短时高负载场景。 |
| 工作目录(Workspace) | 每个任务在代理节点上拥有独立的工作空间,用于存放源码副本和构建产物。 | 多次构建间可选择是否保留工作区以提高效率(如依赖缓存)。 |
| 资源隔离 | 不同代理节点可运行不同操作系统或环境,实现跨平台构建测试。 | 例如:Windows 节点用于 .NET 构建,Linux 节点用于 Java 构建。 |
第二章:Jenkins 安装与环境搭建
2.1 在 Windows 上安装 Jenkins
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 下载 Jenkins WAR 包 | 访问 https://www.jenkins.io/download/,选择 Generic Java package (.war) | 获取 Jenkins 核心程序文件 | 无(手动下载) | 确保从官方站点下载,避免第三方修改版本。 |
| 安装 Java 环境 | 安装 JDK 8 或更高版本,并配置 JAVA_HOME 环境变量 | 提供 Jenkins 运行所需的 Java 支持 | set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_301 set PATH=%JAVA_HOME%\bin;%PATH% | 必须使用支持的 Java 版本;建议使用 LTS 版本。 |
| 启动 Jenkins(命令行) | java -jar jenkins.war --httpPort=8080 | 以独立进程方式启动 Jenkins 服务 | java -jar jenkins.war --httpPort=8080 | 首次运行会生成管理员密码文件,路径在控制台输出中提示。 |
| 安装为 Windows 服务 | 使用 NSSM (Non-Sucking Service Manager) 或 Jenkins 自带工具安装为系统服务 | 实现 Jenkins 开机自启和后台运行 | nssm install Jenkins "C:\Program Files\Java\jdk1.8.0_301\bin\java.exe" -jar "C:\jenkins\jenkins.war" | 推荐生产环境使用服务方式运行,避免关闭终端后服务中断。 |
| 指定自定义工作目录 | 设置 JENKINS_HOME 环境变量 | 将 Jenkins 数据存储位置从默认用户目录迁移至指定路径 | set JENKINS_HOME=D:\jenkins_home | 建议提前设置,便于备份与迁移;需确保目录有读写权限。 |
2.2 在 Linux 上安装 Jenkins(Ubuntu/CentOS)
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 添加 Jenkins 仓库密钥(Ubuntu) | wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - | 验证 Jenkins 软件包来源合法性 | wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - | 若 apt-key 已弃用,可改用 gpg 并放入 /etc/apt/trusted.gpg.d/ |
| 添加 Jenkins 仓库(Ubuntu) | echo deb https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list | 添加 Jenkins 官方 APT 源 | echo deb https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list | 使用 stable 分支确保版本稳定性。 |
| 更新软件包索引(Ubuntu) | sudo apt update | 同步最新软件包信息 | sudo apt update | 必须在添加源后执行。 |
| 安装 Jenkins(Ubuntu) | sudo apt install jenkins | 安装 Jenkins 及其依赖 | sudo apt install jenkins | 默认安装 OpenJDK 若未预装 Java。 |
| 启动 Jenkins 服务(Systemd) | sudo systemctl start jenkins sudo systemctl enable jenkins | 启动并设置开机自启 | sudo systemctl status jenkins | 检查状态确认是否正常运行。 |
| 安装 Java(CentOS) | sudo yum install java-17-openjdk-devel | 安装 Jenkins 所需的 Java 环境 | sudo yum install java-17-openjdk-devel | Jenkins 推荐使用 Java 17+(Jenkins 2.356+)。 |
| 添加 Jenkins 仓库(CentOS) | sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key | 添加 YUM 源 | sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key | 注意区分 stable 和 latest 版本源。 |
| 安装 Jenkins(CentOS) | sudo yum install jenkins | 安装 Jenkins RPM 包 | sudo yum install jenkins | 安装路径通常为 /usr/lib/jenkins。 |
| 防火墙开放端口 | sudo ufw allow 8080(Ubuntu) sudo firewall-cmd --permanent --add-port=8080/tcp(CentOS) | 允许外部访问 Jenkins Web 界面 | sudo firewall-cmd --reload | 若启用防火墙,必须放行 8080 端口。 |
2.3 使用 Docker 安装 Jenkins
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 拉取 Jenkins 官方镜像 | docker pull jenkins/jenkins:lts | 获取稳定版 Jenkins 镜像 | docker pull jenkins/jenkins:lts | 推荐使用 lts 标签以获得长期支持版本。 |
| 创建持久化数据卷 | docker volume create jenkins-data | 持久化 Jenkins 配置与插件数据 | docker volume create jenkins-data | 避免容器重启后数据丢失。 |
| 启动 Jenkins 容器 | docker run -d -p 8080:8080 -p 50000:50000 -v jenkins-data:/var/jenkins_home --name jenkins jenkins/jenkins:lts | 运行 Jenkins 容器并映射端口和数据卷 | docker run -d -p 8080:8080 -p 50000:50000 -v jenkins-data:/var/jenkins_home --name jenkins jenkins/jenkins:lts | -p 50000 用于代理节点通信;-v 实现数据持久化。 |
| 使用本地目录挂载 | docker run -d -v /path/to/jenkins/home:/var/jenkins_home ... | 将宿主机目录作为 Jenkins 工作目录 | docker run -d -v /data/jenkins:/var/jenkins_home -p 8080:8080 --name jenkins jenkins/jenkins:lts | 确保宿主机目录存在且有读写权限(chown -R 1000:1000 /data/jenkins)。 |
| 查看初始管理员密码 | docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword | 获取首次登录密码 | docker logs jenkins | grep password | 密码仅首次生成一次,务必记录。 |
| 进入容器终端 | docker exec -it jenkins bash | 调试或手动安装插件/工具 | docker exec -it jenkins bash | 容器内用户为 jenkins(UID 1000),部分操作需 sudo 权限模拟。 |
2.4 初始配置与插件推荐安装
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 安装向导(Setup Wizard) | 首次启动后访问 http://:8080 进入图形化配置流程 | 引导完成基本安全与插件设置 | 无(Web 界面操作) | 必须完成此步骤才能使用 Jenkins。 |
| 输入管理员密码 | 从 /var/jenkins_home/secrets/initialAdminPassword 文件获取 | 解锁初始设置界面 | sudo cat /var/jenkins_home/secrets/initialAdminPassword | 若使用 Docker,需进入容器或挂载目录查看。 |
| 安装推荐插件 | 在”Customize Jenkins”页面选择”Install suggested plugins” | 快速安装常用核心插件集 | 无(勾选选项) | 包含 Git、SSH、Pipeline、Matrix Authorization 等基础功能。 |
| 选择插件安装方式 | Install suggested plugins 或 Select plugins to install | 自定义插件集合 | 无 | 新手建议选择推荐插件。 |
| 创建首个管理员用户 | 填写用户名、密码、邮箱等信息 | 避免使用默认 admin 账户,提升安全性 | 无(表单输入) | 记住凭据,后续登录使用此账户。 |
| 配置 Jenkins URL | 设置 Jenkins 实例的公共访问地址 | 用于邮件通知、Webhook 回调等场景 | http://your-domain.com:8080 | 若后期更改需在”系统管理 > 系统配置”中更新。 |
| 推荐插件列表 | Git Plugin, GitHub Plugin, Pipeline, Credentials Binding, Docker Pipeline, Email Extension, Workspace Cleanup, Blue Ocean | 增强版本控制、流水线、安全、通知等功能 | 无 | 可在”系统管理 > 插件管理”中单独安装。 |
2.5 访问 Jenkins Web 界面与首次登录设置
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 访问 Jenkins 地址 | 浏览器打开 http://<服务器IP或域名>:8080 | 进入 Jenkins 登录首页 | http://192.168.1.100:8080 | 确保网络可达且防火墙已放行端口。 |
| 查看初始密码 | 查看日志或 secrets 文件输出 | 获取解锁 Jenkins 所需的一次性密码 | docker logs jenkins | grep password cat $JENKINS_HOME/secrets/initialAdminPassword | 若复制粘贴失败,尝试手动输入。 |
| 解锁 Jenkins | 在登录页输入初始管理员密码 | 进入插件安装阶段 | 无(输入密码) | 密码输入错误多次可能导致锁定。 |
| 跳过插件安装(高级) | 点击”Continue as admin”或”Skip plugin installation” | 手动控制插件安装过程 | 无 | 不推荐生产环境跳过,可能导致功能缺失。 |
| 修改系统配置(首次) | 登录后进入”Manage Jenkins > Configure System” | 设置邮件服务器、全局变量、构建工具路径等 | 无(Web 表单) | 建议尽早配置邮件通知和 JDK/Maven 路径。 |
| 更改监听端口(可选) | 启动时指定 —httpPort 参数或修改 systemd 配置 | 避免端口冲突或符合安全策略 | java -jar jenkins.war --httpPort=9090 | 若使用反向代理(如 Nginx),可改为内网端口。 |
| 启用 CSRF 保护 | 在”Configure Global Security”中启用”Prevent Cross Site Request Forgery exploits” | 防止跨站请求伪造攻击 | 默认启用 | 生产环境必须开启。 |
| 备份 JENKINS_HOME | 定期复制整个 JENKINS_HOME 目录 | 实现 Jenkins 配置与数据的完整备份 | cp -r /var/jenkins_home /backup/jenkins_home_$(date +%F) | 最简单的备份方式,恢复时直接替换目录即可。 |
第三章:Jenkins 用户管理与权限控制
3.1 用户创建与管理
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 创建本地用户(Web 界面) | “Manage Jenkins” > “Manage Users” > “Create User” | 在 Jenkins 内部用户数据库中添加新用户 | 无(填写用户名、密码、全名、邮箱等表单) | 适用于未集成外部认证系统的小型团队。 |
| 删除用户 | 在”Manage Users”列表中点击用户后选择”Delete” | 移除不再需要的用户账户 | 无 | 删除用户不会自动清除其构建历史记录。 |
| 查看用户详情 | 点击用户进入其详情页面 | 查看用户的构建活动、权限分配等信息 | 无 | 可用于审计和权限排查。 |
| 修改用户信息 | 在用户详情页点击”Configure” | 更新用户密码、邮箱或全名 | 无 | 普通用户只能修改自身信息;管理员可修改所有用户。 |
| 启用/禁用用户 | 通过插件如 “Matrix Authorization Strategy” 或脚本控制 | 临时禁止某用户登录或执行操作 | 无(需结合安全域配置) | 更安全的做法是移除权限而非删除用户。 |
| 使用 CLI 创建用户 | java -jar jenkins-cli.jar -s http://localhost:8080/ create-user username password fullname email | 通过命令行批量创建用户 | java -jar jenkins-cli.jar -s http://localhost:8080/ create-user dev1 pass123 "Developer One" dev1@company.com | 需提前配置好 CLI 访问权限,适合自动化场景。 |
3.2 角色-Based 访问控制(Role-Based Strategy)配置
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 安装 Role-Based Strategy 插件 | ”Manage Jenkins” > “Manage Plugins” > 搜索并安装 “Role-based Authorization Strategy” | 实现基于角色的细粒度权限管理 | 无 | 必须先安装插件才能启用该策略。 |
| 启用 Role-Based 策略 | ”Manage Jenkins” > “Configure Global Security” > “Authorization” > 选择 “Role-Based Strategy” | 开启角色权限模型 | 无 | 切换后原有矩阵权限将失效。 |
| 创建全局角色(Global Roles) | “Manage Jenkins” > “Manage and Assign Roles” > “Manage Roles” > “Global roles” > Add | 定义适用于整个 Jenkins 实例的角色 | 名称:Admin,权限:Overall/Administer, Job/Read 等 | Admin 角色应仅分配给少数管理员。 |
| 创建项目角色(Project Roles) | 在 “Project roles” 中添加角色并设置模式匹配规则 | 定义针对特定任务的访问权限 | 名称:dev-team-a,Pattern: ^team-a-.*,权限:Job/Build, Job/Read | 支持正则表达式匹配任务名称。 |
| 创建代理角色(Agent Roles) | 在 “Agent roles” 中定义节点相关权限角色 | 控制对代理节点的访问和操作权限 | 名称:node-admin,权限:Agent/Connect, Agent/Configure | 通常用于运维人员管理节点。 |
| 分配角色给用户 | ”Manage and Assign Roles” > “Assign Roles” > 选择用户并勾选对应角色 | 将已定义的角色关联到具体用户或用户组 | 用户 dev1 → 全局角色 Developer + 项目角色 dev-team-a | 一个用户可拥有多个角色。 |
| 使用正则表达式匹配任务 | 在 Project Roles 的 Pattern 字段输入正则表达式 | 实现动态任务权限分配 | ^frontend-.* 匹配所有以前端开头的任务 | 正则语法错误会导致权限不生效。 |
3.3 项目级权限管理
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 启用项目级权限 | 确保已使用 “Role-Based Strategy” 或 “Project-based Matrix Authorization Strategy” | 对单个任务设置独立访问控制 | 无 | 必须在全局安全设置中启用支持项目级权限的策略。 |
| 配置单个任务的权限 | 进入任务配置页 > 勾选 “This project is pre-operated” > “Restrict where this project can be run” 和 “Security” 部分 | 限制谁可以查看、构建或配置该任务 | 无(Web 表单) | 权限继承自全局设置,除非显式覆盖。 |
| 添加项目级用户/角色 | 在任务配置的安全区域添加特定用户或角色 | 给特定任务赋予额外访问权限 | 用户 qa-team → 权限:Job/Build, Job/Read | 适用于跨团队协作项目。 |
| 使用 “Project-based Matrix Authorization Strategy” 插件 | 安装插件并在任务配置中启用矩阵权限 | 在每个任务中直接定义权限矩阵 | 无 | 提供比全局策略更灵活的控制能力。 |
| 限制构建触发权限 | 在任务配置中取消非相关人员的 “Build” 权限 | 防止未经授权的构建执行 | 仅允许 dev-leads 用户拥有 Job/Build 权限 | 结合参数化构建和审批流程更佳。 |
| 隐藏敏感任务 | 不授予普通用户 Job/Read 权限 | 使任务在任务列表中不可见 | 无 | 是实现权限隔离的有效手段。 |
| 继承与覆盖机制 | 默认继承全局权限,可通过项目设置覆盖 | 平衡统一管理和个性化需求 | 无 | 建议保持一致性,避免过度定制增加维护成本。 |
3.4 安全设置与最佳实践
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 启用安全域(Security Realm) | “Configure Global Security” > “Security Realm” > 选择 “Jenkins’ own user database” 或 “LDAP” | 定义用户认证来源 | 选择 LDAP 可集成企业 AD | 生产环境推荐使用 LDAP/OAuth2 统一认证。 |
| 强制使用 HTTPS | 配置反向代理(Nginx/Apache)启用 SSL/TLS | 加密 Web 流量防止凭证泄露 | 参见下方代码示例 | 自签证书需在客户端信任,否则浏览器报错。 |
| 设置会话超时时间 | 在 “Configure Global Security” 中设置 “Session timeout” | 减少未授权访问风险 | 输入分钟数(如 30) | 过短影响用户体验,过长增加安全风险。 |
| 禁用脚本控制台(Script Console) | 移除非管理员用户的 “Script/Run” 权限 | 防止 Groovy 脚本执行导致 RCE | 无 | 脚本控制台功能强大但极其危险,生产环境应严格限制。 |
| 定期更新 Jenkins 与插件 | ”Manage Jenkins” > “Manage Plugins” > “Updates” > 安装更新 | 修复已知漏洞 | 建议每周检查一次更新 | 重大版本升级前应在测试环境验证兼容性。 |
| 备份 JENKINS_HOME 目录 | 定期复制 $JENKINS_HOME 到安全位置 | 实现完整配置与数据备份 | tar -czf jenkins-backup-$(date +%F).tar.gz /var/jenkins_home | 包含 jobs、users、plugins、credentials 等所有信息。 |
| 启用审计日志(Audit Logging) | 使用插件如 “Audit Trail” 记录关键操作 | 追踪用户行为,满足合规要求 | 无(插件自动记录登录、任务修改等事件) | 日志应集中存储并定期归档。 |
| 最小权限原则 | 仅授予用户完成工作所需的最低权限 | 降低误操作和恶意行为影响 | 例如:开发者只需 Job/Build 和 Job/Read | 避免随意分配 Admin 权限。 |
HTTPS 反向代理配置示例(Nginx):
server {
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:8080;
}
}
第四章:Jenkins 任务(Job)基础
4.1 创建自由风格项目(Freestyle Project)
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 新建自由风格项目 | 进入 Jenkins 主页 > 点击”新建任务” > 输入名称 > 选择”构建一个自由风格的项目” | 创建最基础的任务类型,适用于简单自动化流程 | 无(Web 界面操作) | 自由风格项目灵活性高,适合学习和轻量级任务。 |
| 配置任务描述 | 在项目主页点击”配置” > 在”描述”字段输入文本 | 为任务添加说明信息,便于团队理解用途 | 部署前端静态资源到测试环境 | 支持 HTML 标签格式化内容。 |
| 启用/禁用任务 | 在项目主页点击”启用”或”禁用” | 暂时停止任务执行而不删除 | 无 | 禁用后仍保留构建历史和配置。 |
| 复制现有任务 | ”新建任务” > 选择”复制现有项目” > 输入新名称并指定源任务 | 快速创建结构相似的任务,减少重复配置 | 源任务:build-frontend,新任务:build-backend | 修改后需检查路径、参数等是否适配。 |
| 删除任务 | 在项目主页点击”删除项目” | 彻底移除任务及其所有构建历史 | 无 | 删除操作不可逆,请谨慎执行。 |
| 设置任务图标/颜色(通过插件) | 使用 “Build Monitor View” 等插件自定义显示样式 | 在仪表盘中突出关键任务状态 | 无 | 提升可视化监控效率。 |
4.2 配置源码管理(SCM):Git 与 SVN
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 启用 Git 源码管理 | 在任务配置中 > “源码管理” > 选择”Git” | 从 Git 仓库拉取代码进行构建 | Repository URL: https://github.com/user/repo.git | 需提前安装 Git Plugin。 |
| 配置 Git 仓库地址 | 填写 Repository URL 字段 | 指定代码仓库位置 | https://github.com/jenkinsci/jenkins.git | 支持 HTTPS 和 SSH 协议。 |
| 设置 Git 凭据 | 使用”添加”按钮配置用户名/密码或 SSH 私钥 | 认证访问私有仓库 | 类型:Username with password 或 SSH Username with private key | 私钥应使用 Jenkins Credentials Store 管理。 |
| 指定分支 | 在 “Branches to build” 中填写分支名 | 控制构建特定分支代码 | */main 或 */develop | 默认为 */main。 |
| 启用 SVN 源码管理 | 在任务配置中 > “源码管理” > 选择”Subversion” | 从 SVN 仓库检出代码 | Repository URL: http://svn.company.com/svn/project/trunk | 需安装 Subversion Plugin。 |
| 配置 SVN 凭据 | 添加用户名/密码类型凭据 | 认证访问 SVN 服务器 | Domain: company.com, Username: jenkins, Password: *** | 支持 Windows 域账户。 |
| 定义本地检出目录 | 使用 “Check-out to a sub-directory” 或自定义 workspace 路径 | 将代码检出到指定子目录 | sub-project-a | 避免覆盖已有文件。 |
| 高级 Git 配置 | 点击”高级”按钮设置更多选项 | 自定义克隆行为、超时等 | Clone depth: 1, Timeout (minutes): 10 | 浅克隆可加快速度但不包含完整历史。 |
4.3 构建触发器:定时构建与远程触发
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 定时构建(Build periodically) | 在”构建触发器”中勾选 > 输入 cron 表达式 | 按固定时间间隔自动触发构建 | H 2 * * *(每天凌晨2点) | H 表示”哈希”,分散负载避免峰值。 |
| Cron 语法格式 | 分 时 日 月 周 | 定义触发时间规则 | H/15 * * * *(每15分钟一次) | 不支持秒级精度;H 可替代具体数字。 |
| GitHub Webhook 触发 | 勾选”GitHub hook trigger for GITScm polling” | 当代码推送到 GitHub 时自动触发构建 | 无(需在 GitHub 仓库设置 Webhook) | 必须配合 GitHub Integration Plugin 使用。 |
| 轮询 SCM(Poll SCM) | 勾选并输入 cron 表达式 | 定期检查代码库变更,有更新则构建 | H/5 * * * *(每5分钟检查一次) | 消耗资源较多,建议用 Webhook 替代。 |
| 远程触发构建(Trigger builds remotely) | 勾选并设置认证令牌(Token) | 允许外部系统通过 HTTP 请求触发构建 | Token: my-secret-token | URL 格式:http://jenkins/job/job-name/build?token=my-secret-token |
| 使用身份验证令牌 | 在远程触发时添加 token 参数 | 防止未授权调用 | curl -X POST http://jenkins/job/deploy-prod/build?token=abc123 | 建议使用长随机字符串作为 token。 |
| 构建另一个项目(Build after other projects are built) | 指定上游项目名称和触发条件 | 实现任务依赖链 | 项目名:build-app,条件:成功 | 支持失败、不稳定等状态判断。 |
4.4 执行 Shell/Windows 批处理命令
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 添加构建步骤:执行 Shell | 在”构建”部分点击”增加构建步骤” > “执行 Shell” | 在 Linux/Unix 环境下运行命令 | 见下方代码示例 | 默认使用 /bin/sh -xe 执行,-x 显示命令,-e 出错退出。 |
| Shell 脚本中的变量使用 | 使用 BUILD_NUMBER、JOB_NAME 等内置变量 | 动态生成文件名或路径 | echo "Building version $BUILD_NUMBER of $JOB_NAME" | 完整变量列表见 Jenkins 环境变量文档。 |
| 添加构建步骤:执行 Windows 批处理 | 在”构建”部分点击”增加构建步骤” > “执行 Windows 批处理” | 在 Windows 代理节点上运行 .bat 或 .cmd 文件 | echo Starting... call mvn clean package | 使用 cmd /c 执行,支持标准批处理语法。 |
| 设置脚本编码(Windows) | 在批处理步骤中指定”Use custom workspace”或系统区域设置 | 避免中文乱码问题 | chcp 65001 >nul(切换到 UTF-8) | 特别是在处理非英文路径时。 |
| 多行脚本支持 | 在文本框中直接输入多行命令 | 组织复杂构建逻辑 | mkdir dist cp -r src/* dist/ zip -r dist.zip dist/ | 注意缩进不影响执行,但建议保持可读性。 |
| 脚本退出码处理 | 命令返回非零退出码时构建失败 | 控制构建成功/失败状态 | exit 1(标记失败) exit 0(标记成功) | Jenkins 根据最后一条命令的退出码判断结果。 |
| 使用管道和重定向 | 结合 shell 重定向操作符 | 捕获输出、日志记录等 | npm run test > test.log 2>&1 | 可用于调试或归档中间结果。 |
Shell 构建步骤示例:
#!/bin/bash
echo "Starting build..."
npm install
npm run build
4.5 构建后操作:归档、邮件通知、清理
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 归档构建产物(Archive the artifacts) | 在”构建后操作”中添加 > 设置”文件”路径 | 保存生成的文件(如 jar、zip)供后续下载或部署 | dist/*.zip 或 target/*.jar | 支持通配符;产物保存在 Jenkins 服务器上。 |
| 设置归档文件路径 | 使用相对路径(基于 workspace) | 指定要归档的文件位置 | build/output/*.war | 路径错误将导致”没有匹配的文件”警告。 |
| 归档测试报告(Publish JUnit test result report) | 添加该操作 > 设置测试报告 XML 路径 | 展示单元测试结果和历史趋势 | **/test-reports/*.xml | 需测试框架输出兼容 JUnit 格式的报告。 |
| 发送邮件通知(E-mail Notification) | 添加该操作 > 输入收件人列表 | 构建失败或状态变更时发送邮件 | dev-team@company.com, qa-lead@company.com | 需提前在系统设置中配置 SMTP 服务器。 |
| 使用 Email Extension Plugin | 替代默认邮件功能,支持更灵活模板 | 自定义邮件主题、内容、收件人策略 | $DEFAULT_SUBJECT $DEFAULT_CONTENT | 支持 HTML、附件、条件发送等高级功能。 |
| 构建后清理工作空间(Delete workspace after build) | 添加”构建后操作” > “Delete workspace when build is done” | 释放磁盘空间,避免残留文件影响下次构建 | 无 | 建议在调试完成后启用。 |
| 条件化清理(Workspace Cleanup Plugin) | 使用高级清理策略,如保留最近 N 次构建的工作区 | 平衡磁盘使用与调试需求 | 保留策略:按数量保留,最大 3 个 | 可结合标签或路径进行精细控制。 |
| 触发下游项目 | 添加”构建其他项目”操作 | 实现构建流水线串联 | 项目名:deploy-staging, 参数:VERSION=$BUILD_NUMBER | 支持同步或异步触发。 |
第五章:Jenkins Pipeline 入门
5.1 什么是 Jenkins Pipeline
| 概念名称 | 说明 | 注意事项 |
|---|
| Jenkins Pipeline | 一套插件,支持在 Jenkins 中实现持续交付流水线即代码(Pipeline as Code)。它允许将构建、测试、部署等流程定义为可版本控制的脚本。 | Pipeline 是 Jenkins 2.0 的核心特性,取代传统自由风格项目的复杂配置。 |
| 流水线即代码(Pipeline as Code) | 使用代码(Groovy 脚本)定义 CI/CD 流程,存入源码仓库(如 Git),实现版本化、复用和审查。 | 推荐将 Jenkinsfile 提交到项目仓库,与代码一同管理。 |
| Pipeline 任务类型 | Jenkins 中的一种任务形式,用于运行基于 Groovy 的流水线脚本,支持声明式和脚本式两种语法。 | 创建任务时选择 “Pipeline” 类型。 |
| 持久化与暂停能力 | Pipeline 支持长时间运行、跨节点执行,并可在等待人工审批等操作时暂停,状态持久保存。 | 即使 Jenkins 重启,运行中的 Pipeline 也能恢复。 |
| 可视化阶段视图 | Pipeline 运行时可在 Web 界面查看各阶段(Stage)的执行状态和耗时,便于监控和调试。 | 需在脚本中合理划分 stages 以获得清晰视图。 |
| 支持复杂流程控制 | 包括条件判断、循环、并行执行、错误处理(try/catch)、超时控制等高级逻辑。 | 相比自由风格项目,具备更强的表达能力。 |
5.2 声明式 Pipeline 与脚本式 Pipeline 对比
| 对比项 | 声明式 Pipeline(Declarative Pipeline) | 脚本式 Pipeline(Scripted Pipeline) | 注意事项 |
|---|
| 语法类型 | 基于预定义结构的声明式语法,更像配置文件 | 基于 Groovy DSL 的编程式语法,更像脚本 | 声明式更易读、易学,适合大多数场景。 |
| 根块(Root Block) | pipeline { ... } | node { ... } | 声明式必须以 pipeline 开始。 |
| 结构要求 | 强制结构化:必须包含 agent、stages、steps 等块 | 灵活,可自由编写 Groovy 代码 | 声明式有助于规范代码结构。 |
| 错误处理 | 使用 options { timeout }、post 块处理失败 | 使用 Groovy 的 try/catch/finally | 脚本式在异常处理上更灵活。 |
| 条件执行 | 使用 when 指令 | 使用 Groovy 的 if/else | 声明式的 when 更简洁。 |
| 并行执行 | 使用 parallel 指令 | 使用 parallel 步骤 | 两者都支持并行构建。 |
| 可扩展性 | 通过 script 块嵌入 Groovy 代码扩展功能 | 完全自由,可调用任意 Groovy 方法 | 脚本式功能更强但易写出难以维护的代码。 |
| 学习曲线 | 较低,适合初学者 | 较高,需了解 Groovy 语法 | 推荐新手从声明式入手。 |
| 社区趋势 | Jenkins 官方推荐,持续增强新功能 | 传统方式,功能稳定但更新较少 | 新项目建议优先使用声明式。 |
5.3 Pipeline 基本语法结构(pipeline, agent, stages, steps)
| 结构名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| pipeline | pipeline { ... } | 所有声明式 Pipeline 的根容器,必须包含 | pipeline { agent any stages { ... } } | 每个 Jenkinsfile 必须有一个且仅一个 pipeline 块。 |
| agent | agent { ... } | 指定 Pipeline 或 stage 在哪个代理节点上执行 | agent any agent none agent { label 'linux' } | any 表示任意可用节点;none 用于顶层定义,由 stage 自行指定。 |
| stages | stages { ... } | 包含一个或多个 stage 的容器,定义构建的逻辑阶段 | stages { stage('Build') { ... } stage('Test') { ... } } | 必须包含至少一个 stage。 |
| stage | stage('Stage Name') { ... } | 定义流水线中的一个阶段,如构建、测试、部署 | stage('Build') { steps { sh 'make' } } | 每个 stage 包含 steps 块,用于执行具体操作。 |
| steps | steps { ... } | 包含一个或多个具体执行命令的容器 | steps { sh 'echo "Hello"' script { def version = getVersion() } } | 是实际执行命令的地方,支持 shell、Groovy 脚本等。 |
| script | script { ... } | 在声明式 Pipeline 中嵌入任意 Groovy 代码 | script { if (env.BRANCH_NAME == 'main') { deployProd() } } | 用于复杂逻辑处理,如变量计算、条件判断等。 |
5.4 使用 Jenkinsfile 管理 Pipeline 代码
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 创建 Jenkinsfile | 在项目根目录创建名为 Jenkinsfile 的文本文件 | 存放 Pipeline 脚本代码 | touch Jenkinsfile | 文件名区分大小写,必须为 Jenkinsfile(无后缀)。 |
| 使用 SCM 中的 Jenkinsfile | 在 Pipeline 任务配置中选择 “Pipeline script from SCM” | 从代码仓库加载 Jenkinsfile | Repository URL: https://github.com/user/project.git Script Path: Jenkinsfile | 推荐做法,实现代码与流程共管。 |
| 编写声明式 Pipeline 脚本 | 在 Jenkinsfile 中编写 pipeline 块 | 定义完整的 CI/CD 流程 | 见下方代码示例 | 确保语法正确,否则构建失败。 |
| 本地测试 Jenkinsfile | 使用 Jenkinsfile Runner 或在线语法检查工具 | 验证脚本语法和逻辑 | 无(工具辅助) | 减少提交后才发现错误的风险。 |
| 版本控制 Jenkinsfile | 将 Jenkinsfile 提交到 Git/SVN 仓库 | 实现变更追踪、代码审查和回滚 | git add Jenkinsfile git commit -m "Add pipeline" git push | 与应用代码一起评审,确保流程一致性。 |
| 多分支 Pipeline 自动发现 | 使用 “Multibranch Pipeline” 任务类型 | 自动为每个分支创建独立 Pipeline | 无(Jenkins 自动扫描) | 要求每个分支都有 Jenkinsfile。 |
| 设置默认分支 | 在 Multibranch 配置中指定 “Discover branches” 策略 | 控制哪些分支触发 Pipeline | 策略:All branches | 可过滤特定分支(如忽略 feature/*)。 |
| 处理语法错误 | 查看构建日志中的 “WorkflowScript: X: “ | 调试 Jenkinsfile 语法问题 | WorkflowScript: 5: Missing required parameter: ‘stages’ | 常见错误包括括号不匹配、缺少必填块等。 |
声明式 Pipeline 示例(Jenkinsfile):
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
}
}
第六章:Jenkinsfile 与高级 Pipeline 语法
6.1 agent 指令详解(any, label, docker, none)
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| agent any | agent any | 在任意可用的代理节点上运行 Pipeline | pipeline { agent any stages { ... } } | 最常用,适用于大多数场景。 |
| agent none | agent none | 不在顶层指定执行节点,由每个 stage 自行定义 | pipeline { agent none stages { stage('Build') { agent { label 'linux' } steps { ... } } } } | 用于多平台或不同阶段需在不同节点运行的场景。 |
| agent label | agent { label 'label-name' } | 指定在具有特定标签的节点上运行 | agent { label 'docker-build' } | 标签需提前在节点配置中定义。 |
| agent node | agent { node { label 'linux && amd64' } } | 使用更复杂的节点选择条件 | agent { node { label 'ubuntu && high-mem' } } | 支持逻辑表达式(&&, ||)。 |
| agent docker | agent { docker 'image-name' } | 在指定的 Docker 镜像容器中运行 Pipeline | agent { docker 'maven:3.8.6-jdk-11' } | 需 Jenkins 主机安装 Docker 并配置权限。 |
| agent dockerfile | agent { dockerfile true } | 使用项目根目录下的 Dockerfile 构建并运行容器 | agent { dockerfile true } 或 agent { dockerfile 'Dockerfile.build' } | 支持指定 Dockerfile 路径。 |
| agent inherit | agent inherit | 在嵌套 stage 中继承父级 agent 配置 | stage('Sub-stage') { agent inherit steps { ... } } | 仅在 stage 级别使用,声明式 Pipeline 中较少见。 |
6.2 stages 与 stage:定义构建阶段
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| stages | stages { ... } | 容器块,包含一个或多个 stage | stages { stage('Build') { steps { sh 'make' } } stage('Test') { steps { sh 'make test' } } } | 必须包含至少一个 stage。 |
| stage | stage('Stage Name') { ... } | 定义流水线中的一个逻辑阶段 | stage('Deploy') { steps { sh './deploy.sh' } } | 阶段名称应清晰描述其功能。 |
| 嵌套 stage | stage('Outer') { stages { stage('Inner A') { ... } stage('Inner B') { ... } } } | 在一个 stage 内部定义多个子阶段 | stage('Build') { stages { stage('Compile') { steps { ... } } stage('Package') { steps { ... } } } } | 可实现更细粒度的可视化和控制。 |
| 可选阶段(when) | stage('Deploy Prod') { when { branch 'main' } steps { ... } } | 根据条件决定是否执行该阶段 | when { expression { env.DEPLOY_ENV == 'prod' } } | 支持 branch、environment、expression 等条件。 |
| 并行阶段 | parallel { stage('Frontend') { ... } stage('Backend') { ... } } | 并行执行多个 stage,提升效率 | 见下方代码示例 | 并行阶段独立运行,失败一个可能导致整体失败。 |
| 阶段超时 | options { timeout(time: 10, unit: 'MINUTES') } | 为单个阶段设置执行超时 | stage('Long Task') { options { timeout(time: 5, unit: 'MINUTES') } steps { ... } } | 超时后阶段标记为失败。 |
6.3 steps:执行具体操作
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| sh | sh 'command' | 在 Linux/Unix 节点上执行 shell 命令 | steps { sh 'mvn clean package' sh 'echo $BUILD_NUMBER' } | 默认使用 /bin/sh 执行。 |
| bat | bat 'command' | 在 Windows 节点上执行批处理命令 | steps { bat 'call mvn clean package' bat 'echo %BUILD_NUMBER%' } | 使用 cmd /c 执行。 |
| script | script { ... } | 执行 Groovy 脚本,用于复杂逻辑 | steps { script { def version = sh(script: 'git describe --tags', returnStdout: true).trim() env.APP_VERSION = version } } | 可访问 Jenkins API 和变量。 |
| echo | echo 'message' | 输出信息到构建日志 | echo 'Starting deployment...' | 用于调试和流程提示。 |
| sleep | sleep(time: 30, unit: 'SECONDS') | 暂停执行一段时间 | sleep(time: 2, unit: 'MINUTES') | 可用于等待外部系统响应。 |
| archiveArtifacts | archiveArtifacts artifacts: 'target/*.jar', allowEmptyArchive: true | 归档构建产物 | archiveArtifacts 'dist/*.zip' | allowEmptyArchive 防止无文件时报错。 |
| junit | junit 'test-results/*.xml' | 发布 JUnit 测试报告 | junit 'build/test-results/test/*.xml' | 需测试框架生成兼容格式。 |
| checkout | checkout scm | 检出当前任务的源码(通常自动执行) | checkout([$class: 'GitSCM', ...]) | 自定义 SCM 行为时使用。 |
6.4 script 块:在声明式 Pipeline 中使用 Groovy
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| script 块 | script { ... } | 在声明式 Pipeline 中嵌入任意 Groovy 代码 | steps { script { def list = [1,2,3] list.each { println it } } } | 是声明式 Pipeline 扩展功能的主要方式。 |
| 定义变量 | script { def version = '1.0' } | 在 Groovy 上下文中声明变量 | script { env.BUILD_TAG = "v${env.BUILD_NUMBER}" } | 可修改环境变量或创建临时变量。 |
| 条件逻辑 | script { if (condition) { ... } } | 实现复杂条件判断 | script { if (env.BRANCH_NAME == 'main') { env.DEPLOY_ENV = 'prod' } else { env.DEPLOY_ENV = 'staging' } } | Groovy 语法,支持 if/else、switch 等。 |
| 循环处理 | script { for (item in list) { ... } } | 遍历集合或执行重复操作 | script { ['dev', 'test', 'prod'].each { env -> sh "deploy.sh $env" } } | 避免无限循环。 |
| 调用函数 | script { def ver = getBuildVersion() } | 调用自定义或共享库函数 | script { def version = sh(script: 'git describe --tags', returnStdout: true).trim() } | 可封装重复逻辑。 |
| 异常处理 | script { try { ... } catch (e) { ... } } | 捕获和处理错误 | script { try { sh 'risky-command' } catch (Exception e) { echo "Warning: ${e}" } } | 防止脚本因单个错误中断。 |
| 返回值处理 | script { return sh(...) } | 从 script 块返回值供后续使用 | script { def output = sh(script: 'whoami', returnStdout: true).trim() env.USER = output } | 使用 returnStdout: true 获取命令输出。 |
6.5 environment:环境变量定义
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| environment 块 | environment { KEY = 'value' } | 定义环境变量,供整个 Pipeline 使用 | environment { APP_NAME = 'my-app' DEBUG = 'true' } | 可在 steps 中通过 env.KEY 访问。 |
| 动态变量(script) | environment { VERSION = script { ... } } | 使用 Groovy 脚本动态生成变量值 | environment { VERSION = script { return sh(script: 'git describe --tags', returnStdout: true).trim() } } | 脚本在 Pipeline 开始时执行一次。 |
| credentials | environment { USER = credentials('cred-id') } | 从 Jenkins 凭据存储中加载敏感信息 | environment { DB_USER = credentials('db-username') DB_PASS = credentials('db-password') } | 自动解密并设置为环境变量,避免明文暴露。 |
| 内置环境变量引用 | environment { MY_BUILD = '$BUILD_NUMBER' } | 使用 Jenkins 内置变量 | environment { BUILD_TAG = 'jenkins-${JOB_NAME}-${BUILD_NUMBER}' } | 支持大多数内置变量插值。 |
| 阶段级 environment | stage('Deploy') { environment { ENV = 'prod' } steps { ... } } | 为特定阶段定义环境变量 | 变量仅在该 stage 内有效 | 优先级高于全局 environment。 |
| 敏感信息保护 | 使用 credentials() 或 Secret Text 类型 | 防止密码、密钥等泄露 | credentials('aws-secret-key') | 日志中会自动屏蔽。 |
6.6 parameters:参数化构建
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| parameters 块 | parameters { ... } | 定义构建时可输入的参数 | parameters { string(name: 'VERSION', defaultValue: '1.0', description: 'App version') } | 必须在 pipeline 块内定义。 |
| string 参数 | string(name: 'KEY', defaultValue: 'val', description: '...') | 字符串输入参数 | string(name: 'TAG', defaultValue: 'latest', description: 'Docker tag') | 最常用参数类型。 |
| booleanParam | booleanParam(name: 'DEBUG', defaultValue: true, description: 'Enable debug?') | 布尔值(复选框)参数 | booleanParam(name: 'CLEAN', defaultValue: false) | 构建时显示为勾选框。 |
| choice | choice(choices: ['dev','staging','prod'], name: 'ENV', description: 'Target environment') | 下拉选择参数 | choice(choices: '''dev\nstaging\nprod''', name: 'DEPLOY_ENV') | choices 为多行字符串。 |
| text | text(name: 'NOTES', defaultValue: '', description: 'Release notes') | 多行文本输入 | text(name: 'SCRIPT', defaultValue: '#!/bin/bash\n') | 适合输入脚本或长文本。 |
| password | password(name: 'SECRET', defaultValue: '', description: 'Secret token') | 密码输入(隐藏显示) | password(name: 'API_KEY', description: 'External API key') | 输入内容在 UI 和日志中隐藏。 |
| 在脚本中使用参数 | steps { sh "echo $VERSION" } | 通过变量名访问参数值 | echo "Deploying $DEPLOY_ENV environment" | 参数自动作为环境变量注入。 |
6.7 options:构建选项(超时、重试、时间戳等)
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| timeout | options { timeout(time: 1, unit: 'HOURS') } | 设置整个 Pipeline 的最大执行时间 | options { timeout(time: 30, unit: 'MINUTES') } | 超时后构建失败。 |
| retry | options { retry(3) } | 构建失败时自动重试指定次数 | options { retry(2) } | 每次失败后立即重试,适用于不稳定外部依赖。 |
| timestamps | options { timestamps() } | 在构建日志中添加时间戳 | options { timestamps() ansiColor('xterm') } | 便于分析各步骤耗时。 |
| buildDiscarder | options { buildDiscarder(logRotator(daysToKeep: 7, numToKeep: 10)) } | 自动清理旧的构建记录 | logRotator(daysToKeep: 30, numToKeep: 50) | 节省磁盘空间。 |
| disableConcurrentBuilds | options { disableConcurrentBuilds() } | 禁止并发构建,确保串行执行 | options { disableConcurrentBuilds() timeout(time: 1, unit: 'HOURS') } | 避免资源冲突或数据竞争。 |
| skipDefaultCheckout | options { skipDefaultCheckout() } | 跳过默认的源码检出操作 | options { skipDefaultCheckout() } | 当使用自定义 checkout 逻辑时使用。 |
| checkoutToSubdirectory | options { checkoutToSubdirectory('src') } | 将源码检出到子目录 | options { checkoutToSubdirectory('project-a') } | 避免覆盖工作区其他文件。 |
| ansiColor | options { ansiColor('xterm') } | 启用 ANSI 颜色输出,美化日志 | options { ansiColor('xterm') } | 需安装 AnsiColor Plugin。 |
6.8 triggers:触发器(cron, webhook, pollSCM)
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| cron | triggers { cron('H */4 * * *') } | 定时触发构建 | triggers { cron('0 2 * * *') // 每天凌晨2点 } | 使用 Jenkins cron 语法,H 表示哈希。 |
| pollSCM | triggers { pollSCM('H/15 * * * *') } | 定期检查源码变更,有更新则构建 | triggers { pollSCM('H/10 * * * *') // 每10分钟检查 } | 消耗资源,推荐用 Webhook 替代。 |
| upstream | triggers { upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS) } | 当上游项目构建成功后触发 | triggers { upstream(upstreamProjects: 'build-app', threshold: SUCCESS) } | 实现任务依赖链。 |
| Generic Webhook Trigger | 需安装插件,配置自定义 Webhook | 响应外部系统(如 GitLab、自定义服务)的 HTTP 请求 | 见插件文档 | 支持解析 JSON、过滤条件等高级功能。 |
| GitHub Hook | triggers { githubPush() } | 响应 GitHub 的 push 事件 | triggers { githubPush() } | 需在 GitHub 仓库设置 Webhook URL。 |
| 多触发器组合 | triggers { cron(...); githubPush() } | 同时启用多种触发方式 | triggers { cron('H 8 * * 1-5') githubPush() } | 任一条件满足即可触发构建。 |
6.9 post:构建后操作(always, success, failure 等)
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| post | post { ... } | 定义构建完成后执行的操作,根据构建状态分支处理 | post { success { ... } failure { ... } } | 通常放在 pipeline 块末尾。 |
| always | always { ... } | 无论构建成功或失败都执行 | always { echo 'Build finished' } | 适合清理、通知等通用操作。 |
| success | success { ... } | 仅当构建成功时执行 | success { emailext(subject: 'Success', body: '...', to: 'team@company.com') } | 用于发送成功通知、触发下游部署。 |
| failure | failure { ... } | 仅当构建失败时执行 | failure { emailext(subject: 'Failed', body: '...', to: 'dev-lead@company.com') } | 用于告警和故障排查。 |
| unstable | unstable { ... } | 当构建结果为”不稳定”(如测试失败)时执行 | unstable { echo 'Tests failed but build succeeded' } | 常用于发送质量警告。 |
| changed | changed { ... } | 仅当本次构建状态与上次不同时执行 | changed { echo 'Status changed to unstable' } | 避免重复通知。 |
| cleanup | cleanup { ... } | 最终清理操作,即使构建被中止也执行 | cleanup { sh 'rm -rf temp/' } | Jenkins 2.173+ 支持,确保资源释放。 |
| 通知集成 | emailext, slackSend, webhook | 发送邮件、Slack 消息或调用 Webhook | emailext(...) slackSend(message: 'Build failed') | 需安装对应插件(Email Extension, Slack)。 |
第一章:Jenkins 简介与核心概念
1.1 什么是 Jenkins
| 概念名称 | 说明 | 注意事项 |
|---|
| Jenkins | 开源的自动化服务器,用于支持软件项目的持续集成和持续交付(CI/CD)。它通过插件架构提供高度可扩展性,能够自动化构建、测试、部署等任务。 | Jenkins 使用 Java 编写,需运行在 Java 环境(JRE/JDK)之上;适用于各种平台和开发语言。 |
| 自动化服务器 | 一种能够在代码变更后自动执行预定义任务(如编译、测试、部署)的服务程序。 | 不同于普通脚本调度工具,Jenkins 提供 Web 界面、任务依赖管理、日志追踪和丰富的插件生态。 |
| CI/CD 支持 | Jenkins 的核心用途是实现持续集成与持续交付流程的自动化。 | 它本身不强制使用特定流程模型,用户可根据项目需求自定义流水线逻辑。 |
| 插件架构 | Jenkins 功能主要通过插件扩展,拥有超过 1800 个官方插件。 | 插件质量参差不齐,部分插件可能不再维护,安装前应检查兼容性和更新记录。 |
1.2 持续集成(CI)与持续交付(CD)概述
| 概念名称 | 说明 | 注意事项 |
|---|
| 持续集成(Continuous Integration, CI) | 开发人员频繁地(通常每天多次)将代码集成到共享主干(mainline),每次集成都通过自动化构建(包括编译、测试)来验证,以便尽早发现集成错误。 | 必须配合版本控制系统(如 Git)使用;建议每次提交都触发一次构建。 |
| 持续交付(Continuous Delivery, CD) | 在持续集成的基础上,确保软件可以随时以安全、可靠的方式发布到生产环境。通常包括自动化测试、预发布环境部署、人工审批等环节。 | 强调”可发布”状态,但不一定自动发布;发布决策可由团队控制。 |
| 持续部署(Continuous Deployment) | 是持续交付的延伸,指每一次通过自动化测试的代码变更都会自动部署到生产环境,无需人工干预。 | 对测试覆盖率和自动化程度要求极高;适用于高成熟度团队。 |
| 构建(Build) | 将源代码转换为可执行程序或部署包的过程,例如 Java 项目中的编译、打包(jar/war)。 | “构建”在 Jenkins 中泛指一次任务执行,不仅限于编译。 |
| 测试自动化 | 在 CI 阶段自动运行单元测试、集成测试等,确保新代码不会破坏现有功能。 | 建议结合代码覆盖率工具(如 JaCoCo)监控测试质量。 |
| 反馈快速化 | CI/CD 的目标之一是让开发人员尽快获得构建和测试结果反馈,通常在几分钟内完成。 | 构建时间过长会影响开发效率,应优化构建流程。 |
1.3 Jenkins 架构与核心组件
| 组件名称 | 说明 | 注意事项 |
|---|
| 主节点(Master Node) | Jenkins 的核心控制节点,负责管理任务调度、用户界面展示、插件加载、代理节点协调等工作。 | 主节点不应直接执行构建任务,以免资源争用影响系统稳定性。 |
| Web UI(Web 用户界面) | 基于 Web 的图形化操作界面,用于配置任务、查看构建历史、管理插件和用户权限。 | 默认监听 8080 端口;可通过反向代理增强安全性。 |
| Job/Task(任务) | Jenkins 中的基本执行单元,代表一个自动化流程,如构建、测试或部署。 | 支持多种类型:自由风格项目、Pipeline、多分支 Pipeline 等。 |
| Plugin System(插件系统) | Jenkins 功能扩展机制,几乎所有外部集成(Git、Docker、Kubernetes)都通过插件实现。 | 插件之间可能存在依赖关系,升级时需注意兼容性。 |
| Build Queue(构建队列) | 当没有可用代理节点或资源不足时,任务会进入等待队列,按优先级排队执行。 | 可通过标签(Label)和节点分配策略优化调度效率。 |
| Configuration as Code | Jenkins 支持将配置保存为 XML 文件或 Jenkinsfile,便于版本化管理和迁移。 | 推荐使用”Job DSL”或”Configuration as Code (CasC)“插件实现完全代码化配置。 |
1.4 Jenkins 主节点与代理节点(Master-Agent)模型
| 概念名称 | 说明 | 注意事项 |
|---|
| 代理节点(Agent Node) | 又称”从节点”或”执行节点”,是实际执行构建任务的工作机器,可以是物理机、虚拟机或容器。 | 代理节点必须能与主节点网络互通,并安装 Java 运行环境。 |
| 分布式构建 | 利用多个代理节点并行执行不同任务,提升整体构建效率和资源利用率。 | 适合大型团队或高并发构建场景。 |
| 节点通信方式 | 主节点与代理节点之间通过 JNLP(Java Network Launch Protocol)或 SSH 协议建立连接。 | JNLP 需要开放特定端口;SSH 方式更常见于 Linux 环境。 |
| 标签(Label) | 为代理节点打上标签(如 linux、docker、high-mem),任务可指定在具有特定标签的节点上运行。 | 合理使用标签可实现精细化资源调度,例如前端项目指定 nodejs 标签节点。 |
| 临时代理(Ephemeral Agent) | 动态创建的代理节点,常用于 Kubernetes 或云环境,任务结束后自动销毁。 | 节省资源,适合短时高负载场景。 |
| 工作目录(Workspace) | 每个任务在代理节点上拥有独立的工作空间,用于存放源码副本和构建产物。 | 多次构建间可选择是否保留工作区以提高效率(如依赖缓存)。 |
| 资源隔离 | 不同代理节点可运行不同操作系统或环境,实现跨平台构建测试。 | 例如:Windows 节点用于 .NET 构建,Linux 节点用于 Java 构建。 |
第二章:Jenkins 安装与环境搭建
2.1 在 Windows 上安装 Jenkins
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 下载 Jenkins WAR 包 | 访问 https://www.jenkins.io/download/,选择 Generic Java package (.war) | 获取 Jenkins 核心程序文件 | 无(手动下载) | 确保从官方站点下载,避免第三方修改版本。 |
| 安装 Java 环境 | 安装 JDK 8 或更高版本,并配置 JAVA_HOME 环境变量 | 提供 Jenkins 运行所需的 Java 支持 | set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_301 set PATH=%JAVA_HOME%\bin;%PATH% | 必须使用支持的 Java 版本;建议使用 LTS 版本。 |
| 启动 Jenkins(命令行) | java -jar jenkins.war --httpPort=8080 | 以独立进程方式启动 Jenkins 服务 | java -jar jenkins.war --httpPort=8080 | 首次运行会生成管理员密码文件,路径在控制台输出中提示。 |
| 安装为 Windows 服务 | 使用 NSSM (Non-Sucking Service Manager) 或 Jenkins 自带工具安装为系统服务 | 实现 Jenkins 开机自启和后台运行 | nssm install Jenkins "C:\Program Files\Java\jdk1.8.0_301\bin\java.exe" -jar "C:\jenkins\jenkins.war" | 推荐生产环境使用服务方式运行,避免关闭终端后服务中断。 |
| 指定自定义工作目录 | 设置 JENKINS_HOME 环境变量 | 将 Jenkins 数据存储位置从默认用户目录迁移至指定路径 | set JENKINS_HOME=D:\jenkins_home | 建议提前设置,便于备份与迁移;需确保目录有读写权限。 |
2.2 在 Linux 上安装 Jenkins(Ubuntu/CentOS)
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 添加 Jenkins 仓库密钥(Ubuntu) | wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - | 验证 Jenkins 软件包来源合法性 | wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - | 若 apt-key 已弃用,可改用 gpg 并放入 /etc/apt/trusted.gpg.d/ |
| 添加 Jenkins 仓库(Ubuntu) | echo deb https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list | 添加 Jenkins 官方 APT 源 | echo deb https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list | 使用 stable 分支确保版本稳定性。 |
| 更新软件包索引(Ubuntu) | sudo apt update | 同步最新软件包信息 | sudo apt update | 必须在添加源后执行。 |
| 安装 Jenkins(Ubuntu) | sudo apt install jenkins | 安装 Jenkins 及其依赖 | sudo apt install jenkins | 默认安装 OpenJDK 若未预装 Java。 |
| 启动 Jenkins 服务(Systemd) | sudo systemctl start jenkins sudo systemctl enable jenkins | 启动并设置开机自启 | sudo systemctl status jenkins | 检查状态确认是否正常运行。 |
| 安装 Java(CentOS) | sudo yum install java-17-openjdk-devel | 安装 Jenkins 所需的 Java 环境 | sudo yum install java-17-openjdk-devel | Jenkins 推荐使用 Java 17+(Jenkins 2.356+)。 |
| 添加 Jenkins 仓库(CentOS) | sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key | 添加 YUM 源 | sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key | 注意区分 stable 和 latest 版本源。 |
| 安装 Jenkins(CentOS) | sudo yum install jenkins | 安装 Jenkins RPM 包 | sudo yum install jenkins | 安装路径通常为 /usr/lib/jenkins。 |
| 防火墙开放端口 | sudo ufw allow 8080(Ubuntu) sudo firewall-cmd --permanent --add-port=8080/tcp(CentOS) | 允许外部访问 Jenkins Web 界面 | sudo firewall-cmd --reload | 若启用防火墙,必须放行 8080 端口。 |
2.3 使用 Docker 安装 Jenkins
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 拉取 Jenkins 官方镜像 | docker pull jenkins/jenkins:lts | 获取稳定版 Jenkins 镜像 | docker pull jenkins/jenkins:lts | 推荐使用 lts 标签以获得长期支持版本。 |
| 创建持久化数据卷 | docker volume create jenkins-data | 持久化 Jenkins 配置与插件数据 | docker volume create jenkins-data | 避免容器重启后数据丢失。 |
| 启动 Jenkins 容器 | docker run -d -p 8080:8080 -p 50000:50000 -v jenkins-data:/var/jenkins_home --name jenkins jenkins/jenkins:lts | 运行 Jenkins 容器并映射端口和数据卷 | docker run -d -p 8080:8080 -p 50000:50000 -v jenkins-data:/var/jenkins_home --name jenkins jenkins/jenkins:lts | -p 50000 用于代理节点通信;-v 实现数据持久化。 |
| 使用本地目录挂载 | docker run -d -v /path/to/jenkins/home:/var/jenkins_home ... | 将宿主机目录作为 Jenkins 工作目录 | docker run -d -v /data/jenkins:/var/jenkins_home -p 8080:8080 --name jenkins jenkins/jenkins:lts | 确保宿主机目录存在且有读写权限(chown -R 1000:1000 /data/jenkins)。 |
| 查看初始管理员密码 | docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword | 获取首次登录密码 | docker logs jenkins | grep password | 密码仅首次生成一次,务必记录。 |
| 进入容器终端 | docker exec -it jenkins bash | 调试或手动安装插件/工具 | docker exec -it jenkins bash | 容器内用户为 jenkins(UID 1000),部分操作需 sudo 权限模拟。 |
2.4 初始配置与插件推荐安装
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 安装向导(Setup Wizard) | 首次启动后访问 http://:8080 进入图形化配置流程 | 引导完成基本安全与插件设置 | 无(Web 界面操作) | 必须完成此步骤才能使用 Jenkins。 |
| 输入管理员密码 | 从 /var/jenkins_home/secrets/initialAdminPassword 文件获取 | 解锁初始设置界面 | sudo cat /var/jenkins_home/secrets/initialAdminPassword | 若使用 Docker,需进入容器或挂载目录查看。 |
| 安装推荐插件 | 在”Customize Jenkins”页面选择”Install suggested plugins” | 快速安装常用核心插件集 | 无(勾选选项) | 包含 Git、SSH、Pipeline、Matrix Authorization 等基础功能。 |
| 选择插件安装方式 | Install suggested plugins 或 Select plugins to install | 自定义插件集合 | 无 | 新手建议选择推荐插件。 |
| 创建首个管理员用户 | 填写用户名、密码、邮箱等信息 | 避免使用默认 admin 账户,提升安全性 | 无(表单输入) | 记住凭据,后续登录使用此账户。 |
| 配置 Jenkins URL | 设置 Jenkins 实例的公共访问地址 | 用于邮件通知、Webhook 回调等场景 | http://your-domain.com:8080 | 若后期更改需在”系统管理 > 系统配置”中更新。 |
| 推荐插件列表 | Git Plugin, GitHub Plugin, Pipeline, Credentials Binding, Docker Pipeline, Email Extension, Workspace Cleanup, Blue Ocean | 增强版本控制、流水线、安全、通知等功能 | 无 | 可在”系统管理 > 插件管理”中单独安装。 |
2.5 访问 Jenkins Web 界面与首次登录设置
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 访问 Jenkins 地址 | 浏览器打开 http://<服务器IP或域名>:8080 | 进入 Jenkins 登录首页 | http://192.168.1.100:8080 | 确保网络可达且防火墙已放行端口。 |
| 查看初始密码 | 查看日志或 secrets 文件输出 | 获取解锁 Jenkins 所需的一次性密码 | docker logs jenkins | grep password cat $JENKINS_HOME/secrets/initialAdminPassword | 若复制粘贴失败,尝试手动输入。 |
| 解锁 Jenkins | 在登录页输入初始管理员密码 | 进入插件安装阶段 | 无(输入密码) | 密码输入错误多次可能导致锁定。 |
| 跳过插件安装(高级) | 点击”Continue as admin”或”Skip plugin installation” | 手动控制插件安装过程 | 无 | 不推荐生产环境跳过,可能导致功能缺失。 |
| 修改系统配置(首次) | 登录后进入”Manage Jenkins > Configure System” | 设置邮件服务器、全局变量、构建工具路径等 | 无(Web 表单) | 建议尽早配置邮件通知和 JDK/Maven 路径。 |
| 更改监听端口(可选) | 启动时指定 —httpPort 参数或修改 systemd 配置 | 避免端口冲突或符合安全策略 | java -jar jenkins.war --httpPort=9090 | 若使用反向代理(如 Nginx),可改为内网端口。 |
| 启用 CSRF 保护 | 在”Configure Global Security”中启用”Prevent Cross Site Request Forgery exploits” | 防止跨站请求伪造攻击 | 默认启用 | 生产环境必须开启。 |
| 备份 JENKINS_HOME | 定期复制整个 JENKINS_HOME 目录 | 实现 Jenkins 配置与数据的完整备份 | cp -r /var/jenkins_home /backup/jenkins_home_$(date +%F) | 最简单的备份方式,恢复时直接替换目录即可。 |
第三章:Jenkins 用户管理与权限控制
3.1 用户创建与管理
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 创建本地用户(Web 界面) | “Manage Jenkins” > “Manage Users” > “Create User” | 在 Jenkins 内部用户数据库中添加新用户 | 无(填写用户名、密码、全名、邮箱等表单) | 适用于未集成外部认证系统的小型团队。 |
| 删除用户 | 在”Manage Users”列表中点击用户后选择”Delete” | 移除不再需要的用户账户 | 无 | 删除用户不会自动清除其构建历史记录。 |
| 查看用户详情 | 点击用户进入其详情页面 | 查看用户的构建活动、权限分配等信息 | 无 | 可用于审计和权限排查。 |
| 修改用户信息 | 在用户详情页点击”Configure” | 更新用户密码、邮箱或全名 | 无 | 普通用户只能修改自身信息;管理员可修改所有用户。 |
| 启用/禁用用户 | 通过插件如 “Matrix Authorization Strategy” 或脚本控制 | 临时禁止某用户登录或执行操作 | 无(需结合安全域配置) | 更安全的做法是移除权限而非删除用户。 |
| 使用 CLI 创建用户 | java -jar jenkins-cli.jar -s http://localhost:8080/ create-user username password fullname email | 通过命令行批量创建用户 | java -jar jenkins-cli.jar -s http://localhost:8080/ create-user dev1 pass123 "Developer One" dev1@company.com | 需提前配置好 CLI 访问权限,适合自动化场景。 |
3.2 角色-Based 访问控制(Role-Based Strategy)配置
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 安装 Role-Based Strategy 插件 | ”Manage Jenkins” > “Manage Plugins” > 搜索并安装 “Role-based Authorization Strategy” | 实现基于角色的细粒度权限管理 | 无 | 必须先安装插件才能启用该策略。 |
| 启用 Role-Based 策略 | ”Manage Jenkins” > “Configure Global Security” > “Authorization” > 选择 “Role-Based Strategy” | 开启角色权限模型 | 无 | 切换后原有矩阵权限将失效。 |
| 创建全局角色(Global Roles) | “Manage Jenkins” > “Manage and Assign Roles” > “Manage Roles” > “Global roles” > Add | 定义适用于整个 Jenkins 实例的角色 | 名称:Admin,权限:Overall/Administer, Job/Read 等 | Admin 角色应仅分配给少数管理员。 |
| 创建项目角色(Project Roles) | 在 “Project roles” 中添加角色并设置模式匹配规则 | 定义针对特定任务的访问权限 | 名称:dev-team-a,Pattern: ^team-a-.*,权限:Job/Build, Job/Read | 支持正则表达式匹配任务名称。 |
| 创建代理角色(Agent Roles) | 在 “Agent roles” 中定义节点相关权限角色 | 控制对代理节点的访问和操作权限 | 名称:node-admin,权限:Agent/Connect, Agent/Configure | 通常用于运维人员管理节点。 |
| 分配角色给用户 | ”Manage and Assign Roles” > “Assign Roles” > 选择用户并勾选对应角色 | 将已定义的角色关联到具体用户或用户组 | 用户 dev1 → 全局角色 Developer + 项目角色 dev-team-a | 一个用户可拥有多个角色。 |
| 使用正则表达式匹配任务 | 在 Project Roles 的 Pattern 字段输入正则表达式 | 实现动态任务权限分配 | ^frontend-.* 匹配所有以前端开头的任务 | 正则语法错误会导致权限不生效。 |
3.3 项目级权限管理
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 启用项目级权限 | 确保已使用 “Role-Based Strategy” 或 “Project-based Matrix Authorization Strategy” | 对单个任务设置独立访问控制 | 无 | 必须在全局安全设置中启用支持项目级权限的策略。 |
| 配置单个任务的权限 | 进入任务配置页 > 勾选 “This project is pre-operated” > “Restrict where this project can be run” 和 “Security” 部分 | 限制谁可以查看、构建或配置该任务 | 无(Web 表单) | 权限继承自全局设置,除非显式覆盖。 |
| 添加项目级用户/角色 | 在任务配置的安全区域添加特定用户或角色 | 给特定任务赋予额外访问权限 | 用户 qa-team → 权限:Job/Build, Job/Read | 适用于跨团队协作项目。 |
| 使用 “Project-based Matrix Authorization Strategy” 插件 | 安装插件并在任务配置中启用矩阵权限 | 在每个任务中直接定义权限矩阵 | 无 | 提供比全局策略更灵活的控制能力。 |
| 限制构建触发权限 | 在任务配置中取消非相关人员的 “Build” 权限 | 防止未经授权的构建执行 | 仅允许 dev-leads 用户拥有 Job/Build 权限 | 结合参数化构建和审批流程更佳。 |
| 隐藏敏感任务 | 不授予普通用户 Job/Read 权限 | 使任务在任务列表中不可见 | 无 | 是实现权限隔离的有效手段。 |
| 继承与覆盖机制 | 默认继承全局权限,可通过项目设置覆盖 | 平衡统一管理和个性化需求 | 无 | 建议保持一致性,避免过度定制增加维护成本。 |
3.4 安全设置与最佳实践
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 启用安全域(Security Realm) | “Configure Global Security” > “Security Realm” > 选择 “Jenkins’ own user database” 或 “LDAP” | 定义用户认证来源 | 选择 LDAP 可集成企业 AD | 生产环境推荐使用 LDAP/OAuth2 统一认证。 |
| 强制使用 HTTPS | 配置反向代理(Nginx/Apache)启用 SSL/TLS | 加密 Web 流量防止凭证泄露 | 参见下方代码示例 | 自签证书需在客户端信任,否则浏览器报错。 |
| 设置会话超时时间 | 在 “Configure Global Security” 中设置 “Session timeout” | 减少未授权访问风险 | 输入分钟数(如 30) | 过短影响用户体验,过长增加安全风险。 |
| 禁用脚本控制台(Script Console) | 移除非管理员用户的 “Script/Run” 权限 | 防止 Groovy 脚本执行导致 RCE | 无 | 脚本控制台功能强大但极其危险,生产环境应严格限制。 |
| 定期更新 Jenkins 与插件 | ”Manage Jenkins” > “Manage Plugins” > “Updates” > 安装更新 | 修复已知漏洞 | 建议每周检查一次更新 | 重大版本升级前应在测试环境验证兼容性。 |
| 备份 JENKINS_HOME 目录 | 定期复制 $JENKINS_HOME 到安全位置 | 实现完整配置与数据备份 | tar -czf jenkins-backup-$(date +%F).tar.gz /var/jenkins_home | 包含 jobs、users、plugins、credentials 等所有信息。 |
| 启用审计日志(Audit Logging) | 使用插件如 “Audit Trail” 记录关键操作 | 追踪用户行为,满足合规要求 | 无(插件自动记录登录、任务修改等事件) | 日志应集中存储并定期归档。 |
| 最小权限原则 | 仅授予用户完成工作所需的最低权限 | 降低误操作和恶意行为影响 | 例如:开发者只需 Job/Build 和 Job/Read | 避免随意分配 Admin 权限。 |
HTTPS 反向代理配置示例(Nginx):
server {
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:8080;
}
}
第四章:Jenkins 任务(Job)基础
4.1 创建自由风格项目(Freestyle Project)
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 新建自由风格项目 | 进入 Jenkins 主页 > 点击”新建任务” > 输入名称 > 选择”构建一个自由风格的项目” | 创建最基础的任务类型,适用于简单自动化流程 | 无(Web 界面操作) | 自由风格项目灵活性高,适合学习和轻量级任务。 |
| 配置任务描述 | 在项目主页点击”配置” > 在”描述”字段输入文本 | 为任务添加说明信息,便于团队理解用途 | 部署前端静态资源到测试环境 | 支持 HTML 标签格式化内容。 |
| 启用/禁用任务 | 在项目主页点击”启用”或”禁用” | 暂时停止任务执行而不删除 | 无 | 禁用后仍保留构建历史和配置。 |
| 复制现有任务 | ”新建任务” > 选择”复制现有项目” > 输入新名称并指定源任务 | 快速创建结构相似的任务,减少重复配置 | 源任务:build-frontend,新任务:build-backend | 修改后需检查路径、参数等是否适配。 |
| 删除任务 | 在项目主页点击”删除项目” | 彻底移除任务及其所有构建历史 | 无 | 删除操作不可逆,请谨慎执行。 |
| 设置任务图标/颜色(通过插件) | 使用 “Build Monitor View” 等插件自定义显示样式 | 在仪表盘中突出关键任务状态 | 无 | 提升可视化监控效率。 |
4.2 配置源码管理(SCM):Git 与 SVN
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 启用 Git 源码管理 | 在任务配置中 > “源码管理” > 选择”Git” | 从 Git 仓库拉取代码进行构建 | Repository URL: https://github.com/user/repo.git | 需提前安装 Git Plugin。 |
| 配置 Git 仓库地址 | 填写 Repository URL 字段 | 指定代码仓库位置 | https://github.com/jenkinsci/jenkins.git | 支持 HTTPS 和 SSH 协议。 |
| 设置 Git 凭据 | 使用”添加”按钮配置用户名/密码或 SSH 私钥 | 认证访问私有仓库 | 类型:Username with password 或 SSH Username with private key | 私钥应使用 Jenkins Credentials Store 管理。 |
| 指定分支 | 在 “Branches to build” 中填写分支名 | 控制构建特定分支代码 | */main 或 */develop | 默认为 */main。 |
| 启用 SVN 源码管理 | 在任务配置中 > “源码管理” > 选择”Subversion” | 从 SVN 仓库检出代码 | Repository URL: http://svn.company.com/svn/project/trunk | 需安装 Subversion Plugin。 |
| 配置 SVN 凭据 | 添加用户名/密码类型凭据 | 认证访问 SVN 服务器 | Domain: company.com, Username: jenkins, Password: *** | 支持 Windows 域账户。 |
| 定义本地检出目录 | 使用 “Check-out to a sub-directory” 或自定义 workspace 路径 | 将代码检出到指定子目录 | sub-project-a | 避免覆盖已有文件。 |
| 高级 Git 配置 | 点击”高级”按钮设置更多选项 | 自定义克隆行为、超时等 | Clone depth: 1, Timeout (minutes): 10 | 浅克隆可加快速度但不包含完整历史。 |
4.3 构建触发器:定时构建与远程触发
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 定时构建(Build periodically) | 在”构建触发器”中勾选 > 输入 cron 表达式 | 按固定时间间隔自动触发构建 | H 2 * * *(每天凌晨2点) | H 表示”哈希”,分散负载避免峰值。 |
| Cron 语法格式 | 分 时 日 月 周 | 定义触发时间规则 | H/15 * * * *(每15分钟一次) | 不支持秒级精度;H 可替代具体数字。 |
| GitHub Webhook 触发 | 勾选”GitHub hook trigger for GITScm polling” | 当代码推送到 GitHub 时自动触发构建 | 无(需在 GitHub 仓库设置 Webhook) | 必须配合 GitHub Integration Plugin 使用。 |
| 轮询 SCM(Poll SCM) | 勾选并输入 cron 表达式 | 定期检查代码库变更,有更新则构建 | H/5 * * * *(每5分钟检查一次) | 消耗资源较多,建议用 Webhook 替代。 |
| 远程触发构建(Trigger builds remotely) | 勾选并设置认证令牌(Token) | 允许外部系统通过 HTTP 请求触发构建 | Token: my-secret-token | URL 格式:http://jenkins/job/job-name/build?token=my-secret-token |
| 使用身份验证令牌 | 在远程触发时添加 token 参数 | 防止未授权调用 | curl -X POST http://jenkins/job/deploy-prod/build?token=abc123 | 建议使用长随机字符串作为 token。 |
| 构建另一个项目(Build after other projects are built) | 指定上游项目名称和触发条件 | 实现任务依赖链 | 项目名:build-app,条件:成功 | 支持失败、不稳定等状态判断。 |
4.4 执行 Shell/Windows 批处理命令
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 添加构建步骤:执行 Shell | 在”构建”部分点击”增加构建步骤” > “执行 Shell” | 在 Linux/Unix 环境下运行命令 | 见下方代码示例 | 默认使用 /bin/sh -xe 执行,-x 显示命令,-e 出错退出。 |
| Shell 脚本中的变量使用 | 使用 BUILD_NUMBER、JOB_NAME 等内置变量 | 动态生成文件名或路径 | echo "Building version $BUILD_NUMBER of $JOB_NAME" | 完整变量列表见 Jenkins 环境变量文档。 |
| 添加构建步骤:执行 Windows 批处理 | 在”构建”部分点击”增加构建步骤” > “执行 Windows 批处理” | 在 Windows 代理节点上运行 .bat 或 .cmd 文件 | echo Starting... call mvn clean package | 使用 cmd /c 执行,支持标准批处理语法。 |
| 设置脚本编码(Windows) | 在批处理步骤中指定”Use custom workspace”或系统区域设置 | 避免中文乱码问题 | chcp 65001 >nul(切换到 UTF-8) | 特别是在处理非英文路径时。 |
| 多行脚本支持 | 在文本框中直接输入多行命令 | 组织复杂构建逻辑 | mkdir dist cp -r src/* dist/ zip -r dist.zip dist/ | 注意缩进不影响执行,但建议保持可读性。 |
| 脚本退出码处理 | 命令返回非零退出码时构建失败 | 控制构建成功/失败状态 | exit 1(标记失败) exit 0(标记成功) | Jenkins 根据最后一条命令的退出码判断结果。 |
| 使用管道和重定向 | 结合 shell 重定向操作符 | 捕获输出、日志记录等 | npm run test > test.log 2>&1 | 可用于调试或归档中间结果。 |
Shell 构建步骤示例:
#!/bin/bash
echo "Starting build..."
npm install
npm run build
4.5 构建后操作:归档、邮件通知、清理
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 归档构建产物(Archive the artifacts) | 在”构建后操作”中添加 > 设置”文件”路径 | 保存生成的文件(如 jar、zip)供后续下载或部署 | dist/*.zip 或 target/*.jar | 支持通配符;产物保存在 Jenkins 服务器上。 |
| 设置归档文件路径 | 使用相对路径(基于 workspace) | 指定要归档的文件位置 | build/output/*.war | 路径错误将导致”没有匹配的文件”警告。 |
| 归档测试报告(Publish JUnit test result report) | 添加该操作 > 设置测试报告 XML 路径 | 展示单元测试结果和历史趋势 | **/test-reports/*.xml | 需测试框架输出兼容 JUnit 格式的报告。 |
| 发送邮件通知(E-mail Notification) | 添加该操作 > 输入收件人列表 | 构建失败或状态变更时发送邮件 | dev-team@company.com, qa-lead@company.com | 需提前在系统设置中配置 SMTP 服务器。 |
| 使用 Email Extension Plugin | 替代默认邮件功能,支持更灵活模板 | 自定义邮件主题、内容、收件人策略 | $DEFAULT_SUBJECT $DEFAULT_CONTENT | 支持 HTML、附件、条件发送等高级功能。 |
| 构建后清理工作空间(Delete workspace after build) | 添加”构建后操作” > “Delete workspace when build is done” | 释放磁盘空间,避免残留文件影响下次构建 | 无 | 建议在调试完成后启用。 |
| 条件化清理(Workspace Cleanup Plugin) | 使用高级清理策略,如保留最近 N 次构建的工作区 | 平衡磁盘使用与调试需求 | 保留策略:按数量保留,最大 3 个 | 可结合标签或路径进行精细控制。 |
| 触发下游项目 | 添加”构建其他项目”操作 | 实现构建流水线串联 | 项目名:deploy-staging, 参数:VERSION=$BUILD_NUMBER | 支持同步或异步触发。 |
第五章:Jenkins Pipeline 入门
5.1 什么是 Jenkins Pipeline
| 概念名称 | 说明 | 注意事项 |
|---|
| Jenkins Pipeline | 一套插件,支持在 Jenkins 中实现持续交付流水线即代码(Pipeline as Code)。它允许将构建、测试、部署等流程定义为可版本控制的脚本。 | Pipeline 是 Jenkins 2.0 的核心特性,取代传统自由风格项目的复杂配置。 |
| 流水线即代码(Pipeline as Code) | 使用代码(Groovy 脚本)定义 CI/CD 流程,存入源码仓库(如 Git),实现版本化、复用和审查。 | 推荐将 Jenkinsfile 提交到项目仓库,与代码一同管理。 |
| Pipeline 任务类型 | Jenkins 中的一种任务形式,用于运行基于 Groovy 的流水线脚本,支持声明式和脚本式两种语法。 | 创建任务时选择 “Pipeline” 类型。 |
| 持久化与暂停能力 | Pipeline 支持长时间运行、跨节点执行,并可在等待人工审批等操作时暂停,状态持久保存。 | 即使 Jenkins 重启,运行中的 Pipeline 也能恢复。 |
| 可视化阶段视图 | Pipeline 运行时可在 Web 界面查看各阶段(Stage)的执行状态和耗时,便于监控和调试。 | 需在脚本中合理划分 stages 以获得清晰视图。 |
| 支持复杂流程控制 | 包括条件判断、循环、并行执行、错误处理(try/catch)、超时控制等高级逻辑。 | 相比自由风格项目,具备更强的表达能力。 |
5.2 声明式 Pipeline 与脚本式 Pipeline 对比
| 对比项 | 声明式 Pipeline(Declarative Pipeline) | 脚本式 Pipeline(Scripted Pipeline) | 注意事项 |
|---|
| 语法类型 | 基于预定义结构的声明式语法,更像配置文件 | 基于 Groovy DSL 的编程式语法,更像脚本 | 声明式更易读、易学,适合大多数场景。 |
| 根块(Root Block) | pipeline { ... } | node { ... } | 声明式必须以 pipeline 开始。 |
| 结构要求 | 强制结构化:必须包含 agent、stages、steps 等块 | 灵活,可自由编写 Groovy 代码 | 声明式有助于规范代码结构。 |
| 错误处理 | 使用 options { timeout }、post 块处理失败 | 使用 Groovy 的 try/catch/finally | 脚本式在异常处理上更灵活。 |
| 条件执行 | 使用 when 指令 | 使用 Groovy 的 if/else | 声明式的 when 更简洁。 |
| 并行执行 | 使用 parallel 指令 | 使用 parallel 步骤 | 两者都支持并行构建。 |
| 可扩展性 | 通过 script 块嵌入 Groovy 代码扩展功能 | 完全自由,可调用任意 Groovy 方法 | 脚本式功能更强但易写出难以维护的代码。 |
| 学习曲线 | 较低,适合初学者 | 较高,需了解 Groovy 语法 | 推荐新手从声明式入手。 |
| 社区趋势 | Jenkins 官方推荐,持续增强新功能 | 传统方式,功能稳定但更新较少 | 新项目建议优先使用声明式。 |
5.3 Pipeline 基本语法结构(pipeline, agent, stages, steps)
| 结构名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| pipeline | pipeline { ... } | 所有声明式 Pipeline 的根容器,必须包含 | pipeline { agent any stages { ... } } | 每个 Jenkinsfile 必须有一个且仅一个 pipeline 块。 |
| agent | agent { ... } | 指定 Pipeline 或 stage 在哪个代理节点上执行 | agent any agent none agent { label 'linux' } | any 表示任意可用节点;none 用于顶层定义,由 stage 自行指定。 |
| stages | stages { ... } | 包含一个或多个 stage 的容器,定义构建的逻辑阶段 | stages { stage('Build') { ... } stage('Test') { ... } } | 必须包含至少一个 stage。 |
| stage | stage('Stage Name') { ... } | 定义流水线中的一个阶段,如构建、测试、部署 | stage('Build') { steps { sh 'make' } } | 每个 stage 包含 steps 块,用于执行具体操作。 |
| steps | steps { ... } | 包含一个或多个具体执行命令的容器 | steps { sh 'echo "Hello"' script { def version = getVersion() } } | 是实际执行命令的地方,支持 shell、Groovy 脚本等。 |
| script | script { ... } | 在声明式 Pipeline 中嵌入任意 Groovy 代码 | script { if (env.BRANCH_NAME == 'main') { deployProd() } } | 用于复杂逻辑处理,如变量计算、条件判断等。 |
5.4 使用 Jenkinsfile 管理 Pipeline 代码
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 创建 Jenkinsfile | 在项目根目录创建名为 Jenkinsfile 的文本文件 | 存放 Pipeline 脚本代码 | touch Jenkinsfile | 文件名区分大小写,必须为 Jenkinsfile(无后缀)。 |
| 使用 SCM 中的 Jenkinsfile | 在 Pipeline 任务配置中选择 “Pipeline script from SCM” | 从代码仓库加载 Jenkinsfile | Repository URL: https://github.com/user/project.git Script Path: Jenkinsfile | 推荐做法,实现代码与流程共管。 |
| 编写声明式 Pipeline 脚本 | 在 Jenkinsfile 中编写 pipeline 块 | 定义完整的 CI/CD 流程 | 见下方代码示例 | 确保语法正确,否则构建失败。 |
| 本地测试 Jenkinsfile | 使用 Jenkinsfile Runner 或在线语法检查工具 | 验证脚本语法和逻辑 | 无(工具辅助) | 减少提交后才发现错误的风险。 |
| 版本控制 Jenkinsfile | 将 Jenkinsfile 提交到 Git/SVN 仓库 | 实现变更追踪、代码审查和回滚 | git add Jenkinsfile git commit -m "Add pipeline" git push | 与应用代码一起评审,确保流程一致性。 |
| 多分支 Pipeline 自动发现 | 使用 “Multibranch Pipeline” 任务类型 | 自动为每个分支创建独立 Pipeline | 无(Jenkins 自动扫描) | 要求每个分支都有 Jenkinsfile。 |
| 设置默认分支 | 在 Multibranch 配置中指定 “Discover branches” 策略 | 控制哪些分支触发 Pipeline | 策略:All branches | 可过滤特定分支(如忽略 feature/*)。 |
| 处理语法错误 | 查看构建日志中的 “WorkflowScript: X: “ | 调试 Jenkinsfile 语法问题 | WorkflowScript: 5: Missing required parameter: ‘stages’ | 常见错误包括括号不匹配、缺少必填块等。 |
声明式 Pipeline 示例(Jenkinsfile):
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
}
}
第六章:Jenkinsfile 与高级 Pipeline 语法
6.1 agent 指令详解(any, label, docker, none)
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| agent any | agent any | 在任意可用的代理节点上运行 Pipeline | pipeline { agent any stages { ... } } | 最常用,适用于大多数场景。 |
| agent none | agent none | 不在顶层指定执行节点,由每个 stage 自行定义 | pipeline { agent none stages { stage('Build') { agent { label 'linux' } steps { ... } } } } | 用于多平台或不同阶段需在不同节点运行的场景。 |
| agent label | agent { label 'label-name' } | 指定在具有特定标签的节点上运行 | agent { label 'docker-build' } | 标签需提前在节点配置中定义。 |
| agent node | agent { node { label 'linux && amd64' } } | 使用更复杂的节点选择条件 | agent { node { label 'ubuntu && high-mem' } } | 支持逻辑表达式(&&, ||)。 |
| agent docker | agent { docker 'image-name' } | 在指定的 Docker 镜像容器中运行 Pipeline | agent { docker 'maven:3.8.6-jdk-11' } | 需 Jenkins 主机安装 Docker 并配置权限。 |
| agent dockerfile | agent { dockerfile true } | 使用项目根目录下的 Dockerfile 构建并运行容器 | agent { dockerfile true } 或 agent { dockerfile 'Dockerfile.build' } | 支持指定 Dockerfile 路径。 |
| agent inherit | agent inherit | 在嵌套 stage 中继承父级 agent 配置 | stage('Sub-stage') { agent inherit steps { ... } } | 仅在 stage 级别使用,声明式 Pipeline 中较少见。 |
6.2 stages 与 stage:定义构建阶段
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| stages | stages { ... } | 容器块,包含一个或多个 stage | stages { stage('Build') { steps { sh 'make' } } stage('Test') { steps { sh 'make test' } } } | 必须包含至少一个 stage。 |
| stage | stage('Stage Name') { ... } | 定义流水线中的一个逻辑阶段 | stage('Deploy') { steps { sh './deploy.sh' } } | 阶段名称应清晰描述其功能。 |
| 嵌套 stage | stage('Outer') { stages { stage('Inner A') { ... } stage('Inner B') { ... } } } | 在一个 stage 内部定义多个子阶段 | stage('Build') { stages { stage('Compile') { steps { ... } } stage('Package') { steps { ... } } } } | 可实现更细粒度的可视化和控制。 |
| 可选阶段(when) | stage('Deploy Prod') { when { branch 'main' } steps { ... } } | 根据条件决定是否执行该阶段 | when { expression { env.DEPLOY_ENV == 'prod' } } | 支持 branch、environment、expression 等条件。 |
| 并行阶段 | parallel { stage('Frontend') { ... } stage('Backend') { ... } } | 并行执行多个 stage,提升效率 | 见下方代码示例 | 并行阶段独立运行,失败一个可能导致整体失败。 |
| 阶段超时 | options { timeout(time: 10, unit: 'MINUTES') } | 为单个阶段设置执行超时 | stage('Long Task') { options { timeout(time: 5, unit: 'MINUTES') } steps { ... } } | 超时后阶段标记为失败。 |
6.3 steps:执行具体操作
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| sh | sh 'command' | 在 Linux/Unix 节点上执行 shell 命令 | steps { sh 'mvn clean package' sh 'echo $BUILD_NUMBER' } | 默认使用 /bin/sh 执行。 |
| bat | bat 'command' | 在 Windows 节点上执行批处理命令 | steps { bat 'call mvn clean package' bat 'echo %BUILD_NUMBER%' } | 使用 cmd /c 执行。 |
| script | script { ... } | 执行 Groovy 脚本,用于复杂逻辑 | steps { script { def version = sh(script: 'git describe --tags', returnStdout: true).trim() env.APP_VERSION = version } } | 可访问 Jenkins API 和变量。 |
| echo | echo 'message' | 输出信息到构建日志 | echo 'Starting deployment...' | 用于调试和流程提示。 |
| sleep | sleep(time: 30, unit: 'SECONDS') | 暂停执行一段时间 | sleep(time: 2, unit: 'MINUTES') | 可用于等待外部系统响应。 |
| archiveArtifacts | archiveArtifacts artifacts: 'target/*.jar', allowEmptyArchive: true | 归档构建产物 | archiveArtifacts 'dist/*.zip' | allowEmptyArchive 防止无文件时报错。 |
| junit | junit 'test-results/*.xml' | 发布 JUnit 测试报告 | junit 'build/test-results/test/*.xml' | 需测试框架生成兼容格式。 |
| checkout | checkout scm | 检出当前任务的源码(通常自动执行) | checkout([$class: 'GitSCM', ...]) | 自定义 SCM 行为时使用。 |
6.4 script 块:在声明式 Pipeline 中使用 Groovy
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| script 块 | script { ... } | 在声明式 Pipeline 中嵌入任意 Groovy 代码 | steps { script { def list = [1,2,3] list.each { println it } } } | 是声明式 Pipeline 扩展功能的主要方式。 |
| 定义变量 | script { def version = '1.0' } | 在 Groovy 上下文中声明变量 | script { env.BUILD_TAG = "v${env.BUILD_NUMBER}" } | 可修改环境变量或创建临时变量。 |
| 条件逻辑 | script { if (condition) { ... } } | 实现复杂条件判断 | script { if (env.BRANCH_NAME == 'main') { env.DEPLOY_ENV = 'prod' } else { env.DEPLOY_ENV = 'staging' } } | Groovy 语法,支持 if/else、switch 等。 |
| 循环处理 | script { for (item in list) { ... } } | 遍历集合或执行重复操作 | script { ['dev', 'test', 'prod'].each { env -> sh "deploy.sh $env" } } | 避免无限循环。 |
| 调用函数 | script { def ver = getBuildVersion() } | 调用自定义或共享库函数 | script { def version = sh(script: 'git describe --tags', returnStdout: true).trim() } | 可封装重复逻辑。 |
| 异常处理 | script { try { ... } catch (e) { ... } } | 捕获和处理错误 | script { try { sh 'risky-command' } catch (Exception e) { echo "Warning: ${e}" } } | 防止脚本因单个错误中断。 |
| 返回值处理 | script { return sh(...) } | 从 script 块返回值供后续使用 | script { def output = sh(script: 'whoami', returnStdout: true).trim() env.USER = output } | 使用 returnStdout: true 获取命令输出。 |
6.5 environment:环境变量定义
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| environment 块 | environment { KEY = 'value' } | 定义环境变量,供整个 Pipeline 使用 | environment { APP_NAME = 'my-app' DEBUG = 'true' } | 可在 steps 中通过 env.KEY 访问。 |
| 动态变量(script) | environment { VERSION = script { ... } } | 使用 Groovy 脚本动态生成变量值 | environment { VERSION = script { return sh(script: 'git describe --tags', returnStdout: true).trim() } } | 脚本在 Pipeline 开始时执行一次。 |
| credentials | environment { USER = credentials('cred-id') } | 从 Jenkins 凭据存储中加载敏感信息 | environment { DB_USER = credentials('db-username') DB_PASS = credentials('db-password') } | 自动解密并设置为环境变量,避免明文暴露。 |
| 内置环境变量引用 | environment { MY_BUILD = '$BUILD_NUMBER' } | 使用 Jenkins 内置变量 | environment { BUILD_TAG = 'jenkins-${JOB_NAME}-${BUILD_NUMBER}' } | 支持大多数内置变量插值。 |
| 阶段级 environment | stage('Deploy') { environment { ENV = 'prod' } steps { ... } } | 为特定阶段定义环境变量 | 变量仅在该 stage 内有效 | 优先级高于全局 environment。 |
| 敏感信息保护 | 使用 credentials() 或 Secret Text 类型 | 防止密码、密钥等泄露 | credentials('aws-secret-key') | 日志中会自动屏蔽。 |
6.6 parameters:参数化构建
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| parameters 块 | parameters { ... } | 定义构建时可输入的参数 | parameters { string(name: 'VERSION', defaultValue: '1.0', description: 'App version') } | 必须在 pipeline 块内定义。 |
| string 参数 | string(name: 'KEY', defaultValue: 'val', description: '...') | 字符串输入参数 | string(name: 'TAG', defaultValue: 'latest', description: 'Docker tag') | 最常用参数类型。 |
| booleanParam | booleanParam(name: 'DEBUG', defaultValue: true, description: 'Enable debug?') | 布尔值(复选框)参数 | booleanParam(name: 'CLEAN', defaultValue: false) | 构建时显示为勾选框。 |
| choice | choice(choices: ['dev','staging','prod'], name: 'ENV', description: 'Target environment') | 下拉选择参数 | choice(choices: '''dev\nstaging\nprod''', name: 'DEPLOY_ENV') | choices 为多行字符串。 |
| text | text(name: 'NOTES', defaultValue: '', description: 'Release notes') | 多行文本输入 | text(name: 'SCRIPT', defaultValue: '#!/bin/bash\n') | 适合输入脚本或长文本。 |
| password | password(name: 'SECRET', defaultValue: '', description: 'Secret token') | 密码输入(隐藏显示) | password(name: 'API_KEY', description: 'External API key') | 输入内容在 UI 和日志中隐藏。 |
| 在脚本中使用参数 | steps { sh "echo $VERSION" } | 通过变量名访问参数值 | echo "Deploying $DEPLOY_ENV environment" | 参数自动作为环境变量注入。 |
6.7 options:构建选项(超时、重试、时间戳等)
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| timeout | options { timeout(time: 1, unit: 'HOURS') } | 设置整个 Pipeline 的最大执行时间 | options { timeout(time: 30, unit: 'MINUTES') } | 超时后构建失败。 |
| retry | options { retry(3) } | 构建失败时自动重试指定次数 | options { retry(2) } | 每次失败后立即重试,适用于不稳定外部依赖。 |
| timestamps | options { timestamps() } | 在构建日志中添加时间戳 | options { timestamps() ansiColor('xterm') } | 便于分析各步骤耗时。 |
| buildDiscarder | options { buildDiscarder(logRotator(daysToKeep: 7, numToKeep: 10)) } | 自动清理旧的构建记录 | logRotator(daysToKeep: 30, numToKeep: 50) | 节省磁盘空间。 |
| disableConcurrentBuilds | options { disableConcurrentBuilds() } | 禁止并发构建,确保串行执行 | options { disableConcurrentBuilds() timeout(time: 1, unit: 'HOURS') } | 避免资源冲突或数据竞争。 |
| skipDefaultCheckout | options { skipDefaultCheckout() } | 跳过默认的源码检出操作 | options { skipDefaultCheckout() } | 当使用自定义 checkout 逻辑时使用。 |
| checkoutToSubdirectory | options { checkoutToSubdirectory('src') } | 将源码检出到子目录 | options { checkoutToSubdirectory('project-a') } | 避免覆盖工作区其他文件。 |
| ansiColor | options { ansiColor('xterm') } | 启用 ANSI 颜色输出,美化日志 | options { ansiColor('xterm') } | 需安装 AnsiColor Plugin。 |
6.8 triggers:触发器(cron, webhook, pollSCM)
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| cron | triggers { cron('H */4 * * *') } | 定时触发构建 | triggers { cron('0 2 * * *') // 每天凌晨2点 } | 使用 Jenkins cron 语法,H 表示哈希。 |
| pollSCM | triggers { pollSCM('H/15 * * * *') } | 定期检查源码变更,有更新则构建 | triggers { pollSCM('H/10 * * * *') // 每10分钟检查 } | 消耗资源,推荐用 Webhook 替代。 |
| upstream | triggers { upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS) } | 当上游项目构建成功后触发 | triggers { upstream(upstreamProjects: 'build-app', threshold: SUCCESS) } | 实现任务依赖链。 |
| Generic Webhook Trigger | 需安装插件,配置自定义 Webhook | 响应外部系统(如 GitLab、自定义服务)的 HTTP 请求 | 见插件文档 | 支持解析 JSON、过滤条件等高级功能。 |
| GitHub Hook | triggers { githubPush() } | 响应 GitHub 的 push 事件 | triggers { githubPush() } | 需在 GitHub 仓库设置 Webhook URL。 |
| 多触发器组合 | triggers { cron(...); githubPush() } | 同时启用多种触发方式 | triggers { cron('H 8 * * 1-5') githubPush() } | 任一条件满足即可触发构建。 |
6.9 post:构建后操作(always, success, failure 等)
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| post | post { ... } | 定义构建完成后执行的操作,根据构建状态分支处理 | post { success { ... } failure { ... } } | 通常放在 pipeline 块末尾。 |
| always | always { ... } | 无论构建成功或失败都执行 | always { echo 'Build finished' } | 适合清理、通知等通用操作。 |
| success | success { ... } | 仅当构建成功时执行 | success { emailext(subject: 'Success', body: '...', to: 'team@company.com') } | 用于发送成功通知、触发下游部署。 |
| failure | failure { ... } | 仅当构建失败时执行 | failure { emailext(subject: 'Failed', body: '...', to: 'dev-lead@company.com') } | 用于告警和故障排查。 |
| unstable | unstable { ... } | 当构建结果为”不稳定”(如测试失败)时执行 | unstable { echo 'Tests failed but build succeeded' } | 常用于发送质量警告。 |
| changed | changed { ... } | 仅当本次构建状态与上次不同时执行 | changed { echo 'Status changed to unstable' } | 避免重复通知。 |
| cleanup | cleanup { ... } | 最终清理操作,即使构建被中止也执行 | cleanup { sh 'rm -rf temp/' } | Jenkins 2.173+ 支持,确保资源释放。 |
| 通知集成 | emailext, slackSend, webhook | 发送邮件、Slack 消息或调用 Webhook | emailext(...) slackSend(message: 'Build failed') | 需安装对应插件(Email Extension, Slack)。 |
第四章:Jenkins 任务(Job)基础
4.1 创建自由风格项目(Freestyle Project)
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 新建自由风格项目 | 进入 Jenkins 主页 > 点击”新建任务” > 输入名称 > 选择”构建一个自由风格的项目” | 创建最基础的任务类型,适用于简单自动化流程 | 无(Web 界面操作) | 自由风格项目灵活性高,适合学习和轻量级任务。 |
| 配置任务描述 | 在项目主页点击”配置” > 在”描述”字段输入文本 | 为任务添加说明信息,便于团队理解用途 | 部署前端静态资源到测试环境 | 支持 HTML 标签格式化内容。 |
| 启用/禁用任务 | 在项目主页点击”启用”或”禁用” | 暂时停止任务执行而不删除 | 无 | 禁用后仍保留构建历史和配置。 |
| 复制现有任务 | ”新建任务” > 选择”复制现有项目” > 输入新名称并指定源任务 | 快速创建结构相似的任务,减少重复配置 | 源任务:build-frontend,新任务:build-backend | 修改后需检查路径、参数等是否适配。 |
| 删除任务 | 在项目主页点击”删除项目” | 彻底移除任务及其所有构建历史 | 无 | 删除操作不可逆,请谨慎执行。 |
| 设置任务图标/颜色(通过插件) | 使用 “Build Monitor View” 等插件自定义显示样式 | 在仪表盘中突出关键任务状态 | 无 | 提升可视化监控效率。 |
4.2 配置源码管理(SCM):Git 与 SVN
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 启用 Git 源码管理 | 在任务配置中 > “源码管理” > 选择”Git” | 从 Git 仓库拉取代码进行构建 | Repository URL: https://github.com/user/repo.git | 需提前安装 Git Plugin。 |
| 配置 Git 仓库地址 | 填写 Repository URL 字段 | 指定代码仓库位置 | https://github.com/jenkinsci/jenkins.git | 支持 HTTPS 和 SSH 协议。 |
| 设置 Git 凭据 | 使用”添加”按钮配置用户名/密码或 SSH 私钥 | 认证访问私有仓库 | 类型:Username with password 或 SSH Username with private key | 私钥应使用 Jenkins Credentials Store 管理。 |
| 指定分支 | 在 “Branches to build” 中填写分支名 | 控制构建特定分支代码 | */main 或 */develop | 默认为 */main。 |
| 启用 SVN 源码管理 | 在任务配置中 > “源码管理” > 选择”Subversion” | 从 SVN 仓库检出代码 | Repository URL: http://svn.company.com/svn/project/trunk | 需安装 Subversion Plugin。 |
| 配置 SVN 凭据 | 添加用户名/密码类型凭据 | 认证访问 SVN 服务器 | Domain: company.com, Username: jenkins, Password: *** | 支持 Windows 域账户。 |
| 定义本地检出目录 | 使用 “Check-out to a sub-directory” 或自定义 workspace 路径 | 将代码检出到指定子目录 | sub-project-a | 避免覆盖已有文件。 |
| 高级 Git 配置 | 点击”高级”按钮设置更多选项 | 自定义克隆行为、超时等 | Clone depth: 1, Timeout (minutes): 10 | 浅克隆可加快速度但不包含完整历史。 |
4.3 构建触发器:定时构建与远程触发
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 定时构建(Build periodically) | 在”构建触发器”中勾选 > 输入 cron 表达式 | 按固定时间间隔自动触发构建 | H 2 * * *(每天凌晨2点) | H 表示”哈希”,分散负载避免峰值。 |
| Cron 语法格式 | 分 时 日 月 周 | 定义触发时间规则 | H/15 * * * *(每15分钟一次) | 不支持秒级精度;H 可替代具体数字。 |
| GitHub Webhook 触发 | 勾选”GitHub hook trigger for GITScm polling” | 当代码推送到 GitHub 时自动触发构建 | 无(需在 GitHub 仓库设置 Webhook) | 必须配合 GitHub Integration Plugin 使用。 |
| 轮询 SCM(Poll SCM) | 勾选并输入 cron 表达式 | 定期检查代码库变更,有更新则构建 | H/5 * * * *(每5分钟检查一次) | 消耗资源较多,建议用 Webhook 替代。 |
| 远程触发构建(Trigger builds remotely) | 勾选并设置认证令牌(Token) | 允许外部系统通过 HTTP 请求触发构建 | Token: my-secret-token | URL 格式:http://jenkins/job/job-name/build?token=my-secret-token |
| 使用身份验证令牌 | 在远程触发时添加 token 参数 | 防止未授权调用 | curl -X POST http://jenkins/job/deploy-prod/build?token=abc123 | 建议使用长随机字符串作为 token。 |
| 构建另一个项目(Build after other projects are built) | 指定上游项目名称和触发条件 | 实现任务依赖链 | 项目名:build-app,条件:成功 | 支持失败、不稳定等状态判断。 |
4.4 执行 Shell/Windows 批处理命令
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 添加构建步骤:执行 Shell | 在”构建”部分点击”增加构建步骤” > “执行 Shell” | 在 Linux/Unix 环境下运行命令 | 见下方代码示例 | 默认使用 /bin/sh -xe 执行,-x 显示命令,-e 出错退出。 |
| Shell 脚本中的变量使用 | 使用 BUILD_NUMBER、JOB_NAME 等内置变量 | 动态生成文件名或路径 | echo "Building version $BUILD_NUMBER of $JOB_NAME" | 完整变量列表见 Jenkins 环境变量文档。 |
| 添加构建步骤:执行 Windows 批处理 | 在”构建”部分点击”增加构建步骤” > “执行 Windows 批处理” | 在 Windows 代理节点上运行 .bat 或 .cmd 文件 | echo Starting... call mvn clean package | 使用 cmd /c 执行,支持标准批处理语法。 |
| 设置脚本编码(Windows) | 在批处理步骤中指定”Use custom workspace”或系统区域设置 | 避免中文乱码问题 | chcp 65001 >nul(切换到 UTF-8) | 特别是在处理非英文路径时。 |
| 多行脚本支持 | 在文本框中直接输入多行命令 | 组织复杂构建逻辑 | mkdir dist cp -r src/* dist/ zip -r dist.zip dist/ | 注意缩进不影响执行,但建议保持可读性。 |
| 脚本退出码处理 | 命令返回非零退出码时构建失败 | 控制构建成功/失败状态 | exit 1(标记失败) exit 0(标记成功) | Jenkins 根据最后一条命令的退出码判断结果。 |
| 使用管道和重定向 | 结合 shell 重定向操作符 | 捕获输出、日志记录等 | npm run test > test.log 2>&1 | 可用于调试或归档中间结果。 |
Shell 构建步骤示例:
#!/bin/bash
echo "Starting build..."
npm install
npm run build
4.5 构建后操作:归档、邮件通知、清理
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 归档构建产物(Archive the artifacts) | 在”构建后操作”中添加 > 设置”文件”路径 | 保存生成的文件(如 jar、zip)供后续下载或部署 | dist/*.zip 或 target/*.jar | 支持通配符;产物保存在 Jenkins 服务器上。 |
| 设置归档文件路径 | 使用相对路径(基于 workspace) | 指定要归档的文件位置 | build/output/*.war | 路径错误将导致”没有匹配的文件”警告。 |
| 归档测试报告(Publish JUnit test result report) | 添加该操作 > 设置测试报告 XML 路径 | 展示单元测试结果和历史趋势 | **/test-reports/*.xml | 需测试框架输出兼容 JUnit 格式的报告。 |
| 发送邮件通知(E-mail Notification) | 添加该操作 > 输入收件人列表 | 构建失败或状态变更时发送邮件 | dev-team@company.com, qa-lead@company.com | 需提前在系统设置中配置 SMTP 服务器。 |
| 使用 Email Extension Plugin | 替代默认邮件功能,支持更灵活模板 | 自定义邮件主题、内容、收件人策略 | $DEFAULT_SUBJECT $DEFAULT_CONTENT | 支持 HTML、附件、条件发送等高级功能。 |
| 构建后清理工作空间(Delete workspace after build) | 添加”构建后操作” > “Delete workspace when build is done” | 释放磁盘空间,避免残留文件影响下次构建 | 无 | 建议在调试完成后启用。 |
| 条件化清理(Workspace Cleanup Plugin) | 使用高级清理策略,如保留最近 N 次构建的工作区 | 平衡磁盘使用与调试需求 | 保留策略:按数量保留,最大 3 个 | 可结合标签或路径进行精细控制。 |
| 触发下游项目 | 添加”构建其他项目”操作 | 实现构建流水线串联 | 项目名:deploy-staging, 参数:VERSION=$BUILD_NUMBER | 支持同步或异步触发。 |
第五章:Jenkins Pipeline 入门
5.1 什么是 Jenkins Pipeline
| 概念名称 | 说明 | 注意事项 |
|---|
| Jenkins Pipeline | 一套插件,支持在 Jenkins 中实现持续交付流水线即代码(Pipeline as Code)。它允许将构建、测试、部署等流程定义为可版本控制的脚本。 | Pipeline 是 Jenkins 2.0 的核心特性,取代传统自由风格项目的复杂配置。 |
| 流水线即代码(Pipeline as Code) | 使用代码(Groovy 脚本)定义 CI/CD 流程,存入源码仓库(如 Git),实现版本化、复用和审查。 | 推荐将 Jenkinsfile 提交到项目仓库,与代码一同管理。 |
| Pipeline 任务类型 | Jenkins 中的一种任务形式,用于运行基于 Groovy 的流水线脚本,支持声明式和脚本式两种语法。 | 创建任务时选择 “Pipeline” 类型。 |
| 持久化与暂停能力 | Pipeline 支持长时间运行、跨节点执行,并可在等待人工审批等操作时暂停,状态持久保存。 | 即使 Jenkins 重启,运行中的 Pipeline 也能恢复。 |
| 可视化阶段视图 | Pipeline 运行时可在 Web 界面查看各阶段(Stage)的执行状态和耗时,便于监控和调试。 | 需在脚本中合理划分 stages 以获得清晰视图。 |
| 支持复杂流程控制 | 包括条件判断、循环、并行执行、错误处理(try/catch)、超时控制等高级逻辑。 | 相比自由风格项目,具备更强的表达能力。 |
5.2 声明式 Pipeline 与脚本式 Pipeline 对比
| 对比项 | 声明式 Pipeline(Declarative Pipeline) | 脚本式 Pipeline(Scripted Pipeline) | 注意事项 |
|---|
| 语法类型 | 基于预定义结构的声明式语法,更像配置文件 | 基于 Groovy DSL 的编程式语法,更像脚本 | 声明式更易读、易学,适合大多数场景。 |
| 根块(Root Block) | pipeline { ... } | node { ... } | 声明式必须以 pipeline 开始。 |
| 结构要求 | 强制结构化:必须包含 agent、stages、steps 等块 | 灵活,可自由编写 Groovy 代码 | 声明式有助于规范代码结构。 |
| 错误处理 | 使用 options { timeout }、post 块处理失败 | 使用 Groovy 的 try/catch/finally | 脚本式在异常处理上更灵活。 |
| 条件执行 | 使用 when 指令 | 使用 Groovy 的 if/else | 声明式的 when 更简洁。 |
| 并行执行 | 使用 parallel 指令 | 使用 parallel 步骤 | 两者都支持并行构建。 |
| 可扩展性 | 通过 script 块嵌入 Groovy 代码扩展功能 | 完全自由,可调用任意 Groovy 方法 | 脚本式功能更强但易写出难以维护的代码。 |
| 学习曲线 | 较低,适合初学者 | 较高,需了解 Groovy 语法 | 推荐新手从声明式入手。 |
| 社区趋势 | Jenkins 官方推荐,持续增强新功能 | 传统方式,功能稳定但更新较少 | 新项目建议优先使用声明式。 |
5.3 Pipeline 基本语法结构(pipeline, agent, stages, steps)
| 结构名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| pipeline | pipeline { ... } | 所有声明式 Pipeline 的根容器,必须包含 | pipeline { agent any stages { ... } } | 每个 Jenkinsfile 必须有一个且仅一个 pipeline 块。 |
| agent | agent { ... } | 指定 Pipeline 或 stage 在哪个代理节点上执行 | agent any agent none agent { label 'linux' } | any 表示任意可用节点;none 用于顶层定义,由 stage 自行指定。 |
| stages | stages { ... } | 包含一个或多个 stage 的容器,定义构建的逻辑阶段 | stages { stage('Build') { ... } stage('Test') { ... } } | 必须包含至少一个 stage。 |
| stage | stage('Stage Name') { ... } | 定义流水线中的一个阶段,如构建、测试、部署 | stage('Build') { steps { sh 'make' } } | 每个 stage 包含 steps 块,用于执行具体操作。 |
| steps | steps { ... } | 包含一个或多个具体执行命令的容器 | steps { sh 'echo "Hello"' script { def version = getVersion() } } | 是实际执行命令的地方,支持 shell、Groovy 脚本等。 |
| script | script { ... } | 在声明式 Pipeline 中嵌入任意 Groovy 代码 | script { if (env.BRANCH_NAME == 'main') { deployProd() } } | 用于复杂逻辑处理,如变量计算、条件判断等。 |
5.4 使用 Jenkinsfile 管理 Pipeline 代码
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 创建 Jenkinsfile | 在项目根目录创建名为 Jenkinsfile 的文本文件 | 存放 Pipeline 脚本代码 | touch Jenkinsfile | 文件名区分大小写,必须为 Jenkinsfile(无后缀)。 |
| 使用 SCM 中的 Jenkinsfile | 在 Pipeline 任务配置中选择 “Pipeline script from SCM” | 从代码仓库加载 Jenkinsfile | Repository URL: https://github.com/user/project.git Script Path: Jenkinsfile | 推荐做法,实现代码与流程共管。 |
| 编写声明式 Pipeline 脚本 | 在 Jenkinsfile 中编写 pipeline 块 | 定义完整的 CI/CD 流程 | 见下方代码示例 | 确保语法正确,否则构建失败。 |
| 本地测试 Jenkinsfile | 使用 Jenkinsfile Runner 或在线语法检查工具 | 验证脚本语法和逻辑 | 无(工具辅助) | 减少提交后才发现错误的风险。 |
| 版本控制 Jenkinsfile | 将 Jenkinsfile 提交到 Git/SVN 仓库 | 实现变更追踪、代码审查和回滚 | git add Jenkinsfile git commit -m "Add pipeline" git push | 与应用代码一起评审,确保流程一致性。 |
| 多分支 Pipeline 自动发现 | 使用 “Multibranch Pipeline” 任务类型 | 自动为每个分支创建独立 Pipeline | 无(Jenkins 自动扫描) | 要求每个分支都有 Jenkinsfile。 |
| 设置默认分支 | 在 Multibranch 配置中指定 “Discover branches” 策略 | 控制哪些分支触发 Pipeline | 策略:All branches | 可过滤特定分支(如忽略 feature/*)。 |
| 处理语法错误 | 查看构建日志中的 “WorkflowScript: X: “ | 调试 Jenkinsfile 语法问题 | WorkflowScript: 5: Missing required parameter: ‘stages’ | 常见错误包括括号不匹配、缺少必填块等。 |
声明式 Pipeline 示例(Jenkinsfile):
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
}
}
第六章:Jenkinsfile 与高级 Pipeline 语法
6.1 agent 指令详解(any, label, docker, none)
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| agent any | agent any | 在任意可用的代理节点上运行 Pipeline | pipeline { agent any stages { ... } } | 最常用,适用于大多数场景。 |
| agent none | agent none | 不在顶层指定执行节点,由每个 stage 自行定义 | pipeline { agent none stages { stage('Build') { agent { label 'linux' } steps { ... } } } } | 用于多平台或不同阶段需在不同节点运行的场景。 |
| agent label | agent { label 'label-name' } | 指定在具有特定标签的节点上运行 | agent { label 'docker-build' } | 标签需提前在节点配置中定义。 |
| agent node | agent { node { label 'linux && amd64' } } | 使用更复杂的节点选择条件 | agent { node { label 'ubuntu && high-mem' } } | 支持逻辑表达式(&&, ||)。 |
| agent docker | agent { docker 'image-name' } | 在指定的 Docker 镜像容器中运行 Pipeline | agent { docker 'maven:3.8.6-jdk-11' } | 需 Jenkins 主机安装 Docker 并配置权限。 |
| agent dockerfile | agent { dockerfile true } | 使用项目根目录下的 Dockerfile 构建并运行容器 | agent { dockerfile true } 或 agent { dockerfile 'Dockerfile.build' } | 支持指定 Dockerfile 路径。 |
| agent inherit | agent inherit | 在嵌套 stage 中继承父级 agent 配置 | stage('Sub-stage') { agent inherit steps { ... } } | 仅在 stage 级别使用,声明式 Pipeline 中较少见。 |
6.2 stages 与 stage:定义构建阶段
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| stages | stages { ... } | 容器块,包含一个或多个 stage | stages { stage('Build') { steps { sh 'make' } } stage('Test') { steps { sh 'make test' } } } | 必须包含至少一个 stage。 |
| stage | stage('Stage Name') { ... } | 定义流水线中的一个逻辑阶段 | stage('Deploy') { steps { sh './deploy.sh' } } | 阶段名称应清晰描述其功能。 |
| 嵌套 stage | stage('Outer') { stages { stage('Inner A') { ... } stage('Inner B') { ... } } } | 在一个 stage 内部定义多个子阶段 | stage('Build') { stages { stage('Compile') { steps { ... } } stage('Package') { steps { ... } } } } | 可实现更细粒度的可视化和控制。 |
| 可选阶段(when) | stage('Deploy Prod') { when { branch 'main' } steps { ... } } | 根据条件决定是否执行该阶段 | when { expression { env.DEPLOY_ENV == 'prod' } } | 支持 branch、environment、expression 等条件。 |
| 并行阶段 | parallel { stage('Frontend') { ... } stage('Backend') { ... } } | 并行执行多个 stage,提升效率 | 见下方代码示例 | 并行阶段独立运行,失败一个可能导致整体失败。 |
| 阶段超时 | options { timeout(time: 10, unit: 'MINUTES') } | 为单个阶段设置执行超时 | stage('Long Task') { options { timeout(time: 5, unit: 'MINUTES') } steps { ... } } | 超时后阶段标记为失败。 |
6.3 steps:执行具体操作
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| sh | sh 'command' | 在 Linux/Unix 节点上执行 shell 命令 | steps { sh 'mvn clean package' sh 'echo $BUILD_NUMBER' } | 默认使用 /bin/sh 执行。 |
| bat | bat 'command' | 在 Windows 节点上执行批处理命令 | steps { bat 'call mvn clean package' bat 'echo %BUILD_NUMBER%' } | 使用 cmd /c 执行。 |
| script | script { ... } | 执行 Groovy 脚本,用于复杂逻辑 | steps { script { def version = sh(script: 'git describe --tags', returnStdout: true).trim() env.APP_VERSION = version } } | 可访问 Jenkins API 和变量。 |
| echo | echo 'message' | 输出信息到构建日志 | echo 'Starting deployment...' | 用于调试和流程提示。 |
| sleep | sleep(time: 30, unit: 'SECONDS') | 暂停执行一段时间 | sleep(time: 2, unit: 'MINUTES') | 可用于等待外部系统响应。 |
| archiveArtifacts | archiveArtifacts artifacts: 'target/*.jar', allowEmptyArchive: true | 归档构建产物 | archiveArtifacts 'dist/*.zip' | allowEmptyArchive 防止无文件时报错。 |
| junit | junit 'test-results/*.xml' | 发布 JUnit 测试报告 | junit 'build/test-results/test/*.xml' | 需测试框架生成兼容格式。 |
| checkout | checkout scm | 检出当前任务的源码(通常自动执行) | checkout([$class: 'GitSCM', ...]) | 自定义 SCM 行为时使用。 |
6.4 script 块:在声明式 Pipeline 中使用 Groovy
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| script 块 | script { ... } | 在声明式 Pipeline 中嵌入任意 Groovy 代码 | steps { script { def list = [1,2,3] list.each { println it } } } | 是声明式 Pipeline 扩展功能的主要方式。 |
| 定义变量 | script { def version = '1.0' } | 在 Groovy 上下文中声明变量 | script { env.BUILD_TAG = "v${env.BUILD_NUMBER}" } | 可修改环境变量或创建临时变量。 |
| 条件逻辑 | script { if (condition) { ... } } | 实现复杂条件判断 | script { if (env.BRANCH_NAME == 'main') { env.DEPLOY_ENV = 'prod' } else { env.DEPLOY_ENV = 'staging' } } | Groovy 语法,支持 if/else、switch 等。 |
| 循环处理 | script { for (item in list) { ... } } | 遍历集合或执行重复操作 | script { ['dev', 'test', 'prod'].each { env -> sh "deploy.sh $env" } } | 避免无限循环。 |
| 调用函数 | script { def ver = getBuildVersion() } | 调用自定义或共享库函数 | script { def version = sh(script: 'git describe --tags', returnStdout: true).trim() } | 可封装重复逻辑。 |
| 异常处理 | script { try { ... } catch (e) { ... } } | 捕获和处理错误 | script { try { sh 'risky-command' } catch (Exception e) { echo "Warning: ${e}" } } | 防止脚本因单个错误中断。 |
| 返回值处理 | script { return sh(...) } | 从 script 块返回值供后续使用 | script { def output = sh(script: 'whoami', returnStdout: true).trim() env.USER = output } | 使用 returnStdout: true 获取命令输出。 |
6.5 environment:环境变量定义
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| environment 块 | environment { KEY = 'value' } | 定义环境变量,供整个 Pipeline 使用 | environment { APP_NAME = 'my-app' DEBUG = 'true' } | 可在 steps 中通过 env.KEY 访问。 |
| 动态变量(script) | environment { VERSION = script { ... } } | 使用 Groovy 脚本动态生成变量值 | environment { VERSION = script { return sh(script: 'git describe --tags', returnStdout: true).trim() } } | 脚本在 Pipeline 开始时执行一次。 |
| credentials | environment { USER = credentials('cred-id') } | 从 Jenkins 凭据存储中加载敏感信息 | environment { DB_USER = credentials('db-username') DB_PASS = credentials('db-password') } | 自动解密并设置为环境变量,避免明文暴露。 |
| 内置环境变量引用 | environment { MY_BUILD = '$BUILD_NUMBER' } | 使用 Jenkins 内置变量 | environment { BUILD_TAG = 'jenkins-${JOB_NAME}-${BUILD_NUMBER}' } | 支持大多数内置变量插值。 |
| 阶段级 environment | stage('Deploy') { environment { ENV = 'prod' } steps { ... } } | 为特定阶段定义环境变量 | 变量仅在该 stage 内有效 | 优先级高于全局 environment。 |
| 敏感信息保护 | 使用 credentials() 或 Secret Text 类型 | 防止密码、密钥等泄露 | credentials('aws-secret-key') | 日志中会自动屏蔽。 |
6.6 parameters:参数化构建
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| parameters 块 | parameters { ... } | 定义构建时可输入的参数 | parameters { string(name: 'VERSION', defaultValue: '1.0', description: 'App version') } | 必须在 pipeline 块内定义。 |
| string 参数 | string(name: 'KEY', defaultValue: 'val', description: '...') | 字符串输入参数 | string(name: 'TAG', defaultValue: 'latest', description: 'Docker tag') | 最常用参数类型。 |
| booleanParam | booleanParam(name: 'DEBUG', defaultValue: true, description: 'Enable debug?') | 布尔值(复选框)参数 | booleanParam(name: 'CLEAN', defaultValue: false) | 构建时显示为勾选框。 |
| choice | choice(choices: ['dev','staging','prod'], name: 'ENV', description: 'Target environment') | 下拉选择参数 | choice(choices: '''dev\nstaging\nprod''', name: 'DEPLOY_ENV') | choices 为多行字符串。 |
| text | text(name: 'NOTES', defaultValue: '', description: 'Release notes') | 多行文本输入 | text(name: 'SCRIPT', defaultValue: '#!/bin/bash\n') | 适合输入脚本或长文本。 |
| password | password(name: 'SECRET', defaultValue: '', description: 'Secret token') | 密码输入(隐藏显示) | password(name: 'API_KEY', description: 'External API key') | 输入内容在 UI 和日志中隐藏。 |
| 在脚本中使用参数 | steps { sh "echo $VERSION" } | 通过变量名访问参数值 | echo "Deploying $DEPLOY_ENV environment" | 参数自动作为环境变量注入。 |
6.7 options:构建选项(超时、重试、时间戳等)
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| timeout | options { timeout(time: 1, unit: 'HOURS') } | 设置整个 Pipeline 的最大执行时间 | options { timeout(time: 30, unit: 'MINUTES') } | 超时后构建失败。 |
| retry | options { retry(3) } | 构建失败时自动重试指定次数 | options { retry(2) } | 每次失败后立即重试,适用于不稳定外部依赖。 |
| timestamps | options { timestamps() } | 在构建日志中添加时间戳 | options { timestamps() ansiColor('xterm') } | 便于分析各步骤耗时。 |
| buildDiscarder | options { buildDiscarder(logRotator(daysToKeep: 7, numToKeep: 10)) } | 自动清理旧的构建记录 | logRotator(daysToKeep: 30, numToKeep: 50) | 节省磁盘空间。 |
| disableConcurrentBuilds | options { disableConcurrentBuilds() } | 禁止并发构建,确保串行执行 | options { disableConcurrentBuilds() timeout(time: 1, unit: 'HOURS') } | 避免资源冲突或数据竞争。 |
| skipDefaultCheckout | options { skipDefaultCheckout() } | 跳过默认的源码检出操作 | options { skipDefaultCheckout() } | 当使用自定义 checkout 逻辑时使用。 |
| checkoutToSubdirectory | options { checkoutToSubdirectory('src') } | 将源码检出到子目录 | options { checkoutToSubdirectory('project-a') } | 避免覆盖工作区其他文件。 |
| ansiColor | options { ansiColor('xterm') } | 启用 ANSI 颜色输出,美化日志 | options { ansiColor('xterm') } | 需安装 AnsiColor Plugin。 |
6.8 triggers:触发器(cron, webhook, pollSCM)
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| cron | triggers { cron('H */4 * * *') } | 定时触发构建 | triggers { cron('0 2 * * *') // 每天凌晨2点 } | 使用 Jenkins cron 语法,H 表示哈希。 |
| pollSCM | triggers { pollSCM('H/15 * * * *') } | 定期检查源码变更,有更新则构建 | triggers { pollSCM('H/10 * * * *') // 每10分钟检查 } | 消耗资源,推荐用 Webhook 替代。 |
| upstream | triggers { upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS) } | 当上游项目构建成功后触发 | triggers { upstream(upstreamProjects: 'build-app', threshold: SUCCESS) } | 实现任务依赖链。 |
| Generic Webhook Trigger | 需安装插件,配置自定义 Webhook | 响应外部系统(如 GitLab、自定义服务)的 HTTP 请求 | 见插件文档 | 支持解析 JSON、过滤条件等高级功能。 |
| GitHub Hook | triggers { githubPush() } | 响应 GitHub 的 push 事件 | triggers { githubPush() } | 需在 GitHub 仓库设置 Webhook URL。 |
| 多触发器组合 | triggers { cron(...); githubPush() } | 同时启用多种触发方式 | triggers { cron('H 8 * * 1-5') githubPush() } | 任一条件满足即可触发构建。 |
6.9 post:构建后操作(always, success, failure 等)
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|
| post | post { ... } | 定义构建完成后执行的操作,根据构建状态分支处理 | post { success { ... } failure { ... } } | 通常放在 pipeline 块末尾。 |
| always | always { ... } | 无论构建成功或失败都执行 | always { echo 'Build finished' } | 适合清理、通知等通用操作。 |
| success | success { ... } | 仅当构建成功时执行 | success { emailext(subject: 'Success', body: '...', to: 'team@company.com') } | 用于发送成功通知、触发下游部署。 |
| failure | failure { ... } | 仅当构建失败时执行 | failure { emailext(subject: 'Failed', body: '...', to: 'dev-lead@company.com') } | 用于告警和故障排查。 |
| unstable | unstable { ... } | 当构建结果为”不稳定”(如测试失败)时执行 | unstable { echo 'Tests failed but build succeeded' } | 常用于发送质量警告。 |
| changed | changed { ... } | 仅当本次构建状态与上次不同时执行 | changed { echo 'Status changed to unstable' } | 避免重复通知。 |
| cleanup | cleanup { ... } | 最终清理操作,即使构建被中止也执行 | cleanup { sh 'rm -rf temp/' } | Jenkins 2.173+ 支持,确保资源释放。 |
| 通知集成 | emailext, slackSend, webhook | 发送邮件、Slack 消息或调用 Webhook | emailext(...) slackSend(message: 'Build failed') | 需安装对应插件(Email Extension, Slack)。 |
第七章:Jenkins 插件生态与常用插件
7.1 插件管理:安装、更新与卸载
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 安装插件(Web 界面) | “Manage Jenkins” > “Manage Plugins” > “Available” 标签页 > 搜索并勾选插件 > 点击”Install without restart” | 安装新插件扩展 Jenkins 功能 | 无(图形化操作) | 建议勾选”安装后重启”以确保稳定加载。 |
| 批量安装插件 | 在”Available”标签页中选择多个插件同时安装 | 快速部署常用插件集 | 例如:Git Plugin, Email Extension, Blue Ocean | 注意依赖关系,避免冲突。 |
| 更新插件 | ”Manage Jenkins” > “Manage Plugins” > “Updates” 标签页 > 选择要更新的插件 > 安装 | 修复漏洞、获取新功能 | 建议定期检查更新 | 更新前建议备份 JENKINS_HOME。 |
| 卸载插件 | ”Manage Plugins” > “Installed” 标签页 > 找到插件 > 勾选并点击”Uninstall” | 移除不再需要的插件 | 无 | 卸载后相关配置和任务可能失效,请谨慎操作。 |
| 手动上传插件(HPI 文件) | “Advanced” 标签页 > “Upload Plugin” > 选择本地 .hpi 文件 | 在无网络环境或测试未发布插件时使用 | 无 | 需确保插件兼容当前 Jenkins 版本。 |
| 查看插件依赖 | 安装时系统自动提示依赖项 | 了解插件所需前置组件 | 如 Blue Ocean 需要多个子插件 | Jenkins 会自动安装依赖,除非禁用。 |
| 禁用插件 | 在”Installed”列表中点击”Disable” | 临时关闭插件功能而不删除 | 用于排查问题或性能调优 | 禁用后相关功能立即不可用。 |
7.2 Git Plugin 与 GitHub Integration
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| Git Plugin 基本配置 | 任务配置中 > “源码管理” > 选择 Git > 填写仓库 URL 和凭据 | 拉取代码进行构建 | Repository URL: https://github.com/user/project.git | 需提前安装 Git 命令行工具。 |
| 使用 SSH 访问私有仓库 | 配置 Jenkins 凭据为 SSH Username with private key | 安全认证 Git 仓库 | 私钥应使用 Jenkins Credentials Store 存储 | 公钥需添加到 GitHub/GitLab 账户。 |
| GitHub Integration Plugin 安装 | 安装 “GitHub” 插件 | 实现 Jenkins 与 GitHub 深度集成 | 无 | 支持 Webhook 自动触发、状态回写等。 |
| 自动触发构建(Webhook) | 插件自动配置 GitHub Webhook URL:https://<jenkins-url>/github-webhook/ | Push 或 Pull Request 事件触发构建 | 无需手动设置 Webhook | 需 Jenkins 可被公网访问。 |
| GitHub 仓库连接配置 | ”Manage Jenkins” > “Configure System” > “GitHub” > 添加 GitHub Server | 建立 Jenkins 到 GitHub 的连接 | API URL: https://api.github.com | 可使用 Personal Access Token 认证。 |
| 状态回写(Status Check) | 构建完成后自动向 GitHub 提交状态(成功/失败) | 在 PR 页面显示 CI 状态 | 无需额外配置,插件自动处理 | 提升协作效率,便于合并判断。 |
| 多分支 Pipeline 支持 | 创建 “Multibranch Pipeline” 任务 > 关联 GitHub 仓库 | 自动发现并为每个分支创建 Pipeline | 扫描策略:定期或事件驱动 | 要求每个分支包含 Jenkinsfile。 |
7.3 Email Extension Plugin 配置
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 安装 Email Extension Plugin | ”Manage Plugins” > 搜索 “Email Extension Plugin” > 安装 | 替代默认邮件功能,提供更灵活的邮件通知 | 无 | 功能远超内置邮件通知。 |
| 配置 SMTP 服务器 | ”Manage Jenkins” > “Configure System” > “Extended E-mail Notification” > 设置 SMTP host, port, user, password | 发送邮件的基础配置 | SMTP Server: smtp.company.com Port: 587 Use SSL: ✔ | 需确保网络可达且凭据正确。 |
| 设置默认发件人 | 在”Default User E-mail Suffix”或”System Admin e-mail address”中配置 | 避免邮件被识别为垃圾邮件 | System Admin e-mail address: jenkins@company.com | 建议使用企业邮箱域名。 |
| 使用预设内容模板 | 在构建后操作中选择 “Editable Email Notification” > 使用 $DEFAULT_SUBJECT, $DEFAULT_CONTENT | 快速配置标准邮件内容 | Subject: $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS! | 支持大量内置变量。 |
| 自定义邮件内容(HTML) | 编辑 “Content” 字段,使用 HTML + Groovy 变量 | 美化邮件样式,包含构建详情 | <h3>Build Failed</h3><p>Job: ${JOB_NAME}</p> | 可结合 CSS 样式提升可读性。 |
| 条件化收件人 | 使用 “Triggers” 设置不同状态的收件人列表 | 精准通知相关人员 | Failure: dev-lead@company.com, qa-team@company.com | 避免无关人员收到告警。 |
| 添加附件 | 在 “Attachments” 字段指定文件路径 | 发送日志、报告等文件 | **/test-results/*.xml, build.log | 支持通配符。 |
| 测试邮件配置 | 使用 “Test configuration by sending test e-mail” 功能 | 验证邮件能否正常发送 | 输入测试邮箱地址 > 发送 | 排查配置错误的有效手段。 |
7.4 Blue Ocean 插件使用
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 安装 Blue Ocean | 安装 “Blue Ocean” 插件(包含多个子插件) | 提供现代化、用户友好的 Jenkins UI | 无 | 安装后访问 /blue 路径进入。 |
| 访问 Blue Ocean 界面 | 浏览器访问 http://<jenkins-url>/blue | 使用全新 UI 查看和管理 Pipeline | 无 | 界面更直观,适合团队协作。 |
| 可视化 Pipeline 编辑器 | 在 Blue Ocean 中点击 “Create Pipeline” > 图形化拖拽方式创建 Pipeline | 无需编写代码即可定义流水线 | 无(GUI 操作) | 适合初学者快速上手。 |
| 实时构建可视化 | 查看 Pipeline 各 stage 的实时执行状态、耗时、日志 | 监控构建进度,快速定位瓶颈 | 无 | 支持并行 stage 的清晰展示。 |
| 查看构建详情 | 点击具体构建记录,查看每个 step 的日志输出 | 调试构建失败原因 | 无 | 日志高亮显示错误行。 |
| 多分支 Pipeline 管理 | 自动发现 Git 仓库中的分支和 Pull Request | 统一管理所有分支的 CI 流程 | 无 | 支持 GitHub, Bitbucket, GitLab。 |
| PR 集成与状态展示 | 在 Blue Ocean 中直接查看 PR 构建状态和详情 | 加强代码审查与 CI 的联动 | 无 | 需正确配置 GitHub/GitLab 集成。 |
| 用户权限与协作 | 支持基于角色的访问控制,团队成员可共同查看流水线 | 提升团队透明度和协作效率 | 无 | 需配合 Role-Based Strategy 插件使用。 |
7.5 Credentials Binding Plugin
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 安装 Credentials Binding Plugin | 该插件通常作为依赖自动安装 | 提供将凭据安全绑定到环境变量或文件的功能 | 无 | 是安全实践的核心插件之一。 |
| 在 Jenkinsfile 中使用 withCredentials | 使用 withCredentials 步骤绑定凭据 | 在构建过程中安全使用密码、密钥等 | 见下方代码示例 | 凭据在内存中使用,不会明文写入日志。 |
| 绑定用户名/密码 | credentialsId 对应 Jenkins 凭据 ID | 访问需要认证的 API 或服务 | usernamePassword(...) | 最常见用法。 |
| 绑定 SSH 私钥 | sshUserPrivateKey(credentialsId: 'key-id', keyFileVariable: 'KEY') | 使用 SSH 密钥进行远程登录或 Git 操作 | sh "ssh -i $KEY user@host" | 避免将私钥硬编码在脚本中。 |
| 绑定 secret text | string(credentialsId: 'api-token', variable: 'TOKEN') | 使用 API Token、密钥等纯文本凭据 | sh 'curl -H "Authorization: Bearer $TOKEN" ...' | 适用于 OAuth Token 等场景。 |
| 绑定证书文件 | certificate(credentialsId: 'cert-id', variable: 'CERT') | 使用 PKCS#12 证书文件 | $CERT 包含证书路径 | 用于 HTTPS 客户端认证。 |
| 凭据作用域 | 在 “Global” 或 “Folder” 级别创建凭据 | 控制凭据的可见范围 | Folder 级凭据仅该文件夹内任务可用 | 提升安全性,避免越权访问。 |
| 凭据 ID 命名规范 | 使用清晰、一致的命名,如 prod-db-password | 便于管理和审计 | 避免使用 password1 等模糊名称 | 建议包含环境和用途。 |
withCredentials 使用示例:
withCredentials([
usernamePassword(credentialsId: 'github-api-creds',
usernameVariable: 'USER',
passwordVariable: 'PASS')
]) {
sh 'curl -u $USER:$PASS https://api.github.com/user'
}
7.6 Pipeline Utility Steps Plugin
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 安装 Pipeline Utility Steps Plugin | ”Manage Plugins” > 搜索并安装 | 提供读取和操作项目文件的 Pipeline 步骤 | 无 | 适用于 Java、Node.js 等项目。 |
| 读取 JSON 文件 | readJSON file: 'package.json' | 获取项目配置信息(如版本号) | def packageJson = readJSON file: 'package.json' echo "Version: ${packageJson.version}" | 常用于获取 package.json, config.json 等。 |
| 读取 Properties 文件 | readProperties file: 'version.properties' | 读取 Java 风格的配置文件 | def props = readProperties file: 'app.properties' env.APP_NAME = props['app.name'] | 支持 .properties 文件。 |
| 读取 XML 文件 | readXML file: 'pom.xml' | 解析 Maven 项目的 pom.xml | def pom = readXML file: 'pom.xml' def version = pom.version[0] | 可提取 groupId, artifactId, version 等。 |
| 写入 JSON 文件 | writeJSON file: 'metadata.json', json: [build: env.BUILD_NUMBER] | 生成或更新 JSON 文件 | 通常用于归档元数据 | 结合 archiveArtifacts 保存。 |
| 写入 Properties 文件 | writeProperties file: 'build-info.properties', properties: [version: '1.0'] | 生成配置文件供后续步骤使用 | 无 | 支持 key-value 写入。 |
| 查找文件 | findFiles glob: '**/*.jar' | 搜索工作区中的文件 | def jars = findFiles glob: 'target/*.jar' echo "Found ${jars.length} JARs" | 返回文件数组,可获取 name, path, length。 |
| 计算文件哈希 | fileHash file: 'app.jar', algorithm: 'SHA256' | 生成文件校验码,用于完整性验证 | def hash = fileHash file: 'dist/app.zip', algorithm: 'MD5' | 支持 MD5, SHA1, SHA256 等算法。 |
7.7 Warnings Next Generation Plugin
| 方法名称 | 语法/操作步骤 | 用途 | 代码示例 | 注意事项 |
|---|
| 安装 Warnings Next Generation Plugin | ”Manage Plugins” > 搜索并安装 | 分析构建日志或静态扫描报告,展示代码警告 | 无 | 支持多种工具(编译器、linter、扫描器)。 |
| 配置警告解析器 | 在任务配置的”构建后操作”中添加”记录编译警告” > 选择工具类型 | 解析特定格式的警告信息 | 工具:GCC, Java Compiler, ESLint, PMD, SpotBugs 等 | 需确保构建输出或报告格式匹配。 |
| 分析编译器警告 | 解析 GCC、MSVC、javac 等编译器输出的 warning | 识别潜在代码问题 | 无(日志中自动捕获) | 需在构建命令中启用警告输出(如 -Wall)。 |
| 分析 Linter 报告 | 解析 ESLint、Pylint、RuboCop 等工具生成的报告文件 | 统一展示代码风格和质量警告 | Report files: reports/eslint.json | 需配置 linter 输出为支持格式(XML, JSON)。 |
| 展示警告趋势图 | 在项目主页和构建页面显示警告数量趋势 | 监控代码质量变化 | 无(插件自动生成图表) | 可设置质量门禁(Quality Gate)。 |
| 设置质量门禁(Quality Gate) | 结合 “Quality Gates” 插件或 Pipeline 条件判断 | 当警告数超过阈值时标记构建为失败 | 见下方代码示例 | 需在 Pipeline 中编程实现。 |
| 支持多种报告格式 | 支持 XML (Checkstyle, PMD), JSON (ESLint), 文本日志等 | 兼容主流静态分析工具 | 工具列表见插件文档 | 需正确配置文件路径和解析器。 |
| 聚合多工具警告 | 同时配置多个解析器 | 统一管理来自不同工具的警告 | 例如:同时启用 ESLint 和 Pylint | 提供全面的代码质量视图。 |
质量门禁 Pipeline 示例:
post {
unstable {
script {
def issues = scanForIssues tool: [eslint()]
if (issues.size() > 10) {
currentBuild.result = 'FAILURE'
}
}
}
}
第八章:Jenkins 与版本控制集成
8.1 配置 Git 凭据(Username/Password, SSH Key)
| 方法名称 | 操作步骤 | 用途 | 示例/说明 | 注意事项 |
|---|
| 创建 Username/Password 凭据 | 1. 进入 “Manage Jenkins” > “Credentials” 2. 选择域(通常为全局) 3. 点击 “Add Credentials” 4. 类型选择 “Username with password” 5. 输入用户名和密码(或 Personal Access Token) 6. 设置 ID(如 github-user-pass)并保存 | 用于 HTTPS 方式访问 Git 仓库 | 适用于 GitHub、GitLab、Bitbucket 等基于 HTTPS 的仓库 | 推荐使用 Personal Access Token 替代密码,安全性更高 |
| 创建 SSH Key 凭据 | 1. 生成 SSH 密钥对(ssh-keygen -t rsa -b 4096) 2. 将公钥添加到 Git 服务账户(如 GitHub SSH Keys) 3. 在 Jenkins 中 “Add Credentials” 4. 类型选择 “SSH Username with private key” 5. 输入用户名(如 git) 6. 私钥选择 “Enter directly” 并粘贴私钥内容 7. 设置 ID(如 github-ssh-key)并保存 | 用于 SSH 方式访问 Git 仓库 | 免密登录,适合自动化流程 | 私钥必须保密,切勿提交到代码库 |
| 在任务中使用凭据 | 在 Job 配置的 “Source Code Management” > Git 中 选择 “Credentials” 下拉框,选择已创建的凭据 ID | 让 Jenkins 能够拉取私有仓库代码 | 仓库 URL 示例: - HTTPS: https://github.com/user/repo.git - SSH: git@github.com:user/repo.git | 凭据 ID 可在 Jenkinsfile 中通过 credentialsId: 'xxx' 引用 |
| 测试凭据连通性 | 使用 ssh -T git@github.com 测试 SSH 连接 或在 Jenkins 任务中执行 “Check out” 测试 | 验证凭据是否有效 | SSH 测试应返回 Hi username! You've successfully authenticated... | 确保 Jenkins 服务器网络可达 Git 服务 |
8.2 多分支 Pipeline(Multibranch Pipeline)
| 方法名称 | 操作步骤 | 用途 | 示例/说明 | 注意事项 |
|---|
| 创建 Multibranch Pipeline 任务 | 1. 新建任务 > 选择 “Multibranch Pipeline” 2. 输入任务名称 3. 点击 “OK” | 自动发现并管理多个分支的 CI/CD 流程 | 无需为每个分支手动创建任务 | 是现代 CI/CD 的推荐模式 |
| 配置分支源(Branch Source) | 1. 添加源(如 Git) 2. 填写仓库 URL 3. 选择已配置的凭据 4. 设置扫描策略(定期或事件触发) | 定义从哪个仓库扫描分支和 Pull Request | 支持 GitHub、GitLab、Bitbucket、Git 等 | 可添加多个源(如主仓库 + Fork) |
| 扫描仓库(Scan Repository) | 手动点击 “Scan Repository Now” 或等待自动扫描 | 触发 Jenkins 扫描仓库中的所有分支 | 扫描后会列出所有匹配的分支 | 首次配置后需手动触发扫描 |
| 分支匹配策略 | 在 “Behaviors” 中配置 “Discover branches” | 控制哪些分支被发现和创建 Pipeline | 策略:All branches / Exclude branches that are also filed as PRs / Only branches that match a regex | 可结合正则表达式过滤(如 feature.*) |
| Pull Request 支持 | 配置 “Discover pull requests” 行为 | 为每个 PR 创建独立的构建任务 | 可选择从 origin 或 both 方向发现 PR | 便于代码审查前验证 CI 状态 |
| Jenkinsfile 自动发现 | 要求每个分支根目录包含 Jenkinsfile | 定义该分支的构建流程 | 不同分支可使用不同版本的 Jenkinsfile | 若无 Jenkinsfile,该分支不会创建 Pipeline |
| 删除过期分支 | 配置 “Prune stale branches” 行为 | 自动删除已从 Git 仓库移除的分支对应的 Pipeline | 减少 Jenkins 中的无效任务 | 建议启用以保持整洁 |
8.3 GitHub Webhook 自动触发构建
| 方法名称 | 操作步骤 | 用途 | 示例/说明 | 注意事项 |
|---|
| 启用 GitHub Webhook 插件功能 | 确保已安装 “GitHub” 插件 在 Multibranch Pipeline 或 Pipeline 任务中 勾选 “GitHub hook trigger for GITscm polling” | 允许 GitHub 通过 HTTP 请求触发构建 | 无需轮询,实时性高 | 是事件驱动 CI 的核心 |
| 自动配置 Webhook | Jenkins 在任务配置中自动生成 Webhook URL | GitHub 将事件(push, PR)推送到此 URL | 格式:https://<jenkins-url>/github-webhook/ | 通常无需手动设置,要求 Jenkins 有公网可访问地址 |
| 手动配置 GitHub Webhook | 1. 进入 GitHub 仓库 > Settings > Webhooks 2. 点击 “Add webhook” 3. Payload URL: Jenkins 的 webhook 地址 4. Content type: application/json 5. Events: 选择 “Just the push event” 或 “Let me select…”(如 push, pull_request) 6. 点击 “Add webhook” | 确保事件能正确送达 Jenkins | 可用事件:push / pull_request / create / delete | 建议选择最小必要事件集 |
| 测试 Webhook | 在 GitHub Webhook 页面点击 “Test” 或 “Deliver” | 验证连接是否正常 | 应看到 Jenkins 开始构建对应分支 | 查看 Jenkins 系统日志排错 |
| 安全性配置(可选) | 在 Webhook 中设置 “Secret” | 验证请求确实来自 GitHub | Jenkins 需在 GitHub Server 配置中设置相同密钥 | 防止伪造请求 |
| 构建触发验证 | 推送代码到 GitHub 仓库 | 验证是否自动触发 Jenkins 构建 | 构建日志应显示 “Started by GitHub push” | 若未触发,检查防火墙、SSL、插件状态 |
8.4 GitLab CI 集成
| 方法名称 | 操作步骤 | 用途 | 示例/说明 | 注意事项 |
|---|
| 安装 GitLab Plugin | ”Manage Plugins” > 搜索并安装 “GitLab” 插件 | 实现 Jenkins 与 GitLab 深度集成 | 支持 Webhook、状态回写、Merge Request 构建 | 需要 GitLab API 访问权限 |
| 配置 GitLab 连接 | ”Manage Jenkins” > “Configure System” > “GitLab” 添加 GitLab 服务器 URL 和 Credentials(Personal Access Token) | 建立 Jenkins 到 GitLab 的信任连接 | URL 示例: - SaaS: https://gitlab.com - 自建: https://gitlab.company.com | Token 需有 api 或 read_repository 权限 |
| 配置 Webhook | 1. 进入 GitLab 项目 > Settings > Webhooks 2. URL: https://<jenkins-url>/project/<job-name>(传统)或 /generic-webhook-trigger/invoke(需插件) 3. 触发事件:Push, Merge Request 4. 添加 Webhook | 通过事件自动触发构建 | Jenkins 任务需启用 “Build when a change is pushed to GitLab” | 使用 Generic Webhook Trigger 插件更灵活 |
| Merge Request 构建 | 配置 Webhook 触发 MR 事件 在 Jenkinsfile 中使用 if (env.gitlabMergeRequestId) 判断 | 为每个 Merge Request 执行 CI 流程 | 类似 GitHub PR 构建 | 需在 GitLab 中启用 CI/CD |
| 状态回写(Status Check) | GitLab 插件自动将构建状态回传到 GitLab | 在 MR 页面显示 CI 运行状态 | 显示 “jenkins: success” 或 “failed” | 提升代码审查效率 |
| 使用 GitLab CI/CD 变量 | 在 Jenkinsfile 中访问 GitLab 提供的环境变量 | 获取 MR 信息、源分支等 | 如 env.gitlabSourceBranch, env.gitlabMergeRequestId | 便于实现条件逻辑 |
| 自建 GitLab 证书问题 | 若使用自签名证书,需将证书导入 Jenkins 的 Java 信任库 | 避免 SSL 连接错误 | keytool -import -alias gitlab -file gitlab.crt -keystore $JAVA_HOME/lib/security/cacerts | 否则会出现 PKIX path building failed 错误 |
8.5 SVN 集成与轮询策略
| 方法名称 | 操作步骤 | 用途 | 示例/说明 | 注意事项 |
|---|
| 安装 Subversion Plugin | ”Manage Plugins” > 搜索并安装 “Subversion” 插件 | 支持从 SVN 仓库检出代码 | Jenkins 内置支持较旧版本,建议安装插件 | 需服务器安装 svn 命令行工具 |
| 配置 SVN 仓库 URL | 在任务配置的 “Source Code Management” > Subversion 填写仓库 URL(如 http://svn.company.com/repo/trunk) | 指定代码检出位置 | 支持 http://, https://, svn://, file:// | 需确保 Jenkins 有访问权限 |
| 配置 SVN 凭据 | 在 “Credentials” 中添加 Username/Password 或 SSH 凭据 在 SVN 配置中选择该凭据 | 认证 SVN 仓库访问 | 适用于需要登录的 SVN 服务 | 域名(Realm)有时需匹配 |
| Poll SCM 轮询策略 | 在 “Build Triggers” 中选择 “Poll SCM” 设置 cron 表达式(如 H/5 * * * *) | 定期检查 SVN 仓库是否有变更 | 每 5 分钟检查一次 | 即使无变更也会产生请求,消耗资源 |
| 轮询 vs 触发器 | Poll SCM 是轮询机制,无事件通知 | 与 Git Webhook 的实时性对比 | SVN 原生不支持 Webhook,实时性较差 | 大型仓库建议降低轮询频率 |
| 优化轮询频率 | 根据团队提交频率设置合理间隔 | 平衡及时性与资源消耗 | 示例: - 活跃项目:H/5 * * * *(每 5 分钟) - 低频项目:H * * * *(每小时) | 避免设置过短间隔(如每分钟) |
| 使用 svnnotify 或外部触发 | 配置 SVN 的 post-commit hook 调用 Jenkins API | 实现近似 Webhook 的实时触发 | 脚本示例:
curl http://jenkins-url/job/job-name/build?token=MYTOKEN | 需在 Jenkins 任务中设置触发令牌(Trigger builds remotely) |
| 处理分支和标签 | 在 SVN 中通过不同路径管理分支 | 配置多个任务或使用参数化构建 | 路径示例: - Trunk: /repo/trunk - Branch: /repo/branches/v1.0 - Tag: /repo/tags/v1.0.0 | 不如 Git 分支轻量,管理较复杂 |
第九章:Jenkins 代理节点(Agent/Node)管理
9.1 代理节点的作用与类型
| 类型 | 描述 | 用途 | 优点 | 缺点 |
|---|
| Master 节点 | Jenkins 主服务节点,负责调度、UI、插件管理 | 运行轻量级任务、管理任务调度 | 开箱即用,无需额外配置 | 不应运行构建任务,避免资源耗尽影响稳定性 |
| SSH 代理节点 | 通过 SSH 协议连接的远程机器 | 在 Linux/Unix 服务器上执行构建 | 配置简单,支持密码或密钥认证,网络穿透能力强 | 需维护 SSH 服务,密钥管理需谨慎 |
| JNLP 代理节点 | 通过 Java Web Start (JNLP) 协议连接的节点 | 支持 Windows、Linux、macOS 等多种系统 | 安全性高(反向连接),防火墙友好 | 需安装 Java 环境,启动依赖 Jenkins 主节点 |
| 永久代理(Permanent Agent) | 手动配置并长期运行的代理节点 | 固定构建环境(如特定编译器版本) | 稳定、性能好,适合高频构建 | 资源占用固定,扩展性差 |
| 临时/动态代理(Ephemeral Agent) | 按需创建和销毁(如 Docker、Kubernetes Pod) | 弹性伸缩,资源高效利用 | 成本低,环境隔离,自动清理 | 启动时间略长,需云平台支持 |
9.2 配置 SSH 代理节点
| 步骤 | 操作说明 | 示例/注意事项 |
|---|
| 1. 准备目标机器 | 确保远程机器安装 sshd 服务,网络可达 Jenkins 主节点 | sudo systemctl start sshd |
| 2. 创建凭据 | 在 Jenkins 中添加 “Username with password” 或 “SSH Username with private key” | 推荐使用 SSH 密钥,避免密码暴露 |
| 3. 添加节点 | ”Manage Jenkins” > “Manage Nodes and Clouds” > “New Node” 类型选择 “Permanent Agent” | 名称:linux-builder-01 |
| 4. 配置节点信息 | - Remote root directory: /home/jenkins/agent - Launch method: “Launch agents via SSH” - Host: 192.168.1.100 - Credentials: 选择已创建的 SSH 凭据 | 目录需存在且代理用户有读写权限 |
| 5. 高级 SSH 配置 | - Host Key Verification Strategy: 首次连接可选 “Manually trusted key Verification Strategy” - JVM Options: 可设置 -Djava.awt.headless=true | 生产环境建议使用 “Known hosts file” |
| 6. 连接验证 | 保存后 Jenkins 自动尝试连接 | 查看日志确认是否成功启动 agent.jar |
9.3 配置 JNLP 代理节点
| 步骤 | 操作说明 | 示例/注意事项 |
|---|
| 1. 添加节点 | ”New Node” > 类型 “Permanent Agent” | 名称:windows-builder-01 |
| 2. 配置节点信息 | - Remote root directory: C:\jenkins - Launch method: “Launch agent via execution of command on the master” (或 “Let Jenkins control this agent via JNLP”) | Windows 路径使用反斜杠 |
| 3. 获取 JNLP 命令 | 保存节点后,点击节点进入,复制 “Launch agent” 命令 | 命令形如:
java -jar agent.jar -jnlpUrl http://jenkins:8080/computer/agent1/slave-agent.jnlp -secret xxx |
| 4. 在代理机器执行命令 | 在目标机器(需安装 Java)运行复制的命令 | 可创建批处理脚本或 Windows 服务自动启动 |
| 5. 验证连接 | Jenkins 节点状态变为 “Online” | 首次连接可能需确认安全提示 |
9.4 云代理与动态代理(如 Kubernetes)
| 方法 | 配置说明 | 优势 | 插件/工具 |
|---|
| Kubernetes Plugin | 将 Jenkins 集成到 Kubernetes 集群 定义 Pod Template,指定容器镜像、资源请求、卷挂载等 | 按需创建 Pod 作为构建代理,构建完成自动销毁 | Kubernetes Continuous Deploy Plugin |
| Pod Template 配置 | - Label: k8s-agent - Containers: jnlp(必须)、maven、docker - Memory/CPU Request: 1Gi, 500m | 实现多容器协同构建(如 jnlp + maven + docker) | 可在 Jenkinsfile 中使用 agent { kubernetes { ... } } |
| Docker 云代理 | 配置 Docker 主机或 Swarm 作为云资源 定义 Docker 模板镜像(如 jenkins/agent:jdk11) | 快速启动轻量级容器代理 | Docker Plugin |
| 弹性伸缩 | 设置最大代理数、空闲超时(如 5 分钟) | 高峰期自动扩容,低峰期释放资源 | 节省成本,提高资源利用率 |
| 安全上下文 | 在 Pod Template 中设置 runAsUser, fsGroup | 避免权限问题,提升安全性 | 尤其在挂载主机目录时重要 |
9.5 节点资源分配与标签(Label)管理
| 方法 | 操作说明 | 示例/用途 |
|---|
| 标签(Label) | 为节点添加标签,用于 Pipeline 中的 agent { label 'xxx' } | - linux - docker-build - high-mem - k8s |
| 资源分配 | 在节点配置中设置 “Number of executors” | - 普通节点:2-4 - 高性能节点:8+ - 动态代理:通常为 1 |
| 使用标签调度 Pipeline | 在 Jenkinsfile 中指定 agent | pipeline { agent { label 'docker-build' } stages { ... } } |
| 多标签组合 | 使用布尔表达式匹配节点 | agent { label 'linux && high-mem' } |
| 节点监控 | 查看节点 CPU、内存使用情况 | ”Manage Nodes” 页面提供基础监控 |
| 工作区管理 | 设置 “Advanced” 中的 “Workspaces” | 为不同任务分配独立路径 |
第十章:Jenkins 构建优化与最佳实践
10.1 构建参数化(Parameters)
| 参数类型 | 用途 | 示例 | 最佳实践 |
|---|
| string | 输入文本(如版本号、标签) | VERSION=1.2.3 | 设置默认值,添加描述 |
| choice | 下拉选择(如环境:dev/test/prod) | ENV=prod | 限制非法输入,提高易用性 |
| booleanParam | 布尔开关(如是否清理、是否部署) | CLEAN_BUILD=true | 默认关闭高风险操作 |
| text | 多行文本(如脚本、配置) | DEPLOY_SCRIPT=… | 适合复杂输入 |
| password | 敏感信息输入(隐藏) | DB_PASSWORD=*** | 避免日志泄露 |
最佳实践:
- 减少不必要的参数:参数是提升灵活性的关键,但应避免过度参数化
- 为参数添加清晰描述
- 使用默认值降低使用门槛
- 敏感参数使用 password 类型或 Credentials
10.2 构建产物归档与持久化
| 方法 | 操作 | 示例 | 注意事项 |
|---|
| archiveArtifacts | 归档构建产物(如 JAR、ZIP、Docker 镜像元数据) | archiveArtifacts artifacts: 'target/*.jar', allowEmptyArchive: true | allowEmptyArchive: true 防止无文件时报错 |
| junit | 发布测试报告 | junit 'test-results/*.xml' | 用于展示测试趋势 |
| 持久化存储 | 将产物上传到外部存储 | - Nexus/Artifactory(Maven 包) - S3/GCS(通用文件) - Harbor(Docker 镜像) | Jenkins 工作区不应作为长期存储 |
最佳实践:
- 明确归档范围,避免过大文件:确保关键产物可追溯、可重部署
- 结合版本号命名产物
- 定期清理旧产物(使用 buildDiscarder)
10.3 构建日志管理与输出优化
| 方法 | 操作 | 示例 | 优势 |
|---|
| timestamps() | 添加时间戳 | options { timestamps(); ansiColor('xterm') } | 便于分析各步骤耗时 |
| ansiColor() | 启用 ANSI 颜色 | ansiColor('xterm') | 日志更易读,错误突出显示 |
| echo | 输出关键信息 | echo "Starting build for ${env.BRANCH_NAME}" | 提高日志可读性 |
| 避免日志爆炸 | 限制 sh 命令输出 | sh 'long-command > /dev/null 2>&1' | 减少无用日志 |
| 结构化日志 | 使用工具生成 JSON/XML 日志 | 结合 Warnings Plugin 分析 | 便于机器解析和告警 |
10.4 并行构建与 stage 并行执行
| 方法 | 语法 | 示例 | 注意事项 |
|---|
| parallel | 在 stages 块中使用 parallel | 见下方代码示例 | 大幅缩短构建时间 |
适用场景:
- 单元测试、集成测试:确保任务无共享状态或资源冲突
- 多平台构建(Linux/Windows)
- 多模块独立构建
资源考量: 并行会占用更多代理节点资源,需确保有足够 executors,可结合动态代理弹性扩展。
并行构建示例:
stage('Parallel Tests') {
parallel {
stage('Unit') {
steps { sh 'mvn test' }
}
stage('Integration') {
steps { sh 'mvn verify' }
}
}
}
10.5 构建缓存与工作区清理
| 方法 | 操作 | 示例 | 说明 |
|---|
| 本地缓存 | 复用 Maven/Gradle/NPM 缓存 | 挂载 ~/.m2, ~/.gradle, ~/.npm 到代理节点 | 显著加快依赖下载 |
| Docker 缓存 | 使用 docker build —cache-from | 在多阶段构建中复用层 | 减少镜像构建时间 |
| cleanWs() | 清理工作区 | 见下方代码示例 | 防止残留文件影响下次构建 |
cleanWs 使用示例:
post {
always {
cleanWs()
}
}
最佳实践:
- 定期清理旧工作区:平衡缓存复用与环境纯净
- 使用 .gitignore 忽略构建产物
- 动态代理天然具备清理优势
10.6 Pipeline 复用:Shared Libraries
| 概念 | 说明 | 示例 | 优势 |
|---|
| 共享库(Shared Library) | 将通用 Pipeline 逻辑封装为可复用的 Groovy 库 | @Library('my-pipeline-lib') _ | 避免重复代码,统一最佳实践 |
| 加载方式 | Modern SCM(推荐)或 Implicit loading | 配置在 “Manage Jenkins” > “System” > “Global Pipeline Libraries” | 支持版本控制(master、branch、tag) |
| 目录结构 | src/(工具类)、vars/(全局函数)、resources/(资源文件) | src/com/company/Utils.groovy
vars/buildApp.groovy
vars/deployApp.groovy | vars/ 下为全局可调用函数,模块化设计 |
| 调用函数 | 在 Jenkinsfile 中直接使用 | buildApp()
deployApp environment: 'prod' | 语法简洁,易于维护 |
最佳实践:
- 版本化管理共享库:是大型 Jenkins 部署的必备实践
- 编写单元测试
- 文档化 API
第十一章:Jenkins 安全与维护
11.1 CSRF 保护与安全配置
| 配置项 | 操作说明 | 最佳实践 |
|---|
| 启用 CSRF 保护 | ”Manage Jenkins” > “Configure Global Security” > “CSRF Protection” > 选择 “Default Crumb Issuer” | 必须启用,防止跨站请求伪造攻击 |
| Crumb 配置 | ”Proxy Compatibility” 勾选(若使用反向代理) “Enable for APIs” 建议启用 | 确保 API 调用(如脚本、Webhook)也能受保护 |
| 安全域(Security Realm) | 选择用户认证方式: - Jenkins 内建数据库(适合小团队) - LDAP/AD(企业推荐) - OAuth(GitHub, Google) | 集成企业身份系统,统一管理 |
| 授权策略(Authorization) | 设置用户权限: - Logged-in users can do anything(不推荐) - Matrix/Project-based Matrix(细粒度控制) - Role-Based Strategy(推荐) | 遵循最小权限原则 |
| 代理节点通信安全 | JNLP 节点使用加密连接 SSH 节点使用密钥认证而非密码 | 防止中间人攻击 |
| 脚本安全 | 沙箱模式限制未经批准的脚本 | Pipeline 中未批准的脚本需管理员审批 |
11.2 插件安全与定期更新
| 实践 | 说明 | 工具/方法 |
|---|
| 定期检查插件更新 | 插件是主要攻击面,需及时修复已知漏洞 | ”Manage Jenkins” > “Manage Plugins” > “Updates” 标签页 |
| 使用 LTS 版插件 | 优先选择长期支持版本,更稳定 | 在插件列表中查看版本类型 |
| 最小化插件安装 | 只安装必需插件,减少攻击面 | 定期审查并卸载无用插件 |
| 关注安全公告 | 订阅 Jenkins Security Advisories | 及时响应 CVE 通告 |
| 测试更新 | 在生产环境前,先在预发环境测试插件更新 | 避免更新导致构建失败 |
| 插件白名单 | 使用 “Plugin Usage Plugin” 分析插件使用情况 | 识别并移除僵尸插件 |
11.3 备份与恢复 Jenkins 配置
| 方法 | 操作步骤 | 说明 |
|---|
| 备份 JENKINS_HOME | 复制整个 JENKINS_HOME 目录(默认 /var/lib/jenkins) 包含:jobs/(任务配置)、plugins/(插件)、users/(用户)、config.xml(主配置) | 最完整、最可靠的备份方式 |
| 使用 ThinBackup 插件 | 安装 “ThinBackup” 插件 配置备份目录和计划 | 支持增量备份,节省空间 |
| 备份策略 | 频率:每日或每次重大变更后 存储:异地、加密 验证:定期恢复测试 | 建议结合 cron 脚本自动化 |
| 恢复步骤 | 1. 停止 Jenkins 服务 2. 替换 JENKINS_HOME 目录 3. 启动 Jenkins | 确保版本兼容性 |
| 备份构建产物? | 不推荐:产物应归档到 Nexus、S3 等专用存储 | Jenkins 工作区不是持久化存储 |
11.4 日志审计与监控
| 日志类型 | 位置/方法 | 用途 |
|---|
| Jenkins 主日志 | ”Manage Jenkins” > “System Log” > “All logs” | 查看系统级错误、插件加载、安全事件 |
| 任务构建日志 | 每个构建的 “Console Output” | 调试构建失败 |
| 审计日志(Audit Trail) | 使用 “Audit Trail Plugin” 或 “Role-based Authorization Strategy” | 记录用户操作(如谁修改了任务) |
| 代理节点日志 | JNLP 或 SSH 代理的控制台输出 | 排查节点连接问题 |
| 监控指标 | 集成 Prometheus + Grafana: - Jenkins Prometheus Plugin - Exporter 暴露指标 | 监控构建队列长度、代理节点状态、JVM 内存/GC |
| 告警设置 | 基于监控指标设置告警(如构建失败率突增) | 快速响应系统异常 |
11.5 升级 Jenkins 版本
| 步骤 | 说明 | 注意事项 |
|---|
| 1. 查看升级路径 | Jenkins LTS 版本之间可能有中间版本要求 | 参考官方升级指南 |
| 2. 备份 | 必须执行完整 JENKINS_HOME 备份 | 升级失败可快速回滚 |
| 3. 测试环境验证 | 在预发环境先升级,运行关键 Pipeline | 验证插件兼容性 |
| 4. 停止 Jenkins 服务 | sudo systemctl stop jenkins | 避免文件锁问题 |
| 5. 更新 Jenkins | - Debian/Ubuntu: sudo apt update && sudo apt install jenkins - WAR: 替换 jenkins.war 文件 | 确保权限正确 |
| 6. 启动 Jenkins | sudo systemctl start jenkins | 观察日志是否有错误 |
| 7. 检查插件兼容性 | 登录后查看是否有插件需要更新 | Jenkins 升级后常提示插件更新 |
| 8. 验证功能 | 手动触发几个关键任务 | 确保 CI/CD 流程正常 |
最佳实践:
- 选择 LTS(长期支持)版本,降低生产风险
- 避免跳过多版本升级
- 利用维护窗口升级
第十二章:Jenkins 与 DevOps 工具链集成
12.1 与 Maven/Gradle 集成构建 Java 项目
| 工具 | 集成方式 | 示例 |
|---|
| Maven | 1. 安装 “Maven Integration” 插件 2. 在全局工具配置中添加 Maven 安装 3. 任务中选择 “Maven project” 4. 设置 POM 路径和 Goals | clean package -DskipTests |
| Gradle | 1. 安装 “Gradle Plugin” 2. 配置 Gradle 安装(或使用 wrapper) 3. 在 Pipeline 中使用 sh 'gradle build' | 推荐使用 gradlew 保证版本一致 |
| 依赖缓存 | 挂载 ~/.m2 或 ~/.gradle 目录 | 加速构建,减少下载 |
| 发布到 Nexus | 在 pom.xml 配置 distributionManagement 或使用 Gradle maven-publish 插件 | 结合 Credentials Binding 插件使用密码 |
12.2 与 Node.js/npm 集成构建前端项目
| 步骤 | 操作 | 工具/插件 |
|---|
| 安装 Node.js | ”Manage Jenkins” > “Global Tool Configuration” > “NodeJS” 添加 Node.js 安装(可指定版本) | NodeJS Plugin |
| 安装 npm/yarn | NodeJS 插件自动包含 npm/yarn | 可配置 .npmrc |
| 构建命令 | 在 Pipeline 中执行 | sh 'npm install' sh 'npm run build' sh 'npm test' |
| 缓存 node_modules | 使用 cache 步骤或挂载目录 | sh 'mkdir -p $HOME/.npm' sh 'npm config set cache $HOME/.npm' |
| 归档产物 | archiveArtifacts 'dist/**' | 静态文件可部署到 Nginx、S3 等 |
12.3 与 Docker 集成:构建与推送镜像
| 方法 | 操作 | 示例 |
|---|
| 前提 | 代理节点需安装 Docker 引擎 | sudo apt install docker.io |
| 权限 | Jenkins 用户需在 docker 组中 | sudo usermod -aG docker jenkins |
| Pipeline 中构建 | 使用 sh 执行 Docker 命令 | sh 'docker build -t myapp:$BUILD_ID .' sh 'docker tag myapp:$BUILD_ID registry/myapp:latest' sh 'docker push registry/myapp:latest' |
| 使用 Docker Pipeline 插件 | 提供更高级的 Docker DSL | script { docker.build("myapp", ".").push("latest") } |
| 凭证管理 | 使用 withDockerRegistry | withDockerRegistry([credentialsId: 'docker-hub', url: '']) { // 构建和推送 } |
12.4 与 Kubernetes 部署集成
| 方法 | 说明 | 示例 |
|---|
| 使用 kubectl | 代理节点安装 kubectl,配置 kubeconfig | sh 'kubectl apply -f deployment.yaml' sh 'kubectl set image deployment/myapp container=myapp:$IMAGE_TAG' |
| 凭证管理 | 将 kubeconfig 文件作为 “Secret file” 凭据存储 | withKubeConfig([credentialsId: 'kubeconfig']) { ... } |
| Helm 部署 | 使用 Helm 命令行 | sh 'helm upgrade --install myapp ./chart --set image.tag=$IMAGE_TAG' |
| 金丝雀/蓝绿部署 | 结合 Helm 或 Argo Rollouts 实现 | 需在 Kubernetes 侧配置 |
| 优势 | 自动化部署,与 CI 无缝衔接 | 实现真正的持续部署 |
12.5 与 SonarQube 集成代码质量检测
| 步骤 | 操作 | 插件 |
|---|
| 1. 安装 SonarQube 服务器 | 独立部署 SonarQube 服务 | sonarqube.org |
| 2. 安装 Scanner | 在 Jenkins 代理安装 SonarScanner | 或使用 sonar-scanner 命令行 |
| 3. 配置 Server | ”Manage Jenkins” > “Configure System” > “SonarQube servers” | 添加服务器 URL 和 Token |
| 4. 在 Pipeline 中调用 | 使用 withSonarQubeEnv | 见下方代码示例 |
| 5. 质量门禁(Quality Gate) | 等待质量门禁结果 | 见下方代码示例 |
SonarQube 集成 Pipeline 示例:
withSonarQubeEnv('My SonarQube') {
sh 'mvn sonar:sonar'
}
timeout(time: 1, unit: 'HOURS') {
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "Quality Gate Failed: ${qg.status}"
}
}
优势: 代码覆盖率、漏洞、坏味道检测,提升代码质量和可维护性。
12.6 与 Argo CD/Jenkins X 等高级 CD 工具对比
| 特性 | Jenkins | Argo CD | Jenkins X |
|---|
| 核心定位 | 通用 CI/CD 流水线引擎 | GitOps CD 专用工具 | Kubernetes 原生 CI/CD 平台 |
| 配置方式 | Groovy Pipeline、UI 配置 | 声明式 YAML (Kustomize/Helm) | 声明式 Pipeline + GitOps |
| 部署模型 | 推式(Push-based) | 拉式(Pull-based, GitOps) | 混合(CI 推,CD 拉) |
| 学习曲线 | 中等(Groovy 脚本) | 低(YAML + GitOps 概念) | 高(需懂 K8s、Helm、Tekton) |
| 灵活性 | 极高,几乎无限定制 | 较低,专注于部署同步 | 高,但受限于 K8s 生态 |
| UI/可视化 | Blue Ocean(可选) | 优秀,实时同步状态 | 基于 Tekton Dashboard |
| 适用场景 | 传统环境、复杂 CI 流程、多语言项目 | 纯 Kubernetes 环境,强调 GitOps 和声明式管理 | 云原生团队,希望开箱即用的 CI/CD |
| 维护成本 | 较高(插件、脚本维护) | 低(声明式配置,易审计) | 中等(依赖云原生生态) |
推荐组合: Jenkins 做 CI → Argo CD 做 CD