Как непрерывно создавать и развертывать функциональные ветви с 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 полностью изолированы от внутренней работы над ветками тем.