9

我有具有动态并行阶段的管道,如果任何阶段失败,我希望我的管道快速失败。我尝试添加 failFast: true 但我的管道卡在“在 ABC 阶段失败”。

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

3 回答 3

20

解决方案:在 Jenkins 管道上使用failFast 标志。

来自文档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)
于 2019-11-27T11:23:59.127 回答
2

我无法回复@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                      
                }
            }
        }
    }
于 2020-06-10T22:02:35.870 回答
0

如果您使用的是脚本化管道,那么您需要将 failFast 添加到并行步骤中,如下所示 -

    stage('SomeStage') {
    parallel (
        "Process1" : { //do something },
        "Process2" : { //do something else },
        failFast: true
    )
}
于 2021-10-20T15:33:31.320 回答