在Jenkins中为数组简单并行执行

Fre*_*ger 5 groovy jenkins

我在使用Groovy 运行Jenkins作业时遇到了麻烦,看起来非常简单,但我只是1)Java/Groovy的菜鸟和2)我能找到的所有例子都不是我需要做的.

我发现了以下类似的问题: Jenkins Groovy Parallel Variable无法正常工作,但确切的代码会导致错误:

java.lang.UnsupportedOperationException:尚未支持在CPS转换的闭包上调用public static 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}"
}
Run Code Online (Sandbox Code Playgroud)

我尝试过闭包,但是他们抛出一个错误,说实话,我几乎不知道如何使用它们.以下代码

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

parallel arr.collect { item ->
    { -> 
        echo "${item}"
    }
}
Run Code Online (Sandbox Code Playgroud)

抛出与上面相关问题相同的"java.lang.UnsupportedOperationException".

我正在努力学习如何在Jenkins中正确使用Groovy,但它一直很粗糙.只是寻找我现在能得到的任何帮助.

谢谢.

Ken*_*ego 5

这是一个非常烦人的限制,但目前你不能.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}"
}
Run Code Online (Sandbox Code Playgroud)

如果实际需要并行执行,代码看起来更像:

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
Run Code Online (Sandbox Code Playgroud)

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

编辑:在现代Jenkins(在2.150.1测试)中,上面列出的原始bug是固定的,并且.each有效.您可以执行以下并行执行:

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

def stepsForParallel = [:]
arr.each {
    def stepName = "running ${it}"
    stepsForParallel[stepName] = { ->           
        echo "${it}"
    }
}
parallel stepsForParallel
Run Code Online (Sandbox Code Playgroud)