当前位置: 首页 > 面试题库 >

使用工作流程插件多次并发工作

公冶安怡
2023-03-14
问题内容

我正在尝试使用工作流插件同时执行一项作业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是在封闭范围内定义的,并且已被更改,因此在每次关闭运行时,它具有相同的值: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与下游项目中实际定义的任何参数都不对应,将被警告跳过或导致错误。如果您认为需要一个虚拟参数,则可能是在做其他错误,但是如果没有解释为什么您希望下游项目多次运行而其输入中没有任何内容可以区分版本,那么就不可能给出建议。



 类似资料:
  • 问题内容: 随着我越来越多地将Groovy与Jenkins Workflow插件配合使用,我开始意识到可以在多个脚本中使用的可重用代码。 共享此代码的最佳方法是什么?是否可以使用共享代码生成我自己的.jar并在Workflow脚本中利用它?还是有更简单的方法? 问题答案: 我实际上通过使用我们自己的git repo最终完成了这项工作,但在工作流库/ src中放置了一个符号链接以指向该repo。

  • 我很难让Grails中的Quartz工作按预期同时运行。这就是我的工作。我已经注释掉了使用Executor插件的代码行,但是当我没有注释掉它们时,我的代码会按预期工作。 就我而言,myService2。doOtherStuff()需要很长时间才能完成,这与下一次触发此作业的时间重叠。我不介意它们是否重叠,这就是我明确添加def concurrent=true的原因,但它不起作用。 我有Quartz

  • 问题内容: 我在OS X上使用boot2docker并克隆了以下存储库: https://github.com/enokd/docker-node-hello 它基本上有一个Dockerfile和一个非常简单的Express应用程序,可以打印世界。在构建和运行映像时,一切运行良好,但是,如果我在Mac上对index.js进行了任何更改,这些都不会反映在运行的映像中。我似乎找不到任何有关如何设置do

  • 实现细节 添加路由器接口 删除路由器接口 启动新的虚拟机节点 删除虚拟机节点

  • 完成每项开发任务,你都会用到一套流程,流程里面很重要的一部分就是工具。学习开发之前,有些必备的工具可以提前准备一下,你不需要成为使用这些工具的专家,做简单的了解以后,就可以投入到开发的学习中去了。

  • 我试图一次将多行插入数据库。 用户最多可以添加5个新行,以便将血液结果插入数据库。 有一个添加更多按钮允许他们这样做。 我有一个循环来遍历每个条目,但是当我单击submit时,只会提交一个条目。第一,我不确定我哪里出了问题,任何帮助都将不胜感激。 循环在这个代码块的底部,但我不确定这就是问题所在。