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

时间:2021-05-25 02:15:48

标签: groovy jenkins-pipeline

我有一份 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 相关的东西,但我希望可以像这样动态调用方法名称,以便我可以为需要使用变量输入运行的作业提供大量动态输入。

1 个答案:

答案 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"
}
相关问题