Можно ли включить вызовы в декларативные конвейеры в общей библиотеке (Jenkins)? - PullRequest
0 голосов
/ 03 июля 2018

Как вы знаете в общих библиотеках в Jenkins, в Jenkinsfile можно вызывать содержимое файла в папке vars.

Например, в папке vars в общей библиотеке у нас может быть файл с именем build.groovy, а в файле Jenkinsfile мы можем вызвать его следующим образом:

build { parameter1 = "some param1" parameter2 = "some param2" }

Как описано в этом разделе . У меня нет проблем с созданием groovy файлов и вызовом их с помощью метода call() в Jenkinsfile.

Но я хочу настроить конвейер и сделать его как можно более универсальным. Поэтому я хочу вызвать groovy-файл, содержащийся в папке vars, но в том же конвейере: вызов genericStage.groovy в другом файле, содержащемся в той же папке vars в общей библиотеке.

Итак, у меня есть отличный файл в папке vars: genericStage.groovy Что у меня есть:

Pipeline{
 agent{label myNode}

 stages{

  stage("init"){
   //steps

  }

  genericStage{
   parameter1 = "some param"
  }

 }

}

А в genericStage:

def call(Closure body) {
def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
body()

stage(config.parameter1){
    steps{
        //steps
    }
}   

}

Но я получаю ошибку:

Expected a stage @ line 125, column 6.
                genericStage{
    ^

1 error

at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085)

Так как делать вызовы в той же общей библиотеке, что и для Jenkinsfile?

1 Ответ

0 голосов
/ 04 июля 2018

В своем методе общей библиотеки, определяя шаг стиля DSL, подобный этому, вы можете определить блок шагов и сценарий, который выполняет некоторую общую обработку, которую вам нужно разделить между заданиями или этапами в задании или целым конвейером. Таким образом, ваш genericStage.groovy может содержать только то, что следует после комментария "/ steps", и не может содержать определение стадии и шагов, как это. Я делаю этот тип пользовательского шага библиотеки довольно часто в том стиле, который у вас здесь есть, но не пытаясь определить этап / шаги внутри него, и он работает нормально. Здесь происходит то, что валидация / синтаксический анализатор конвейера нарушает синтаксис основного конвейера еще до того, как приступает к обработке вашего пользовательского шага, потому что вы не включили его в определение этапа и шагов.

Если вы прочитаете ссылку на документацию, которая у вас есть, в конце появится раздел, посвященный определению полного декларативного конвейера в общей библиотеке. В конце написано: «Только весь конвейер s can be defined in shared libraries as of this time. This can only be done in vars / *. Groovy, и только в методе вызова. В одной сборке может быть выполнен только один декларативный конвейер, и если вы попытаетесь выполнить второй, ваша сборка будет потерпеть неудачу в результате. " Это говорит о том, что такой частичный конвейер, как у вас, не будет работать, у вас должны быть только шаги / скрипт или полный конвейер.

...