【问题标题】:Constructing a version number in a Jenkins, Spring Boot and Gradle environment在 Jenkins、Spring Boot 和 Gradle 环境中构建版本号
【发布时间】:2021-02-19 01:45:22
【问题描述】:

我有 Spring Boot Web 应用程序并想在我的应用程序中显示版本号。版本号应该类似于 v1.2.3#BUILD_NUMBER,其中 BUILD_NUMBER 是来自 Jenkins 的内部版本号。我怎样才能做到这一点?

【问题讨论】:

    标签: spring-boot jenkins gradle


    【解决方案1】:

    首先,让我们确保 Gradle 知道内部版本号。 Jenkins 通过环境变量使其可用。我们可以把它放在 Gradle 项目中普通的version 字段中:

    version = "1.0-" + (System.getenv("BUILD_NUMBER") ?: "SNAPSHOT")
    

    从这里我们必须将它放入您的应用程序可以读取的文件中。有两种很好的方法可以做到这一点,我通常同时使用这两种方法。

    首先,我们更新最终 jar 中的标准 MANIFEST.MF 文件:

    bootJar {
        manifest {
            attributes(
                    "Implementation-Title": project.name,
                    "Implementation-Version": project.version
            )
        }
    }
    

    默认情况下,Spring Boot 会在启动时打印一个横幅,它会读取这些属性并将它们打印出来。您可以自定义横幅,但在您这样做之前,它应该看起来像这样:

      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v2.3.5.RELEASE)
    
    2020-11-06 16:00:56.394  INFO 3144 --- [main] com.example.App : Starting App v1.0-SNAPSHOT on PF18RJAD with PID 3144 (C:\Work\Temp\buildinfo-example\app\build\libs\app-1.0-SNAPSHOT.jar started by bmv in C:\Work\Temp\buildinfo-example\app)
    2020-11-06 16:00:56.398  INFO 3144 --- [main] com.example.App : No active profile set, falling back to default profiles: default
    2020-11-06 16:00:57.181  INFO 3144 --- [main] com.example.App : Started App in 1.292 seconds (JVM running for 1.908)
    

    请注意“Starting App v1.0-SNAPSHOT”这一行,其中“SNAPSHOT”将替换为环境变量(如果存在)。

    但请注意,由于 MANIFEST.INF 仅作为 jar 的一部分创建,因此它不会在测试中或通过运行 bootRun 任务显示。你必须运行最终的“boot jar”(例如java -jar build/libs/app-1.0-SNAPSHOT.jar)。

    其次,您可以使用BuildInfo 任务。这使 Actuator 能够阅读有关构建的更多详细信息,并使您更容易以编程方式查询它们:

    springBoot {
      buildInfo()
    }
    

    这将在您的应用程序中生成一个文件META-INF/build-info.properties,其中包含版本、工件名称或自定义值等构建信息。您可以通过注入 BuildProperties 实例来查询它们:

    @Autowired
    BuildProperties buildProperties;
    

    使用它来获取有关构建的信息:

    public void greet() {
        System.out.println("Hello version: " + buildProperties.getVersion());
    }
    

    它应该输出:

    Hello version: 1.0-SNAPSHOT
    

    如果您使用 Actuator,它还会从构建属性文件中获取信息。

    【讨论】:

    • 不幸的是,我没有将 Gradle 配置为从 Jenkins 读取内部版本号。如果您也能举个例子,我将不胜感激。
    猜你喜欢
    • 2018-10-19
    • 1970-01-01
    • 2021-06-16
    • 2017-10-31
    • 2017-01-11
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 2019-07-03
    相关资源
    最近更新 更多