«1. Обзор

В этом руководстве мы собираемся показать, как внедрить информацию репозитория Git в созданное Maven приложение на основе Spring Boot.

Для этого воспользуемся maven-git-commit-id-plugin — удобным инструментом, созданным исключительно для этой цели.

2. Зависимости Maven

Давайте добавим плагин в раздел \u003cplugins\u003e нашего файла pom.xml нашего проекта:

<plugin>
    <groupId>pl.project13.maven</groupId>
    <artifactId>git-commit-id-plugin</artifactId>
    <version>2.2.1</version>
</plugin>

Вы можете найти последнюю версию здесь. Имейте в виду, что для этого плагина требуется версия Maven не ниже 3.1.1.

3. Конфигурация

Плагин имеет множество удобных флагов и атрибутов, расширяющих его функциональность. В этом разделе мы кратко опишем некоторые из них. Если вы хотите познакомиться со всеми из них, посетите страницу maven-git-commit-id-plugin, а если вы хотите сразу перейти к примеру, перейдите к разделу 4.

Следующие фрагменты содержат примеры атрибутов плагина. ; укажите их в разделе \u003cconfiguration\u003e\u003c/configuration\u003e в соответствии с вашими потребностями.

3.1. Отсутствует репозиторий

Вы можете настроить его для пропуска ошибок, если репозиторий Git не найден:

<failOnNoGitDirectory>false</failOnNoGitDirectory>

3.2. Местоположение репозитория Git

Если вы хотите указать собственное местоположение репозитория .git, используйте атрибут dotGitDirectory:

<dotGitDirectory>${project.basedir}/submodule_directory/.git</dotGitDirectory>

3.3. Выходной файл

Чтобы сгенерировать файл свойств с произвольным именем и/или каталогом, используйте следующий раздел:

<generateGitPropertiesFilename>
    ${project.build.outputDirectory}/filename.properties
</generateGitPropertiesFilename>

3.4. Многословие

Для более подробного логирования используйте:

<verbose>true</verbose>

3.5. Создание файла свойств

Вы можете отключить создание файла git.properties:

<generateGitPropertiesFile>false</generateGitPropertiesFile>

3.6. Префикс свойства

Если вы хотите указать собственный префикс свойства, используйте:

<prefix>git</prefix>

3.7. Только для родительского репозитория

При работе с проектом с подмодулями установка этого флага гарантирует, что плагин работает только для родительского репозитория:

<runOnlyOnce>true</runOnlyOnce>

3.8. Исключение свойств

Возможно, вы захотите исключить некоторые конфиденциальные данные, такие как информация о пользователе репозитория:

<excludeProperties>
    <excludeProperty>git.user.*</excludeProperty>
</excludeProperties>

3.9. Свойства Включение

Также возможно включение только указанных данных:

<includeOnlyProperties>    
    <includeOnlyProperty>git.commit.id</includeOnlyProperty>
</includeOnlyProperties>

4. Пример приложения

Давайте создадим пример контроллера REST, который будет возвращать основную информацию о нашем проекте.

Мы создадим пример приложения с помощью Spring Boot. Если вы не знаете, как настроить приложение Spring Boot, см. вводную статью: Настройка веб-приложения Spring Boot.

Наше приложение будет состоять из 2-х классов: Application и CommitIdController

4.1. Приложение

CommitIdApplication будет служить корнем нашего приложения:

@SpringBootApplication(scanBasePackages = { "com.baeldung.git" })
public class CommitIdApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(CommitIdApplication.class, args);
    }
 
    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        PropertySourcesPlaceholderConfigurer propsConfig 
          = new PropertySourcesPlaceholderConfigurer();
        propsConfig.setLocation(new ClassPathResource("git.properties"));
        propsConfig.setIgnoreResourceNotFound(true);
        propsConfig.setIgnoreUnresolvablePlaceholders(true);
        return propsConfig;
    }
}

Помимо настройки корня нашего приложения, мы создали bean-компонент PropertyPlaceHolderConfigurer, чтобы иметь доступ к файлу свойств, сгенерированному плагином.

Мы также установили некоторые флаги, чтобы приложение работало гладко, даже если Spring не смог разрешить файл git.properties.

4.2. Контроллер

@RestController
public class CommitInfoController {

    @Value("${git.commit.message.short}")
    private String commitMessage;

    @Value("${git.branch}")
    private String branch;

    @Value("${git.commit.id}")
    private String commitId;

    @RequestMapping("/commitId")
    public Map<String, String> getCommitId() {
        Map<String, String> result = new HashMap<>();
        result.put("Commit message",commitMessage);
        result.put("Commit branch", branch);
        result.put("Commit id", commitId);
        return result;
    }
}

Как видите, мы внедряем свойства Git в поля класса.

Чтобы увидеть все доступные свойства, обратитесь к файлу git.properties или странице автора на Github. Мы также создали простую конечную точку, которая на HTTP-запрос GET ответит JSON, содержащим введенные значения.

4.3. Maven Entry

Сначала мы настроим этапы выполнения, которые должен выполнять плагин, а также любые другие свойства конфигурации, которые мы считаем полезными:

<plugin>
    <groupId>pl.project13.maven</groupId>
    <artifactId>git-commit-id-plugin</artifactId>
    <version>2.2.1</version>
    <executions>
        <execution>
            <id>get-the-git-infos</id>
            <goals>
                <goal>revision</goal>
            </goals>
        </execution>
        <execution>
            <id>validate-the-git-infos</id>
            <goals>
                <goal>validateRevision</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <!-- ... -->
    </configuration>
</plugin>

Чтобы наш код работал правильно, нам нужно в итоге получим файл git.properties в нашем пути к классам. Для этого у нас есть два варианта.

Во-первых, оставить плагину возможность сгенерировать файл. Мы можем указать это, установив для свойства конфигурации generateGitPropertiesFile значение true:

<configuration>
    <generateGitPropertiesFile>true</generateGitPropertiesFile>
</configuration>

Второй вариант — включить файл git.properties в папку ресурсов самостоятельно. Мы можем включить только те записи, которые будем использовать в нашем проекте:

# git.properties
git.tags=${git.tags}
git.branch=${git.branch}
git.dirty=${git.dirty}
git.remote.origin.url=${git.remote.origin.url}
git.commit.id=${git.commit.id}
git.commit.id.abbrev=${git.commit.id.abbrev}
git.commit.id.describe=${git.commit.id.describe}
git.commit.id.describe-short=${git.commit.id.describe-short}
git.commit.user.name=${git.commit.user.name}
git.commit.user.email=${git.commit.user.email}
git.commit.message.full=${git.commit.message.full}
git.commit.message.short=${git.commit.message.short}
git.commit.time=${git.commit.time}
git.closest.tag.name=${git.closest.tag.name}
git.closest.tag.commit.count=${git.closest.tag.commit.count}
git.build.user.name=${git.build.user.name}
git.build.user.email=${git.build.user.email}
git.build.time=${git.build.time}
git.build.host=${git.build.host}
git.build.version=${git.build.version}

Maven заменит заполнители соответствующими значениями.

Примечание. Некоторые IDE не работают с этим подключаемым модулем и могут выдавать ошибку «circular placeholder reference» при начальной загрузке, когда мы определяем свойства, как мы делали выше.

«После загрузки и запроса localhost:8080/commitId вы можете увидеть файл JSON со структурой, подобной следующей:

{
    "Commit id":"7adb64f1800f8a84c35fef9e5d15c10ab8ecffa6",
    "Commit branch":"commit_id_plugin",
    "Commit message":"Merge branch 'master' into commit_id_plugin"
}

5. Интеграция с Spring Boot Actuator

Вы можете легко использовать плагин с Spring Actuator.

Как вы можете прочитать в документации, GitInfoContributor подберет файл git.properties, если он доступен. Таким образом, с конфигурацией плагина по умолчанию информация Git будет возвращена при вызове конечной точки /info:

{
  "git": {
    "branch": "commit_id_plugin",
    "commit": {
      "id": "7adb64f",
      "time": "2016-08-17T19:30:34+0200"
    }
  }
}

6. Заключение

В этом руководстве мы показали основы использования maven-git-commit-id-plugin и создали простое приложение Spring Boot, использующее свойства, сгенерированные плагином.

Представленная конфигурация не охватывает все доступные флаги и атрибуты, но охватывает все основы, необходимые для начала работы с этим плагином.

Вы можете найти примеры кода на Github.