Итак, у меня есть сценарий использования Jenkinsfile, который, как я знаю, встречается редко, и я пока не нашел решения для него.
Фон
В настоящее время у нас есть многоотраслевое конвейерное задание, настроенное для построения нескольких ветвей Это используется для запуска системного тестирования продуктов в нескольких выпусках. Работа Дженкинса
- Клонировать все необходимые репозитории
- Развертывание среды
- Выполнить автоматизированные тесты
- Развернуть среду
Чтобы избежать необходимости определять один и тот же Jenkinsfile в каждой ветви, мы создали общую библиотеку. Общая библиотека определяет этапы декларативного конвейера для файла Jenkins. Общая библиотека имеет следующее:
/* File name var/myStep.groovy */
def call(Map pipelineParams) {
callASharedLibraryFunction()
properties([
parameters(sharedLibraryGetParameters(pipelineParams))
])
pipeline {
// snip
stages {
stage("clone repos") { }
stage("Deploy environment") { }
stage("Executed Tests") { }
stage("Undeploy environment") { }
}
// post directives
}
}
И файл Дженкинса просто определяет карту, а затем вызывает myStep
call.
например:.
/* Sample Jenkinsfile */
pipelineParams = [
FOO = "foo"
]
myStep pipelineParams
Проблема
Теперь нам нужна другая работа Дженкинса, где некоторые этапы будут одинаковыми. Например, новые рабочие места должны будут
- Клонировать все необходимые репозитории
- Развертывание среды
- Сделай что-нибудь еще
И изменение поведения общей стадии (например, клонирование репо) должно вступить в силу для всех заданий, которые определяют эту стадию. Я знаю, что мы можем использовать директиву when
на этапе, однако с точки зрения удобства использования я хочу, чтобы задания были разными, поскольку они выполняют разные задачи. А пользователи одной работы не заботятся о дополнительных этапах, выполняемых другой работой.
Я хочу избежать дублирования кода, и еще лучше, я не хочу дублировать код этапа. (включая steps
, when
, post
и т. д.).
Есть ли способ, которым разделяемая библиотека может определить этап "реализация" со всеми директивами (steps
, when
, post
и т. Д.) Один раз, но вызывается ли она несколько раз?
например:.
/* File: vars/cloneReposStageFunction.groovy */
def call() {
stage("Clone Repos") { }
}
/* File: vars/myStep.groovy */
def call(Map pipelineParams) {
pipeline {
// snip
stages {
cloneReposStageFunction()
stage("Deploy environment") { }
stage("Executed Tests") { }
stage("Undeploy environment") { }
}
// post directives
}
}
/* File: vars/myNewStep.groovy */
def call(Map pipelineParams) {
pipeline {
// snip
stages {
cloneReposStageFunction()
stage("Deploy environment") { }
stage("Do something else") { }
}
// post directives
}
}