1. harukasan

    Posted

    harukasan
Changes in title
+ビルドする際にバージョン情報を埋め込む
Changes in tags
+Go
1.3
Changes in body
Source | HTML | Preview
@@ -0,0 +1,74 @@
+Golangのアプリケーションはビルドした状態で各サーバにデプロイするのが一般的だと思うが、どのバージョンがデプロイされているのか確認したくなる。ビルドする際にバージョン情報を埋め込めると良い。
+
+## リンク時に変数を指定する
+
+まずはバージョンを表示できるようにコードを追加しよう。`-version`オプションが指定されたらバージョン番号をプリントして出力するようにする。
+
+```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](http://golang.org/cmd/ld/)コマンドは`-X`オプションを使用することで、初期化していない変数の値を指定することが出来る。これを利用してビルド時にバージョン情報を含める。
+
+```
+go build -ldflags "-X main.version $(git describe)" main.go
+```
+
+`main.version`はmainパッケージのversion変数ということだ。ここでは`git describe`コマンドを使用した。
+
+実行すればちゃんとバージョンが表示されるはずだ。
+
+```sh
+$ ./main -version
+version: v1.1
+```
+
+## git describe
+
+`git describe`コマンドを使用すると、直近のtagを元にしたバージョン番号を生成してくれる。
+
+例えば、HEADに`v1.1`というタグが打たれていれば、実行結果は次のようになる。tagにコメントを付けていない場合は、`--tags`オプションをつけると全てのtagを探索対象にしてくれる。
+
+```sh:
+$ git describe
+v1.1
+```
+
+また、HEADにタグが打たれていなければ、コミット数とハッシュを元に適切なバージョン名を生成する。
+
+```sh:
+$ git describe
+v1.1-2-g012abc
+```
+
+このときのフォーマットは次のようになっている。
+
+```sh
+${直近のタグ}-${タグからのコミット回数}-g${ハッシュのprefix}
+```
+
+このように何となくどのコミットがHEADだったときにbuildしたのか把握できて便利だ。
+
+## ライセンス
+
+本記事は下記記事を再編集しており、[CC BY-SA 3.0](http://creativecommons.org/licenses/by-sa/3.0/)でライセンスされる。
+
+- [version control - Go: how to add git revision to binaries built? - Stack Overflow](http://stackoverflow.com/questions/15711780/go-how-to-add-git-revision-to-binaries-built)
+