从闭包开始并行运行Jenkins管线作业



我有一个Jenkins服务器使用管道插件。在这种情况下,我想并行地启动几个构建,并在进入管道的下一阶段之前等待构建完成。

我能够成功地做到这一点,如果我显式地写出构建任务,像这样:

parallel 'one': {
    build job: 'job1', 
        parameters: [
            [$class: 'StringParameterValue', name: 'CONFIG', value: "foo"]
        ],
        propagate: false,
        wait: true
},  'two': {
    build job: 'job2', 
        parameters: [
            [$class: 'StringParameterValue', name: 'CONFIG', value: "foo"]
        ],
        propagate: false,
        wait: true
},  'three': {
    build job: 'job3', 
        parameters: [
            [$class: 'StringParameterValue', name: 'CONFIG', value: "foo"]
        ],
        propagate: false,
        wait: true
}

然而,在现实中,需要构建的工作数量是可变的,因此显式地将它们写出来是不可行的。我尝试将构建包在一个闭包中,如下所示:

def createParallel = { String parallelName ->
    parallelName: {
        build job: 'jobX', 
            parameters: [
                [$class: 'StringParameterValue', name: 'CONFIG', value: "foo"]
            ],
            propagate: false,
            wait: true
    }
}
parallel (
    createParallel('one'), 
    createParallel('two'), 
    createParallel('three')
)

这种方法的问题是构建实际上并不是并行启动的——它们一次构建一个,等待上一个构建完成。我做错了什么?

您没有指定任何构建参数,因此Jenkins按照设计合并队列项。

设置wait: false并且构建从不等待另一个构建。但是如果你需要触发另一个阶段,你必须得到结果

简短的回答是,由于Jenkins -33051和Jenkins -25979的bug,目前这在Jenkins中无法完成。

我在上面所做的实际上是创建了三个平行线,每个平行线都有一个参数。需要做的是将闭包放在一个列表中,然后将列表作为参数展开,如下所示:

def list = [ createParallel('one'), createParallel('two'),  createParallel('three') ]
parallel (*list)

最新更新