将Git信息注入Spring

2023/05/11

1. 概述

在本教程中,我们将演示如何将Git仓库信息注入到Maven构建的基于Spring Boot的应用程序中。

为此,我们将使用maven-git-commit-id-plugin-一个专为此目的而创建的便捷工具。

2. Maven依赖

在项目的pom.xml文件的<plugins>部分添加一个插件:

<plugin>
    <groupId>pl.project13.maven</groupId>
    <artifactId>git-commit-id-plugin</artifactId>
    <version>2.2.1</version>
</plugin>
你可以在[此处](https://search.maven.org/classic/#search gav 1 g%3A”pl.project13.maven” AND a%3A”git-commit-id-plugin”)找到最新版本。请记住,此插件至少需要3.1.1版本的Maven

请注意,此插件在不同的仓库坐标处有一个更高版本的重新定位版本(5.x或更新版本),但是,该版本需要Java 11。由于我们将使用具有Java 8基线的Spring Boot 2.x开发示例应用程序,因此我们需要使用旧版本的插件。这使我们能够保持Spring Boot和git-commit-id-plugin之间的兼容性。

3. 配置

该插件有许多方便的标志和属性,可以扩展其功能。在本节中,我们将简要介绍其中的一些,如果你想了解所有这些,请访问maven-git-commit-id-plugin的页面,如果你想直接看示例,请转到第4节。

以下代码片段包含插件属性的示例;根据你的需要在<configuration></configuration>部分中指定它们。

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 Web应用程序

我们的应用程序将包含2个类:CommitIdApplication和CommitIdController

4.1 CommitIdApplication

CommitIdApplication将作为我们应用程序的主类:

@SpringBootApplication(scanBasePackages = {"cn.tuyucheng.taketoday.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;
    }
}

除了配置应用程序的主方法之外,我们还创建了PropertyPlaceHolderConfigurer bean,以便我们能够访问插件生成的属性文件。

我们还设置了一些标志,这样即使Spring无法解析git.properties文件,应用程序也能顺利运行。

4.2 CommitIdController

@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入口

我们首先设置插件要执行的执行步骤,以及我们认为有用的任何其他配置属性:

<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>

第二种选择是我们自己在resources文件夹中包含一个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不能很好地与这个插件配合使用,并且当我们像上面那样定义属性时,可能会在引导程序上抛出一个“循环占位符引用”错误。

启动并请求localhost:8080/commitId后,你可以看到一个结构类似于以下内容的JSON文件:

{
    "Commit id": "1a509ef1dce3effa7fbd87446308be279c6a5e6f",
    "Commit branch": "master",
    "Commit message": "✨ 使用Maven运行Spring Boot应用程序 vs 可执行的War/Jar"
}

5. 与Spring Boot Actuator集成

你还可以简单地将插件与Spring Actuator一起使用。

正如你在文档中看到的那样,GitInfoContributor会选择可用的git.properties文件。因此,使用默认插件配置,调用/info端点时将返回Git信息:

{
    "git": {
        "branch": "master",
        "commit": {
            "id": "7adb64f",
            "time": "2022-12-20T14:30:34+0200"
        }
    }
}

6. 总结

在本教程中,我们演示了使用maven-git-commit-id-plugin的基础知识,并创建了一个简单的Spring Boot应用程序,该程序使用了插件生成的属性。提供的配置并未涵盖所有可用的标志和属性,但它涵盖了开始使用此插件所需的所有基础知识。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章