我在使用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,但它一直很粗糙.只是寻找我现在能得到的任何帮助.
谢谢.
这是一个非常烦人的限制,但目前你不能.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)
| 归档时间: |
|
| 查看次数: |
9980 次 |
| 最近记录: |