Golangのアプリケーションはビルドした状態で各サーバにデプロイするのが一般的だと思うが、どのバージョンがデプロイされているのか確認したくなる。ビルドする際にバージョン情報を埋め込めると良い。
リンク時に変数を指定する
まずはバージョンを表示できるようにコードを追加しよう。-version
オプションが指定されたらバージョン番号をプリントして出力するようにする。
package main
import (
"flag"
"fmt"
)
var version string
var show_version = flag.Bool("version", false, "show version")
func main() {
flag.Parse()
if *show_version {
fmt.Printf("version: %s\n", version)
return
}
// ... snip ...
}
後はビルド時に変数version
に文字列を指定するだけである。goのldコマンドは-X
オプションを使用することで、初期化していない変数の値を指定することが出来る。これを利用してビルド時にバージョン情報を含める。
go build -ldflags "-X main.version $(git describe)" main.go
main.version
はmainパッケージのversion変数ということだ。ここではgit describe
コマンドを使用した。
実行すればちゃんとバージョンが表示されるはずだ。
$ ./main -version
version: v1.1
git describe
git describe
コマンドを使用すると、直近のtagを元にしたバージョン番号を生成してくれる。
例えば、HEADにv1.1
というタグが打たれていれば、実行結果は次のようになる。tagにコメントを付けていない場合は、--tags
オプションをつけると全てのtagを探索対象にしてくれる。
$ git describe
v1.1
また、HEADにタグが打たれていなければ、コミット数とハッシュを元に適切なバージョン名を生成する。
$ git describe
v1.1-2-g012abc
このときのフォーマットは次のようになっている。
${直近のタグ}-${タグからのコミット回数}-g${ハッシュのprefix}
このように何となくどのコミットがHEADだったときにbuildしたのか把握できて便利だ。
ライセンス
本記事は下記記事を再編集しており、CC BY-SA 3.0でライセンスされる。