Jenkins Job 创建与配置指南

Jenkins版本:2.5
学习时间:2026-04-04
所属阶段:第一阶段(基础入门)


目录

  1. Job概述
  2. Job类型
  3. 创建Freestyle Job
  4. 源码管理配置
  5. 构建触发器
  6. 构建步骤
  7. 构建环境配置
  8. 构建后操作
  9. 参数化构建
  10. 视图管理
  11. Job权限管理
  12. Job模板与复制
  13. 常用配置示例
  14. Pipeline Job创建详解
  15. Multibranch Pipeline配置
  16. Job日常管理操作
  17. 构建状态与结果详解
  18. Jenkins CLI与REST API操作Job
  19. Job常见问题排查
  20. 凭据管理详解
  21. Jenkins内置环境变量
  22. Webhook触发配置详解

一、Job概述

1.1 什么是Job

Job(任务)是Jenkins的核心执行单元,每个Job定义了:

┌─────────────────────────────────────────────────────────────────┐
│                        Jenkins Job                               │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  ├── Job名称与描述                                                │
│  ├── 执行节点(Master/Agent)                                    │
│  ├── 源码管理(Git/SVN)                                        │
│  ├── 构建触发器(定时/轮询/Webhook)                              │
│  ├── 构建步骤(Shell/Pipeline脚本)                              │
│  ├── 构建后操作(通知/归档/部署)                                  │
│  └── 构建历史记录                                               │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

1.2 Job工作流程

Job执行流程:

┌─────────────────────────────────────────────────────────────────┐
│  1. 触发构建                                                     │
│     ├── 手动触发                                                  │
│     ├── 定时触发(Cron)                                          │
│     ├── 代码提交触发(Webhook)                                    │
│     └── 上游Job触发                                              │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│  2. 检出代码                                                     │
│     └── 从Git/SVN拉取源码                                         │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│  3. 执行构建                                                     │
│     ├── 预处理脚本                                                │
│     ├── 编译构建                                                  │
│     └── 测试执行                                                  │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│  4. 构建后处理                                                   │
│     ├── 结果归档                                                  │
│     ├── 通知发送                                                  │
│     └── 部署触发                                                  │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│  5. 完成记录                                                     │
│     └── 保存构建历史、测试报告、产物                                │
└─────────────────────────────────────────────────────────────────┘

二、Job类型

2.1 Jenkins 2.5 支持的Job类型

类型 说明 使用场景
Freestyle Project 自由风格,最基本的Job类型 简单构建任务
Pipeline 流水线,支持复杂工作流 复杂CI/CD流程
Multi-configuration Project 多配置项目 矩阵式构建(多平台/多浏览器)
Folder 文件夹,用于组织Job Job分类管理
Multibranch Pipeline 多分支流水线 Gitflow工作流
Organization Folder 组织文件夹 GitHub/GitLab组织扫描

2.2 Job类型对比

特性 Freestyle Pipeline Multi-configuration
配置复杂度
灵活性
版本控制
条件执行 有限 完整 有限
并行执行 手动配置 原生支持 配置矩阵
构建矩阵 可模拟 ✅ 原生支持
适用场景 简单任务 复杂流程 多环境测试

2.3 选择建议

Job类型选择指南:

┌─────────────────────────────────────────────────────────────────┐
│                         简单构建任务                              │
│                    (编译、测试、打包)                             │
│                         ↓                                       │
│                  Freestyle Project                              │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                         复杂CI/CD                                │
│                    (多阶段、条件分支)                             │
│                         ↓                                       │
│                    Pipeline Job                                 │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                      多环境测试                                   │
│                (Windows/Linux/macOS)                            │
│                         ↓                                       │
│              Multi-configuration Project                        │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                     Git多分支管理                                 │
│                   (main/feature/release)                        │
│                         ↓                                       │
│              Multibranch Pipeline Job                           │
└─────────────────────────────────────────────────────────────────┘

三、创建Freestyle Job

3.1 创建入口

创建Job步骤:

1. 点击Jenkins首页左侧 "新建任务" / "New Item"
2. 输入任务名称
3. 选择任务类型
4. 点击 "确定" / "OK"

3.2 基础配置

Job基础配置页面:

┌─────────────────────────────────────────────────────────────────┐
│  配置名称                                                        │
│  ├── 任务名称:my-first-job                                     │
│  ├── 任务描述:这是一个示例任务                                    │
│  └── 旧构建保留策略                                              │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  丢弃旧构建                                                     │
│  ├── 保持构建天数:7                                            │
│  └── 保持构建的最大个数:10                                      │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  此项目配置为参数化构建过程                                        │
│  └── 添加参数类型                                               │
└─────────────────────────────────────────────────────────────────┘

3.3 限制构建运行节点

构建执行位置配置:

┌─────────────────────────────────────────────────────────────────┐
│  勾选 "限制项目的运行节点"                                        │
│                                                                  │
│  标签表达式:                                                    │
│  ├── any (任何节点)                                             │
│  ├── linux (指定标签)                                           │
│  ├── java11 && maven (组合条件)                                 │
│  └── !windows (排除条件)                                        │
│                                                                  │
│  示例:                                                         │
│  ├── "java11" - 标签为java11的节点                              │
│  ├── "master" - Master节点                                      │
│  ├── "docker && amd64" - 同时满足两个标签                       │
│  └── "ubuntu-20.04 || centos-8" - 满足任一标签                 │
└─────────────────────────────────────────────────────────────────┘

3.4 配置截图说明

配置页面的Tab顺序(Jenkins 2.5):

┌─────────────────────────────────────────────────────────────────┐
│  General                                    [General]           │
│  源码管理                                   [Source Code Mgmt]  │
│  构建触发器                                 [Build Triggers]    │
│  构建环境                                  [Build Environment]  │
│  构建步骤                                  [Build Steps]       │
│  构建后操作                                [Post-build Actions]│
└─────────────────────────────────────────────────────────────────┘

四、源码管理配置

4.1 Git配置

Git配置项:

┌─────────────────────────────────────────────────────────────────┐
│  源码管理:Git                                                   │
│                                                                  │
│  Repository URL:                                                 │
│  └── https://github.com/company/my-project.git                  │
│                                                                  │
│  Credentials:                                                   │
│  └── 选择已配置的Git凭证                                         │
│                                                                  │
│  Branches to build:                                             │
│  ├── Branch Specifier (blank for 'any'):                       │
│      ├── */main                    ← 主分支                      │
│      ├── */feature/*              ← 功能分支                    │
│      ├── ${BRANCH_NAME}          ← 参数化分支                  │
│      └── */release/*              ← 发布分支                    │
│                                                                  │
│  行为 (Behaviors):                                              │
│  ├── ✓ Clean before checkout      检出前清理                    │
│  ├── ✓ Clean after checkout       检出后清理                    │
│  ├── ✓ Recursively update submodules  更新子模块               │
│  └── ✓ Prune stale remote tracking branches  清理远程追踪分支  │
└─────────────────────────────────────────────────────────────────┘

4.2 Git Branch与Tag语法

语法 说明 示例
*/main 主分支(*/前缀匹配远程分支) 主线开发
*/develop 开发分支 开发主线
*/feature/* 功能分支 feature/login
*/release/* 发布分支 release/1.0.0
*/hotfix/* 热修复分支 hotfix/bug-001
** 匹配所有分支(含Tag) 通配所有
origin/pr/*/head GitHub Pull Request PR构建
${PARAM} 参数化 使用构建参数

4.3 Subversion配置

Subversion配置项:

┌─────────────────────────────────────────────────────────────────┐
│  源码管理:Subversion                                            │
│                                                                  │
│  Repository URL:                                                │
│  └── svn://192.168.1.100/project/trunk                         │
│                                                                  │
│  Credentials:                                                   │
│  └── 选择已配置的SVN凭证                                         │
│                                                                  │
│  Local module directory (SCM):                                   │
│  └── . (当前目录)                                               │
│                                                                  │
│  Externals:                                                    │
│  └── 配置外部引用                                                │
│                                                                  │
│  检出策略:                                                       │
│  ├── ✓ 使用 'svn update' as much as possible                  │
│  └── ○ Always check out a fresh copy                           │
└─────────────────────────────────────────────────────────────────┘

4.4 Git高级配置

┌─────────────────────────────────────────────────────────────────┐
│  Shallow Clone(浅克隆,加速大仓库检出)                         │
│                                                                  │
│  Git → Behaviors → Add → Advanced clone behaviours              │
│  ├── Shallow clone depth: 1                                     │
│  └── 只拉取最近1次提交,大幅减少克隆时间                         │
│                                                                  │
│  ⚠️ 注意:浅克隆可能导致部分Git操作失败                         │
│  ├── git log 无法查看完整历史                                    │
│  ├── git blame 无法正常工作                                      │
│  └── 适用于只做构建不需要历史的场景                              │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  Sparse Checkout(稀疏检出,只检出指定目录)                     │
│                                                                  │
│  Git → Behaviors → Add → Sparse Checkout paths                  │
│  ├── 输入要检出的路径(每行一个):                              │
│  │   src/main                                                   │
│  │   pom.xml                                                    │
│  └── 适用于monorepo(单仓多项目)场景                            │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  Git LFS(大文件存储)                                           │
│                                                                  │
│  前提:服务器和构建节点都需安装 git-lfs                          │
│  ├── Git → Behaviors → Add → Git LFS pull after checkout        │
│  └── 检出代码后自动拉取LFS管理的文件                             │
│                                                                  │
│  安装Git LFS(Linux):                                          │
│  ├── curl -s https://packagecloud.io/install/repositories/github/│
│  │   git-lfs/script.deb.sh | sudo bash                         │
│  └── sudo apt-get install git-lfs && git lfs install            │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  Checkout到子目录                                                │
│                                                                  │
│  Git → Additional Behaviours → Check out to a sub-directory     │
│  ├── Local sub-directory for repo: src                          │
│  └── 代码将检出到 $WORKSPACE/src 目录下                          │
│                                                                  │
│  多SCM场景:同一Job检出多个仓库到不同子目录                      │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  Pipeline中的Git高级配置                                         │
│                                                                  │
│  checkout([                                                      │
│      $class: 'GitSCM',                                          │
│      branches: [[name: '*/main']],                              │
│      extensions: [                                               │
│          [$class: 'CloneOption', depth: 1, shallow: true],      │
│          [$class: 'SparseCheckoutPaths',                        │
│           sparseCheckoutPaths: [[path: 'src/main']]],           │
│          [$class: 'GitLFSPull'],                                │
│          [$class: 'RelativeTargetDirectory',                    │
│           relativeTargetDir: 'src'],                            │
│          [$class: 'CleanBeforeCheckout'],                       │
│      ],                                                          │
│      userRemoteConfigs: [[                                       │
│          url: 'https://github.com/company/project.git',         │
│          credentialsId: 'github-ssh-key'                        │
│      ]]                                                          │
│  ])                                                              │
└─────────────────────────────────────────────────────────────────┘

五、构建触发器

5.1 定时构建(Build Triggers)

定时构建配置:

┌─────────────────────────────────────────────────────────────────┐
│  触发远程构建 (例如,使用脚本)                                      │
│  ├── 身份验证令牌:MY_TOKEN                                      │
│  └── 访问URL: http://jenkins/job/my-job/build?token=MY_TOKEN    │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  其他项目构建后触发                                               │
│  ├── 监听的其他项目: other-job                                  │
│  ├── ✓ 构建后触发                                               │
│  └── ✓ 即使构建失败也触发                                        │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  定时构建                                                        │
│  └── 日程表:H 2 * * *                                          │
└─────────────────────────────────────────────────────────────────┘

5.2 Cron表达式详解

Cron表达式格式:
┌───────────── 分钟 (0-59)
│ ┌───────────── 小时 (0-23)
│ │ ┌───────────── 日 (1-31)
│ │ │ ┌───────────── 月 (1-12)
│ │ │ │ ┌───────────── 星期 (0-7, 0和7都是周日)
│ │ │ │ │
* * * * *

常用示例:
┌─────────────────────────────────────────────────────────────────┐
│  H 2 * * *           每天凌晨2点构建                             │
│  H H * * *           每天任意时间构建                             │
│  H/15 * * * *        每15分钟构建                                │
│  H H(0-8) * * *     凌晨0点到8点之间任意时间                     │
│  H H 1,15 * *       每月1日和15日构建                            │
│  H H * * 1-5        工作日每天一次(随机时间)构建               │
│  H * * * 1-5        工作日每小时构建                             │
│  30 9 * * 1-5       周一到周五9:30构建                           │
│  0 18 * * *         每天下午6点构建                              │
└─────────────────────────────────────────────────────────────────┘

特殊字符:
┌─────────────────────────────────────────────────────────────────┐
│  *   任意值                                                     │
│  ,   值列表分隔符 (1,3,5)                                       │
│  -   范围 (1-5 表示1到5)                                        │
│  /   步长 (*/15 表示每15个单位)                                  │
│  H   哈希值(用于分散构建时间,避免高峰期)                         │
└─────────────────────────────────────────────────────────────────┘

5.3 GitHub/Webhook触发

GitHub Pull Request Builder配置:

┌─────────────────────────────────────────────────────────────────┐
│  GitHub Pull Request Builder                                     │
│                                                                  │
│  ✓ 使用GitHub Pull Request Builder触发构建                       │
│                                                                  │
│  Admin list:                                                    │
│  └── GitHub账号白名单                                            │
│                                                                  │
│  Cron:                                                         │
│  └── H/5 * * * *   每5分钟检查PR更新                             │
│                                                                  │
│  Trigger Setup:                                                │
│  ├── ✓ 关闭构建 SSL 验证 (测试环境)                             │
│  └── 公司GitHub需要配置GitHub Token                             │
└─────────────────────────────────────────────────────────────────┘

5.4 轮询SCM

轮询SCM配置:

┌─────────────────────────────────────────────────────────────────┐
│  轮询SCM                                                         │
│                                                                  │
│  日程表:H/5 * * * *                                             │
│  └── 每5分钟检查代码更新,有更新才构建                            │
│                                                                  │
│  注意:与定时构建的区别                                           │
│  ├── 定时构建:无论代码是否变化,到了时间就构建                    │
│  └── 轮询构建:检测到代码变化才构建                               │
└─────────────────────────────────────────────────────────────────┘

5.5 触发器对比

触发方式 配置位置 实时性 资源消耗
定时构建 Jenkins ⭐⭐
轮询SCM Jenkins ⭐⭐
Webhook Git服务器 ⭐⭐⭐⭐⭐
上游Job Jenkins ⭐⭐⭐⭐
远程触发 外部系统 ⭐⭐⭐⭐

六、构建步骤

6.1 执行Windows批处理命令

Windows批处理构建步骤:

┌─────────────────────────────────────────────────────────────────┐
│  构建步骤                                                       │
│  ├── 执行Windows批处理命令                                        │
│  └── 命令内容:                                                 │
│                                                                  │
│  cd %WORKSPACE%                                                 │
│  call mvn clean package -DskipTests                             │
│                                                                  │
│  常用命令:                                                      │
│  ├── set PATH=C:\maven\bin;%PATH%  设置环境变量                  │
│  ├── call mvn clean install         调用Maven                   │
│  ├── if exist dist\*.zip del dist\*.zip  条件执行               │
│  └── echo Build completed              输出信息                  │
└─────────────────────────────────────────────────────────────────┘

6.2 执行Shell

Shell构建步骤:

┌─────────────────────────────────────────────────────────────────┐
│  构建步骤                                                       │
│  └── 执行shell                                                   │
│                                                                  │
│  命令内容:                                                      │
│  #!/bin/bash                                                    │
│  cd ${WORKSPACE}                                                │
│  mvn clean package -DskipTests                                 │
│  tar -czf dist.tar.gz target/*.jar                             │
└─────────────────────────────────────────────────────────────────┘

6.3 调用Maven

Maven构建步骤:

┌─────────────────────────────────────────────────────────────────┐
│  构建步骤                                                       │
│  └── 顶层Maven目标                                               │
│                                                                  │
│  Maven版本:                                                     │
│  └── 选择已配置的Maven (MAVEN_HOME)                              │
│                                                                  │
│  Goals:                                                         │
│  └── clean package -DskipTests                                  │
│                                                                  │
│  POM文件:                                                       │
│  └── pom.xml (留空使用默认)                                      │
│                                                                  │
│  构建属性:                                                      │
│  ├── JAVA_HOME=/path/to/jdk8                                   │
│  └── MAVEN_OPTS=-Xmx1024m                                      │
└─────────────────────────────────────────────────────────────────┘

6.4 调用Gradle

Gradle构建步骤:

┌─────────────────────────────────────────────────────────────────┐
│  构建步骤                                                       │
│  └── 调用Gradle                                                  │
│                                                                  │
│  Gradle版本:                                                    │
│  └── 选择已配置的Gradle                                         │
│                                                                  │
│  Tasks:                                                         │
│  └── build -x test                                             │
└─────────────────────────────────────────────────────────────────┘

6.5 Windows PowerShell

PowerShell构建步骤:

┌─────────────────────────────────────────────────────────────────┐
│  构建步骤                                                       │
│  └── Windows PowerShell                                         │
│                                                                  │
│  脚本内容:                                                      │
│  $ErrorActionPreference = "Stop"                               │
│  cd $env:WORKSPACE                                              │
│  & "C:\maven\bin\mvn.cmd" clean package                        │
│  if ($LASTEXITCODE -ne 0) {                                     │
│      Write-Host "Build failed with exit code $LASTEXITCODE"    │
│      exit 1                                                     │
│  }                                                              │
└─────────────────────────────────────────────────────────────────┘

七、构建环境配置

重要:这是Job配置中容易被忽略但非常关键的环节,直接影响构建能否成功执行。

7.1 构建前清理Workspace

┌─────────────────────────────────────────────────────────────────┐
│  构建环境 → 勾选 "Delete workspace before build starts"         │
│                                                                  │
│  作用:每次构建前清空工作空间,确保干净的构建环境                   │
│                                                                  │
│  适用场景:                                                      │
│  ├── 构建产物残留导致打包错误                                    │
│  ├── 缓存文件导致测试结果不准确                                  │
│  ├── 切换分支后旧文件干扰                                       │
│  └── 排查构建问题时确保环境干净                                  │
│                                                                  │
│  ⚠️ 注意:                                                       │
│  ├── 会增加构建时间(需要重新检出代码)                           │
│  ├── 大型项目慎用(检出耗时长)                                  │
│  └── 推荐用 Git Clean 代替(只清理未跟踪文件)                    │
└─────────────────────────────────────────────────────────────────┘

7.2 构建工具自动安装

┌─────────────────────────────────────────────────────────────────┐
│  构建环境 → 勾选需要的工具                                       │
│                                                                  │
│  可选工具(需在全局工具配置中预先定义):                           │
│  ├── ☑ JDK                      选择JDK版本                    │
│  ├── ☑ Maven                    选择Maven版本                  │
│  ├── ☑ Gradle                   选择Gradle版本                 │
│  ├── ☑ Ant                      选择Ant版本                    │
│  └── ☑ NodeJS                   选择Node.js版本                │
│                                                                  │
│  全局工具配置路径:                                               │
│  Manage Jenkins → Global Tool Configuration                     │
│                                                                  │
│  配置示例(JDK):                                                │
│  ├── Name: JDK11                                                │
│  ├── JAVA_HOME: /usr/lib/jvm/java-11-openjdk                   │
│  └── 或勾选 "Install automatically" 自动安装                    │
│                                                                  │
│  配置示例(Maven):                                              │
│  ├── Name: Maven-3.8                                            │
│  ├── MAVEN_HOME: /opt/maven-3.8                                │
│  └── 或勾选 "Install automatically" 从Apache下载                │
└─────────────────────────────────────────────────────────────────┘

7.3 环境变量配置

┌─────────────────────────────────────────────────────────────────┐
│  方式1:Job级别环境变量                                          │
│  构建环境 → 勾选 "Inject environment variables to the build process" │
│                                                                  │
│  Properties Content:                                            │
│  JAVA_HOME=/usr/lib/jvm/java-11                                │
│  MAVEN_OPTS=-Xmx1024m -XX:MaxMetaspaceSize=256m                  │
│  BUILD_ENV=production                                           │
│                                                                  │
│  方式2:使用EnvInject插件                                       │
│  ├── 安装 Environment Injector 插件                              │
│  ├── 勾选 "Prepare an environment for the run"                  │
│  └── 可从文件加载环境变量:.env文件路径                          │
│                                                                  │
│  方式3:全局环境变量                                             │
│  Manage Jenkins → Configure System → Global properties          │
│  ├── 勾选 "Environment variables"                               │
│  └── 添加键值对:如 DOCKER_REGISTRY=registry.example.com        │
└─────────────────────────────────────────────────────────────────┘

7.4 构建超时与并发控制

┌─────────────────────────────────────────────────────────────────┐
│  构建超时(防止构建卡死)                                         │
│  构建环境 → 勾选 "Abort the build if it's stuck"                │
│                                                                  │
│  Time-out strategy:                                              │
│  ├── Absolute    绝对超时(如60分钟)                            │
│  ├── Elastic     弹性超时(根据历史构建时间动态调整)              │
│  └── Likely stuck  检测卡住(无输出超时)                        │
│                                                                  │
│  Time-out variable: BUILD_TIMEOUT=true                          │
│  Action after timeout:                                           │
│  ├── Abort the build    中止构建                                │
│  └── Fail the build     标记为失败                              │
│                                                                  │
│  ─────────────────────────────────────────────                   │
│                                                                  │
│  并发构建控制                                                    │
│  勾选 "Execute concurrent builds if necessary"                   │
│                                                                  │
│  ├── ✅ 勾选:允许同一Job同时运行多个构建                        │
│  │   适用:参数化构建,不同参数可并行                            │
│  │   注意:需要确保Workspace不冲突!                             │
│  │                                                              │
│  └── ❌ 不勾选:同一Job同时只能运行一个构建                      │
│      适用:部署类Job、有共享资源冲突的Job                        │
│      新构建会排队等待                                            │
└─────────────────────────────────────────────────────────────────┘

7.5 构建时间戳与控制台编码

┌─────────────────────────────────────────────────────────────────┐
│  构建环境常用选项:                                               │
│                                                                  │
│  ☑ Add timestamps to the Console Output                         │
│  → 在控制台输出中添加时间戳                                      │
│  → 需要安装 Timestamper 插件                                    │
│  → 方便排查构建各阶段耗时                                        │
│                                                                  │
│  ☑ Set Build Name                                               │
│  → 自定义构建名称(默认为#1, #2...)                             │
│  → 示例:${ENV,var="BRANCH"}-#${BUILD_NUMBER}                   │
│  → 需要安装 Build Name Setter 插件                               │
│                                                                  │
│  Console Output Encoding:                                        │
│  → 如果构建日志中文乱码,设置编码为UTF-8                         │
│  → 在Jenkins启动参数中添加:                                      │
│    -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8               │
│  → 或在Job的构建步骤开头添加:                                     │
│    export JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8"              │
└─────────────────────────────────────────────────────────────────┘

在这里插入图片描述
在这里插入图片描述

7.6 静默期(Quiet Period)

┌─────────────────────────────────────────────────────────────────┐
│  静默期配置                                                     │
│  General → ☑ Quiet period                                       │
│                                                                  │
│  秒数:5                                                        │
│  └── 触发构建后等待5秒,期间如有新的提交则合并构建              │
│                                                                  │
│  适用场景:                                                      │
│  ├── 多人频繁提交到同一分支,避免重复构建                       │
│  ├── 多个Webhook短时间内连续触发                                 │
│  └── 与SCM Skip配合使用效果更佳                                 │
│                                                                  │
│  全局默认值配置:                                                │
│  Manage Jenkins → Configure System → Quiet period               │
│  └── 设置全局默认静默期(如5秒)                                │
│                                                                  │
│  Pipeline中配置:                                                │
│  options { quietPeriod(5) }                                      │
└─────────────────────────────────────────────────────────────────┘

7.7 忽略SCM变更(Skip SCM Changes)

┌─────────────────────────────────────────────────────────────────┐
│  忽略SCM变更触发                                                │
│  General → ☑ Ignore post-commit hooks                           │
│  └── 忽略Git post-commit hook触发的构建                         │
│                                                                  │
│  ☑ Disable automatic SCM triggering                             │
│  └── 禁止SCM变更自动触发构建(只允许手动触发)                  │
│                                                                  │
│  Pipeline中配置:                                                │
│  properties([pipelineTriggers([])])                              │
│  → 清空所有自动触发器,只保留手动触发                            │
└─────────────────────────────────────────────────────────────────┘

八、构建后操作

8.1 归档构建产物

归档产物配置:

┌─────────────────────────────────────────────────────────────────┐
│  构建后操作                                                     │
│  └── 归档构建产物                                                  │
│                                                                  │
│  文件留待归档:                                                  │
│  └── target/*.jar                                               │
│                                                                  │
│  归档方式:                                                      │
│  ├── ✓ 始终归档,不考虑构建结果                                  │
│  └── ○ 只归档成功构建                                           │
│                                                                  │
│  压缩归档文件:                                                  │
│  └── ✓ 启用压缩                                                 │
└─────────────────────────────────────────────────────────────────┘

常用归档模式:
┌─────────────────────────────────────────────────────────────────┐
│  target/*.jar                    所有JAR文件                      │
│  target/**/*.jar                所有JAR包括子目录                │
│  build/dist/*.zip               所有ZIP文件                      │
│  "**/target/*.{jar,war,ear}"   多类型                           │
│  !target/test-*.jar             排除特定文件                     │
└─────────────────────────────────────────────────────────────────┘

8.2 邮件通知

邮件通知配置:

┌─────────────────────────────────────────────────────────────────┐
│  构建后操作                                                     │
│  └── Editable Email Notification                                │
│                                                                  │
│  Project From Address:                                          │
│  └── jenkins@company.com                                       │
│                                                                  │
│  Default Subject:                                               │
│  └── [$PROJECT_NAME] - Build #%BUILD_NUMBER - %STATUS%         │
│                                                                  │
│  Default Content:                                               │
│  └── 详见下方模板                                               │
│                                                                  │
│  触发条件:                                                     │
│  ├── ✓ Always                          总是发送                 │
│  ├── ✓ Failure - New                   失败且是首次失败         │
│  ├── ✓ Failure - Any                    任何失败                 │
│  ├── ✓ Success                         成功                     │
│  └── ✓ Unstable                        不稳定                   │
└─────────────────────────────────────────────────────────────────┘

8.3 邮件内容模板

邮件内容模板示例:

<!DOCTYPE html>
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; }
        .success { color: green; }
        .failure { color: red; }
    </style>
</head>
<body>
    <h2>构建通知 - ${PROJECT_NAME}</h2>

    <p><b>构建结果:</b> <span class="${BUILD_STATUS}">${BUILD_STATUS}</span></p>
    <p><b>构建编号:</b> #${BUILD_NUMBER}</p>
    <p><b>触发方式:</b> ${CAUSE}</p>

    <h3>构建信息</h3>
    <ul>
        <li><b>构建耗时:</b> ${BUILD_DURATION}</li>
        <li><b>代码分支:</b> ${GIT_BRANCH}</li>
        <li><b>提交记录:</b> ${GIT_COMMIT}</li>
    </ul>

    <h3>控制台输出</h3>
    <p><a href="${BUILD_URL}console">点击查看完整日志</a></p>

    <h3>变更记录</h3>
    ${CHANGES}
</body>
</html>

8.4 钉钉/企业微信通知

钉钉机器人通知配置:

┌─────────────────────────────────────────────────────────────────┐
│  构建后操作                                                     │
│  └── 钉钉机器人通知                                              │
│                                                                  │
│  Webhook地址:                                                  │
│  └── https://oapi.dingtalk.com/robot/send?access_token=xxx     │
│                                                                  │
│  通知内容:                                                     │
│  └── 构建通知:${BUILD_STATUS} - ${PROJECT_NAME} #${BUILD_NUMBER}│
│                                                                  │
│  触发条件:                                                     │
│  ├── ✓ Always                          总是发送                 │
│  └── ✓ On Failure                     仅失败时                 │
└─────────────────────────────────────────────────────────────────┘

8.5 触发其他Job

触发参数化构建:

┌─────────────────────────────────────────────────────────────────┐
│  构建后操作                                                     │
│  └── 在其他项目构建后触发                                        │
│                                                                  │
│  项目名称:deploy-job                                           │
│                                                                  │
│  触发稳定构建:                                                  │
│  └── ✓ 触发即使构建不稳定                                        │
│                                                                  │
│  触发参数化构建:                                                │
│  └── ✓ 触发参数化构建                                           │
│                                                                  │
│  参数:                                                         │
│  └── ARTIFACT_PATH=target/app.jar                              │
│  └── DEPLOY_ENV=production                                     │
└─────────────────────────────────────────────────────────────────┘

8.6 构建产物指纹(Fingerprint)

┌─────────────────────────────────────────────────────────────────┐
│  构建后操作 → Record fingerprints of files to track usage       │
│                                                                  │
│  作用:对构建产物计算MD5指纹,跟踪产物在哪些Job中被使用         │
│                                                                  │
│  配置:                                                         │
│  ├── Files to fingerprint: target/*.jar                         │
│  └── Fingerprint all archived artifacts: ☑                      │
│                                                                  │
│  使用场景:                                                      │
│  ├── 跟踪某个JAR包被哪些下游Job部署了                           │
│  ├── 查看某个war包的完整构建→部署链路                           │
│  └── 排查"线上版本对应哪次构建"的问题                           │
│                                                                  │
│  查看指纹信息:                                                  │
│  ├── 构建详情页 → Fingerprints                                  │
│  └── Manage Jenkins → Fingerprints → 搜索MD5                   │
│                                                                  │
│  Pipeline中使用:                                                │
│  fingerprint 'target/*.jar'                                     │
│  → 自动对归档产物记录指纹                                       │
└─────────────────────────────────────────────────────────────────┘

九、参数化构建

9.1 参数化构建概述

参数化构建允许在构建时传入动态参数:

┌─────────────────────────────────────────────────────────────────┐
│  参数化构建配置                                                  │
│                                                                  │
│  此项目配置为参数化构建过程                                       │
│  └── 点击 "添加参数" 按钮添加参数                                 │
└─────────────────────────────────────────────────────────────────┘

9.2 常用参数类型

┌─────────────────────────────────────────────────────────────────┐
│  String Parameter (字符串参数)                                   │
├─────────────────────────────────────────────────────────────────┤
│  名称:BRANCH                                                   │
│  默认值:main                                                   │
│  描述:请输入代码分支名称                                         │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  Choice Parameter (选择参数)                                     │
├─────────────────────────────────────────────────────────────────┤
│  名称:ENV                                                      │
│  选项:                                                         │
│  ├── dev                                                       │
│  ├── test                                                      │
│  └── prod                                                      │
│  描述:选择部署环境                                              │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  Boolean Parameter (布尔参数)                                    │
├─────────────────────────────────────────────────────────────────┤
│  名称:SKIP_TEST                                                │
│  默认值:false                                                  │
│  描述:是否跳过测试                                              │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  Password Parameter (密码参数)                                   │
├─────────────────────────────────────────────────────────────────┤
│  名称:DB_PASSWORD                                              │
│  默认值:                                                       │
│  描述:数据库密码(构建时会加密显示)                              │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  File Parameter (文件参数)                                       │
├─────────────────────────────────────────────────────────────────┤
│  文件路径:upload.jar                                           │
│  描述:上传要部署的JAR文件                                       │
└─────────────────────────────────────────────────────────────────┘

9.3 Pipeline中使用参数

// Jenkinsfile中使用参数
pipeline {
    agent any

    parameters {
        string(name: 'BRANCH', defaultValue: 'main', description: '代码分支')
        choice(name: 'ENV', choices: ['dev', 'test', 'prod'], description: '部署环境')
        booleanParam(name: 'SKIP_TEST', defaultValue: false, description: '跳过测试')
    }

    stages {
        stage('Build') {
            steps {
                echo "Building ${params.BRANCH} for ${params.ENV}"
                sh "mvn clean package -DskipTests=${params.SKIP_TEST}"
            }
        }
    }
}

十、视图管理

10.1 视图类型

视图类型 说明
List View 列表视图,最常用
My View 我的视图,显示用户关注的Job
Sectioned View 分区视图,可自定义布局
Nested View 嵌套视图,支持多层级

10.2 创建视图

创建视图步骤:

1. 点击Jenkins首页左侧 "视图" / "Views"
2. 点击 "+" 添加新视图
3. 输入视图名称
4. 选择视图类型
5. 配置视图内容

10.3 视图配置

List View配置:

┌─────────────────────────────────────────────────────────────────┐
│  视图名称:CI/CD Pipeline                                       │
│                                                                  │
│  列配置:                                                       │
│  ├── ✓ 状态                                                     │
│  ├── ✓ 名称                                                     │
│  ├── ✓ 最后成功构建                                             │
│  ├── ✓ 最后失败构建                                             │
│  ├── ✓ 最后持续时间                                             │
│  └── ✓ 构建参数                                                 │
│                                                                  │
│  筛选器:                                                       │
│  └── ✓ 使用正则表达式匹配Jobs                                   │
│      正则:.*-pipeline|.*-deploy                               │
└─────────────────────────────────────────────────────────────────┘

10.4 视图分组

使用Folder组织Job:

1. 创建Folder:mkdir project-folder
2. 在Folder中创建Job
3. 创建Folder视图

┌─────────────────────────────────────────────────────────────────┐
│  Jenkins首页                                                    │
│  ├── All (默认视图)                                            │
│  ├── CI/CD                                                     │
│  ├── 我的视图                                                   │
│  └── 业务线 Folder                                              │
│       ├── project-a                                            │
│       ├── project-b                                            │
│       └── project-c                                            │
└─────────────────────────────────────────────────────────────────┘

十一、Job权限管理

11.1 授权策略

Jenkins授权策略配置 (Manage Jenkins → Configure Global Security):

┌─────────────────────────────────────────────────────────────────┐
│  安全realm                                                      │
│  └── Jenkins专有用户数据库                                      │
│                                                                  │
│  授权策略:                                                     │
│  ├── ○ 任何用户可以做任何事 (不推荐)                              │
│  ├── ○ Legacy mode                                             │
│  ├── ○ Logged-in users can do anything                         │
│  └── ● 项目矩阵授权策略                                         │
└─────────────────────────────────────────────────────────────────┘

11.2 项目矩阵授权

项目矩阵授权配置:

┌─────────────────────────────────────────────────────────────────┐
│  项目矩阵授权策略                                                │
│                                                                  │
│  用户/组          │ Overall │ Repository │ Jobs     │ Run      │
│  ────────────────────────────────────────────────────────────  │
│  admin           │  Admin  │  Admin     │ Admin   │ Admin    │
│  developer       │  Read   │  Read      │ Read    │ Read     │
│  deployer        │  Read   │  None      │ Read    │ Update   │
│  anonymous       │  None   │  None      │ None    │ None     │
└─────────────────────────────────────────────────────────────────┘

权限说明:
┌─────────────────────────────────────────────────────────────────┐
│  Overall (全局权限)                                             │
│  ├── Admin          管理员权限                                   │
│  ├── Read           读取权限                                    │
│  └── UploadPlugins  上传插件                                    │
├─────────────────────────────────────────────────────────────────┤
│  Repository (仓库权限)                                           │
│  ├── Create         创建                                        │
│  ├── Delete         删除                                        │
│  └── Update         更新                                        │
├─────────────────────────────────────────────────────────────────┤
│  Jobs (任务权限)                                                │
│  ├── Create         创建                                        │
│  ├── Delete         删除                                        │
│  ├── Configure      配置                                        │
│  ├── Read           读取                                        │
│  ├── Build          构建                                        │
│  └── Workspace      工作空间                                     │
├─────────────────────────────────────────────────────────────────┤
│  Run (构建记录权限)                                             │
│  ├── Update         更新                                        │
│  └── Delete         删除                                        │
└─────────────────────────────────────────────────────────────────┘

11.3 Role-based Authorization

安装 Role-based Authorization Strategy 插件后:

┌─────────────────────────────────────────────────────────────────┐
│  角色管理 (Manage and Assign Roles)                             │
│                                                                  │
│  Global Roles:                                                  │
│  ├── admin         管理员                                       │
│  └── developer     开发者                                       │
│                                                                  │
│  Item/Roles (项目角色):                                         │
│  ├── developer     匹配: .*-dev.*                              │
│  ├── tester        匹配: .*-test.*                             │
│  └── operator      匹配: .*                                     │
│                                                                  │
│  Assign Roles:                                                  │
│  ├── user1 → admin + developer                                  │
│  └── user2 → developer + tester                                 │
└─────────────────────────────────────────────────────────────────┘

十二、Job模板与复制

12.1 复制Job

复制已有Job:

1. 在Job列表页面,点击Job右侧 "复制" / "Copy"
2. 输入新Job名称
3. 点击 "确定"

用途:
├── 快速创建类似配置的Job
├── 备份Job配置
└── 实验性配置

12.2 Job配置导出

使用Jenkins CLI导出配置:

# 导出Job配置
java -jar jenkins-cli.jar -s http://localhost:8080 get-job my-job > config.xml

# 导入Job配置
java -jar jenkins-cli.jar -s http://localhost:8080 create-job new-job < config.xml

# 批量创建
for /f %i in (jobs.txt) do (
    java -jar jenkins-cli.jar -s http://localhost:8080 get-job template-job > config.xml
    java -jar jenkins-cli.jar -s http://localhost:8080 create-job %i < config.xml
)

12.3 使用Seed Job生成Job

使用Seed Job + DSL插件批量创建Job:

1. 安装 "Job DSL" 插件
2. 创建Seed Job
3. 配置Seed Job的构建步骤:

┌─────────────────────────────────────────────────────────────────┐
│  构建步骤                                                       │
│  └── Process Job DSLs                                           │
│                                                                  │
│  DSL Scripts:                                                  │
│  └── job.groovy                                                │
└─────────────────────────────────────────────────────────────────┘

4. job.groovy内容:

job('example-pipeline') {
    description('Generated pipeline job')
    scm {
        git('https://github.com/company/project.git')
    }
    steps {
        maven('clean package')
    }
    publishers {
        archiveArtifacts('target/*.jar')
        mailer('team@company.com')
    }
}

十三、常用配置示例

13.1 Java Maven项目

配置示例 - Java Maven项目:

┌─────────────────────────────────────────────────────────────────┐
│  General                                                       │
│  ├── 任务名称:java-maven-app                                  │
│  ├── 描述:Java Maven构建项目                                   │
│  └── 丢弃旧构建:保留30天,最大100个                              │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  源码管理:Git                                                   │
│  ├── Repository URL: git@github.com:company/app.git            │
│  ├── Credentials: (GitHub Deploy Key)                          │
│  └── Branch: */main                                            │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  构建触发器                                                     │
│  └── 定时构建:H 2 * * *                                        │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  构建步骤                                                       │
│  └── 调用顶层Maven目标                                          │
│      ├── Maven版本:Maven-3.8.6                                │
│      └── Goals:clean package -DskipTests                      │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  构建后操作                                                     │
│  ├── 归档构建产物:target/*.jar                                   │
│  └── Editable Email Notification                               │
│      └── 收件人:dev-team@company.com                           │
└─────────────────────────────────────────────────────────────────┘

13.2 Node.js前端项目

配置示例 - Node.js前端项目:

┌─────────────────────────────────────────────────────────────────┐
│  General                                                       │
│  ├── 任务名称:frontend-app                                     │
│  └── 丢弃旧构建:保留7天,最大20个                               │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  源码管理:Git                                                   │
│  ├── Repository URL: git@github.com:company/frontend.git        │
│  └── Branch: */develop                                          │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  构建环境                                                     │
│  └── ✓ Delete workspace before build starts                    │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  构建步骤                                                       │
│  └── 执行Windows批处理命令                                        │
│                                                                  │
│  call npm install                                              │
│  call npm run build                                            │
│  if errorlevel 1 exit /b 1                                     │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  构建后操作                                                     │
│  ├── 归档构建产物:dist/**                                        │
│  └── Windows PowerShell                                         │
│                                                                  │
│  $webDir = "C:\inetpub\wwwroot\frontend"                       │
│  Remove-Item -Path "$webDir\*" -Recurse -Force                  │
│  Copy-Item -Path "dist\*" -Destination $webDir -Recurse        │
└─────────────────────────────────────────────────────────────────┘

13.3 Python项目

配置示例 - Python项目:

┌─────────────────────────────────────────────────────────────────┐
│  构建触发器                                                     │
│  └── 轮询SCM:H/10 * * * *                                      │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  构建步骤                                                       │
│  └── 执行Shell                                                   │
│                                                                  │
│  python3 -m venv venv                                          │
│  source venv/bin/activate                                      │
│  pip install -r requirements.txt                               │
│  pytest tests/ --junitxml=report.xml                           │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  构建后操作                                                     │
│  ├── 归档构建产物:report.xml, coverage.xml                       │
│  └── 发布HTML报告:target/site/coverag                         │
└─────────────────────────────────────────────────────────────────┘

13.4 多阶段流水线Job

配置示例 - 多阶段流水线:

┌─────────────────────────────────────────────────────────────────┐
│  Job名称:app-pipeline                                          │
│                                                                  │
│  阶段1:Build (构建)                                           │
│  └── mvn clean package                                         │
│                                                                  │
│  阶段2:Test (测试)                                            │
│  └── mvn test                                                  │
│                                                                  │
│  阶段3:Deploy-Dev (部署开发环境)                               │
│  └── ./deploy.sh dev                                           │
│                                                                  │
│  阶段4:Deploy-Prod (需手动确认)                                 │
│  └── ./deploy.sh prod                                          │
└─────────────────────────────────────────────────────────────────┘

十四、Pipeline Job创建详解

Pipeline是Jenkins 2.x的核心特性,也是现代CI/CD的首选Job类型。

14.1 创建Pipeline Job

创建步骤:

1. Jenkins首页 → 新建任务
2. 输入名称,选择 "Pipeline" 类型
3. 点击确定进入配置页面

14.2 Pipeline定义方式

┌─────────────────────────────────────────────────────────────────┐
│  Pipeline → Definition 配置项                                    │
│                                                                  │
│  方式1:Pipeline script                                          │
│  ├── 直接在Jenkins界面编写Pipeline脚本                           │
│  ├── 适合:简单测试、快速验证                                    │
│  └── 缺点:无法版本控制                                          │
│                                                                  │
│  方式2:Pipeline script from SCM ⭐推荐                          │
│  ├── 从Git仓库的Jenkinsfile加载Pipeline脚本                     │
│  ├── 适合:正式项目、团队协作                                    │
│  └── 优点:版本控制、代码审查                                    │
│                                                                  │
│  方式3:Pipeline script from SCM (light checkout)                │
│  ├── 轻量检出,只获取Jenkinsfile                                 │
│  └── 适合:大仓库加速                                            │
└─────────────────────────────────────────────────────────────────┘

14.3 Pipeline script from SCM 配置

┌─────────────────────────────────────────────────────────────────┐
│  Definition: Pipeline script from SCM                            │
│                                                                  │
│  SCM: Git                                                       │
│  ├── Repository URL: https://gitlab.com/group/project.git       │
│  ├── Credentials: gitlab-ssh-key                                │
│  ├── Branches to build: */main                                  │
│  └── Script Path: Jenkinsfile                                   │
│      ├── 默认值:Jenkinsfile(项目根目录)                       │
│      ├── 可指定子目录:ci/Jenkinsfile                            │
│      └── 可使用变量:Jenkinsfile.${BRANCH_NAME}                 │
│                                                                  │
│  Lightweight checkout: ☑                                         │
│  → 只拉取Jenkinsfile,不拉取整个仓库                             │
│  → 后续 checkout 步骤再拉取完整代码                              │
└─────────────────────────────────────────────────────────────────┘

14.4 声明式Pipeline完整模板

pipeline {
    agent any

    environment {
        APP_NAME = 'my-app'
        VERSION = "${env.BUILD_ID}"
    }

    options {
        timeout(time: 30, unit: 'MINUTES')
        buildDiscarder(logRotator(numToKeepStr: '10'))
        timestamps()
        disableConcurrentBuilds()
    }

    parameters {
        string(name: 'BRANCH', defaultValue: 'main', description: '代码分支')
        choice(name: 'ENV', choices: ['dev', 'test', 'prod'], description: '部署环境')
    }

    triggers {
        pollSCM('H/5 * * * *')
    }

    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }

        stage('Build') {
            steps {
                sh 'mvn clean package -DskipTests'
            }
        }

        stage('Test') {
            steps {
                sh 'mvn test'
            }
            post {
                always {
                    junit 'target/surefire-reports/**/*.xml'
                }
            }
        }

        stage('Deploy') {
            when {
                branch 'main'
            }
            steps {
                sh "./deploy.sh ${params.ENV}"
            }
        }
    }

    post {
        success {
            echo 'Build succeeded!'
        }
        failure {
            echo 'Build failed!'
        }
        always {
            archiveArtifacts artifacts: 'target/*.jar', allowEmptyArchive: true
            cleanWs()
        }
    }
}

14.5 Pipeline配置页面与Jenkinsfile的对应关系

┌─────────────────────────────────────────────────────────────────┐
│  Freestyle配置项      →    Pipeline对应语法                      │
│  ─────────────────────────────────────────────────────────────  │
│  丢弃旧构建           →    options { buildDiscarder(...) }      │
│  参数化构建           →    parameters { ... }                   │
│  构建触发器           →    triggers { ... }                     │
│  限制运行节点         →    agent { label 'xxx' }                │
│  构建环境-超时        →    options { timeout(...) }             │
│  构建环境-时间戳      →    options { timestamps() }             │
│  构建环境-并发控制    →    options { disableConcurrentBuilds() } │
│  构建步骤             →    stages { stage(...) { steps {...} } }│
│  构建后操作           →    post { always/failure/success {...} } │
│  环境变量             →    environment { ... }                  │
└─────────────────────────────────────────────────────────────────┘

十五、Multibranch Pipeline配置

Multibranch Pipeline自动为每个分支创建Pipeline Job,是Gitflow工作流的最佳搭档。

15.1 创建Multibranch Pipeline

创建步骤:

1. Jenkins首页 → 新建任务
2. 输入名称,选择 "Multibranch Pipeline" 类型
3. 点击确定进入配置页面

15.2 Branch Sources配置

┌─────────────────────────────────────────────────────────────────┐
│  Branch Sources → Add source → Git                               │
│                                                                  │
│  项目仓库配置:                                                   │
│  ├── Repository URL: https://gitlab.com/group/project.git       │
│  ├── Credentials: gitlab-credentials                            │
│  └── Includes: *                                                │
│      Excludes:                                                   │
│                                                                  │
│  ─── 或使用 GitLab / GitHub ───                                 │
│                                                                  │
│  Branch Sources → Add source → GitLab(需安装插件)              │
│  ├── Server: gitlab-server                                      │
│  ├── Owner: group-name                                          │
│  ├── Project: project-name                                      │
│  └── 自动发现分支和MR                                            │
└─────────────────────────────────────────────────────────────────┘

15.3 分支发现策略

┌─────────────────────────────────────────────────────────────────┐
│  Discover branches:                                              │
│  ├── All branches           发现所有分支                         │
│  ├── Only master branch     仅发现主分支                        │
│  └── Exclude branches that are also filed as PR                 │
│      排除已提交PR的分支                                          │
│                                                                  │
│  Discover MR from origin:                                        │
│  ├── Merge request from origin    发现源仓库的MR                │
│  └── 配置MR的构建策略                                            │
│                                                                  │
│  Filter by name (with regular expression):                       │
│  ├── Include: (feature|bugfix|hotfix)/.*                        │
│  └── 只发现匹配正则的分支                                        │
└─────────────────────────────────────────────────────────────────┘

15.4 扫描配置

┌─────────────────────────────────────────────────────────────────┐
│  Scan Multibranch Pipeline Triggers                              │
│                                                                  │
│  ☑ Periodically if not otherwise run                             │
│  ├── Interval: 5 minutes                                        │
│  └── 每5分钟自动扫描仓库,发现新分支/删除旧分支                   │
│                                                                  │
│  手动触发扫描:                                                  │
│  └── Multibranch Pipeline首页 → Scan Multibranch Pipeline Now   │
│                                                                  │
│  扫描结果:                                                      │
│  ├── 新分支 → 自动创建Pipeline Job                              │
│  ├── 已删除分支 → 自动删除对应Job                                │
│  └── Jenkinsfile变更 → 自动更新Pipeline配置                     │
└─────────────────────────────────────────────────────────────────┘

15.5 与普通Pipeline的区别

特性 Pipeline Multibranch Pipeline
分支管理 手动指定分支 自动发现所有分支
Job数量 1个Job 每个分支1个Job
Jenkinsfile 可内联或SCM 必须在仓库根目录
PR/MR构建 需手动配置 自动支持
分支删除 手动清理 自动清理
适用场景 单分支/简单流程 Gitflow/GitHub Flow

十六、Job日常管理操作

日常运维中频繁使用的Job管理操作,很多新手容易忽略。

16.1 禁用与启用Job

┌─────────────────────────────────────────────────────────────────┐
│  禁用Job                                                        │
│  ├── 方式1:Job首页 → 左侧菜单 "Disable Project"               │
│  ├── 方式2:Job配置页 → 顶部勾选 "Disabled"                     │
│  └── 效果:Job变灰,不会响应任何触发器                           │
│                                                                  │
│  启用Job                                                        │
│  ├── 方式1:Job首页 → 左侧菜单 "Enable Project"                │
│  └── 方式2:Job配置页 → 取消勾选 "Disabled"                     │
│                                                                  │
│  适用场景:                                                      │
│  ├── 临时维护时暂停构建                                          │
│  ├── 依赖服务不可用时暂停                                        │
│  └── 废弃但暂时保留的Job                                        │
└─────────────────────────────────────────────────────────────────┘

16.2 重命名与移动Job

┌─────────────────────────────────────────────────────────────────┐
│  重命名Job                                                      │
│  ├── Job首页 → 左侧菜单 "Rename"                                │
│  ├── 输入新名称 → 点击确认                                      │
│  └── ⚠️ 注意:                                                  │
│      ├── 会影响所有引用该Job的上游/下游Job                       │
│      ├── URL会变化,外部链接会失效                               │
│      └── 建议在低峰期操作                                        │
│                                                                  │
│  移动Job到Folder                                                 │
│  ├── Job首页 → 左侧菜单 "Move"                                  │
│  ├── 选择目标Folder                                              │
│  └── ⚠️ 注意:URL路径会变化                                     │
└─────────────────────────────────────────────────────────────────┘

16.3 删除Job

┌─────────────────────────────────────────────────────────────────┐
│  删除Job                                                        │
│  ├── 方式1:Job首页 → 左侧菜单 "Delete Project"                 │
│  ├── 方式2:Jenkins首页 → Job行 → 下拉菜单 → Delete             │
│  └── ⚠️ 不可恢复!建议先备份config.xml                          │
│                                                                  │
│  批量删除(使用Script Console):                                │
│  Manage Jenkins → Script Console                                │
│  ─────────────────────────────────────────────                   │
│  // 删除所有以 "test-" 开头的Job                                 │
│  Jenkins.instance.getAllItems(Job.class).each { job ->           │
│      if (job.name.startsWith('test-')) {                         │
│          job.delete()                                            │
│          println "Deleted: ${job.name}"                          │
│      }                                                           │
│  }                                                               │
└─────────────────────────────────────────────────────────────────┘

16.4 清理构建历史

┌─────────────────────────────────────────────────────────────────┐
│  单个Job清理                                                     │
│  ├── Job首页 → 左侧菜单 "Wipe Out Current Workspace"            │
│  │   → 清理工作空间文件                                          │
│  └── Job首页 → 构建历史 → 逐个删除或批量清理                     │
│                                                                  │
│  批量清理旧构建(Script Console):                              │
│  ─────────────────────────────────────────────                   │
│  // 清理所有Job的旧构建,只保留最近10次                           │
│  Jenkins.instance.getAllItems(Job.class).each { job ->           │
│      job.getBuilds().byTimestamp(0,                              │
│          System.currentTimeMillis() - 30*24*60*60*1000)          │
│          .each { build ->                                        │
│              build.delete()                                      │
│          }                                                       │
│      println "Cleaned: ${job.name}"                              │
│  }                                                               │
│                                                                  │
│  配置自动清理(推荐):                                           │
│  Job配置 → 勾选 "Discard old builds"                             │
│  ├── Days to keep builds: 30                                    │
│  ├── Max # of builds to keep: 50                                │
│  ├── Days to keep artifacts: 7                                  │
│  └── Max # of builds to keep with artifacts: 10                 │
└─────────────────────────────────────────────────────────────────┘

16.5 重新构建与中断构建

┌─────────────────────────────────────────────────────────────────┐
│  重新构建                                                       │
│  ├── Job首页 → 构建历史 → 点击构建号 → "Replay"                 │
│  │   → Pipeline Job支持修改脚本后重新执行                        │
│  └── Job首页 → "Build Now" 触发新构建                           │
│                                                                  │
│  中断构建                                                       │
│  ├── 构建详情页 → 左侧 "Abort Build" / 点击红色X按钮            │
│  ├── 效果:发送中断信号,构建进程收到SIGTERM/SIGINT              │
│  └── ⚠️ 注意:                                                  │
│      ├── 中断可能不会立即生效(进程可能忽略信号)                │
│      ├── 可能产生僵尸进程(需要手动kill)                        │
│      └── 中断的构建状态为 ABORTED(黄色)                        │
└─────────────────────────────────────────────────────────────────┘

十七、构建状态与结果详解

理解Jenkins的构建状态是排查问题和配置通知的前提。

17.1 构建状态分类

┌─────────────────────────────────────────────────────────────────┐
│  Jenkins构建状态一览                                             │
│                                                                  │
│  🔵 SUCCESS (蓝色)                                               │
│  ├── 构建完全成功                                                │
│  ├── 所有步骤正常完成                                            │
│  └── 触发条件:exit code = 0                                    │
│                                                                  │
│  🟡 UNSTABLE (黄色)                                              │
│  ├── 构建成功但测试失败                                          │
│  ├── 编译/打包成功,但测试用例有失败                              │
│  └── 触发条件:测试框架报告失败(如JUnit失败)                   │
│                                                                  │
│  🔴 FAILURE (红色)                                               │
│  ├── 构建失败                                                    │
│  ├── 编译错误、脚本执行失败、步骤异常                            │
│  └── 触发条件:exit code ≠ 0 或步骤抛出异常                     │
│                                                                  │
│  ⚪ ABORTED (灰色)                                               │
│  ├── 构建被手动中止                                              │
│  ├── 超时被自动中止                                              │
│  └── 触发条件:用户点击Abort或超时                               │
│                                                                  │
│  🔶 NOT_BUILT (灰色)                                             │
│  ├── 该阶段未执行                                                │
│  ├── 多出现在Pipeline的when条件不满足时                           │
│  └── 触发条件:stage被跳过                                       │
└─────────────────────────────────────────────────────────────────┘

17.2 状态转换与触发条件

构建状态转换流程:

  开始构建
     │
     ▼
  ┌─────────┐    exit 0 + 测试全通过    ┌──────────┐
  │ 执行中   │ ──────────────────────→  │ SUCCESS  │
  │ (BUILDING)│                         └──────────┘
  └─────────┘    exit 0 + 测试失败    ┌──────────┐
     │         ──────────────────────→ │ UNSTABLE │
     │                                └──────────┘
     │    exit ≠ 0 / 异常           ┌──────────┐
     ├────────────────────────────→ │ FAILURE  │
     │                              └──────────┘
     │    手动中止 / 超时           ┌──────────┐
     └────────────────────────────→ │ ABORTED  │
                                    └──────────┘

17.3 在Pipeline中设置构建结果

pipeline {
    agent any
    stages {
        stage('Test') {
            steps {
                script {
                    def testResult = runTests()
                    if (testResult.failCount > 0) {
                        currentBuild.result = 'UNSTABLE'
                        echo "Tests failed: ${testResult.failCount}"
                    }
                }
            }
        }
        stage('Deploy') {
            when {
                expression { currentBuild.result != 'UNSTABLE' }
            }
            steps {
                sh './deploy.sh'
            }
        }
    }
    post {
        unstable {
            echo 'Build is UNSTABLE - tests failed!'
            mail to: 'team@example.com',
                 subject: "UNSTABLE: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
                 body: 'Test failures detected'
        }
    }
}

17.4 构建状态与通知配置对照

构建状态 邮件通知 钉钉/企微 触发下游Job
SUCCESS ✅ 可选 ✅ 可选 ✅ 触发
UNSTABLE ✅ 推荐 ✅ 推荐 ⚠️ 可配置
FAILURE ✅ 必须 ✅ 必须 ❌ 不触发
ABORTED ❌ 通常不发 ❌ 通常不发 ❌ 不触发

十八、Jenkins CLI与REST API操作Job

批量管理Job时,命令行和API比Web界面高效得多。

18.1 Jenkins CLI

# 下载CLI jar
curl -LO http://jenkins-server:8080/jnlpJars/jenkins-cli.jar

# 基本格式
java -jar jenkins-cli.jar -s http://jenkins-server:8080/ -auth user:token <command>

# 常用Job操作
java -jar jenkins-cli.jar -s http://localhost:8080 list-jobs
java -jar jenkins-cli.jar -s http://localhost:8080 get-job my-job
java -jar jenkins-cli.jar -s http://localhost:8080 create-job new-job < config.xml
java -jar jenkins-cli.jar -s http://localhost:8080 copy-job template new-job
java -jar jenkins-cli.jar -s http://localhost:8080 delete-job my-job
java -jar jenkins-cli.jar -s http://localhost:8080 build my-job
java -jar jenkins-cli.jar -s http://localhost:8080 build my-job -p BRANCH=dev
java -jar jenkins-cli.jar -s http://localhost:8080 disable-job my-job
java -jar jenkins-cli.jar -s http://localhost:8080 enable-job my-job

18.2 REST API操作

⚠️ 重要:Jenkins默认启用CSRF保护,所有POST请求必须携带Crumb头!

获取Crumb:
curl -s -u user:token "http://localhost:8080/crumbIssuer/api/json"
返回示例:{"crumb":"abc123","crumbRequestField":"Jenkins-Crumb"}

在后续POST请求中添加Header:
-H "Jenkins-Crumb: abc123"
# 获取Job列表
curl -s -u user:token "http://localhost:8080/api/json?pretty=true"

# 获取Job详情
curl -s -u user:token "http://localhost:8080/job/my-job/api/json?pretty=true"

# 触发构建(需要Crumb)
CRUMB=$(curl -s -u user:token "http://localhost:8080/crumbIssuer/api/json" | python3 -c "import sys,json; print(json.load(sys.stdin)['crumb'])")
curl -X POST -u user:token -H "Jenkins-Crumb: $CRUMB" "http://localhost:8080/job/my-job/build"

# 参数化构建
curl -X POST -u user:token -H "Jenkins-Crumb: $CRUMB" \
  "http://localhost:8080/job/my-job/buildWithParameters?BRANCH=dev&ENV=test"

# 获取构建日志
curl -s -u user:token "http://localhost:8080/job/my-job/1/consoleText"

# 获取构建状态
curl -s -u user:token "http://localhost:8080/job/my-job/1/api/json" | \
  python3 -c "import sys,json; print(json.load(sys.stdin)['result'])"

# 创建Job(需要Crumb + config.xml)
curl -X POST -u user:token -H "Jenkins-Crumb: $CRUMB" -H "Content-Type: application/xml" \
  --data-binary @config.xml \
  "http://localhost:8080/createItem?name=new-job"

# 更新Job配置
curl -X POST -u user:token -H "Jenkins-Crumb: $CRUMB" -H "Content-Type: application/xml" \
  --data-binary @config.xml \
  "http://localhost:8080/job/my-job/config.xml"

# 删除Job
curl -X POST -u user:token -H "Jenkins-Crumb: $CRUMB" "http://localhost:8080/job/my-job/doDelete"

# 启用/禁用Job
curl -X POST -u user:token -H "Jenkins-Crumb: $CRUMB" "http://localhost:8080/job/my-job/enable"
curl -X POST -u user:token -H "Jenkins-Crumb: $CRUMB" "http://localhost:8080/job/my-job/disable"

18.3 批量操作脚本

#!/bin/bash
# batch_job_ops.sh - Jenkins Job批量操作脚本

JENKINS_URL="http://localhost:8080"
USER="admin"
TOKEN="your-api-token"

# 批量禁用匹配的Job
disable_jobs() {
    local pattern=$1
    curl -s -u "$USER:$TOKEN" "$JENKINS_URL/api/json?tree=jobs[name]" | \
    python3 -c "
import sys, json
jobs = json.load(sys.stdin)['jobs']
for job in jobs:
    if '$pattern' in job['name']:
        print(job['name'])
" | while read job; do
        curl -X POST -u "$USER:$TOKEN" "$JENKINS_URL/job/$job/disable"
        echo "Disabled: $job"
    done
}

# 批量触发构建
trigger_builds() {
    local pattern=$1
    curl -s -u "$USER:$TOKEN" "$JENKINS_URL/api/json?tree=jobs[name]" | \
    python3 -c "
import sys, json
jobs = json.load(sys.stdin)['jobs']
for job in jobs:
    if '$pattern' in job['name']:
        print(job['name'])
" | while read job; do
        curl -X POST -u "$USER:$TOKEN" "$JENKINS_URL/job/$job/build"
        echo "Triggered: $job"
    done
}

# 使用示例
# disable_jobs "test-"
# trigger_builds "deploy-"

十九、Job常见问题排查

Job使用中的高频问题与解决方案。

19.1 构建卡住不动

┌─────────────────────────────────────────────────────────────────┐
│  症状:构建一直运行,不结束也不输出                              │
│                                                                  │
│  排查步骤:                                                      │
│  1. 查看控制台输出                                               │
│     → 是否卡在某个步骤(如等待输入、下载依赖)                   │
│  2. 检查执行器占用                                               │
│     → Manage Jenkins → 节点列表 → 查看执行器状态                │
│  3. 检查是否等待用户输入                                         │
│     → Pipeline的input步骤会暂停等待                              │
│  4. 检查网络问题                                                 │
│     → 下载外部依赖超时(Maven/npm)                              │
│                                                                  │
│  解决方案:                                                      │
│  ├── 配置构建超时(Abort the build if it's stuck)               │
│  ├── 检查代理设置(HTTP_PROXY等)                                │
│  ├── 配置Maven/npm镜像源加速                                    │
│  └── 手动Abort后检查是否有僵尸进程                               │
│      → ps aux | grep java                                       │
│      → kill -9 <pid>                                            │
└─────────────────────────────────────────────────────────────────┘

19.2 Workspace问题

┌─────────────────────────────────────────────────────────────────┐
│  问题1:Workspace磁盘空间不足                                    │
│  ├── df -h 查看磁盘使用                                         │
│  ├── 清理旧Workspace:                                          │
│  │   find /var/lib/jenkins/workspace -mtime +30 -exec rm -rf {} \;│
│  └── 配置Workspace自动清理                                       │
│                                                                  │
│  问题2:Workspace文件权限错误                                    │
│  ├── ls -la 查看文件权限                                        │
│  ├── chown -R jenkins:jenkins workspace/                        │
│  └── 检查Docker容器挂载的权限映射                                │
│                                                                  │
│  问题3:Workspace残留导致构建失败                                │
│  ├── 勾选 "Delete workspace before build starts"                 │
│  ├── 或在Pipeline中添加:                                        │
│  │   steps {                                                     │
│  │       cleanWs()                                               │
│  │   }                                                           │
│  └── 或使用Git clean:                                           │
│      steps {                                                     │
│          checkout([$class: 'GitSCM', ..., extensions: [          │
│              [$class: 'CleanBeforeCheckout'],                    │
│              [$class: 'CleanAfterCheckout'],                     │
│          ]])                                                     │
│      }                                                           │
└─────────────────────────────────────────────────────────────────┘

19.3 构建权限问题

┌─────────────────────────────────────────────────────────────────┐
│  问题1:用户无法触发构建                                         │
│  ├── 检查用户是否有 Job/Build 权限                               │
│  ├── 检查项目矩阵授权配置                                       │
│  └── 检查Role-based Strategy的角色分配                           │
│                                                                  │
│  问题2:构建无法访问Git仓库                                      │
│  ├── 检查Credentials配置是否正确                                 │
│  ├── 检查SSH密钥是否有效(ssh -T git@github.com)               │
│  ├── 检查网络是否可达                                            │
│  └── 检查仓库权限(用户是否有读权限)                            │
│                                                                  │
│  问题3:构建无法执行Shell命令                                    │
│  ├── 检查jenkins用户是否有执行权限                               │
│  ├── 检查脚本是否有+x权限                                       │
│  ├── 检查sudo配置(jenkins用户是否在sudoers中)                  │
│  └── 使用绝对路径执行命令                                        │
└─────────────────────────────────────────────────────────────────┘

19.4 构建环境问题

┌─────────────────────────────────────────────────────────────────┐
│  问题1:Java版本不匹配                                          │
│  ├── 在Job配置中指定JDK版本                                     │
│  ├── 或在Shell步骤开头设置:                                     │
│  │   export JAVA_HOME=/usr/lib/jvm/java-11                     │
│  │   export PATH=$JAVA_HOME/bin:$PATH                          │
│  └── 全局工具配置中管理多个JDK版本                               │
│                                                                  │
│  问题2:Maven构建OOM                                            │
│  ├── 增大MAVEN_OPTS:                                           │
│  │   MAVEN_OPTS="-Xmx2048m -XX:MaxMetaspaceSize=512m"            │
│  ├── 检查Jenkins节点内存是否充足                                 │
│  └── 考虑使用独立构建节点而非Master                              │
│                                                                  │
│  问题3:中文乱码                                                 │
│  ├── Jenkins启动参数添加:                                       │
│  │   -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8             │
│  ├── Shell步骤开头添加:                                         │
│  │   export LANG=en_US.UTF-8                                    │
│  └── 检查系统locale设置                                         │
└─────────────────────────────────────────────────────────────────┘

二十、凭据管理详解

凭据(Credentials)是Job访问外部系统(Git、Docker Registry、SSH等)的认证信息,安全管理凭据是Jenkins运维的基础。

20.1 凭据类型

类型 说明 使用场景
Username with password 用户名+密码 Git HTTP认证、API Token
SSH Username with private key SSH用户名+私钥 Git SSH克隆、远程部署
Secret text 单一秘密文本 API Token、Webhook Secret
Secret file 秘密文件 证书文件、配置文件
Certificate PKCS12证书 双向TLS认证

20.2 创建凭据

创建凭据步骤:

1. Manage Jenkins → Credentials → System → Global credentials
2. 点击 "Add Credentials"
3. 选择类型并填写信息
4. 点击 "Create"

凭据作用域:
├── Global    全局可用(任何Job都能引用)
└── System    仅Jenkins系统内部使用(如Master节点连接Agent)

20.3 常用凭据配置示例

┌─────────────────────────────────────────────────────────────────┐
│  示例1:Git SSH密钥                                             │
│  ├── Kind: SSH Username with private key                       │
│  ├── ID: github-ssh-key                                        │
│  ├── Username: git                                             │
│  ├── Private Key: ☑ Enter directly                            │
│  │   └── 粘贴 ~/.ssh/id_rsa 内容                               │
│  └── Passphrase: (如有设置则填写)                              │
│                                                                  │
│  示例2:Docker Registry                                         │
│  ├── Kind: Username with password                              │
│  ├── ID: docker-registry-creds                                 │
│  ├── Username: admin                                           │
│  ├── Password: ********                                        │
│  └── Description: Harbor镜像仓库认证                            │
│                                                                  │
│  示例3:API Token                                               │
│  ├── Kind: Secret text                                         │
│  ├── ID: vault-api-token                                       │
│  ├── Secret: s.xxxxxxxxxxxxx                                   │
│  └── Description: Vault访问令牌                                 │
└─────────────────────────────────────────────────────────────────┘

20.4 在Pipeline中使用凭据

pipeline {
    agent any
    stages {
        stage('Git Checkout') {
            steps {
                git credentialsId: 'github-ssh-key',
                    url: 'git@github.com:company/project.git',
                    branch: 'main'
            }
        }
        stage('Docker Push') {
            steps {
                withCredentials([usernamePassword(
                    credentialsId: 'docker-registry-creds',
                    usernameVariable: 'DOCKER_USER',
                    passwordVariable: 'DOCKER_PASS'
                )]) {
                    sh 'echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin'
                    sh 'docker push my-app:latest'
                }
            }
        }
        stage('Deploy') {
            steps {
                withCredentials([sshUserPrivateKey(
                    credentialsId: 'deploy-ssh-key',
                    keyFileVariable: 'SSH_KEY',
                    usernameVariable: 'SSH_USER'
                )]) {
                    sh "ssh -i $SSH_KEY $SSH_USER@prod-server 'deploy.sh'"
                }
            }
        }
    }
}

20.5 凭据安全最佳实践

┌─────────────────────────────────────────────────────────────────┐
│  ⚠️ 凭据安全注意事项:                                          │
│                                                                  │
│  1. 永远不要在Jenkinsfile中硬编码密码                           │
│     ❌ sh 'curl -u admin:password123 ...'                       │
│     ✅ withCredentials([...]) { sh 'curl -u $USER:$PASS ...' }  │
│                                                                  │
│  2. 使用最小权限原则                                             │
│     ├── Git仓库:只读权限的Deploy Key                           │
│     └── Docker Registry:只推送到指定仓库的账号                  │
│                                                                  │
│  3. 定期轮换凭据                                                │
│     ├── 更新凭据后ID不变,Job自动使用新值                       │
│     └── 建议每90天轮换一次密码/Token                            │
│                                                                  │
│  4. 控制凭据可见性                                               │
│     ├── Job权限中 "Credentials" 权限需谨慎授予                  │
│     └── 避免在构建日志中泄露凭据(Credentials Binding插件)     │
│                                                                  │
│  5. 使用凭据ID而非明文                                          │
│     ├── 每个凭据都有唯一ID(如 github-ssh-key)                 │
│     └── 引用时使用ID,不使用用户名密码                          │
└─────────────────────────────────────────────────────────────────┘

二十一、Jenkins内置环境变量

Jenkins提供了大量内置环境变量,在构建步骤和Pipeline中可直接引用,是自动化脚本的关键支撑。

21.1 核心环境变量列表

变量名 说明 示例值
BUILD_NUMBER 当前构建编号 42
BUILD_ID 当前构建ID(等同BUILD_NUMBER) 42
BUILD_TAG 构建标签(jenkins-Job名-编号) jenkins-my-job-42
BUILD_URL 当前构建的完整URL http://jenkins/job/my-job/42/
JOB_NAME Job名称 my-project
JOB_URL Job的URL http://jenkins/job/my-project/
WORKSPACE 工作空间绝对路径 /var/lib/jenkins/workspace/my-project
JENKINS_URL Jenkins服务器URL http://jenkins/
JENKINS_HOME Jenkins主目录 /var/lib/jenkins
NODE_NAME 执行构建的节点名 masteragent-01
NODE_LABELS 节点标签 linux docker maven
EXECUTOR_NUMBER 执行器编号 0
CVS_BRANCH CVS分支 -

21.2 Git相关环境变量

变量名 说明 前提条件
GIT_COMMIT 当前提交的SHA 使用Git SCM
GIT_BRANCH 当前分支名 使用Git SCM
GIT_PREVIOUS_COMMIT 上次构建的SHA 使用Git SCM
GIT_PREVIOUS_SUCCESSFUL_COMMIT 上次成功构建的SHA 使用Git SCM
GIT_URL Git仓库URL 使用Git SCM
GIT_LOCAL_BRANCH 本地分支名 使用Git SCM

21.3 Pipeline专用变量

变量名 说明 示例
env.BUILD_NUMBER Pipeline中引用构建号 "${env.BUILD_NUMBER}"
env.JOB_NAME Pipeline中引用Job名 "${env.JOB_NAME}"
env.WORKSPACE Pipeline中引用工作空间 "${env.WORKSPACE}"
currentBuild.result 当前构建结果 SUCCESS/FAILURE
currentBuild.displayName 构建显示名 #42 - main
currentBuild.description 构建描述 Deployed to prod
params.XXX 引用参数 "${params.BRANCH}"
env.XXX 引用environment定义的变量 "${env.APP_NAME}"

21.4 在Shell中使用环境变量

#!/bin/bash
echo "Job: ${JOB_NAME}"
echo "Build: #${BUILD_NUMBER}"
echo "Workspace: ${WORKSPACE}"
echo "Node: ${NODE_NAME}"
echo "Git Commit: ${GIT_COMMIT:0:8}"
echo "Git Branch: ${GIT_BRANCH}"
echo "Build URL: ${BUILD_URL}"

# Windows批处理中使用
# echo Job: %JOB_NAME%
# echo Build: #%BUILD_NUMBER%
# echo Workspace: %WORKSPACE%

二十二、Webhook触发配置详解

Webhook是实现"代码推送即构建"的核心机制,比轮询SCM更实时、更高效。

22.1 Webhook工作原理

Webhook触发流程:

┌──────────────┐    HTTP POST     ┌──────────────┐    触发构建    ┌──────────────┐
│  Git服务器    │ ──────────────→ │   Jenkins     │ ────────────→ │   Job执行    │
│ (GitHub等)   │  push事件通知    │  Webhook端点  │               │              │
└──────────────┘                  └──────────────┘               └──────────────┘

关键配置要素:
├── Jenkins公网可访问的URL(或使用内网穿透)
├── Job中启用Webhook触发
└── Git服务器配置Webhook URL

22.2 GitHub Webhook配置

步骤1:Jenkins Job配置
├── 构建触发器 → ☑ GitHub hook trigger for GITScm polling
└── (需要安装 GitHub plugin 和 Git plugin)

步骤2:GitHub仓库配置
├── 仓库 → Settings → Webhooks → Add webhook
├── Payload URL: http://jenkins-server:8080/github-webhook/
├── Content type: application/json
├── Secret: (可选,用于验证签名)
├── Events: ☑ Just the push event(或自定义)
└── Active: ☑

触发URL格式:
└── http://<jenkins-url>/github-webhook/

22.3 GitLab Webhook配置

步骤1:Jenkins Job配置
├── 构建触发器 → ☐ Build when a change is pushed to GitLab
├── 勾选需要的触发事件:
│   ├── ☑ Push Events
│   ├── ☑ Opened Merge Request Events
│   ├── ☑ Approved Merge Request Events
│   └── ☑ Tag Push Events
├── 设置 Secret token(点击Generate生成)
└── (需要安装 GitLab plugin)

步骤2:GitLab仓库配置
├── 仓库 → Settings → Webhooks → Add new webhook
├── URL: http://jenkins-server:8080/project/my-job
├── Secret token: (填入Jenkins中生成的token)
├── Trigger: ☑ Push events / ☑ Tag push events
├── SSL verification: ☐ (测试环境可关闭)
└── 点击 "Add webhook" → 测试 "Test" → "Push events"

触发URL格式:
└── http://<jenkins-url>/project/<job-name>

22.4 Gitee Webhook配置

步骤1:Jenkins Job配置
├── 构建触发器 → ☑ Gitee WebHook 触发构建
├── 勾选触发事件:
│   ├── ☑ Push
│   ├── ☑ Pull Request
│   └── ☑ Tag Push
├── Gitee WebHook 密码:点击Generate生成
└── (需要安装 Gitee plugin)

步骤2:Gitee仓库配置
├── 仓库 → 管理 → WebHooks → 添加WebHook
├── URL: http://jenkins-server:8080/gitee-project/my-job
├── 密码:填入Jenkins中生成的密码
├── 勾选事件:Push / Pull Request / Tag Push
└── 点击 "添加" → "测试推送"

22.5 通用Webhook(Generic Webhook Trigger)

使用 Generic Webhook Trigger 插件(支持任意Git平台):

步骤1:安装插件
└── Generic Webhook Trigger Plugin

步骤2:Job配置
├── 构建触发器 → ☑ Generic Webhook Trigger
├── Token: my-job-token(自定义,用于区分不同Job)
├── Post content parameters:
│   ├── Variable: REF
│   │   Expression: $.ref
│   │   └── 从JSON payload中提取ref字段
│   └── Variable: COMMIT_MSG
│       Expression: $.commits[0].message
│       └── 提取提交信息
├── Optional filter:
│   ├── Expression: refs/heads/(main|develop)
│   └── Text: $REF
│   └── 只在main/develop分支推送时触发
└── Print post content: ☑(调试用)

步骤3:触发URL
└── http://<jenkins-url>/generic-webhook-trigger/invoke?token=my-job-token

测试:
curl -X POST http://jenkins:8080/generic-webhook-trigger/invoke \
  -H "Content-Type: application/json" \
  -d '{"ref":"refs/heads/main","commits":[{"message":"test"}]}'

22.6 Webhook常见问题

┌─────────────────────────────────────────────────────────────────┐
│  问题1:Webhook无法触发构建                                     │
│  ├── 检查Jenkins是否可从公网访问                                │
│  ├── 检查防火墙是否放行Jenkins端口                              │
│  ├── 检查Webhook URL是否正确                                    │
│  └── 检查Job中是否启用了对应的触发器                            │
│                                                                  │
│  问题2:Jenkins在内网,Git服务器在公网                          │
│  ├── 方案1:使用内网穿透(ngrok/frp)暴露Jenkins               │
│  ├── 方案2:使用轮询SCM代替Webhook                              │
│  └── 方案3:使用Git平台的中转服务(如GitLab CI触发Jenkins)    │
│                                                                  │
│  问题3:Webhook触发但构建未执行                                 │
│  ├── 检查分支过滤条件是否匹配                                   │
│  ├── 检查Job是否被禁用                                          │
│  └── 查看Jenkins日志:Manage Jenkins → System Log              │
└─────────────────────────────────────────────────────────────────┘

附录A:Job常用URL

Jenkins Job相关URL:

┌─────────────────────────────────────────────────────────────────┐
│  Job相关URL                                                     │
├─────────────────────────────────────────────────────────────────┤
│  Job首页:         /job/{job-name}/                             │
│  Job配置:         /job/{job-name}/configure                    │
│  Job删除:         /job/{job-name}/doDelete                     │
│  Job复制:         /job/{job-name}/clone                        │
│  Job重命名:       /job/{job-name}/rename                       │
│                                                                  │
│  构建相关URL:                                                 │
│  ├── 构建列表:     /job/{job-name}/                           │
│  ├── 触发构建:     /job/{job-name}/build                      │
│  ├── 控制台输出:   /job/{job-name}/{n}/console                │
│  ├── 构建产物:     /job/{job-name}/{n}/artifact               │
│  └── 删除构建:     /job/{job-name}/{n}/doDelete               │
│                                                                  │
│  API:                                                          │
│  └── JSON API:   /job/{job-name}/api/json                    │
└─────────────────────────────────────────────────────────────────┘

附录B:Jenkins 2.5 特性

Jenkins 2.5 新特性:

┌─────────────────────────────────────────────────────────────────┐
│  Pipeline相关                                                   │
│  ├── Pipeline as Code (Jenkinsfile)                             │
│  ├── Blue Ocean UI (Beta)                                      │
│  └── Pipeline Support Improvements                              │
│                                                                  │
│  安全相关                                                       │
│  ├── 改进了凭证存储                                             │
│  ├── 更严格的CSRF防护                                           │
│  └── 加密存储增强                                               │
│                                                                  │
│  用户体验                                                       │
│  ├── 改进了构建队列UI                                           │
│  ├── 更好的历史记录搜索                                         │
│  └── Favorite Views                                            │
│                                                                  │
│  性能优化                                                       │
│  ├── 更快的首页加载                                             │
│  └── 改进了大列表渲染性能                                        │
└─────────────────────────────────────────────────────────────────┘
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐