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

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

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

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


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

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

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

7 ответов

Решение

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

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

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

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

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

Трубопроводный плагин

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

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

например

// build
stage 'build'
...

// deploy
stage 'deploy'
...

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

// promote artifacts
stage 'promote'
...

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

Вы также можете использовать плагин 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. Скопируйте артефакты из апстрима build работа с использованием плагина копирования артефактов

    • Название проекта = ${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 заданий. Сборка продолжается только после завершения всей фазы, поэтому, если фаза состоит из нескольких заданий, все они должны быть выполнены до выполнения остальных. Естественно, это можно настроить, если сборка продолжается в случае сбоя на этапе.

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

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

Этот конвейер сборки алмазной зависимости можно настроить с помощью подключаемого модуля DepBuilder . DepBuilder использует свой собственный предметно-ориентированный язык, который в этом случае будет выглядеть так:

      _BUILD {
    // define the maximum duration of the build (4 hours)
    maxDuration: 04:00 
}

// define the build order of the existing Jenkins jobs
Build -> Deploy
Deploy -> "Functional Tests" -> Promote
Deploy -> "Performance Tests" -> Promote

Скриншот пользовательского интерфейса плагина DepBuilder

После сборки проекта визуализация сборки будет отображаться на странице панели управления проектом:

Создание визуализации конвейера

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

Скриншот неудачной сборки

Другие вопросы по тегам