带有动态构建列表的Jenkins管道并行步骤



我有一份詹金斯的工作,有一些奇怪的行为,我不确定发生了什么。

node(){
myFuncs = [:]
String[] myFuncsToCall = ["one", "two"]
for (int i = 0; i < myFuncsToCall.size(); i++) {
func = myFuncsToCall[$i]
myFuncs[func] = {
"${func}"()
}
}
parallel myFuncs
}
def one(){
echo "one"
}
def two(){
echo "two"
}

这很有趣,因为作业输出显示了"one"one_answers"two"的并行分支,但只调用了两个并行分支的方法"two"。

我想我在这里缺少了一些与groovy相关的东西,但我希望可以动态调用这样的方法名,这样我就可以为需要使用变量输入运行的作业提供大量的动态输入。

func不是局部变量,而是主脚本上动态定义的属性。如果在var名称的左边没有指定类型或keyworkddef,那么groovy将尝试解析它,Jenkins将主脚本配置为func作为一个新属性分配给主脚本。基本上,它创建了一个全局var,因为只有一个主脚本实例(Jenkinsfile本身(。因此,这个全局var在循环中被更改,并且只存储最后的结果("两个"(。当涉及到运行闭包时,每个闭包都是来自全局变量的值;两个";。要改变这种行为,只需添加def或显式类型,使func成为局部变量。

node(){
def myFuncs = [:]
String[] myFuncsToCall = ["one", "two"]
for (int i = 0; i < myFuncsToCall.size(); i++) {
def func = myFuncsToCall[i]
myFuncs[func] = {
"${func}"()
}
}
parallel myFuncs
}
def one(){
echo "one"
}
def two(){
echo "two"
}

最新更新