1. 概述
Jenkins 是一个开源的持续集成与持续交付(CI/CD)自动化服务器,广泛用于软件构建、测试与部署流程的自动化。Jenkins 提供了基于 Groovy 的 脚本化流水线(Scripted Pipeline),允许开发者编写灵活的流水线逻辑。
在脚本化流水线中,各个阶段(stage)通常按顺序执行。但在实际使用中,有时我们希望根据某些条件动态跳过某些阶段,比如跳过测试阶段以加快流水线执行速度。
本文将介绍几种在 Jenkins 脚本化流水线中跳过 stage 的常见方法。
2. 为什么需要跳过流水线阶段
跳过阶段在 CI/CD 流程中非常有用,主要原因包括:
- ✅ 节省执行时间:跳过不必要的阶段,可以显著缩短流水线整体执行时间。
- ✅ 灵活控制流程:比如在本地开发时跳过测试,在预发布环境跳过部署。
- ✅ 适应不同环境需求:同一份流水线脚本可以在不同场景下动态控制执行路径。
3. 使用 when
条件判断跳过阶段
when
是 Jenkins 提供的一种条件判断机制,用于控制某个 stage 是否执行。它支持多种表达式类型,如参数判断、环境变量、构建触发器等。
✅ 示例代码
pipeline {
agent any
parameters {
booleanParam(name: 'skip_test', defaultValue: false, description: '设置为 true 可跳过测试阶段')
}
stages {
stage('Build') {
steps {
sh 'echo "Building application"'
}
}
stage('Test') {
when { expression { params.skip_test != true } }
steps {
sh 'echo "Testing application"'
}
}
stage('Deploy') {
steps {
sh 'echo "Deploying application"'
}
}
}
}
🔍 说明
- 使用
booleanParam
定义了一个参数skip_test
。 when
表达式判断skip_test
是否为true
,若为true
则跳过该阶段。- 适用于根据参数或环境变量动态控制执行流程。
4. 使用 input
步骤手动确认是否跳过
如果希望在执行过程中由用户决定是否跳过某个阶段,可以使用 input
步骤进行交互式确认。
✅ 示例代码
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'echo "Building the application"'
}
}
stage('Test') {
steps {
input message: '是否跳过测试阶段?', ok: 'Yes',
parameters: [booleanParam(name: 'skip_test', defaultValue: false)], timeout: time(minutes: 5)
script {
if (params.skip_test) {
echo "已选择跳过测试阶段"
return
}
}
sh 'echo "开始执行测试"'
}
}
stage('Deploy') {
steps {
sh 'echo "Deploying the application"'
}
}
}
}
🔍 说明
- 使用
input
步骤弹出确认框,让用户决定是否跳过测试阶段。 - 用户选择“是”后,
params.skip_test
为true
,进入脚本逻辑后直接return
跳出当前 stage。 - 适合需要人工干预的场景,比如上线前审批、灰度发布等。
5. 使用自定义函数控制阶段执行
如果多个 stage 都需要支持跳过功能,可以封装一个函数来统一控制流程,避免重复代码。
✅ 示例代码
pipeline {
agent any
parameters {
booleanParam(name: 'skip_test', defaultValue: false, description: '设置为 true 可跳过测试阶段')
}
stages {
stage('Build') {
steps {
sh 'echo "Building the application"'
}
}
stage('Test') {
steps {
executeStage('Test', params.skip_test) {
sh 'echo "Running tests"'
}
}
}
stage('Deploy') {
steps {
executeStage('Deploy', false) {
sh 'echo "Deploying the application"'
}
}
}
}
}
def executeStage(String stageName, Boolean skip, Closure steps) {
if (skip) {
echo "跳过阶段:${stageName}"
} else {
stage(stageName) {
steps.call()
}
}
}
🔍 说明
- 封装了一个
executeStage
函数,接受阶段名称、是否跳过和步骤闭包。 - 如果
skip
为true
,则直接打印跳过信息,不再执行 stage。 - 否则正常执行该 stage 及其步骤。
- 适用于多个阶段需要统一控制跳过逻辑的场景,提高代码复用性。
6. 总结
本文介绍了三种在 Jenkins 脚本化流水线中跳过 stage 的方法:
方法 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
when 条件判断 |
根据参数或表达式跳过 | 简洁、易于维护 | 无法动态交互 |
input 步骤 |
人工确认跳过 | 支持人工干预 | 依赖用户输入 |
自定义函数 | 多个阶段统一控制 | 代码复用高、逻辑清晰 | 实现稍复杂 |
你可以根据实际需求选择合适的方式。完整示例代码可以在 GitHub 仓库 中找到。
如果你正在维护一个复杂的 Jenkins 流水线项目,灵活使用这些技巧可以让你的 CI/CD 更加高效、可控。