Я использую Maven как инструмент для сборки и Jenkins в качестве моего сервера сборки. Я пытаюсь упростить разработку и создание.
У меня есть следующее:
Глобальный pom
<project>
<!-- ... -->
<artifactId>global-pom</artifactId>
<!-- ... -->
</project>
Библиотеки pom (parent pom is Global), у этого есть загрузка общих библиотек
<project>
<!-- ... -->
<version>2.0-SNAPSHOT</version>
<artifactId>libraries-pom</artifactId>
<parent>
<!-- ... -->
<artifactId>global-pom</artifactId>
<version>2.0-SNAPSHOT</version>
</parent>
<properties>
<libraries.version>2.0-SNAPSHOT</libraries.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<!-- ... -->
<artifactId>library-one</artifactId>
<version>${libraries.version}</version>
</dependency>
<dependency>
<!-- ... -->
<artifactId>library-two</artifactId>
<version>${libraries.version}</version>
</dependency>
<!-- ... -->
</dependencies>
</dependencyManagement>
<modules>
<module>library-one</module>
<module>library-two</module>
<!-- ... -->
</modules>
</project>
Общая библиотека (родительский pom - это библиотеки) pom будет выглядеть так:
<project>
<!-- ... -->
<version>2.0-SNAPSHOT</version>
<artifactId>library-one</artifactId>
<parent>
<!-- ... -->
<artifactId>libraries-pom</artifactId>
<version>2.0-SNAPSHOT</version>
</parent>
<!-- ... -->
</project>
Затем служба pom (parent pom is Libraries) может выглядеть так:
<project>
<!-- ... -->
<version>1.0-SNAPSHOT</version>
<artifactId>service-one</artifactId>
<parent>
<!-- ... -->
<artifactId>libraries-pom</artifactId>
<version>2.0-SNAPSHOT</version>
</parent>
<!-- ... -->
</project>
Теперь все хорошо и хорошо, когда я развиваюсь локально. Я могу иметь все эти poms в моем проекте Intellij, и если я что-то изменил в одной из библиотек, которые будут использоваться в одном из проектов, тогда, когда я буду строить и запускать локально, он знает, как построить библиотеку в первую очередь и т. Д...
Всякий раз, когда что-то проверяется, версия SNAPSHOT автоматически строится на Дженкинсе.
Когда я прихожу к действительно выпуску, я не хочу использовать версии SNAPSHOT, я хочу использовать "реальные" версии, и мне интересно, как лучше всего управлять этим, чтобы не влиять на разработку или выпуски.
У кого-нибудь есть идеи? В идеале, когда я хочу выпустить, я хотел бы перейти к моему серверу сборки и щелкнуть по нему, и он автоматически сортирует все для меня - возможно ли это?
Вам нужно будет использовать плагин выпуска Maven для выполнения автоматических выпусков всех ваших артефактов, выдав некоторые командные строки Maven в пакетном режиме.
Для этого включите следующую конфигурацию в родительский pom:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<autoVersionSubmodules>true</autoVersionSubmodules>
<tagNameFormat>v@{project.version}</tagNameFormat>
<goals>deploy</goals>
</configuration>
</plugin>
Чтобы сделать выпуск, вам нужно выполнить два шага. Первый mvn -B release:prepare
и mvn -B release:perform
.
Запустив Maven в пакетном режиме (-B), эти шаги автоматически сделают выпуск, тег, развернуть в удаленный репозиторий и нажать изменения в вашей системе управления версиями (при условии git), которые должны быть указаны в pom.
Однако, чтобы проверить, выполняются ли какие-либо действия, я бы сначала их запускал локально в интерактивном режиме (без -B) и включал в себя некоторую дополнительную конфигурацию для плагина:
<localCheckout>true</localCheckout>
<pushChanges>false</pushChanges>
Это предотвратит нажатие на git. Если с выпуском что-то не так, вы можете сделать mvn release:rollback
и очистить репозиторий git локально, а затем зафиксировать конфигурацию плагина выпуска.
Чтобы запустить это в Jenkins, вам нужно создать новое задание, которое будет запускать и prepare
и perform
команды в пакетном режиме.