【问题标题】:Jenkins Build Flow Plugin sequentially chain multiple jobs in parallelJenkins Build Flow Plugin 并行顺序链接多个作业
【发布时间】:2017-06-24 12:51:14
【问题描述】:

我正在尝试从 Build Flow Plugin 复制此功能: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,但同时运行两组作业。即 Job 1 和 Job 5 同时开始,然后当 Job 1 完成时 Job 2 开始,当 Job 5 完成时 Job 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

有更好的方法吗?

【问题讨论】:

    标签: jenkins groovy build parallel-processing series


    【解决方案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())。

    【讨论】:

    • 谢谢,我现在理解了这个理论,但是在运行您的代码时我得到以下信息: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Cannot invoke method call() on null对象
    • 糟糕,我的错,应该是series1.each{it()},例如括号代替圆括号。我已经更新了我的答案。
    • 看起来更好;),现在得到java.util.concurrent.ExecutionException: groovy.lang.MissingMethodException: No signature of method: com.cloudbees.plugins.flow.FlowDelegate.build() is applicable for argument types: (java.util.LinkedHashMap, java.util.ArrayList) values: [[param:job1], [Script1$_run_closure3@5bc92f8c, Script1$_run_closure4@3a163c10]] Possible solutions: build(java.lang.String), build(java.util.Map, java.lang.String), fail(), find(), getBuild(), wait()
    • 是的,另一个错误,你使用了变量subjob 两次,一次是第一个作业的名称(在第一行),一次是在第五行存储子作业。我通过将第二个变量重命名为 subTasks 更新了答案中的示例
    • 已排序!现在是很好的例子!
    猜你喜欢
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多