Jenkins声明式Pipeline:阶段X报错后如何跳过阶段Y但执行最后阶段Z?
Jenkins声明式Pipeline实现:失败后跳过中间阶段仅执行最后一步
核心实现思路
- 定义全局布尔标记记录流水线是否失败
- 在风险阶段通过
try/catch捕获异常,更新失败标记并标记构建状态 - 中间阶段通过
when条件判断,仅当未失败时执行 - 最后阶段强制执行,不受前面失败状态影响
完整示例代码
pipeline { agent any environment { // 全局标记:记录流水线是否在某个阶段失败 PIPELINE_FAILED = false } stages { stage('核心任务阶段') { steps { script { try { // 模拟可能失败的业务操作 sh 'exit 1' // 故意触发失败用于测试 // sh 'echo "核心任务执行成功"' // 正常业务逻辑替换此行 } catch (Exception e) { echo "核心任务失败:${e.toString()}" // 更新全局失败标记 env.PIPELINE_FAILED = true // 标记构建整体为失败状态 currentBuild.result = 'FAILURE' } } } } stage('中间任务A') { // 仅当流水线未失败时执行此阶段 when { expression { env.PIPELINE_FAILED != 'true' } } steps { echo "执行中间任务A" } } stage('中间任务B') { when { expression { env.PIPELINE_FAILED != 'true' } } steps { echo "执行中间任务B" } } stage('收尾/通知阶段') { // 无论前面是否失败,强制执行此阶段 when { always() } steps { script { if (env.PIPELINE_FAILED == 'true') { echo "流水线执行失败,发送告警通知..." // 可扩展邮件、企业微信等通知逻辑 } else { echo "流水线执行成功,发送成功通知..." } } } } } }
关键细节说明
- 全局标记的作用:通过
environment块定义的PIPELINE_FAILED可在所有阶段共享,确保状态传递准确 - 异常处理逻辑:捕获异常后必须设置
currentBuild.result = 'FAILURE',避免Jenkins误判构建状态为成功 - 阶段跳过规则:中间阶段的
when表达式直接判断失败标记,无需额外复杂逻辑 - 最后阶段强制执行:
when { always() }是声明式Pipeline中强制执行阶段的标准写法,适合做收尾、清理、通知等操作
内容的提问来源于stack exchange,提问作者Dequavis
相关产品推荐
相关产品推荐

