Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
61
Help us understand the problem. What is going on with this article?
@harukasan

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

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

61
Help us understand the problem. What is going on with this article?
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
harukasan
よろしくおねがいします。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
61
Help us understand the problem. What is going on with this article?