13 февр. 2012 г.

Maven и Mercurial. Версия с точностью до changeset'а

Захотелось для Maven проекта, размещенного в разных местах и с разными билдами, знать точную версию в виде changeset'a из репозитория Mercurial.

Ниже быстрое, простое (без scm плагина) и не слишком гибкое решение в виде кусков pom.xml.

<build>
    ...
    <plugins>
        ...
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>buildnumber-maven-plugin</artifactId>
            <version>1.0</version>
            <configuration>
                <doCheck>true</doCheck>
                <doUpdate>false</doUpdate>
                <format>At {0,date,dd-MM-yyyy HH:mm:ss} rev {1} was built.</format>
                <items>
                    <item>timestamp</item>
                    <item>${changeSet}</item>
                </items>
            </configuration>
            <executions>
                <execution>
                    <phase>validate</phase>
                    <goals>
                        <goal>hgchangeset</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        ...
    </plugins>
    ...
</build>

По порядку:

  1. Подключили плагин buildnumber-maven-plugin
  2. Опция doCheck нужна для проверки на наличие локальных незафиксированных изменений в проекте. Мы же хотим, чтобы изменение версии было жестко привязано к коммиту.
  3. Как я понял, doUpdate нужен для SVN, чтобы при сборке проекта у нас локально были самые свежие изменения (в документации описано плохо). По-моему это вообще имеет смысл только для централизованной VCS, так что отключаем этот пункт.
  4. Поле format отвечает за формат переменной ${buildNumber}, в которую и записывается версия. 0-ое поле имеет специальный формат для даты и ему передается специальный item, возвращающий время на момент сборки; вместо 1-го поля подставляется переменная ${changeSet}, которая появляется в результате работы цели hgchangeset. Также hgchangeset создает переменную changeSetDate с датой changeset'а.

Теперь в переменной ${buildNumber} у нас имеется готовая версия, которую нужно куда-нибудь положить для дальнейшего употребления в приложении. Логичным местом для этого является манифест архива. В моем случае это был .war. Соответственно, настройка war-плагина:

<build>
    ...
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1.1</version>
            <configuration>
                <archive>
                    <manifest>
                        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                    </manifest>
                    <manifestEntries>
                        <Implementation-Build>${changeSet} (@${changeSetDate})</Implementation-Build>
                    </manifestEntries>
                </archive>
            </configuration>
            ...
        </plugin>
        ...
    </plugins>
    ...
</build>

С такими настройками в каталоге META-INF появляется файл MANIFEST.MF примерно следующего содержания:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: USERNAME
Build-Jdk: 1.7.0_147-icedtea
Implementation-Title: PROJECT_TITLE
Implementation-Version: 1.0
Implementation-Vendor-Id: com.EXAMPLE
Implementation-Build: c6603b09df8b (@"2012-02-07 01:58 +0400")

Комментариев нет :

Отправить комментарий