Spring Boot Actuator の info エンドポイントにビルド情報を含める

旬の生魚おじさん、都元です。弊社は本日を最終営業日として、これから冬季休業となります。 今年も一年、どうもありがとうございました。というわけで恒例の書き納め三本締め、その3。

またまた以前のエントリーの掘り返しになりますが、以前「Spring Boot Actuatorによる便利なAPIエンドポイント自動設定」というエントリーを書きました。

現在の最新版である Spring Boot 2.x 系では /actuator/health など、/actuator の下に各種エンドポイントが生えます。また、デフォルトでは /actuator/health/actuator/info しか公開されないように変わりました。と、まぁ v2 系のアップデート情報はそこそこにしまして。

で、その中で /actuator/info というエンドポイントがあるのですが、これはデフォルトでは {} という無意味な情報しか返しません。ここには、Spring Boot のプロパティ (application.properties や環境変数等をまとめたもの) で指定した情報などを組み込めるのですが、デフォルトでは何も設定していないので空なのです。

せっかくなので、ここにはアプリケーションのビルド情報が入るようにしてみましょう。

Spring Initializr でプロジェクトを作る

Spring Initializr はご存知でしょうか。Spring Boot のプロジェクト雛形をサクっと作ってくれるやつです。UI からポチポチやってもいいのですが、今回は curl コマンド一発でプロジェクトを作って起動してみましょう。

余談ですが、世の中ではこの Spring Initializr によって月間に 100 万回のプロジェクト生成が行われているようです。すげえ。

$ curl https://start.spring.io/starter.tgz \
       -d dependencies=web,actuator \
       -d type=gradle-project \
       -d baseDir=cm-boot-demo | tar -xzvf -
$ cd cm-boot-demo

$ git init && git add --all && git commit -m'Initial commit'

$ ./gradlew bootRun
(略)
2019-12-19 16:10:14.343  INFO 69748 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-12-19 16:10:14.345  INFO 69748 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 2.722 seconds (JVM running for 3.065)
<=========----> 75% EXECUTING [25s]
> :bootRun

ここまで 1 分です。すごい。別のターミナルで /actuator/info を叩いてみましょう。

$ curl -s http://localhost:8080/actuator/info | jq .
{}

空っぽですね。

Actuator の info エンドポイントにビルド情報を組み込む

はい、これも一瞬です。 build.gradle に次の 3 行を追記してください。以上。

springBoot {
    buildInfo()
}

アプリケーションを再起動 (./gradlew bootRun) して info エンドポイントを叩くと…。

$ curl -s http://localhost:8080/actuator/info | jq .
{
  "build": {
    "version": "0.0.1-SNAPSHOT",
    "artifact": "demo",
    "name": "demo",
    "group": "com.example",
    "time": "2019-12-19T07:16:32.427Z"
  }
}

こんな感じです。いいですね!

これに加えて Git のコミット情報も組み込む

Git のコミットハッシュや、コミットタイムスタンプも info で参照できるといいですね。ということでやってみます。 これには com.gorylenko.gradle-git-properties という Gradle プラグインを利用します。

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

はい、plugins ブロックに 1 行追加するだけです。 アプリケーションを再起動 (./gradlew bootRun) して info エンドポイントを叩いてみましょう。

curl -s http://localhost:8080/actuator/info | jq .
{
  "git": {
    "commit": {
      "time": "2019-12-19T07:14:09Z",
      "id": "8f7ad5e"
    },
    "branch": "master"
  },
  "build": {
    "version": "0.0.1-SNAPSHOT",
    "artifact": "demo",
    "name": "demo",
    "group": "com.example",
    "time": "2019-12-19T07:17:43.821Z"
  }
}

まとめ

さらに Gradle でバージョンを自動的に付ける (2020 年版) の仕組みも加えれば、.build.version がリッチになり、さらに運用しやすくなるかもしれません。

ではみなさま、良いお年を。