如何在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
相关产品推荐
相关产品推荐

