Как запустить работу Jenkins после успешного выполнения нескольких одновременных заданий? - PullRequest
69 голосов
/ 26 января 2012

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

Дженкинс имеет «Сборку после других проектов»встроены », но я интерпретирую это как« запустить это задание, когда любое исходное задание завершится »(не« запускать это задание, когда все последующие задания выполнены успешно »).1008 * Вот визуализация того, о чем я говорю.Кто-нибудь знает, существует ли плагин, чтобы делать то, что я после?Build Pipeline


Редактировать:

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

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

Ответы [ 6 ]

30 голосов
/ 19 сентября 2013

Конвейерный плагин

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

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

например,

// build
stage 'build'
...

// deploy
stage 'deploy'
...

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

// promote artifacts
stage 'promote'
...

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

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

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

Создание заданий для:

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

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

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

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

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

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

  1. Я использую 2 параметра PARENT_JOB_NAME и PARENT_BUILD_NUMBER
  2. Копирование артефактов из вышестоящего 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)

удачи.

27 голосов
/ 26 января 2012

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

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

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

В обоих этих решениях есть КРИТИЧЕСКИЙ аспект: отпечатки пальцев должны быть правильно использованы.Вот что я нашел:

  1. Задание "build" должно ОРИГИРОВАТЬ новый файл с отпечатками пальцев.Другими словами, он должен отследить какой-то файл, который, по мнению Дженкинса, был создан при первоначальной работе.Дважды проверьте ссылку «Просмотр отпечатков пальцев» задания, чтобы убедиться в этом.
  2. Все связанные с ним нижестоящие задания (в данном случае «развертывание», «Функциональные тесты» и «Тесты производительности») должны получить и идентифицировать этот же файл.Плагин Copy Artifacts отлично подходит для такого рода вещей.
  3. Имейте в виду, что некоторые плагины позволяют изменять порядок дактилоскопии и запуска нижестоящих заданий;в этом случае дактилоскопия ДОЛЖНА произойти до того, как нижестоящее задание отсканирует один и тот же файл, чтобы обеспечить правильную настройку ОРИГИНА отпечатка пальца.
11 голосов
/ 01 января 2015

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

8 голосов
/ 11 июня 2013

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

3 голосов
/ 14 марта 2016

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

2 голосов
/ 14 февраля 2016

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

...