Jenkins Build Pipeline с добавочными сборками Gradle
Возьмем этот базовый конвейер сборки (с задачами gradle):
- Компилировать / запускать юнит-тесты (чистая сборка)
- Интеграционные тесты (gradlegrationTest)
- Приемочные испытания (gradle acceptTest)
- Развернуть (gradle myCustomDeployTask)
Согласно книге Джеза Хамбла "Непрерывная доставка", вы должны создавать свои двоичные файлы только один раз. Таким образом, в приведенном выше теоретическом конвейере, на шаге 1 мы очищаем, компилируем и собираем WAR, на шаге 2 мы запускаем интеграционные тесты (используя скомпилированный код из шага 1), на шаге 3 мы запускаем приемочные тесты (используя скомпилированные код из шага 1), и на шаге 4 мы развернем WAR (который был построен на шаге 1). Все идет нормально.
Я пытаюсь реализовать этот конвейер в Дженкинс. Поскольку у каждого задания есть свое собственное рабочее пространство, шаги 2, 3 и 4 в конечном итоге перекомпилируют код и создают WAR, что нарушает мантру "Непрерывная доставка", заключающуюся в том, что вы строите свои двоичные файлы только один раз.
Чтобы бороться с этим, я использовал плагин Jenkins " Clone Workspace SCM", который архивирует рабочую область из первой сборки и будет источником рабочей области для сборок 2, 3 и 4. Однако gradle по-прежнему перекомпилирует код в каждом шаг, потому что он, очевидно, использует абсолютный путь к файлам, чтобы определить, нужно ли выполнить задачу. Поскольку плагин переместил файлы в новое рабочее пространство, абсолютный путь изменился, что заставляет Gradle думать, что ему нужно начинать с самого начала, а не выполнять инкрементную сборку.
Теперь мы можем делиться рабочими пространствами в Jenkins, но это также вызывает недовольство из-за возможности выполнения двух заданий в общем рабочем пространстве.
Так как же реализовать вышеуказанный конвейер, используя Jenkins и Gradle, придерживаясь при этом лучших практик Continuous Delivery, Jenkins и Gradle?
2 ответа
Сначала убедитесь, что более поздние цели (интеграция и т. Д.) Не зависят от компиляции. Затем опубликуйте файл войны, сгенерированный в первом задании, как артефакт Дженкинса. Затем используйте что-то вроде плагина копирования артефактов, чтобы скопировать файл войны в целевое рабочее пространство.
Я не пробовал, но вы можете попробовать добавить следующее в ваш проект:
build.onlyIf { ! Boolean.getBoolean('skip.build') }
Беги Gradle с -Dskip.build=true
аргумент и задачи сборки будут пропущены.
Взгляните на раздел " Пропуск задач" в документации по gradle.
Это похоже на ответ в этой сборке Gradle без тестовых вопросов.