groovy Jenkins在标记顶层任务失败或通过之前执行所有子任务?

hfwmuf9z  于 2023-01-16  发布在  Jenkins
关注(0)|答案(2)|浏览(144)
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])
                            }
                        }
                    }
                }
            }
        }
    }
}

此Jenkins作业触发其他子作业(通过pipeline build step):subjob1subjob2subjob3。如果任何子作业失败,则此作业将立即失败(propagate:true)。
但是,我想做的是继续执行所有作业。如果一个或多个子作业失败,则将此作业标记为失败。我将如何执行此操作?

lztngnrs

lztngnrs1#

你可以这样做:你可以简单地使用一个catchError块。

def jobs = [
    'subjob1': true,
    'subjob2': false,
    'subjob3': true
]

pipeline
{
    agent any

    stages
    {
        stage('stage1')
        {
            steps
            {
                script
                {
                    jobs.each
                    {
                        if ("$it.value".toBoolean())
                        {
                            stage("Stage $it.key")
                            {
                               catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') 
                                {
                                    echo "Building"
                                    build([job:"$it.key", wait:true, propagate:true])
                                } 
                            }
                        }
                    }
                }
            }
        }
    }
}
cvxl0en2

cvxl0en22#

您可以在parallel中执行所有作业,而不是逐个执行所有作业。这样,所有作业将彼此独立地执行,并且stage1仅在一个或多个作业失败时才会失败。
根据文件
parallel指令接受一个从分支名称到闭包的Map和一个可选参数failFast,该参数将在任何其他分支失败时终止所有分支。
因此,我们必须将阶段名称的jobs to a Map转换为并行执行的Closures。我们将使用jobs.collectEntries()构建Map,并将其作为参数传递给parallel指令:

stage('Parallel') {
    steps {
        script {
            parallel(jobs.collectEntries {
                [(it.key): {
                    if (it.value) {
                        build(job: it.key)
                    } else {
                        echo "Skipping job execution: ${it.key}"
                        // This is required to mark the parallel stage as skipped - it is not required for the solution to work
                        org.jenkinsci.plugins.pipeline.modeldefinition.Utils.markStageSkippedForConditional(it.key)
                    }
                }]
            })
        }
    }
}

我们可以省略build step中的waitpropagate标志,因为它们是默认设置的。
在所提供的解决方案中,Parallel阶段(以及生成的构建)只有在一个或多个jobs失败时才会失败。此外,如果您安装了Blue Ocean插件,您将看到Parallel阶段沿着所有并行子阶段的漂亮视图图:

相关问题