LoginSignup
70
61

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-09-10

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

70
61
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
70
61