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

如何将Jenkins中job2的执行结果传递给job1并同步失败状态?

问题描述

我有一个Jenkins Job1,用于触发Job2,原触发代码如下:

stage("trigger job2") {
       steps {
           build job: job2,
                parameters: [
                    string(name: "test1", value: "test1"),
                    string(name: "test2", value: "test2"),
                ],
       }
}

现在需要实现:当Job2的最后一个阶段("RESULT"阶段)失败(标红)时,将该结果传递给Job1,让Job1中触发Job2的阶段也显示为失败(标红)。Jenkins版本为2.346.1,尝试过多种方法均无效,之前尝试的代码如下:

尝试过的方法1

def p = build job: job2, propagate: true,
                parameters: [
                    string(name: "test1", value: "test1"),
                    string(name: "test2", value: "test2"),
                ],
            script {
                    build.waitForCompletion()
            }
            if (p.result == 'FAILURE') {
                currentBuild.result = "FAILURE"
                error 'Job2 failed, marking Job1 as failed in the current stage'
                }
            }

尝试过的方法2

def result = build.waitForCompletion()
            if (result.result == 'FAILURE') {
                currentBuild.result = "FAILURE"
                error 'Job2 failed, marking Job1 as failed in the current stage'
            }
解决方案

默认build步骤仅返回Job的整体构建结果,而你需要检查Job2特定阶段的状态。可通过以下逻辑实现需求:

方案1:直接获取触发的Job2构建实例

stage("trigger job2") {
    steps {
        script {
            // 触发Job2,propagate设为false避免Job1被Job2整体结果直接终止
            def job2Build = build job: 'job2',
                                propagate: false,
                                parameters: [
                                    string(name: "test1", value: "test1"),
                                    string(name: "test2", value: "test2"),
                                ]
            
            // 等待Job2构建完成
            job2Build.waitForCompletion()
            
            // 定位Job2的"RESULT"阶段
            def resultStage = job2Build.getExecution().getStages().find { stage ->
                stage.getName() == 'RESULT'
            }
            
            // 检查阶段状态,若失败则标记Job1当前阶段为失败
            if (resultStage && resultStage.getStatus().toString() == 'FAILED') {
                currentBuild.result = 'FAILURE'
                error 'Job2的RESULT阶段失败,标记Job1当前阶段为失败'
            }
        }
    }
}

方案2:通过Jenkins实例获取Job2最新构建(适配权限限制场景)

如果方案1中getExecution()方法触发权限问题,可改用此方式:

stage("trigger job2") {
    steps {
        script {
            // 触发Job2
            build job: 'job2',
                  propagate: false,
                  parameters: [
                      string(name: "test1", value: "test1"),
                      string(name: "test2", value: "test2"),
                  ]
            
            // 获取Job2的最新构建实例
            def job2 = Jenkins.instance.getItemByFullName('job2')
            def job2Build = job2.getLastBuild()
            job2Build.waitForCompletion()
            
            // 查找目标阶段
            def resultStage = job2Build.getStages().find { it.name == 'RESULT' }
            
            // 判断阶段状态并处理
            if (resultStage && resultStage.status == 'FAILED') {
                currentBuild.result = 'FAILURE'
                error 'Job2的RESULT阶段失败,Job1当前阶段标记为失败'
            }
        }
    }
}

关键说明

  • propagate: false:确保Job1不会因Job2的整体结果直接终止,保留后续阶段检查的逻辑执行机会。
  • 阶段状态判断:阶段状态枚举值为FAILED/SUCCESS等,需通过字符串形式比对。
  • 权限注意:使用Jenkins.instance需要确保Job1拥有脚本审批权限,若遇权限报错,需在Jenkins「脚本审批」页面通过对应方法的调用权限。

内容的提问来源于stack exchange,提问作者0xGJx0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:55:17