Help us understand the problem. What is going on with this article?

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

More than 5 years have 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でライセンスされる。

harukasan
よろしくおねがいします。
http://harukasan.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした