在 Jenkins Pipeline 中跳过特定步骤的核心是条件控制,而非删除代码;常用方法包括:1. 用 when 指令按分支、参数或环境变量跳过整个阶段;2. 用 script + if 在 steps 内动态判断;3. 通过 parameters 实现人工可选跳过;4. 用 catchError 容错并继续执行后续步骤。

在 Jenkins Pipeline 中跳过特定步骤,核心思路是“不让它执行”,而不是删除或注释掉代码。实际落地时主要靠条件控制,结合触发方式、参数、环境变量或运行时状态来动态决定是否执行某段逻辑。方法不唯一,但关键看场景是否需要灵活、可配置、可审计。
用 when 指令控制阶段级跳过
适用于声明式 Pipeline,最简洁直观的方式。when 块写在 stage 内部,Jenkins 会自动跳过整个阶段(日志显示 Stage skipped)。
- 判断分支:只在 main 分支部署,其他分支跳过部署阶段
- 判断参数:比如定义 booleanParam SKIP_DEPLOY,当为 true 时跳过部署
- 判断环境变量:如 env.ENV == 'prod' 才执行敏感操作
示例:
完整流程:Reddit 痛点扫描 → 聚类 → 构建 pip 可安装的 CLI 工具 → 推送到 GitHub。使用此模式已交付 5 款工具,经验证 343 条痛点。
stage('Deploy to Prod') {
when {
expression { params.SKIP_DEPLOY != true && env.BRANCH_NAME == 'main' }
}
steps {
sh 'kubectl apply -f manifests/'
}
}
用 script + if 在 steps 内部精细跳过
适合脚本式 Pipeline 或声明式中需动态计算的场景,比如根据上一阶段结果、API 返回值、或构建原因(手动/定时)决定是否执行某步。
- 获取构建来源:currentBuild.getBuildCauses()[0].shortDescription 可识别 Started by timer 或 Started by user
- 跳过 input 步骤:定时构建时绕过人工确认
- 检查文件是否存在、命令返回码、测试覆盖率等再决定是否继续
示例:
stage('Manual Approval') {
steps {
script {
def cause = currentBuild.getBuildCauses()[0].shortDescription
if (cause.contains('Started by user')) {
input message: 'Confirm deployment?', id: 'deploy-confirm'
} else {
echo "Timer trigger → skip manual approval"
}
}
}
}
用 parameters 实现人工可控跳过
把“是否跳过”变成构建时可选的参数,适合需要人工干预、审计留痕的流程。
- 定义 booleanParam 或 choiceParam,例如 SKIP_TESTS、DEPLOY_ENV
- 在 stage 或 step 中通过 params.SKIP_TESTS == true 控制逻辑分支
- 配合 when 或 script 都可,UI 上勾选即生效,无需改代码
示例:
parameters {
booleanParam(name: 'SKIP_UNIT_TEST', defaultValue: false, description: 'Skip unit tests?')
}
// ...
stage('Run Unit Tests') {
when {
expression { !params.SKIP_UNIT_TEST }
}
steps {
sh './gradlew test'
}
}
用 catchError 或 try-catch 处理失败后跳过后续动作
不是“主动跳过”,而是“出错后不中断流程”,让失败步骤之后的逻辑仍能执行(比如发通知、归档日志)。
- catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') 包裹可能失败的步骤
- 内部执行失败时,阶段标记为 FAILURE,但 pipeline 继续向下走
- 适合集成外部 Job、调用不稳定接口、清理类操作
示例:
stage('Trigger downstream job') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
build job: 'integration-test', wait: true
}
}
}
stage('Send notification') {
steps {
echo 'Always runs — even if upstream failed'
}
}

















