Я использую плагин Version Maven Plugin use-latest-versions функциональность для обновления groupID = com.example * версий внутренней зависимости до Последняя версия. Это выполняется как часть нашей системы CI с использованием Jenkins.
Когда разработчики начинают работать над новой функцией, они разветвляют код, работают над ветвью, и когда новая функция реализуется (или частично), код объединяется обратно в основную часть (обычно несколько раз в неделю).
Обновление версии филиалов:
- Используя "снимок" профиля. См. Ниже конфигурацию профиля моментального снимка pom.xml и конфигурацию репозитория Artifactory.
- Команда, используемая для обновления версии:
mvn -P snapshot -B versions:use-latest-versions versions:update-properties -Dincludes=com.example* -DexcludeReactor=false -DallowSnapshots=true ...
Обновление версии внешней линии:
- Использование «производственного» профиля. См. Ниже конфигурацию производственного профиля pom.xml и конфигурацию Artifactory.
- Команда, используемая для обновления версии:
mvn -P production -B versions:use-latest-versions versions:update-properties -Dincludes=com.example* -DexcludeReactor=false ...
Иногда сборки веток обновляют версии зависимостей com.example * до версии "...- SNAPSHOT" (это нормально, потому что репозиторий libs-snapshot Artifactory используется в качестве репозитория зависимостей, который может иметь версии зависимостей -SNAPSHOT). Эти обновления версий возвращаются в систему управления версиями (svn).
Когда код (включая изменения обновления версии pom.xml) объединяется обратно из ветвей в магистраль и выполняется сборка магистрали, все версии внутренних зависимостей com.example * должны быть изменены / обновлены до последних версий выпуска. Но по какой-то причине, когда в версиях зависимостей есть "-SNAPSHOT", версии: use-latest-versions не изменяют / не обновляют версию до последней версии (без -SNAPSHOT).
Пример:
Артифакторные репозитории имеют текущие версии:
- libs-snapshot имеет "com.example: myLib: 1.1.10-SNAPSHOT", "com.example: myLib: 1.1.11-SNAPSHOT"
- libs-release содержит com.example: myLib: 1.1.9, com.example: myLib: 1.1.12.
Создание веток myApp получит версии зависимостей из libs-snapshot и обновит версию com.example: myLib до 1.1.11-SNAPSHOT и вернет это обновление обратно в SVN.
...
<dependency>
<groupId>com.example</groupId>
<artifactId>myLib</artifactId>
<version>1.1.11-SNAPSHOT</version>
</dependency>
...
Слияние кода обратно в магистраль, включая указанные выше изменения версии зависимостей, и запуск сборки магистрали (включая обновление версии) mvn -P production -B versions:use-latest-versions...
не изменяет версию com.example: myLib на 1.1.12.
Конфигурация Artifactory:
- Локальные репозитории: libs-snapshot-local (репозиторий разработки); libs-release-local (репозиторий релизов)
- Виртуальные репозитории: libs-snapshot (включая libs-snapshot-local, libs-release-local и удаленные репозитории); libs-release (включает libs-release-local и удаленные репозитории)
конфигурация pom.xml:
...
<profiles>
<profile>
<id>snapshot</id>
<distributionManagement>
<repository>
<id>libs-snapshot-local</id>
<name>Internal Applications Snapshot Repository</name>
<url>http://example.com/artifactory/libs-snapshot-local</url>
</repository>
</distributionManagement>
<repositories>
<repository>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
<id>libs-snapshot</id>
<name>libs-snapshot</name>
<url>http://example.com/artifactory/libs-snapshot</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
</repository>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>libs-release</id>
<name>libs-release</name>
<url>http://example.com/artifactory/libs-release</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
</repository>
</repositories>
<build>
...
</build>
</profile>
<profile>
<id>production</id>
<distributionManagement>
<repository>
<id>libs-release-local</id>
<name>Internal Applications Snapshot Repository</name>
<!-- Artifacts are promoted to libs-release-local not deployed directly -->
<url>http://example.com/artifactory/libs-snapshot-local</url>
</repository>
</distributionManagement>
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>libs-release</id>
<name>libs-release</name>
<url>http://example.com/artifactory/libs-release</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
</repository>
</repositories>
<build>
...
</build>
</profile>
</profiles>
...