Jenkins Build Flow Plugin顺序链接多个作业

时间:2017-02-07 10:14:01

标签: jenkins groovy build parallel-processing series

我尝试从Build Flow插件中复制此功能:https://wiki.jenkins-ci.org/display/JENKINS/Build+Flow+Plugin

parallel (
    {
        build("job1")
        build("job2")
    },
    {
        build("job5")
        build("job6")
    }
)

我有以下DSL工作:

subjob = "test"
subjob2 = "test2"
series1 = []
series2 = []
subjob = []

["job1","job2"].each{ parameter ->
  series1.add({build( subjob, param: parameter )})
}

["job5","job6"].each{ parameter2 ->
  series2.add({build( subjob2, param: parameter2)})
}

subjob.add(series1)
subjob.add(series2)

parallel( subjob )

我的目标是串联运行一组1& 2和另一组5& 6系列作业,但要并行运行两组作业。即,作业1和5同时启动,然后当作业1完成作业2开始,而作业5完成作业6开始时。

但是,我在上面的代码中尝试了很多变体,但每次都有不同的错误。上面的代码给出了以下内容:

ERROR: Failed to run DSL Script
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '[Script1$_run_closure1$_closure3@3c52c84, Script1$_run_closure1$_closure3@56789ba0]' with class 'java.util.ArrayList' to class 'groovy.lang.Closure' due to: groovy.lang.GroovyRuntimeException: failed to invoke constructor: public groovy.lang.Closure(java.lang.Object,java.lang.Object) with arguments: [Script1$_run_closure1$_closure3@3c52c84, Script1$_run_closure1$_closure3@56789ba0] reason: java.lang.InstantiationException

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

并行步骤/函数需要一个闭包列表,例如代码块列表。你给它的是一个带闭包的列表列表,当然你不能将它转换为闭包,因此错误:

Cannot cast object '...' with class 'java.util.ArrayList' to class 'groovy.lang.Closure'

您需要做的是将序列作业包装在一个闭包中:

subjob = "test"
subjob2 = "test2"
series1 = []
series2 = []
subTasks = []

["job1","job2"].each{ parameter ->
  series1.add({build( subjob, param: parameter )})
}

["job5","job6"].each{ parameter2 ->
  series2.add({build( subjob2, param: parameter2)})
}

subTasks.add({
  series1.each{it()}
})
subTasks.add({
  series2.each{it()}
})

parallel( subTasks )

解释我的所作所为:

subTasks.add({
  series1.each{it()}
})

首先我们在列表subTasks中添加一个新的闭包,这个闭包采用列表中的每个元素并执行它(it())。