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