如何强制詹金斯作业等待所有作业在循环中执行

rea*_*hit 1 parallel-processing groovy jenkins jenkins-pipeline

在此,我需要在不等待的情况下触发 3 次迭代(下面的示例 3)我的作业,但在触发所有 3 个作业后,必须等到所有 3 个作业成功完成,无论失败或通过。

我正在使用 wait:true但这会等待每次迭代,这不是我想要的。如果我使用 wait: false,它不会等待循环中的所有迭代完成,也不会等待下游作业完成。我希望当前的工作等到我得到工作结果(3 个管道)。

//job1 is a pipeline job which i am triggering multiple times with different params

stage {
    for(int cntr=0;i<3;i++) {
         build job : "job1",
         parameters: [string(name: 'param1', value:val[cntr] )],
         wait: false
    }
}
Run Code Online (Sandbox Code Playgroud)

Noa*_*mer 5

我认为你真正想要的是并行运行它们,然后等待它们全部完成。
为此,您可以使用并行关键字:

parallel:并行执行。获取从分支名称到闭包的映射以及可选参数failFast>,该参数将在任何其他分支发生故障时终止所有分支:

parallel firstBranch: {
    // do something
}, secondBranch: {
    // do something else
},
failFast: true|false```
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它可能看起来像:

 stage('Build Jobs') {
     def values = ['value1', 'value2', 'value2']
     parallel values.collectEntries {value ->
         ["Building With ${value}": {
             build job : "job1",
                   parameters: [string(name: 'param1', value: value)],
                   wait: true
         }]
     }
 }
Run Code Online (Sandbox Code Playgroud)

或者,如果您想使用索引而不是常量列表:

    stage('Build Jobs') {
        def range = 0..2 //  or range = [0, 1, 2]
        parallel range.collectEntries { num ->
            ["Iteration ${num}": {
                build job : "job1",
                      parameters: [string(name: 'param1', value: somefunc(num)],
                      wait: true
            }]
        }
    }
Run Code Online (Sandbox Code Playgroud)

这将并行执行所有作业,然后等待它们全部完成,然后再继续管道(不要忘记将步骤wait的参数设置buildtrue)。您可以在这里
找到更多类似的示例。