获取jenkins工作流中并行生成中失败生成的生成编号

获取jenkins工作流中并行生成中失败生成的生成编号,jenkins,groovy,jenkins-plugins,jenkins-workflow,Jenkins,Groovy,Jenkins Plugins,Jenkins Workflow,我正在从我的作业中执行3个并行作业,每个作业运行测试,如下所示: def run_job(job) { output = build(job:job, parameters:parameters) def buildNumber = output.getNumber().toString() test_results[job] = '/job/'+ job +'/' + buildNumber + '/artifact/test_result.xml' } def tes

我正在从我的作业中执行3个并行作业,每个作业运行测试,如下所示:

def run_job(job) {
   output = build(job:job, parameters:parameters)
   def buildNumber = output.getNumber().toString()
   test_results[job] = '/job/'+ job +'/' + buildNumber + '/artifact/test_result.xml'

}


def test_func_array = [:]
def test_results = [:]

test_func_array['Python_Tests'] = {run_job('Run_Python_Tests', test_results)}

test_func_array['JS_Tests'] = {run_job('Run_JS_Tests', test_results)}

test_func_array['Selenium_Tests'] = {run_job('Run_Selenium_Tests', test_results)}

parallel(test_func_array)
当每个作业成功时,我可以使用
output.getNumber()
调用获取构建编号。但是,当作业失败时,
build()
函数调用会引发异常,因此无法获取生成号

然而,失败的构建仍然可以有构建编号和归档工件。
如何获取失败生成的生成编号

使用
传播:false
。有关详细信息,请参阅代码段生成器。

我认为当您想要完成所有并行作业时,Jesse的答案是有效的,即使其中一个作业失败。因此,基本上,它将禁用failFast功能

是否有人知道如何捕捉失败作业的编号,同时仍然具有failFast功能,以便在作业失败时短路构建?例如,下面是我的代码,我希望在catch块中也包含变量achild\u job\u info的值

build_jobs = [“Build_A”, “ Build_B”, “ Build_C”]

// in this hashmap we'll place the jobs that we wish to run
def branches = [:] 
def achild_job_info = ""
def abuild_number = ""
for (x in build_jobs) {
    def abuild = x 
    branches[abuild] = { 
        stage(abuild){
            def allow_retry = true
            retry(2) {
                try {
                    achild_job_info = build job: abuild
                    echo “ achild_job_info”  // —>  this gives: org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper@232601dc
                    abuild_number = achild_job_info.getId()
                    build_job_to_number_mappings[abuild] = achild_job_info.getNumber()
                } catch (err) {
                    echo “ achild_job_info: ${achild_job_info } “  // —> This comes empty. I want the runwrapper here as well, just like in the try block. 
                    abuild_job_number = abuild_job_info.getId()
                    build_job_to_number_mappings[abuild] = achild_job_info.getNumber()
                } // try-catch
        } // stage
   } // branches
} // for
branches.failFast = true
parallel branches

如果使用
propagate:false
,则不能使用try-catch块,因为
生成作业
在作业失败时不会引发异常,因此需要通过
getResult()
方法处理结果,如下所示:

stage('build something'){
    def job_info = build job: build_something, propagate: false,
    println "Build number: ${job_info.getNumber()}"
    currentBuild.result = job_info.getResult()
}
另见: