如何在Jenkins的动态管道中使用failFast

9

我有一个具有动态并行阶段的流水线,如果任何一阶段失败,我希望我的流水线能够快速失败。 我尝试添加 failFast: true,但我的流水线卡在“阶段ABC失败”。

  stage("Deploy") {             
        steps {
            script {
                def stages = createStages("Name", "Project")
                fastFail: true
                for (stage in stages) {                        
                    parallel stage                      
                }
            }
        }
    }
3个回答

25

解决方案:在Jenkins pipeline中使用failFast flag

来自文档您可以通过将failFast设置为true,强制使所有并行阶段在其中一个失败时全部中止,该选项应添加到包含并行阶段的阶段中。

请注意,如果每个作业都在代理节点上启动,并且其中一个作业失败,则所有作业都会被触发并退出(如果管道中的作业'a'失败,但作业'b'仍在寻找节点且尚未启动,则会继续执行 - [这是一种边缘情况])。

示例 - 选项如下:

1。在您的选项管道中使用parallelsAlwaysFailFast方法:

pipeline {
agent any
options {
    parallelsAlwaysFailFast()
}
stages {
    stage('Non-Parallel Stage') {
        steps {
            echo 'This stage will be executed first.'
        }
    }
    stage('Parallel Stage') {
        when {
            branch 'master'
        }
        parallel {
            stage('Branch A') {
                agent {
                    label "for-branch-a"
                }
                steps {
                    echo "On Branch A"
                }
            }
            stage('Branch B') {
                agent {
                    label "for-branch-b"
                }
                steps {
                    echo "On Branch B"
                }
            }
            stage('Branch C') {
                agent {
                    label "for-branch-c"
                }
                stages {
                    stage('Nested 1') {
                        steps {
                            echo "In stage Nested 1 within Branch C"
                        }
                    }
                    stage('Nested 2') {
                        steps {
                            echo "In stage Nested 2 within Branch C"
                        }
                    }
                }
            }
        }
    }
}

2.在并行使用之前使用failFast true

stage('Parallel Stage') {
        when {
            branch 'master'
        }
        failFast true
        parallel {

3.在地图中配置作业,并启用failFast属性后执行。

 jobsList = [
    {job: 'jobA', parameters: [booleanParam(name: 'flag', value: true)]},
    {job: 'jobB', parameters: [booleanParam(name: 'flag', value: true)]}
 ]

 jobsList.failFast = true
 parallel(jobsList)

1
回复:“如果管道中的作业'a'失败,但作业'b'仍在寻找节点并且尚未启动,则它将继续执行。”有没有办法捕捉这种边缘情况?对我们来说,这种情况经常发生,failFast就无用了。 - David Schumann
这个不起作用。 jobsList是一个数组,它没有failFast属性。 - undefined

3

我无法回复@avivamg提供的答案,但我无法直接使用他/她的解决方案。以下方法适用于我:

stages.failFast = true
parallel stages

或者在你的情况下:

stage("Deploy") {             
        steps {
            script {
                def stages = createStages("Name", "Project")
                stages.fastFail = true
                // I'm not sure if the for loop will work as failFast is on the map
                // so if that doesn't work then you could use this instead:
                // parallel stages
                for (stage in stages) {                        
                    parallel stage                      
                }
            }
        }
    }

0
如果您正在使用脚本化流水线,则需要将failFast添加到parallel步骤中,如下所示 -
    stage('SomeStage') {
    parallel (
        "Process1" : { //do something },
        "Process2" : { //do something else },
        failFast: true
    )
}

当process1和process2保存在一个map中时,这个解决方案会是什么样子?最好是任意数量的进程。 - David Schumann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接