Jenkins构建流插件以并行方式顺序链接多个作业

Jenkins构建流插件以并行方式顺序链接多个作业,jenkins,groovy,build,parallel-processing,series,Jenkins,Groovy,Build,Parallel Processing,Series,我正在尝试从构建流插件复制此功能: 我有以下DSL工作: subjob = "test" subjob2 = "test2" series1 = [] series2 = [] subjob = [] ["job1","job2"].each{ parameter -> series1.add({build( subjob, param: parameter )}) } ["job5","job6"].each{ parameter2 -> series2.add({bu

我正在尝试从构建流插件复制此功能:

我有以下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,但同时运行两组作业。i、 e.作业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

有更好的方法吗?

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

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()}
})

首先,我们向列表
子任务添加一个新的闭包
,这个闭包接受列表中的每个元素并执行它(
it()
)。

谢谢,我现在理解了这个理论,但在运行代码时我得到了以下信息:java.util.concurrent.ExecutionException:java.lang.NullPointerException:Cannote invoke method call()在null objectWops上,my bad,它应该是
系列1。每个{it()}
,例如括号而不是括号。我更新了我的答案。看起来好多了;),现在获取
java.util.concurrent.ExecutionException:groovy.lang.MissingMethodException:com.cloudbees.plugins.flow.FlowDelegate.build()方法的签名不适用于参数类型:(java.util.LinkedHashMap,java.util.ArrayList)值:[[param:job1],[Script1$\u run]_closure3@5bc92f8c,Script1$\u运行_closure4@3a163c10]]可能的解决方案:build(java.lang.String)、build(java.util.Map、java.lang.String)、fail()、find()、getBuild()、wait()
Yep,另一个错误是,您使用变量
subjob
两次,一次用于第一个作业的名称(在第一行),另一次用于第五行存储subjob。我更新了答案中的示例,将第二个变量重命名为subTaskssorted!现在是一个很好的例子!
subTasks.add({
  series1.each{it()}
})