2016-03-02 38 views
2

并行作业所以我试图生成可变数量的测试作业并行运行,但我遇到的情况下传递参数将是所有执行的最大值。我怎样才能动态生成与詹金斯工作流程/管道

这里是Groovy代码的简化版本,我使用

jobs=[:] 
unitSplits = 5 
println "split units $unitSplits times" 

for (int i = 0; i < unitSplits; i++) { 
    jobs["unit tests ${i} of ${unitSplits}"] = { 
     group -> {-> test(group)} 
    }(i) 
} 

jobs.each{ k, v -> v() } 

def test(group) { 
    println "testing group ${group}" 
} 

预期输出:

split units 5 times 
testing group 0 
testing group 1 
testing group 2 
testing group 3 
testing group 4 

实际输出:

split units 5 times 
testing group 5 
testing group 5 
testing group 5 
testing group 5 
testing group 5 

我需要这个group参数知道运行哪组测试。

任何想法如何使这项工作?

回答

3

这是一个Groovy错误,事实上还有另一个jenkins-workflow问题在讨论。您的int i是一个单一的变量作用域到循环并由每个闭包共享;在循环结束时(在任何闭包运行之前!),它有它的最终值5。使用def在每个循环迭代中创建一个新的(有效的final)变量的最简单的修复方法,例如:

def _i = i 

顺便说一句.each是不会工作的,因为JENKINS-26481;你现在必须使用更简单的C风格循环。无论如何,我想你的真实例子将使用parallel步骤。

+0

例如,请参阅http://stackoverflow.com/questions/32228590/start-a-job-multiple-times-concurrently-with-workflow-plugin。 –

+0

是的,你认为真实的例子会使用并行步骤是正确的,在groovyConsole会话中做测试并不容易。 – Jeff