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

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

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

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


Изменить:

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

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

Ответ 1

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

  • Используйте Плагин подключений в вашем задании "развернуть" и укажите "продвигать" в качестве целевой задачи. Вам нужно будет указать "Функциональные тесты" и "Тесты производительности" в качестве объединенных заданий и запустить их через некоторое время, после сборки. Параметрированный триггерный плагин хорош для этого.

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

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

  • Задание "build" должно ОРИГИНАЛ новый файл с отпечатками пальцев. Другими словами, он должен отпечатать некоторые файлы, которые, по мнению Дженкинса, возникли из начальной работы. Дважды проверьте ссылку "Просмотреть отпечатки пальцев" задания, чтобы проверить это.
  • Все связанные с нисходящим заданием задания (в этом случае "развернуть", "Функциональные тесты" и "Тесты производительности" ) должны получить и отпечатать этот же файл. Плагин Copy Artifacts отлично подходит для такого рода вещей.
  • Имейте в виду, что некоторые плагины позволяют вам изменить порядок запуска отпечатков пальцев и последующей работы; в этом случае отпечаток пальца ДОЛЖЕН произойти до того, как нисходящее задание отпечатает один и тот же файл, чтобы убедиться, что ORIGIN отпечатка правильно установлена.

Ответ 2

Плагин трубопровода

Вы можете использовать Pipeline Plugin (ранее workflow-plugin).

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

например.

// build
stage 'build'
...

// deploy
stage 'deploy'
...

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

// promote artifacts
stage 'promote'
...

Плагин сборки потока

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

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

Создать задания для:

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

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

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

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

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

Настройка рабочих заданий ниже по течению

  • Я использую 2 параметра PARENT_JOB_NAME и PARENT_BUILD_NUMBER
  • Скопируйте артефакты из исходного задания build, используя Копировать плакат артефакта

    • Название проекта = ${PARENT_JOB_NAME}
    • Какая сборка = ${PARENT_BUILD_NUMBER}
    • Артефакты для копирования = build.tag
  • Записать отпечатки пальцев; это важно.

Настройка задания продвижения вниз по течению

Сделайте то же самое, что и выше, чтобы установить отношения вверх-вниз по течению. Он не нуждается в шаге сборки. Вы можете выполнять дополнительные действия после сборки, такие как "эй 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)

удачи.

Ответ 3

Недавно Дженкинс объявил поддержку первого класса для рабочего процесса.

Ответ 4

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

Ответ 5

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

Ответ 6

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