You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:01:09