Jenkins中的数组简单并行执行
我在使用Groovy 运行 作业时遇到麻烦,而且看起来超级简单,但我是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
以上是 Jenkins中的数组简单并行执行 的全部内容, 来源链接: utcz.com/qa/408076.html