将工作流拆分为更小的块时,变量作用域如何工作?

How does variable scoping work when splitting a workflow into smaller chunks?

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

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

我是否遗漏了有关工作流解释流程脚本的方式的某些信息?有没有一种好方法可以将使用很多很多参数的庞大工作流拆分成更小的块?

您必须在外部定义一个函数 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