SpringBootのアプリケーション情報を生成してAPIで取得する.

エキサイト株式会社メディア事業部エンジニアの佐々木です。SpringBootのアプリケーション情報を生成し、取得活用する方法になります。

前提

Java Version

openjdk 17.0.1 2021-10-19 LTS
OpenJDK Runtime Environment Corretto-17.0.1.12.1 (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.1.12.1 (build 17.0.1+12-LTS, mixed mode, sharing)

Gradle Version

------------------------------------------------------------
Gradle 7.5
------------------------------------------------------------

Build time:   2022-07-14 12:48:15 UTC
Revision:     c7db7b958189ad2b0c1472b6fe663e6d654a5103

Kotlin:       1.6.21
Groovy:       3.0.10
Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM:          17.0.1 (Amazon.com Inc. 17.0.1+12-LTS)
OS:           Mac OS X 11.5.2 x86_64

設定

ビルドツールにはGradleを使用しています。

build.gradleに設定を追記

下記の設定を追加します。

springBoot {
    buildInfo()
}

これを追加すると、 ./gradlew bootBuildInfo タスクが使用できるようになります。

タスクの実行

下記、タスクを実行します。

./gradlew bootBuildInfo

実行すると、下記ファイルが生成されます。

./build/resources/main/META-INF/build-info.properties

build.artifact=media-backend-seed
build.group=com.example
build.name=exmaple
build.time=2022-09-19T09\:28\:56.398216Z
build.version=0.0.1-SNAPSHOT

これは、 src フォルダではなく、 build フォルダの方に作成されます。

アプリケーションから使えるようにする

アプリケーションから使えるようにするには、SpringのDIコンテナに登録する必要があります。

設定

application.ymlに先程の resources/main/META-INF/build-info.properties を読み込ませる設定を記述します。

spring:
  config:
    import: 'classpath:META-INF/build-info.properties'

DIコンテナへの登録

DIコンテナへの登録を行います。

@ConstructorBinding
@RequiredArgsConstructor
@ConfigurationProperties(prefix = "build")
@Getter
public class BuildInfoProperty {
    private final String artifact;
    private final String group;
    private final String name;
    private final String time;
    private final String version;
}

上記でDIコンテナの登録が完了しています。

REST APIで応答する

登録したものをREST APIを通して出力してみます。 下記コードをControllerに記述します。

@RestController
@RequestMapping
@RequiredArgsConstructor
public class RootController {

    private final BuildInfoProperty buildInfoProperty;    // DIに登録されたものを取り出す

    @GetMapping
    public Object index(){
        return buildInfoProperty;
    }
}

APIをリクエストすると下記のように出力されます。

$ curl http://localhost:8080/

{
  "artifact": "example",
  "group": "jp.co.excite.",
  "name": "example",
  "time": "2022-09-19T09:17:10.024553Z",
  "version": "0.0.1-SNAPSHOT"
}

まとめ

SpringBootには標準でこのように内部情報を出力する機能がついており、DIすることでアプリケーションから使うことが可能です。Git等との連携もできるようになっていますので、別途記載したいとおもいます。

最後に

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

カジュアル面談はこちらになります! meety.net

募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com