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

Jenkins中的数组简单并行执行

宋腾
2023-03-14
问题内容

我在使用Groovy 运行 Jenkins 作业时遇到麻烦,而且看起来超级简单,但我是1)Java /
Groovy的菜鸟,2)我能找到的所有示例都不是我需要做的。

我发现以下类似问题: JenkinsGroovy并行变量不起作用,但是该 精确 代码导致错误:

java.lang.UnsupportedOperationException:尚不支持在CPS转换的闭包上调用公共静态java.util.List
org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(java.lang.Object,groovy.lang.Closure)(JENKINS
-26481);封装在@NonCPS方法中,或使用Java样式的循环

这是我要执行的操作的伪代码:

String[] arr = [ "one","two","three",'four','five' ]
echo "Running commands: ${arr}"
int top = arr.size()
echo "top is ${top}"
parallel arr.each {
    echo "${it}"
}

我尝试过闭包,但是它们引发了错误,说实话,我几乎不知道如何使用它们。以下代码

String[] arr = [ "one","two","three",'four','five' ]
echo "Running commands: ${arr}"

parallel arr.collect { item ->
    { -> 
        echo "${item}"
    }
}

引发与上述相关问题相同的“ java.lang.UnsupportedOperationException”。

我正在尝试学习如何在Jenkins中正确使用Groovy,但这很困难。只是在此时寻求任何帮助。

谢谢。


问题答案:

这是一个非常令人讨厌的限制,但是当前您不能.each在管道脚本中使用(如此处记录:https : //issues.jenkins-
ci.org/browse/JENKINS-26481

您需要做一个实际的循环,例如

String[] arr = [ "one","two","three",'four','five' ]
echo "Running commands: ${arr}"
int top = arr.size()
echo "top is ${top}"
for (it in arr) {
    echo "${it}"
}

如果实际需要并行执行,则代码将更像:

String[] arr = [ "one","two","three",'four','five' ]
echo "Running commands: ${arr}"
int top = arr.size()
echo "top is ${top}"
def stepsForParallel = [:]

for (int i = 0; i < arr.size(); i++) {
    def it = arr[i]
    def stepName = "running ${it}"
    stepsForParallel[stepName] = { ->           
        echo "${it}"
    }
}

parallel stepsForParallel

您链接到的另一个stackoverflow使用Build Flow插件,它是您正在使用的Pipeline插件的前身。这就是为什么相同的代码不起作用的原因。

编辑: 在现代詹金斯(在2.150.1中进行测试)上面列出的原始错误是固定的,并且.each可以工作。您可以为并行执行执行以下操作:

String[] arr = [ "one","two","three",'four','five' ]

def stepsForParallel = [:]
arr.each {
    def stepName = "running ${it}"
    stepsForParallel[stepName] = { ->           
        echo "${it}"
    }
}
parallel stepsForParallel


 类似资料:
  • 我正在使用Linux-Ubuntu14.04。我安装了詹金斯2.7.2。 我在Eclipse中创建了一个maven项目,并遵循了此链接中提供的说明http://www.guru99.com/maven-jenkins-with-selenium-complete-tutorial.html. 在完成项目设置后,我将其作为Maven项目执行,构建成功。 然后我安装了Jenkins,安装了Maven集

  • 问题 你有个程序要执行CPU密集型工作,你想让他利用多核CPU的优势来运行的快一点。 解决方案 concurrent.futures 库提供了一个 ProcessPoolExecutor 类, 可被用来在一个单独的Python解释器中执行计算密集型函数。 不过,要使用它,你首先要有一些计算密集型的任务。 我们通过一个简单而实际的例子来演示它。假定你有个Apache web服务器日志目录的gzip压

  • 我目前使用的是Build Flow插件,在Jenkins 2.0中,这个插件似乎已经被放弃,转而支持管道。 在使用新管道重建现有工作时遇到了一些问题。 目前,我有类似这样的代码: 此处的目标是并行运行多个现有作业,然后访问有关已完成的生成的信息。这在构建流插件中一直没有问题。 我无法找到使用新管道访问这些数据的方法。 join['Job1']的转储不会像构建流插件那样提供对抽象构建或类似内容的访问

  • 我试图使用Selenium和TestNG进行测试设计,我将每个@test放在一个单独的类中,并对所有类使用once@beforeSuite&@afterSuite,原因是: 代码易于维护 数据驱动,以便能够选择通过文件运行的类。 案例1类: 注意:如果上面的代码在套件中使用单个运行,它就可以正常工作。 问题是它是否像下面的配置那样并行运行。

  • 问题内容: 我正在尝试创建一个WCF REST客户端,该客户端将与Jenkins通信并从XML文件创建作业,然后构建该作业。我的理解是,您可以使用Jenkins做到这一点。 有人可以提供一些命令,您可以在浏览器的地址栏上键入这些命令来创建和构建作业吗?即:沿着这些思路。 问题答案: 请参阅Jenkins API Wiki页面(包括末尾的注释)。您可以使用Jenkins本身提供的文档来填补空白。例如

  • 问题内容: 如何运行简单的 Windows命令 ? 该命令: ..输出此消息: del:在%path%中找不到可执行文件 我究竟做错了什么? 问题答案: 我和你有同样的错误。但是dystroy是正确的:您无法运行或内置任何其他命令,因为没有文件(或与此相关的任何其他del可执行文件)。 我可以使用它: