Как работает переменная область видимости при разделении рабочего процесса на более мелкие фрагменты?

У меня очень длинный рабочий процесс для создания и тестирования нашего приложения. На самом деле так долго, что когда мы пытаемся загрузить основной сценарий рабочего процесса, мы получаем это исключение:

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
  }
}

Основываясь на моем понимании документации, где потокPartA.groovy интерпретируется как замыкание, я ожидаю, что переменная 'a' останется в области видимости, но вместо этого я получаю обратное исключение.

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

Я что-то упустил в том, как рабочий процесс интерпретирует сценарии потока? Есть ли хороший способ разделить огромный рабочий процесс, использующий множество параметров, на более мелкие части?


person SaucyWrong    schedule 15.12.2015    source источник


Ответы (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

Дополнительные сведения см. в документации.

person amuniz    schedule 21.12.2015