Jenkins如何执行全部子任务后再标记主任务的成功或失败?
问题场景
现有如下Jenkins Pipeline脚本,通过build步骤触发子任务subjob1、subjob2、subjob3:
def jobs = [ 'subjob1': true, 'subjob2': false, 'subjob3': true ] pipeline { agent { label "ag1" } stages { stage('stage1') { steps { script { jobs.each { if ("$it.value".toBoolean()) { stage("Stage $it.key") { build([job:"$it.key", wait:true, propagate:true]) } } } } } } } }
当前脚本中propagate: true的设置会导致任一子任务失败时,主任务立即终止并标记为失败。需求改为:执行所有需要运行的子任务,仅当存在一个或多个子任务失败时,最后再将主任务标记为失败。
实现方案
修改后的Pipeline脚本如下:
def jobs = [ 'subjob1': true, 'subjob2': false, 'subjob3': true ] // 记录执行失败的子任务 def failedJobs = [] pipeline { agent { label "ag1" } stages { stage('Trigger Subjobs') { steps { script { jobs.each { jobName, shouldRun -> if (shouldRun.toBoolean()) { stage("Run ${jobName}") { // 关闭propagate,避免子任务失败直接终止主任务 def buildResult = build([job: jobName, wait: true, propagate: false]) // 检查子任务构建结果,非成功则记录 if (buildResult.result != 'SUCCESS') { failedJobs.add(jobName) } } } } } } } } post { always { script { // 所有子任务执行完毕后,检查失败列表 if (failedJobs.size() > 0) { error "子任务执行失败:${failedJobs.join(', ')}" } } } } }
关键修改说明
- 关闭
propagate:将propagate: true改为propagate: false,这样子任务失败时不会直接终止主Pipeline,而是返回包含构建状态的RunWrapper对象。 - 维护失败任务列表:新增
failedJobs列表,每次子任务执行完成后,判断其构建结果,若不是SUCCESS则将任务名加入列表。 - 统一检查失败状态:在
post阶段的always块中(无论前面步骤成功与否都会执行),检查failedJobs列表。如果存在失败任务,通过error指令将主任务标记为失败。
内容的提问来源于stack exchange,提问作者Danijel
相关产品推荐
相关产品推荐

