Может ли мой Jenkinsfile содержать только свойства и не содержать круговой линии - PullRequest
0 голосов
/ 07 октября 2018

Все учебники, с которыми я сталкивался при написании декларативного конвейера, предлагают включать этапы и шаги в Jenkinsfile .

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

И для определения конвейера он использует концепции разделяемой библиотеки, где он пишет свой конвейерный кодв файле в папке vars.Я не могу угадать мудрость этого подхода.

Нигде в Интернете я не сталкивался с чем-либо подобным.
Любые рекомендации в этом отношении высоко ценятся.Я новичок в мире Дженкинс.

1 Ответ

0 голосов
/ 07 октября 2018

Как показано в Расширение с помощью общих библиотек , этот подход (который я также использую) позволяет:

  • сохранять содержимое Jenkinsfile для минимум
  • обеспечивает стандартный способ выполнения определенной работы (как указано в общей библиотеке)

Эта общая библиотека становится шаблоном процесса длякоторый вы предоставляете только значения в вашем Jenkinsfile, прежде чем делегировать фактическое выполнение в предопределенную библиотеку.

OP Асиф Камран Малик обратите внимание, что документация действительно включает :

Существует также трюк с «шаблоном построения», использующий Groovy Closure.DELEGATE_FIRST, который позволяет Jenkinsfile выглядеть немного больше как файл конфигурации, чем как программа, но это более сложный и подверженный ошибкам ине рекомендуется.

Затем он спрашивает:

Почему блоггер предпочел такой способ, когда его фактически не одобряют в официальном документе.

Я проверяюd и мы также используем Closure.DELEGATE_FIRST.
Причина в том, что "разрешает Jenkinsfile выглядеть немного больше как файл конфигурации, чем как программа" *

. Это избавляет нас от необходимости определять блок JSON,и сохраняйте параметр в виде последовательности key=value строк, которые легче читать.

Тогда вызов разделяемой библиотеки будет следующим:

#!/usr/bin/env groovy
@Library("MyLibraries") _
MyLibrary {
    config1 = 'value1'
    config2 = 'value2'
    ...
}
{
    anotherConfigA = 'valueA'
    anotherConfigB = 'valueB'...
    astep(
        ...
    )
}

Тогда ваши ДженкинсШаблон конвейера в MyLibraries/vars/MyLibrary.yml может использовать эти блоки закрытия:

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

    astep(
      ...
    ){
      if (body) { body() }
    }
}
...