6

我正在尝试使用工作流插件同时运行一项作业 5 次。这是片段:

def concurrent=[:]
for (int i = 0; i < 5; i++) {
concurrent["concurrent${i}"] = {
build job: 'test_job', parameters: [[$class: 'StringParameterValue', name:'queue', value:     
'automation_prod.q'],[$class: 'StringParameterValue', name:'dummy', value: "${i}"]]
    }
}
parallel concurrent

此代码段导致 test_job 仅运行一次。我需要它同时运行 5 次。

谢谢!

4

1 回答 1

6

除了缺乏对脚本错误的诊断之外,这里的工作流程中没有错误。在 Groovy 中,循环计数器i被定义在一个封闭范围内并发生了变异,因此在每个闭包运行时,它具有相同的值:5。您可以在 Jenkins 之外看到这一点以及修复背后的概念:

$ groovy -e 'def cs = []; for (int i = 0; i < 5; i++) {def j = i; cs += {println "${i} vs. ${j}"}}; for (c in cs) {c()}'
5 vs. 0
5 vs. 1
5 vs. 2
5 vs. 3
5 vs. 4

在您的情况下,Jenkins 看到了五次尝试使用相同的参数来安排相同的下游项目,并将它们全部合并到一个队列项目中,从而构建一个。(根据时间的不同,它可能在其他build步骤运行之前就开始了一个下游构建,在这种情况下,它会运行第二个下游构建,但通常总构建少于五个。)

这个新的测试证明你想做的事情确实是可能的;您只需要在闭包外的新词法范围变量中捕获循环变量的当前值。

顺便一提

def cs = []; (0..4).each {i -> cs += {println i}}; cs*.call()

确实可以从命令行 Groovy 中按预期工作,因为没有变异的循环变量。不幸的是,此语法在工作流中尚不可用:JENKINS-26481

请注意,您不应使用“虚拟”参数值来区分队列条目。虽然这可能在今天发生,但希望该行为得到修复,以便指定的参数值build与下游项目中实际定义的任何参数不对应,要么跳过警告,要么导致错误。如果您认为您需要一个虚拟参数,那么您可能做错了其他事情,但是如果没有任何解释为什么您希望下游项目运行多次而其输入中没有任何区别构建,就不可能给出建议。

于 2015-08-27T14:42:09.043 回答