2017-04-26 16 views
0

我在使用Groovy运行Jenkins作业时遇到了问题,它看起来超级简单,但我是1)Java/Groovy的noob和2)我可以使用的所有示例找不到我需要做的事情。在Jenkins中为一个数组执行简单的并行执行

我发现下面类似的问题: Jenkins Groovy Parallel Variable not working,但确切代码导致错误:

java.lang.UnsupportedOperationException: Calling public static java.util.List org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(java.lang.Object,groovy.lang.Closure) on a CPS-transformed closure is not yet supported (JENKINS-26481); encapsulate in a @NonCPS method, or use Java-style loops

这里是什么,我要尽我的伪代码:

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”如上述的相关问题。

我想学习如何正确利用Groovy与Jenkins,但它很粗糙。只是寻找任何帮助,我可以在这一点上得到。

谢谢。

回答

0

这是一个非常恼人的限制,但目前不能在一个流水线脚本中使用.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插件n,它是您正在使用的Pipeline插件的前身。这就是为什么相同的代码不起作用。