在将工作流拆分为较小的块时,变量范围如何工作?

时间:2015-12-15 20:58:28

标签: jenkins jenkins-workflow

我有一个很长的工作流程来构建和测试我们的应用程序。事实上,当我们尝试加载主工作流脚本时,我们得到了这个例外:

java.lang.ClassFormatError: Invalid method Code length 67768 in class file WorkflowScript

我并不为此感到骄傲。我想将工作流分成我们从主工作流脚本加载的较小脚本,但是遇到了变量作用域的问题。例如:

def a = 'foo' //some variable referenced in multiple workflow stages

node {
  echo a
}
//... and then a whole bunch of other stages

可能会成为

def a = 'foo' //some variable referenced in multiple workflow stages
node {
  git: ...
  load 'flowPartA.groovy'
}()

flowPartA.groovy的样子:

{ ->
  node {
    echo a
  }
}

根据我对文档的理解,其中flowPartA.groovy被解释为闭包,我希望变量'a'将保留在范围内,但相反,我得到一个例外。

groovy.lang.MissingPropertyException: No such property: a for class: groovy.lang.Binding

我是否遗漏了工作流解释流脚本的方式?是否有一种很好的方法来采用一个庞大的工作流程,使用许多很多参数并将其拆分成更小的块?

1 个答案:

答案 0 :(得分:1)

你必须在外部groovy中定义一个函数并调用它传递所有必需的参数:

def a = 'foo'
node('slave') {
    git '…'
    def flow = load 'flowPartA.groovy'
    flow.echoFromA(a)
}

flowPartA.groovy包含:

def echoFromA(String a) {
    echo a
}
return this

有关详细信息,请参阅documentation