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

回到顶部