Maven и управление релизами

From JazzTeamWiki
Jump to: navigation, search

Про релизы и SNAPSHOT-ы

Maven позволяет управлять циклом разработки и сборки проекта. С помощью maven эти процессы стандартизируются для всех проектов.

SPANSHOT - это специальная версия проекта или модуля. Означает, что на данный момент в модуле находится самый новый код и ведутся постоянные изменения, например делается багфиксинг или доработка нового функционала. Если в проекте используется артефакт с обычной версией (например 2.0), то maven выполнит его сборку (либо загрузку с nexus) один раз и сохранит в локальном репозитории, потом будет загружать собранный (загруженный) в первый раз артефакт. Если модуль является SPAPSHOT-ом (версия 2.0-SNAPSHOT), то maven будет пересобирать его каждый раз заново вместо того, чтобы подтягивать из репозитория, либо каждый раз вытягивать из nexus вместо вытягивания из локального репозитория. Указывать версию как SNAPSHOT нужно, если на проекте ведутся работы и нам всегда нужна самая последняя версия.

Релиз - это какой-то объём функциональности, срез проекта в определённый момент времени и фиксирование этих изменений. Зачастую релизы поставляются заказчику и отдаются на тестирование. С помощью maven можно создавать релизы и управлять версиями автоматически.

Конфигурирование pom-файла

Все конфигурации выполняются в pom-файле родительского проекта.

1. Добавить путь к SCM (source control management, например SVN или GIT)

 <scm>
   <developerConnection>scm:svn:https://svn.myserver.com/path/to/repository</developerConnection>
   <url>https://svn.myserver.com/path/to/repository</url>
 </scm>

2. Добавить пути к nexus-репозиторию, куда будут паблишиться релизы

 <distributionManagement>
   <repository>
     <id>nexus</id>
     <name>jazzteam release repository</name>
     <url>http://svn.myserver.com/content/repositories/releases</url>
   </repository>
   <snapshotRepository>
     <id>nexus</id>
     <name>jazzteam snapshot repository</name>
     <url>http://svn.myserver.com/content/repositories/snapshots</url>
   </snapshotRepository>
 </distributionManagement>

3. Указать версию maven-release-plugin. У меня по умолчанию бралась 2.0, в которой был баг.

 <build>
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-release-plugin</artifactId>
       <version>2.3.1</version>
     </plugin>
   </plugins>
 </build>

Maven и управление релизами

Создание релиза состоит из двух стадий:

Подготовка релиза

1. У нас есть многомодульный проект, версия на данный момент 1.0-SNAPSHOT

2. Мы комитаем весь исходный код и вызываем

 mvn release:prepare

3. Maven переименовывает все версии на 1.0, делает сборку проекта, запускаетunit-тесты

4. Далее maven создаёт тег в системе контроля версий (svn, git, ...), и сохраняет под этим тегом слепок нашего проекта (версия 1.0)

5. Далее maven инкрементирует версии (в проекте и подпроектах) на 1.1-SNAPSHOT и комитает изменённые pom.xml файлы

Создание релиза

После подготовки релиза, в проекте появляются файлы бэкапов pom.xml и файл release.properties. Release plugin использует эти файлы для выполнения релиза.

6. Вызываем

 mvn release:perform

7. maven достаёт по тегу последний релиз (в нашем случае был 1.0), выполняет сборку и паблишит артефакты на nexus

После этого чистятся все бэкапы pom-файлов и файл release.properties

Подходы к работе с reusable-компонентом

Повторно-используемые компоненты позволяют шарить общий код между проектами, тем самым ускоряя разработку. Для работы с такими компонентами мы используем maven + nexus (internal maven-репозиторий).

Как подключить готовый компонент к проекту

1. В файле maven/conf/settings.xml настроить использование внутреннего nexus-репозитория

 <servers>
   <server>
     <id>nexus</id> 
     <username>login</username> 
     <password>password</password> 
   </server>
 </servers>
 <mirrors>
   <mirror>
   <id>nexus</id> 
   <mirrorOf>*</mirrorOf> 
   <url>http://mynexusurl.com/nexus/content/groups/public/</url> 
   </mirror>
 </mirrors>

2. Подключить компонент как maven-зависимость

 <dependency>
   <groupId>org.jazzteam</groupId> 
   <artifactId>utils</artifactId> 
   <version>1.0</version> 
 </dependency>


Как создать компонент для повторного использования в других проектах

1. Создать maven-проект, положить его в репозиторий (svn, git, ...)

2. Добавить к проекту конфигурацию для работы с релизами (см. раздел "Конфигурирование pom-файла")

3. Выполнить релиз, после этого проект будет задеплоен на nexus и доступен для использования в других проектах (см. раздел "Maven и управление релизами")


Что делать, если нужно изменить компонент (добавить код, исправить баг...)

1. Чекаутаем компонент из репозитория

2. Делаем изменения, вносим код, рефакторим, ...

3. Выполняем релиз компонента (см. раздел "Maven и управление релизами"), убеждаемся что зарелизанная версия отличается от предыдущей (к примеру, до модификации была версия 1.2-SNAPSHOT, значит старая версия проекта будет 1.1, версия, которая пойдёт в релиз будет 1.2)

4. Проекты, которые использовали компонент до изменений будут продолжать использовать версию 1.1. Чтобы начать использовать наши изменения нужно поменять версию этого в зависимостях на 1.2.

 <dependency>
   <groupId>org.jazzteam</groupId> 
   <artifactId>utils</artifactId> 
   <version>1.2</version> 
 </dependency>

Password encription

Чтобы не хранить пароли в конфигурации в их чистом видео используют md5 hash.

Зная пароль от maven удаленного репозитория мы можем сгенерировать hash.

для начала сгенерируем master-password. <password> - это базовый пароль, введите любой пароль.

mvn --encrypt-master-password <password>

Создайте файл

~/.m2/settings-security.xml

заполните его

<?xml version="1.0" encoding="UTF-8"?>	  
<settingsSecurity>
  <master>{rNKR4UvVllQHZdE/gp7wlKv85wxDoi9+WFZaTRpHw9U=}</master>
</settingsSecurity>

Далее сгенерируем хэш для нашего пароля.

mvn --encrypt-password <realPassword>

Вставим его в ~/.m2/settings.xml

<server>
 <id>nexus</id>
 <username>user</username>
 <password>{GAsdfsdfRWd9dgfdgfdfgdfgdfg0Lxj/HYhjBFlXLqYrM6YdU3j24=}</password>
</server>
  • Если вы администратор, и вам нужно передать готовый хэш пользователю.

Вам нужно проделать вышесказанные пункты используя пароль пользователя, и передать ему файл

~/.m2/settings-security.xml

и хэш пароля из файла

~/.m2/settings.xml

Ссылки

Подробнее можно почитать здесь:

http://habrahabr.ru/post/77382/

http://habrahabr.ru/post/130936/

http://jlorenzen.blogspot.com/2007/09/how-to-effectively-use-snapshot.html

http://jlorenzen.blogspot.com/2007/09/how-to-create-release-using-maven2.html

http://maven.apache.org/scm/plugins/usage.html

http://www.apache-maven.ru/