我有一份 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"
}
这很有趣,因为作业输出显示了“一”和“二”的并行分支,但只为两个并行分支调用了方法“二”。
我想我在这里遗漏了一些与 groovy 相关的东西,但我希望可以像这样动态调用方法名称,以便我可以为需要使用变量输入运行的作业提供大量动态输入。
答案 0 :(得分:0)
func 不是局部变量,而是主脚本上动态定义的属性。如果没有 type 或从 var 名称指定为 left 的 keyworkd def
,则 groovy 将尝试解析它,并且 Jenkins 以这样的方式配置主脚本,即 func 将作为新属性分配给主脚本。基本上,它创建了一个全局变量,因为只有一个主脚本实例(Jenkinsfile 本身)。
因此,这个全局变量在循环中被改变并且只存储最后的结果(“二”)。当涉及到运行闭包时,每个闭包都是来自全局变量的值。因此,“两个”。
要更改此行为,只需添加 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"
}