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

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(', ')}"
                }
            }
        }
    }
}

关键修改说明

  1. 关闭propagate:将propagate: true改为propagate: false,这样子任务失败时不会直接终止主Pipeline,而是返回包含构建状态的RunWrapper对象。
  2. 维护失败任务列表:新增failedJobs列表,每次子任务执行完成后,判断其构建结果,若不是SUCCESS则将任务名加入列表。
  3. 统一检查失败状态:在post阶段的always块中(无论前面步骤成功与否都会执行),检查failedJobs列表。如果存在失败任务,通过error指令将主任务标记为失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:10:26