使用工作流插件同时启动多个作业
Start a job multiple times concurrently with workflow plugin
我正在尝试使用工作流插件同时 运行 完成一项工作 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 次。
谢谢!
这里除了缺乏对脚本错误的诊断外,工作流中没有任何错误。在 Groovy 中,循环计数器 i
是在一个封闭范围内定义并发生变异的,因此到每个闭包 运行s 时,它具有相同的值: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
步骤甚至 运行 之前启动一个下游构建,在这种情况下,它会 运行 第二个下游构建,但通常少于五个总构建数。)
This new test 证明你想做的事情确实是可能的;您只需要在闭包外部的新词法范围变量中捕获循环变量的 current 值。
顺便说一句
def cs = []; (0..4).each {i -> cs += {println i}}; cs*.call()
确实按命令行 Groovy 的预期工作,因为没有变异的循环变量。不幸的是,此语法在 Workflow 中尚不可用:JENKINS-26481
请注意,您应该不使用“虚拟”参数值来区分队列条目。虽然这可能在今天起作用,但希望该行为得到修复,以便 build
指定的参数值不对应于下游项目中实际定义的任何参数将被跳过并发出警告,或者导致一个错误。如果您认为您需要一个虚拟参数,那么您可能做错了其他事情,但是如果不解释为什么您希望下游项目多次 运行 而其输入中没有任何内容,则不可能建议这是什么区分构建。
我正在尝试使用工作流插件同时 运行 完成一项工作 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 次。
谢谢!
这里除了缺乏对脚本错误的诊断外,工作流中没有任何错误。在 Groovy 中,循环计数器 i
是在一个封闭范围内定义并发生变异的,因此到每个闭包 运行s 时,它具有相同的值: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
步骤甚至 运行 之前启动一个下游构建,在这种情况下,它会 运行 第二个下游构建,但通常少于五个总构建数。)
This new test 证明你想做的事情确实是可能的;您只需要在闭包外部的新词法范围变量中捕获循环变量的 current 值。
顺便说一句
def cs = []; (0..4).each {i -> cs += {println i}}; cs*.call()
确实按命令行 Groovy 的预期工作,因为没有变异的循环变量。不幸的是,此语法在 Workflow 中尚不可用:JENKINS-26481
请注意,您应该不使用“虚拟”参数值来区分队列条目。虽然这可能在今天起作用,但希望该行为得到修复,以便 build
指定的参数值不对应于下游项目中实际定义的任何参数将被跳过并发出警告,或者导致一个错误。如果您认为您需要一个虚拟参数,那么您可能做错了其他事情,但是如果不解释为什么您希望下游项目多次 运行 而其输入中没有任何内容,则不可能建议这是什么区分构建。