Этот вопрос предназначен для получения отзывов о предлагаемой системе управления версиями для многомодульного Java-приложения, созданного с использованием Maven.
Мы разработали мульти-баночную систему (микроуслуги) с около 15 модулями / банками. Некоторые из них (5) являются библиотеками, используемыми другими модулями в системе, но не за ее пределами. Все модули хранятся в отдельных репозиториях git.
Мы выпустили первую версию и должны серьезно заняться ветвлением / версионированием.
Цель : свести к минимуму работу, связанную с управлением версиями (обновление номеров версий, объединение вручную из-за разной информации о версиях для каждой ветви и т. Д.).
Как : Модули идентифицируются по имени модуля и имени ветки git, а не по имени модуля и версии
Мы создаем наши собственные "файлы версий", сохраненные в виде ресурсов в каждом модуле. Они содержат время сборки, git commit-id, имя ветки, URL сборки и т. Д. Для самого модуля плюс включенные модули. Поэтому после развертывания нам не нужен номер версии Maven.
Примечание : Для библиотечных модулей вне системы мы используем стандартный подход как для внутренних, так и для внешних модулей. То есть. версионирование со строгим номером с использованием системы зависимостей Maven.
Система, которую я рассматриваю, заключается в
- всегда используйте номер версии
<branch-name>-SNAPSHOT
в файлах pom, плюс настройку Maven для постоянной загрузки последней версии SNAPSHOT (не только ежедневно, как это делается по умолчанию - ref. Что такое снимок Maven и почему мы это нужно? ).
- Используйте спецификацию (ref. Maven BOM [ведомость материалов] Зависимость ) для определения зависимостей.
Файл pom для модуля в этой системе будет похож на:
<project>
...
<version>${revision}</version>
<dependencies>
<dependency>
<groupId>mygroup</groupId>
<artifactId>bom</artifactId>
<version>${revision}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
<properties>
<revision>default_version</revision>
<properties>
</project>
Эта версия указывается при сборке, выполняя mvn, используя: mvn deploy -Drevision=<branch-name>-SNAPSHOT
(ref: https://maven.apache.org/maven-ci-friendly.html).
Как показывает pom, у нас (в основном) будет одна версия спецификации на имя ветви, используемое в системе, с именем версии <branch-name>-SNAPSHOT
- так же, как и сам модуль. Файл спецификации должен содержать зависимости, использующие явные версии, также для внутренних системных модулей.
Пример потоков:
- Простая функция ветвь. В ветви измените pom, чтобы ссылка на спецификацию ссылалась на родительскую ветвь - замените
${revision}
для ссылки на спецификацию. То есть. вам не нужна отдельная спецификация (пока ...)
- Простая ветвь функций для внутренней библиотеки. То же, что и в предыдущем случае, но вам, вероятно, следует создать ту же ветвь для модуля, использующего эту библиотеку, и ту же ветвь для спецификации, обеспечивающую связь двух модулей.
- Системный выпуск. Создайте ветку релиза на всех модулях (репозитории git). Включая модуль спецификации. Например:
release201810
. В файле спецификации в ветви release201810
убедитесь, что все упомянутые внутренние системные модули ссылаются на версию release201810-SNAPSHOT
.
- Разработка Parallell. Создайте пользовательскую ветвь для модулей по мере необходимости. Обновите пользовательскую спецификацию, поскольку модули разветвлены для этой разработки.
Это хорошая идея?