Gradle でバージョンを自動的に付ける (2020 年版)

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

だいぶ昔に「Gradle でバージョン名を自動的に付ける 〜 git-describe とのコラボ」というエントリーを書きました。

当時は grgit という Git クライアントを導入して文字列操作をするような方法をご紹介しました。が、もっとスマートな Gradle プラグインを見つけたので、最近はそっちに切り替えていこうと思っています。

超小ネタですが、ご紹介します。

Gradle com.palantir.git-version プラグイン

com.palantir.git-version というプラグインがあります。導入方法は簡単です。build.gradle の中に次の記述を行うだけです。

plugins {
    // 略
    id 'com.palantir.git-version' version '0.12.2'
}

version = gitVersion()

これにより、git-describe に従ったフォーマットで自動的にバージョン名設定ができます。ついでに printVersion というタスクが利用できるようになります。

実行してみる

新しいディレクトリに上記の build.gradle を作成して、実行してみます。

$ gradle printVersion

FAILURE: Build failed with an exception.

* Where:
Build file '/path/to/build.gradle' line: 3

* What went wrong:
An exception occurred applying plugin request [id: 'com.palantir.git-version', version: '0.12.2']
> Failed to apply plugin [id 'com.palantir.git-version']
   > Cannot find '.git' directory

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 891ms

そりゃそうですね。そもそも .git/ が存在しなければエラーになります。

$ git init
$ gradle printVersion

> Task :printVersion
unspecified

BUILD SUCCESSFUL in 889ms
1 actionable task: 1 executed

git init したてで何もコミットが無ければ unspecified になるようです。

$ git add --all && git commit -m'Initial commit'
$ gradle printVersion

> Task :printVersion
63402c4

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

コミットしてみると、コミットハッシュがバージョン名になります。そして。

$ git tag 1.0.0
$ gradle printVersion

> Task :printVersion
1.0.0

BUILD SUCCESSFUL in 897ms
1 actionable task: 1 executed

タグを打つと、そのタグ名がバージョン名になります。

$ touch hoge
$ gradle printVersion

> Task :printVersion
1.0.0.dirty

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

なにかを追加して、未コミットのものがある状態では .dirty という suffix が付きます。

$ git add --all && git commit -m'Add hoge'
$ gradle printVersion

> Task :printVersion
1.0.0-1-gd306f6c

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

これをコミットしてみると、git-describe の仕様に従って {直近のタグ名}-{からのコミット数}-g{ハッシュ} という形式になります。

ああっ、便利だ。

まとめ

まとめもなにもありませんでした…。便利なのでぜひ導入しましょう。

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