Groovy 具有动态构建列表的Jenkins管道并行步骤
我有一份詹金斯的工作,有一些奇怪的行为,我不知道发生了什么Groovy 具有动态构建列表的Jenkins管道并行步骤,groovy,jenkins-pipeline,Groovy,Jenkins Pipeline,我有一份詹金斯的工作,有一些奇怪的行为,我不知道发生了什么 node(){ myFuncs = [:] String[] myFuncsToCall = ["one", "two"] for (int i = 0; i < myFuncsToCall.size(); i++) { func = myFuncsToCall[$i] myFuncs[func] = { "${func}"()
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"
}
node(){
myFuncs=[:]
字符串[]myFuncsToCall=[“一”,“二”]
对于(int i=0;i
这很有趣,因为作业输出显示了“one”和“two”的并行分支,但只调用了两个并行分支的方法“two”
我想这里缺少了一些与groovy相关的东西,但我希望可以像这样动态调用方法名,这样我就可以为需要使用变量输入运行的作业提供大量动态输入。func不是一个局部变量,而是主脚本上的一个动态定义属性。如果未键入或变量名称左侧指定的keyworkd
def
,groovy将尝试解析它,Jenkins将主脚本配置为func作为新属性分配给主脚本。基本上,它创建了一个全局变量,因为主脚本只有一个实例(Jenkinsfile本身)。
因此,这个全局变量在循环中被更改,并且只存储最后一个结果(“两个”)。当涉及到运行闭包时,每个闭包的值都来自全局变量,因此是“2”。
要更改此行为,只需添加def或explicit type,使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"
}
node(){
def myFuncs=[:]
字符串[]myFuncsToCall=[“一”,“二”]
对于(int i=0;i