groovy – 与工作流插件同时多次启动作业
发布时间:2020-12-14 16:30:16 所属栏目:大数据 来源:网络整理
导读:我正在尝试使用工作流插件同时运行一个作业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']
我正在尝试使用工作流插件同时运行一个作业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只运行一次. 谢谢! 解决方法
除了缺乏对脚本中的错误的诊断之外,Workflow中没有错误.在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看到五次尝试使用相同的参数来安排相同的下游项目,并将它们全部合并为一个队列项,从而构建一个. (根据时间安排,它可能在其他构建步骤运行之前启动了一个下游构建,在这种情况下,它将运行第二个下游构建,但通常总共少于五个构建.) This new test表明你想要做的确实是可能的;你只需要在闭包之外的一个新的词法范围变量中捕获循环变量的当前值. 顺便说说 def cs = []; (0..4).each {i -> cs += {println i}}; cs*.call() 从命令行Groovy开始按预期工作,因为没有变异的循环变量.不幸的是,工作流程:JENKINS-26481中尚未提供此语法 请注意,您不应使用“虚拟”参数值来区分队列条目.虽然这可能恰好在今天起作用,但期望修复行为,以便构建指定的参数值与下游项目中实际定义的任何参数不对应,将被警告跳过,或导致错误.如果您认为您需要一个虚拟参数,那么您可能正在做其他错误的事情,但是如果没有任何解释为什么您希望下游项目多次运行而其输入区别于构建中没有任何内容,则无法建议这是什么. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |