Go
golang

ビルドする際にバージョン情報を埋め込む

More than 1 year has passed since last update.

Golangのアプリケーションはビルドした状態で各サーバにデプロイするのが一般的だと思うが、どのバージョンがデプロイされているのか確認したくなる。ビルドする際にバージョン情報を埋め込めると良い。

リンク時に変数を指定する

まずはバージョンを表示できるようにコードを追加しよう。-versionオプションが指定されたらバージョン番号をプリントして出力するようにする。

main.go
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でライセンスされる。