我在使用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)
.each
您需要做一个实际的循环,例如
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