Наша компания перешла с mercurial на Git, после чего мне пришлось разобраться как у нас до этого выводилась в лог информация о развертывающейся ветки и переписать это под git. Возможно, кто-то в будущем столкнется с такой же проблемой, так как Git набирает популярность и многие компании мигрируют на него.
Моя цель показать Вам, как с помощью нескольких maven plugin-ов можно сделать вывод в лог Вашей java программы названия ветки и хэш коммита из Git. Это полезно при анализе логов, если у Вас давно не было деплоя и история Вашего инструмента CI затерлась.
В моем примере я буду использовать: java, maven, spring-core, git. Ссылка на пример. Предположим, что у нас уже имеется проект, написанный на Java и для сборки используется Maven, также он хранится на GitHub.

Для того чтобы maven мог получить доступ к Вашему репозиторию, нужно указать ему методы и пути подключения. Для этого нужно использовать maven scm:
Ссылку для доступа формируется на веб-странице Git-а Вашего проекта в разделе Quick setup. Подробнее об использовании scm и вариантах получения доступа к репозиторию можно прочитать здесь и здесь.
Далее нам потребуется добавить maven plugin buildnumber-maven-plugin, который будет формировать buildNumber — хэш коммита и scmBranch — название ветки.
Формирование buildNumber и scmBranch происходит на этапе validate, который происходит после clean в Maven.
Параметры:
Больше информации об этом.
После этого вы можете смело добавлять в Ваш application.properties файл следующие переменные: ${buildNumber} и ${scmBranch}
Например я в application.properties добавил следующие параметры:
Чтобы наш application.properties был найдет, в тэг build нужно добавить:
Давайте теперь соберем наш проект командой:
Если вы посмотрите лог, который Вам вывел maven при сборке, то заметите что он выполняет команду git для получения искомых данных:
Также Вы можете проверить корректность полученных данных в папке target/classes файл application.properties:

Содержимое:
Для получения свойств в любом классе, с которым работает spring используется аннотация @Value.
Пример:
Пример класса с main методом:
Если мы запустим наше программу, то получим:
Хэш нашего коммита слишком длинный, чтобы его урезать нужно указать в buildnumber-maven-plugin максимальное количество символов, которые мы хотим вывести:
Есть возможность добавить эти данные в MANIFEST.MF. Для этого нам необходимо подключить еще один maven plugin: maven-jar-plugin.
После сборки нашего проекта мы сможем увидеть в MANIFEST.MF:
Спасибо. Надеюсь, статья окажется полезна.
Моя цель показать Вам, как с помощью нескольких maven plugin-ов можно сделать вывод в лог Вашей java программы названия ветки и хэш коммита из Git. Это полезно при анализе логов, если у Вас давно не было деплоя и история Вашего инструмента CI затерлась.
Начало
В моем примере я буду использовать: java, maven, spring-core, git. Ссылка на пример. Предположим, что у нас уже имеется проект, написанный на Java и для сборки используется Maven, также он хранится на GitHub.

Maven SCM
Для того чтобы maven мог получить доступ к Вашему репозиторию, нужно указать ему методы и пути подключения. Для этого нужно использовать maven scm:
... </dependencies> <scm> <connection>scm:git:https://github.com/<your_username>/<your_projectname>.git</connection> <developerConnection>scm:git:https://github.com/<your_username>/<your_projectname>.git</developerConnection> <tag>HEAD</tag> <url>https://github.com/<your_username>/<your_projectname>.git</url> </scm> <build> ...
Ссылку для доступа формируется на веб-странице Git-а Вашего проекта в разделе Quick setup. Подробнее об использовании scm и вариантах получения доступа к репозиторию можно прочитать здесь и здесь.
Получение информации о текущей ветки git
Далее нам потребуется добавить maven plugin buildnumber-maven-plugin, который будет формировать buildNumber — хэш коммита и scmBranch — название ветки.
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>buildnumber-maven-plugin</artifactId> <version>1.4</version> <executions> <execution> <phase>validate</phase> <goals> <goal>create</goal> </goals> </execution> </executions> <configuration> <doCheck>false</doCheck> <doUpdate>false</doUpdate> </configuration> </plugin>
Формирование buildNumber и scmBranch происходит на этапе validate, который происходит после clean в Maven.
Параметры:
- doCheck — если true, то проект не скомпилируется пока в нем есть локальные изменения
- doUpdate — позволяет Maven обновить Вашу текущую ревизию
Больше информации об этом.
Работа с properties
После этого вы можете смело добавлять в Ваш application.properties файл следующие переменные: ${buildNumber} и ${scmBranch}
Например я в application.properties добавил следующие параметры:
branch.name=${scmBranch} commit.hash=${buildNumber} application.version=${project.version}
Чтобы наш application.properties был найдет, в тэг build нужно добавить:
<resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources>
Сборка проекта
Давайте теперь соберем наш проект командой:
mvn clean install -DskipTests
Если вы посмотрите лог, который Вам вывел maven при сборке, то заметите что он выполняет команду git для получения искомых данных:
[INFO] --- buildnumber-maven-plugin:1.4:create (default) @ GitRevision --- [INFO] Executing: /bin/sh -c cd '/home/<user>/Development/GitRevision' && 'git' 'rev-parse' '--verify' 'HEAD' [INFO] Working directory: /home/<user>/Development/GitRevision [INFO] Storing buildNumber: 47c0d1df153b8610392d51d1a7fa0b7b39716e09 at timestamp: 1474375934082 [INFO] Storing buildScmBranch: master
Также Вы можете проверить корректность полученных данных в папке target/classes файл application.properties:

Содержимое:
branch.name=master commit.hash=47c0d1df153b8610392d51d1a7fa0b7b39716e09 application.version=0.0.1-SNAPSHOT
Добавление в лог
Для получения свойств в любом классе, с которым работает spring используется аннотация @Value.
Пример:
public class LoggerExampleImpl implements LoggerExample { private static final Logger log = LoggerFactory.getLogger(LoggerExampleImpl.class); @Value("${branch.name}") private String branchName; @Value("${commit.hash}") private String commitHash; @Value("${application.version}") private String version; public void printLog() { log.info("Project version: {}, git branch: {}, commit hash: {}", version, branchName, commitHash); } }
Пример класса с main методом:
public class GitRevisionApplication { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); LoggerExample loggerExample = context.getBean(LoggerExampleImpl.class); loggerExample.printLog(); } }
Если мы запустим наше программу, то получим:
2016-09-20 17:06:07 INFO [main] ClassPathXmlApplicationContext:581 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@66cd51c3: startup date [Tue Sep 20 17:06:07 EEST 2016]; root of context hierarchy 2016-09-20 17:06:07 INFO [main] XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [spring.xml] 2016-09-20 17:06:07 INFO [main] PropertyPlaceholderConfigurer:172 - Loading properties file from URL [file:/home/rado/Development/GitRevision/target/classes/application.properties] 2016-09-20 17:06:08 INFO [main] LoggerExampleImpl:25 - Project version: 0.0.1-SNAPSHOT, git branch: master, commit hash: 52c05227fb27271314d80d39b5026193ff310f04
Сокращение хэша
Хэш нашего коммита слишком длинный, чтобы его урезать нужно указать в buildnumber-maven-plugin максимальное количество символов, которые мы хотим вывести:
<configuration> <shortRevisionLength>5</shortRevisionLength> </configuration>
Расширить git данными MANIFEST.MF
Есть возможность добавить эти данные в MANIFEST.MF. Для этого нам необходимо подключить еще один maven plugin: maven-jar-plugin.
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.3.1</version> <configuration> <archive> <manifest> <addDefaultImplementationEntries>true</addDefaultImplementationEntries> <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries> </manifest> <manifestEntries> <Implementation-Version>${project.version}-${buildNumber}</Implementation-Version> <Implementation-Build>${scmBranch}</Implementation-Build> <Main-Class>com.habrahabr.example.GitRevisionApplication</Main-Class> </manifestEntries> </archive> </configuration> </plugin>
После сборки нашего проекта мы сможем увидеть в MANIFEST.MF:
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven Built-By: rado Build-Jdk: 1.8.0_102 Specification-Title: GitRevision Specification-Version: 0.0.1-SNAPSHOT Implementation-Title: GitRevision Implementation-Vendor-Id: com.habrahabr.example Implementation-Build: master Implementation-Version: 0.0.1-SNAPSHOT-47c0d1df153b8610392d51d1a7fa0b7 b39716e09 Main-Class: com.habrahabr.example.GitRevisionApplication
Спасибо. Надеюсь, статья окажется полезна.
