Spring Boot Gradle Plugin を使ってビルド情報をアプリケーションに埋め込む

Gradle で管理されている Spring Boot アプリケーションのバージョン情報などをアプリケーションコードから動的に参照できるようにするためのメモです。

ビルド情報を Spring Boot アプリケーションに埋め込む

具体的にやるべきことは リファレンス にも書かれているとおり、以下の 2 つだけです。

springBoot {
    buildInfo()
}

試しに、上記設定を記述した状態で ./gradlew bootBuildInfo を実行すると、build/resources/main/META-INF ディレクトリ配下に以下のような、バージョン番号などビルドされる (された) アーティファクトに関わる内容の build-info.properties ファイルが生成されます。

build.artifact=spring-boot-buildinfo-example
build.group=me.k11i
build.name=spring-boot-buildinfo-example
build.time=2019-12-30T10\:59\:04.798249Z
build.version=1.0.0-SNAPSHOT

この bootBuildInfo タスクは Java プラグインの classes タスクに依存されている ので、./gradlew bootJar コマンドなどでアーティファクトをビルドすれば自動的にその中に含められます。

アプリケーションコードからビルド情報を参照する

Spring Boot アプリケーションのコードからビルド情報を参照するには、例えば以下のように、必要な箇所で BuildProperties オブジェクトをインジェクションするのがよいでしょう。

@RestController
class ExampleApi {
    private static final Logger LOGGER = LoggerFactory.getLogger(ExampleApi.class);

    public ExampleApi(@Autowired BuildProperties buildProperties) {
        LOGGER.info("App version: {}", buildProperties.getVersion());
    }

    // ...
}

Spring Boot Actuator 経由でビルド情報を取得する

Spring Boot Actuator を使っていれば、/actuator/info の web エンドポイント経由でビルド情報を取得することもできます。

$ curl -s localhost:18080/actuator/info | jq .
{
  "build": {
    "artifact": "spring-boot-buildinfo-example",
    "name": "spring-boot-buildinfo-example",
    "time": "2019-12-30T11:25:06.988Z",
    "version": "1.0.0-SNAPSHOT",
    "group": "me.k11i"
  }
}

git.properties も生成して埋め込む

git.properties ファイルを生成する Gradle プラグイン を併用すれば、git リポジトリに関する情報も Spring Boot アプリケーションのアーティファクトに埋め込むことができます。このプラグインの使い方はいたって簡単で、単に plugins ブロックに以下のように記述するだけで OK です。

plugins {
    // ...
    id 'com.gorylenko.gradle-git-properties' version '2.2.0'
}

このプラグインが提供する generateGitProperties タスクもやはり classes タスクが依存するように設定されている ので、アーティファクトのビルドに合わせて git.properties ファイルが生成されることになります。

Spring Boot Actuator は git.properties ファイルが存在すれば、/actuator/info エンドポイントのレスポンスにそのファイルの一部の情報を含めます。

$ curl -s localhost:18080/actuator/info | jq .
{
  "git": {
    "branch": "master",
    "commit": {
      "id": "9d05db1",
      "time": "2019-12-30T10:27:10Z"
    }
  },
  "build": {
    "artifact": "spring-boot-buildinfo-example",
    "name": "spring-boot-buildinfo-example",
    "time": "2019-12-30T11:25:06.988Z",
    "version": "1.0.0-SNAPSHOT",
    "group": "me.k11i"
  }
}

サンプルコード

具体的にビルド情報を扱う Spring Boot アプリケーションのサンプルコードを github.com/komiya-atsushi/spring-boot-buildinfo-example にて公開しています。