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

如何在Jenkins流水线阶段执行成功后将其状态标记为失败?

问题:Jenkins流水线中如何在某阶段执行成功后将其标记为失败

你的代码存在的问题

  • 异步构建导致无法获取最终状态:使用wait: false启动目标job时,构建是异步进行的,此时build_job_result.getStatus()返回的是构建中的状态,而非最终执行结果,无法准确判断job是否失败。
  • 错误的stage状态修改方式:stage('1').status = failed是无效写法,Jenkins不支持直接通过这种方式修改已完成stage的状态。
  • 状态比较逻辑错误:jobStatus == failed中的failed未定义,Jenkins的构建状态是Result枚举类型,正确的失败状态应为Result.FAILURE。

解决方案

场景1:等待目标job完成后再判断(同步方式)

如果可以等待目标job执行完成,将build的wait参数设为true,直接获取最终结果,再修改stage1的状态:

def build_job_result
pipeline {
    agent any
    stages {
        stage('1') {
            steps {
                script {
                    // 同步等待目标job完成,获取最终结果
                    build_job_result = build job: "jobName", wait: true
                }
            }
        }
        stage('2') {
            steps {
                script {
                    def jobStatus = build_job_result.result
                    // 判断目标job是否执行失败
                    if (jobStatus == Result.FAILURE) {
                        // 获取stage1的对象并修改其结果为失败
                        def stageAction = currentBuild.rawBuild.getAction(StagesAction.class)
                        def stage1 = stageAction.getStage('1')
                        stage1.setResult(Result.FAILURE)
                        // 可选:将整个流水线的结果也设为失败
                        currentBuild.result = Result.FAILURE
                    }
                }
            }
        }
    }
}

场景2:异步启动目标job,轮询等待完成后判断

如果必须异步启动目标job,需要通过轮询等待其完成,再获取最终状态:

def build_job_result
pipeline {
    agent any
    stages {
        stage('1') {
            steps {
                script {
                    // 异步启动目标job
                    build_job_result = build job: "jobName", wait: false
                }
            }
        }
        stage('2') {
            steps {
                script {
                    // 获取目标job的构建实例
                    def targetJob = Jenkins.instance.getItemByFullName(build_job_result.project.fullName)
                    def targetBuild = targetJob.getBuildByNumber(build_job_result.number)
                    
                    // 轮询等待构建完成
                    while (!targetBuild.isComplete()) {
                        sleep 30 // 每30秒检查一次
                        targetBuild = targetBuild.reload() // 刷新构建状态
                    }
                    
                    def jobStatus = targetBuild.result
                    if (jobStatus == Result.FAILURE) {
                        // 修改stage1的状态为失败
                        def stageAction = currentBuild.rawBuild.getAction(StagesAction.class)
                        def stage1 = stageAction.getStage('1')
                        stage1.setResult(Result.FAILURE)
                        currentBuild.result = Result.FAILURE
                    }
                }
            }
        }
    }
}

注意事项

  • 权限配置:上述代码使用了Jenkins内部API(如rawBuild、StagesAction),需要在Jenkins全局安全设置中批准相关方法,否则会抛出权限异常。
  • API兼容性:内部API可能随Jenkins版本更新发生变化,若后续版本出现兼容性问题,可考虑使用官方提供的流水线插件或脚本化流水线语法实现。
  • 流水线结果:若需要整个流水线的状态跟随stage1变为失败,需设置currentBuild.result = Result.FAILURE。

内容的提问来源于stack exchange,提问作者Roman Zinger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 04:54:51