Как определить этап конвейера один раз и использовать его несколько раз - PullRequest
0 голосов
/ 07 января 2019

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

Фон

В настоящее время у нас есть многоотраслевое конвейерное задание, настроенное для построения нескольких ветвей Это используется для запуска системного тестирования продуктов в нескольких выпусках. Работа Дженкинса

  1. Клонировать все необходимые репозитории
  2. Развертывание среды
  3. Выполнить автоматизированные тесты
  4. Развернуть среду

Чтобы избежать необходимости определять один и тот же 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

Проблема

Теперь нам нужна другая работа Дженкинса, где некоторые этапы будут одинаковыми. Например, новые рабочие места должны будут

  1. Клонировать все необходимые репозитории
  2. Развертывание среды
  3. Сделай что-нибудь еще

И изменение поведения общей стадии (например, клонирование репо) должно вступить в силу для всех заданий, которые определяют эту стадию. Я знаю, что мы можем использовать директиву 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
    }
}

1 Ответ

0 голосов
/ 08 января 2019

Это открытый запрос Дженкинса .

Я видел разные способы шаблонирования конвейера, но это далеко от того, чего вы хотели бы достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...