- PVSM.RU - https://www.pvsm.ru -

Логирование Git revision в Java с помощью Maven

Наша компания перешла с mercurial [1] на Git [2], после чего мне пришлось разобраться как у нас до этого выводилась в лог информация о развертывающейся ветки и переписать это под git. Возможно, кто-то в будущем столкнется с такой же проблемой, так как Git набирает популярность и многие компании мигрируют на него.

Моя цель показать Вам, как с помощью нескольких maven plugin-ов можно сделать вывод в лог Вашей java программы названия ветки и хэш коммита из Git. Это полезно при анализе логов, если у Вас давно не было деплоя и история Вашего инструмента CI затерлась.

Начало

В моем примере я буду использовать: java, maven, spring-core, git. Ссылка на пример [3]. Предположим, что у нас уже имеется проект, написанный на Java и для сборки используется Maven, также он хранится на GitHub [4].

image

Maven SCM

Для того чтобы maven мог получить доступ к Вашему репозиторию, нужно указать ему методы и пути подключения. Для этого нужно использовать maven scm [5]:

...
	</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 и вариантах получения доступа к репозиторию можно прочитать здесь [5] и здесь [6].

Получение информации о текущей ветки git

Далее нам потребуется добавить maven plugin buildnumber-maven-plugin [7], который будет формировать 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 обновить Вашу текущую ревизию

Больше информации об этом [7].

Работа с properties

После этого вы можете смело добавлять в Ваш application.properties файл следующие переменные: ${buildNumber} и ${scmBranch}

Например я в application.properties добавил следующие параметры:

branch.name=${scmBranch}
commit.hash=${buildNumber}
application.version=${project.version}

Сборка проекта

Давайте теперь соберем наш проект командой:

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:

image

Содержимое:

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 [8].

<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

Спасибо. Надеюсь, статья окажется полезна.

Автор: scorpioa

Источник [9]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/maven/191045

Ссылки в тексте:

[1] mercurial: https://ru.wikipedia.org/wiki/Mercurial

[2] Git: https://ru.wikipedia.org/wiki/Git

[3] пример: https://github.com/scorpioa/gitrevision

[4] GitHub: https://github.com

[5] maven scm: https://maven.apache.org/scm/maven-scm-plugin/usage.html

[6] здесь: https://maven.apache.org/scm/maven-scm-plugin/

[7] buildnumber-maven-plugin: http://www.mojohaus.org/buildnumber-maven-plugin/usage.html

[8] maven-jar-plugin: https://maven.apache.org/plugins/maven-jar-plugin/

[9] Источник: https://habrahabr.ru/post/310738/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox