Подтвердить что ты не робот

Создать возобновляемый трубопровод jenkins script

Я рассматриваю недавно использование конвейера Jenkins script, один вопрос заключается в том, что я не считаю умным способ создания внутреннего кода повторного использования utils, представьте, у меня есть общая функция helloworld, которая будет использоваться по множеству рабочих заданий на конвейере, поэтому я надеюсь, что создать utils.jar можно ввести его в путь класса задания.

Я замечаю, что у Дженкинса есть аналогичная концепция с глобальной библиотекой , но моя озабоченность по поводу этого плагина:

Так как это плагин, поэтому нам нужно установить/обновить его через jenkins plugin manager, тогда может потребоваться перезагрузка, чтобы применить изменение, это не то, что я хочу видеть, поскольку utils могут меняться, добавлять всегда, мы надеемся он может быть доступен сразу.

Во-вторых, это официальный jenkins shared lib, я не хочу (или они не будут применять нас) помещает частный код в jenkins repo.

Любая хорошая идея?

4b9b3361

Ответ 1

Общие библиотеки (docs) позволяет вам сделайте свой код доступным для всех ваших сценариев конвейера. Вам не нужно создавать плагин для этого, и вам не нужно перезапускать Jenkins.

например. это моя библиотека и этот файл Jenkins, который называет это общее функция.


EDIT (февраль 2017 г.): Доступ к библиотеке можно получить через внутренний сервер Git Jenkins, или развернутый с помощью других средств (например, через шеф-повар) в каталог workflow-lib/ в домашнем каталоге пользователя jenkins. (все еще возможно, но очень неудобный).

Глобальную библиотеку можно настроить с помощью следующих средств:

  • аннотация @Library('github.com/...') в Jenkinsfile, указывающая на URL-адрес репозитория разделяемой библиотеки.
  • настроен на уровне папок заданий Дженкинса.
  • настроен в конфигурации Jenkins как глобальная библиотека, с тем преимуществом, что код доверен, то есть не подлежит защите script.

Комбинация первого и последнего метода была бы не явно загруженной разделяемой библиотекой, которая затем запрашивается только с использованием ее имени в Jenkinsfile: @Library('mysharedlib').

Ответ 2

В зависимости от того, как часто вы планируете повторно использовать свой код, вы также можете загрузить функцию (или набор функций) как часть другого конвейера.

{
  // ...your pipeline code...

  git 'http://urlToYourGit/projectContainingYourScript'
  pipeline = load 'global-functions.groovy'
  pipeline.helloworld()    // Call one of your defined function

  // ...some other pipeline code...
}

Это решение может показаться немного громоздким по сравнению с StephenKing, но то, что мне нравится в этом решении, состоит в том, что мои глобальные функции все привязаны к Git, и любой может легко изменить их без (почти) любых знаний Jenkins, просто основы Groovy.

В Groovy script ваши load ing, убедитесь, что вы добавили return this в самом конце. Это позволит вам совершать звонки позже. В противном случае, если вы установите pipeline = load global-functions.groovy, переменная будет установлена ​​на null.

Ответ 3

Вот решение, которое мы в настоящее время используем для повторного использования кода Jenkinsfile:

node {

  curl_cmd = "curl -H 'Accept: application/vnd.github.v3.raw' -H 'Authorization: token ${env.GITHUB_TOKEN}' https://raw.githubusercontent.com/example/foobar/master/shared/Jenkinsfile > Jenkinsfile.t
  sh "${curl_cmd}"
  load 'Jenkinsfile.tmp'

}

Я могу быть немного уродливым, но он работает реально, и в дополнение к этому он также позволяет нам вставлять какой-либо конкретный код репозитория до или после общего кода.