Как заставить Дженкинса пропустить нисходящую работу, если новая сборка ждет в трубопроводе?
Мой строительный трубопровод в Дженкинсе разбит на три задания:
- Код сборки
- Развертывание кода для среды
- Запуск автоматизированных функциональных тестов
Я настроил его так, чтобы возникали параллельные сборки, и конвейер сборки останавливает сборку из ввода # 2, если в настоящее время выполняется # 2 или # 3 для другой сборки.
То, что я хочу сделать, - это настроить Jenkins для обработки, когда есть несколько ожиданий построения, а # 2 и # 3 - только для того, чтобы только LATEST build входила в # 2 и # 3.
Есть ли способ сделать это из коробки? Если у вас есть книга "Непрерывная доставка", то, что я пытаюсь сделать, это реализовать то, что на p. 118 - стр. 119
Ответы
Ответ 1
Попробуйте один из них в разделе Дополнительные параметры проекта:
-
Блокировать сборку, когда проект upstream строится
(должен убедиться, что он не вызывает шаги 2 и 3, чтобы застрять в очереди)
-
Блокировать сборку, когда проект downstream строится
(Я знаю, что это звучит как противоположность вашему запросу, но фактический результат заключается в том, что вы накапливаете изменения в единый цикл сборки, предотвращение дополнительных прогонов)
Если это приводит к сбою нежелательных сборок,
пожалуйста, просмотрите следующие ссылки, которые должны помочь вам
пустая очередь или убить выполняемые задания:
Приветствия
Ответ 2
Плагин Workflow позволяет писать весь конвейер как один script. В этом случае шаг stage
может использоваться для управления доступом:
stage 'build'
// any number of builds get here
stage name: 'deployAndTest', concurrency: 1
// only the last to build successfully enters here
(Для целей визуализации JENKINS-29892 позволит вам пометить границу между этапами deploy
и test
.)
Ответ 3
Проблема с "block upstream" или "block downstream" заключается в том, что вы всегда блокируете что-то, что может работать.
Если вы используете "git", вы можете сделать что-то в этих строках - это, случается, то, что я делаю...
Я использую ветвь отслеживания, которая указывает на последнее завершенное задание сборки любого шага, называемого следующим образом: <branch>-latest-<step>
. Итак, если вы запустите шаг "build" на основе мастера, вы получите master-latest-build
. Очень легко переместить эту ветвь в конец вашей сборки script, просто запустите: git branch -f <name> HEAD
, а затем нажмите.
Затем я запускаю выходные задания для этой ветки отслеживания. Таким образом, все задания слабо связаны и будут делать правильные действия независимо от того, что было создано на выходе, независимо от того, над чем работает эта работа вверх.
Если в дополнение к этому вы также помечаете свою сборку, ваше нисходящее задание может извлекать тег и повторно использовать его в качестве имени сборки, чтобы вы могли легко сопоставлять различные прогоны.
Это очень эффективно, если в конвейере есть шаги значительно различной длины - особенно, когда ваши шаги в нисходящем потоке занимают гораздо больше времени, чем ваши шаги по восходящему потоку, что в моем мире является нормой, поскольку нисходящие тесты включают в себя целый набор производительности и интеграции тесты...