小编典典

Jenkins中的数组简单并行执行

jenkins

我在使用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,但这很困难。只是在此时寻求任何帮助。

谢谢。


阅读 531

收藏
2020-07-25

共1个答案

小编典典

这是一个非常令人讨厌的限制,但是当前您不能.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
2020-07-25