【问题标题】:How to enforce jenkins job to wait until all jobs executed in loop如何强制詹金斯作业等到所有作业循环执行
【发布时间】:2021-10-19 18:34:00
【问题描述】:

在这种情况下,我需要在不等待的情况下通过 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
    }
}

【问题讨论】:

    标签: jenkins groovy parallel-processing jenkins-pipeline


    【解决方案1】:

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

    parallel:并行执行。 采用从分支名称到闭包的映射和一个可选参数 failFast >它将在任何其他分支发生故障时终止所有分支:

    parallel firstBranch: {
        // do something
    }, secondBranch: {
        // do something else
    },
    failFast: true|false```
    

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

     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
             }]
         }
     }
    

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

        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
                }]
            }
        }
    

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

    【讨论】:

    • 谢谢诺姆。我还需要一个……我有 5 个参数和值。首先,我将循环并创建一个值列表(3 次)。现在,您希望我如何迭代具有键和值作为列表的 Map;你能帮我举个例子吗
    • 你到底是什么意思?您有 5 个不同的参数需要传递给作业并且每个参数都有不同的值?我不太确定我理解你的参数布局,你能举个例子吗?
    • for (int cntr=0;cntr
    • @reachit 我用一个使用范围和索引的例子来更新答案。它应该可以帮助您实现所需的目标。
    • 作业被参数触发,但出现如下异常。怎么了?发生的异常:在对象 org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@6a42ff6d 中的字段 com.cloudbees.groovy.cps.impl.BlockScopeEnv.locals 引起:java.io.NotSerializableException:java 中的 groovy.lang.IntRange .util.HashMap.writeObject(HashMap.java:1363) 在 sun.reflect.GeneratedMethodAccessor57.invoke(Unknown Source) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 2023-01-12
    相关资源
    最近更新 更多