具有动态构建列表的 Jenkins 流水线并行步骤
Jenkins pipeline parallel step with dynamically built list
我的 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' 和 'two' 的并行分支,但只为两个并行分支调用方法 'two'。
我想这里缺少一些 groovy 相关的东西,但我希望可以像这样动态调用方法名称,这样我就可以为需要 运行 可变输入。
func 不是局部变量,而是在主脚本上动态定义的 属性。如果没有类型或 keyworkd def
指定在 var 名称的左侧,那么 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"
}
我的 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' 和 'two' 的并行分支,但只为两个并行分支调用方法 'two'。
我想这里缺少一些 groovy 相关的东西,但我希望可以像这样动态调用方法名称,这样我就可以为需要 运行 可变输入。
func 不是局部变量,而是在主脚本上动态定义的 属性。如果没有类型或 keyworkd def
指定在 var 名称的左侧,那么 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"
}