Является ли Jenkinsfile в чистом виде Groovy? Какая языковая конструкция Groovy используется в `steps` в файле Jenkins? - PullRequest
0 голосов
/ 18 июня 2020

Какая Groovy языковая конструкция, синтаксис или управляющая структура используется в следующем фрагменте кода в Jenkinsfile?

stage('Stage 1') {
    steps {
        // One or more steps
    }
}

т.е. что такое блоки в Jenkinsfile с точки зрения чистый Groovy язык?

что такое «шаги»? или stage? Это вызов функции? или определение? или вызов функции с анонимным (лямбда) аргументом?

В этом вопросе есть еще один вопрос:

Вопрос 2:

Является ли файл Jenkinsfile фрагментом кода на языке groovy?

Другими словами, 1. Соответствует ли файл Jenkins всему синтаксису и управляющим структурам чистого Groovy? (возможно, с помощью неявного импорта библиотеки или #include d в начале),

В отличие от DSL: 2. Jenkinsfile - это почти groovy исходный файл, дополненный новыми спецификациями Jenkins c конструкции не были изначально в Groovy, например, Jenkins с использованием предварительной обработки.

Какой из двух вышеупомянутых правил?

Связано:

1 Ответ

0 голосов
/ 19 июня 2020

В Jenkins (или Gradle) используются 2 основные функции:

  1. Groovy (java) идиоматические c структуры, такие как циклы, переключатели, цепочка команд и т. Д. c
  2. DSLBuilder, основанный на Closure s, чтобы разрешить вложение и вызов методов c, специфичных для домена, поскольку они были частью самого Groovy.

Итак, если вы пишете что-то вроде

stage('Stage 1') {
    steps {
        // One or more steps
    }
}

, это переводится внутри примерно на:

jenkinsContext.stage('Stage 1') {
    jenkinsContext.steps {
        // One or more steps
    }
}

, поэтому писать и читать намного проще. Здесь Замыкания - блоки {...} - представляют вложенность или группировку вашего кода.

В этом блоке вы также можете увидеть способ вызова методов Groovy, в котором последний аргумент - Замыкание. Приведенный выше код можно переписать как:

jenkinsContext.stage 'Stage 1', { // here no brackets around args
    jenkinsContext.steps( { // here with normal java-style brackets
        // One or more steps
    } )
}

В jenkins вы можете смешивать и сопоставлять вызовы DSL со структурами Groovy:

[ 'Stage 1', 'Stage 2' ].each{
  stage( it ) {}
}

или даже динамически генерировать имена DSL:

[ 'Stage 1':'stage', 'step 2':'steps' ].each{ value, name ->
  "$name"( value ) {}
}

создаст DSL (ТОЛЬКО в качестве примера!):

  stage( 'Stage 1') {}
  steps( 'Step 2' ) {}

Итак, синтаксис конвейера Jenkins: Groovy + Jenkins DSL

...