Создать возобновляемый трубопровод jenkins script
Я рассматриваю недавно использование конвейера Jenkins script, один вопрос заключается в том, что я не считаю умным способ создания внутреннего кода повторного использования utils, представьте, у меня есть общая функция helloworld
, которая будет использоваться по множеству рабочих заданий на конвейере, поэтому я надеюсь, что создать utils.jar
можно ввести его в путь класса задания.
Я замечаю, что у Дженкинса есть аналогичная концепция с глобальной библиотекой , но моя озабоченность по поводу этого плагина:
Так как это плагин, поэтому нам нужно установить/обновить его через jenkins plugin manager, тогда может потребоваться перезагрузка, чтобы применить изменение, это не то, что я хочу видеть, поскольку utils могут меняться, добавлять всегда, мы надеемся он может быть доступен сразу.
Во-вторых, это официальный jenkins shared lib, я не хочу (или они не будут применять нас) помещает частный код в jenkins repo.
Любая хорошая идея?
Ответы
Ответ 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'
}
Я могу быть немного уродливым, но он работает реально, и в дополнение к этому он также позволяет нам вставлять какой-либо конкретный код репозитория до или после общего кода.