使用工作流插件

时间:2015-08-26 13:52:17

标签: groovy jenkins jenkins-workflow

我正在尝试使用工作流插件同时运行一个作业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次。

谢谢!

1 个答案:

答案 0 :(得分:6)

除了缺少对脚本中的错误的诊断之外,Workflow中没有错误。在Groovy中,循环计数器i在封闭范围内定义并进行变异,因此在每个闭包运行时,它具有相同的值:5。您可以看到这个,以及修复背后的概念,詹金斯外面:

$ 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步骤运行之前启动了一个下游构建,在这种情况下它将运行第二个下游构建,但通常总共少于五个构建。)

This new test表明你想要做的事情确实是可能的;你只需要在闭包之外的一个新的词法范围变量中捕获循环变量的当前值。

顺便说一下

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

从命令行Groovy开始按预期工作,因为没有变异的循环变量。遗憾的是,工作流程中尚未提供此语法:JENKINS-26481

请注意,您应使用“虚拟”参数值来区分队列条目。虽然这可能恰好在今天起作用,但期望修复行为,以便build指定的参数值与下游项目中实际定义的任何参数不对应,将被警告跳过,或者导致一个错误。如果您认为您需要一个虚拟参数,那么您可能正在做其他错误的事情,但是如果没有任何解释为什么您希望下游项目多次运行而其输入区别于构建中没有任何内容,则无法建议这是什么。