Jenkins Build Pipeline с добавочными сборками Gradle

Возьмем этот базовый конвейер сборки (с задачами gradle):

  1. Компилировать / запускать юнит-тесты (чистая сборка)
  2. Интеграционные тесты (gradlegrationTest)
  3. Приемочные испытания (gradle acceptTest)
  4. Развернуть (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 без тестовых вопросов.

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