Как сделать так, чтобы работа Дженкинса начиналась после успешного выполнения нескольких одновременных вышестоящих заданий?


Чтобы получить максимально быструю обратную связь, мы иногда хотим, чтобы задания Дженкинса выполнялись параллельно. Дженкинс имеет возможность запускать несколько последующих заданий (или "разветвлять" конвейер), когда задание заканчивается. Тем не менее, Дженкинс, похоже, не имеет никакого способа сделать нисходящее задание только началом всех ветвей этой вилки (или "соединить" вилку вместе).

У Дженкинса есть кнопка" построить после того, как будут построены другие проекты", но я интерпретирую это как " начать эту работу, когда любое восходящее задание завершается" (не "запускайте это задание, Когдавсе восходящие задания завершаются успешно").

Вот визуализация того, о чем я говорю. Кто-нибудь знает, существует ли плагин, чтобы сделать то, что я ищу? Строительство Газопровода


Правка:

Когда я впервые опубликовал этот вопрос в 2012 году, ответ Джейсона (Плагины Join и Promoted Build) был лучшим, и я выбрал решение.

Однако ответ dnozay (плагин Build Flow) стал популярным через год или два. Итак, после этого вопроса, который является гораздо лучшим ответом. Как бы то ни было, если люди задают мне этот вопрос сегодня, я теперь рекомендую это вместо этого.

6 67

6 ответов:

Есть два решения, которые я использовал для этого сценария в прошлом:

  1. Используйте Join Plugin в задании "deploy" и укажите "promote" в качестве целевого задания. Вы должны были бы указать "функциональные тесты" и "тесты производительности" в качестве объединенных заданий и запустить их некоторым образом, после сборки. Для этого хорош параметризованный триггерный плагин .

  2. Используйте Promoted Build Plugin в вашем задании" deploy", укажите продвижение это работает, когда нисходящие задания завершены и заданы функциональные и тестовые задания производительности. В рамках действия по продвижению активируйте задание" продвигать". Вы все еще должны запустить два тестовых задания из "deploy"

Существует критический аспект обоих этих решений: отпечатки пальцев должны использоваться правильно. Вот что я нашел:

  1. задание "построить" должно создать новый файл отпечатков пальцев. Другими словами, он должен отпечатать какой-то файл, который, по мнению Дженкинса, был возник из первоначального задания. Дважды проверьте ссылку" увидеть отпечатки пальцев " задания, чтобы убедиться в этом.
  2. все нижестоящие связанные задания (в данном случае "развертывание", "функциональные тесты" и "тесты производительности") должны получить и отпечатать этот же файл. Плагин Copy Artifacts отлично подходит для такого рода вещей.
  3. имейте в виду, что некоторые плагины позволяют изменять порядок дактилоскопирования и запуска нисходящего задания; в этом случае дактилоскопирование должно происходить до нисходящего задания. задание отпечатков пальцев тот же файл, чтобы убедиться, что происхождение отпечатка правильно установлено.

Модуль конвейера

Вы можете использовать модуль конвейера (ранее workflow-plugin).

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

Например

// build
stage 'build'
...

// deploy
stage 'deploy'
...

// run tests in parallel
stage 'test'
parallel 'functional': {
  ...
}, 'performance': {
  ...
}

// promote artifacts
stage 'promote'
...

Build flow plugin

Вы также можете использовать плагин Build Flow. Это просто потрясающе - но это устарело (развитие заморожено).

Настройка заданий

Создание рабочих мест ибо:

  • построить
  • развернуть
  • тесты производительности
  • функциональные тесты
  • раскрутки

Настройка восходящего потока

  1. В верхнем течении (здесь build) создайте уникальный артефакт, например:

    echo ${BUILD_TAG} > build.tag
    
  2. Архивируйте артефакт build.tag.

  3. запись отпечатков пальцев для отслеживания использования файлов; если какая-либо работа копирует один и тот же файл build.tag и записывает отпечатки пальцев, вы сможете отслеживать родитель.
  4. настройте продвижение по службе, Когда promotion задание успешно выполнено.

Настройка нижестоящих заданий

  1. я использую 2 параметра PARENT_JOB_NAME и PARENT_BUILD_NUMBER
  2. Скопируйте артефакты из задания upstream build с помощью плагина Copy Artifact

    • название проекта = ${PARENT_JOB_NAME}
    • который билд = ${PARENT_BUILD_NUMBER}
    • артефакты для копирования = build.tag
  3. Запишите отпечатки пальцев; это ключевой.

Настройка нисходящего задания продвижения

Сделайте то же самое, что и выше, чтобы установить отношения "вверх-вниз". Он не нуждается в каком-либо этапе сборки. Вы можете выполнять дополнительные действия после сборки, такие как"Эй QA, это ваша очередь".

Создание задания потока сборки

// start with the build
parent = build("build")
parent_job_name = parent.environment["JOB_NAME"]
parent_build_number = parent.environment["BUILD_NUMBER"]

// then deploy
build("deploy")

// then your qualifying tests
parallel (
    { build("functional tests",
          PARENT_BUILD_NUMBER: parent_build_number,
          PARENT_JOB_NAME: parent_job_name) },
    { build("performance tests",
          PARENT_BUILD_NUMBER: parent_build_number,
          PARENT_JOB_NAME: parent_job_name) }
)

// if nothing failed till now...
build("promotion",
    PARENT_BUILD_NUMBER: parent_build_number,
    PARENT_JOB_NAME: parent_job_name)

// knock yourself out...
build("more expensive QA tests",
    PARENT_BUILD_NUMBER: parent_build_number,
    PARENT_JOB_NAME: parent_job_name)

Удачи.

ПлагинMultijob прекрасно работает для этого сценария. Он также пригодится, если вы хотите, чтобы одно "родительское" задание запускало несколько "дочерних" заданий, но при этом могли выполнять каждое из них вручную, самостоятельно. Это работает путем создания "фаз", к которым вы добавляете от 1 до n заданий. Сборка продолжается только после завершения всей фазы,поэтому, если фаза состоит из нескольких заданий, все они должны быть завершены до выполнения остальных. Естественно, можно ли настроить сборку продолжается, если в фазе произошел сбой.

Ответы jason & dnozay достаточно хороши. Но если кто-то ищет простой способ, просто используйте jobfanin plugin.

Я считаю, что плагин Workflow теперь называется Pipeline Plugin и является (текущим) предпочтительным решением исходного вопроса, вдохновленным плагином Build Flow. Существует такжеруководство по началу работы в GitHub.