Как непрерывно создавать и развертывать функциональные ветви с Maven?

Моя команда использует ветви функций для реализации новых функций и постоянно развертывает сборки снимков в удаленном репо для использования нашими пользователями. Таким образом, "развернуть" на самом деле означает только "распространение в удаленный репозиторий Maven". В настоящее время мы выполняем только непрерывные сборки интеграции для основной ветви, а не ветви функций по следующей причине: мы используем Maven для создания наших проектов и распространения JavaDoc и источников вместе с JAR.

Теперь я планировал добавить классификатор в каждую сборку веток объектов и ожидал, что он будет использоваться при создании и развертывании таких артефактов:

  • Отрасль: магистр
  • Классификатор: нет
  • Артефакты: foo-${version}.jar, foo-${version}-sources.jar, foo-${version}-javadoc.jar

  • Филиал: Feature-X

  • Классификатор: моя особенность
  • Артефакты: foo-${version}-feature.jar, foo-${version}-sources-feature.jar, foo-${version}-javadoc-feature.jar

Меня не волнует точное наименование артефакта, мне просто нужны отдельные артефакты main, source и JavaDoc для ветви функций. Оказывается, ни плагин JavaDoc, ни плагин исходного кода не учитывают сконфигурированный классификатор и, таким образом, эффективно перезаписывают артефакты, созданные для моей основной сборки.

Я действительно не хочу менять artifactI d, хотя это, вероятно, решит проблему. Как вы подходите к ветвям функций и непрерывной интеграции с Maven?

4 ответа

Решение

Я бы предложил добавить квалификатор ветки в компонент версии, так как он больше связан с этой частью. Это также позволяет вашим снимкам зависеть от этих версий вместе с основной веткой.

Я бы предложил использовать соответствующую версию, которая представляет ветку, а также версию вещи, такие как:

1.0.0-SNAPSHOT для мастера

а также

1.0.0-F1-SNAPSHOT для функции F1

и т.п.

Это также указывает на то, из какой версии 1.0.0 была сделана ветка функций.

Использование номера версии для хранения названия ветви, как предлагают другие, - быстрый выигрыш, но приводит к проблемам, если вы используете диапазоны версий. Номер версии не предназначен для такого использования. Мы используем их в процессе непрерывной интеграции, чтобы интеграционные тесты зависели от проверенного артефакта:

[1.8-SNAPSHOT,1.9-SNAPSHOT)

Часть квалификатора внутри номера версии обозначает различные этапы добавления одной и той же базы кода:

1.8-alpha1-SNAPSHOT
1.8-alpha1-SNAPSHOT
1.8-beta1-SNAPSHOT

Вот почему вышеприведенный диапазон версий захватит вышеизложенное, и Maven упорядочит их в следующем порядке:

1.8-SNAPSHOT
1.8-alpha1-SNAPSHOT
1.8-alpha1-SNAPSHOT
1.8-beta1-SNAPSHOT

Любой артефакт, содержащий имя ветви объекта в номере версии (1.8-featureA-SNAPSHOT) будет заказан новее, чем снимки без классификатора. Но функциональная ветвь - это "другая" кодовая база, а не более новое представление той же кодовой базы. Для нашего сценария интеграционных испытаний это привело к бесполезным сбоям тестирования. Функциональная ветвь еще не была готова для тестирования интеграционными тестами.

Теперь мы следуем этому правилу: если вам все равно нужно что-то изменить, почему бы не идентификатор артефакта? Мы меняем идентификатор артефакта для ветвей функций, и он работает просто отлично.

Вместо того, чтобы изменять maven координаты артефакта, вы можете использовать maven-branch-extension, чтобы эффективно создать отдельное пространство имен SNAPSHOT для каждой из ветвей объекта. Цитата со страницы проекта:

Вместо изменения номера версии в ветви функций мы меняем репозиторий. Каждая функция развертывается в подкаталоге на основе их имени ветви в удаленном репозитории, который предназначен только для ветвей функций. Нет риска перезаписи артефактов. Номера версий не меняются. Разветвление и слияние с Git остается простым (как и должно было быть!).

Расширение получает текущую ветку Git и разрешает свойство в URL-адресе хранилища, чтобы артефакты можно было правильно хранить и извлекать. Он также управляет кэшированием и извлечением артефактов в локальный репозиторий, так что артефакты берутся из репозитория ветвей объектов, если они существуют, при работе из ветви объектов.

Прелесть этого в том, что внешние пользователи зависимостей SNAPSHOT полностью изолированы от внутренней работы над ветками тем.