git版本信息注入go程序

概述

版本管理主要用於對運行程序的版本追蹤,從而能夠管理線上服務的運行版本,避免各個版本的服務程序混淆.這裏一般的作法爲在程序中埋入版本標誌,同時該版本號會對應到git上的tag或release版本.從而對線上服務更改有一個更全面的信息說明.這裏將介紹基於GNU風格一種版本命名方式.linux

1 版本號命名格式

主版本號 . 子版本號 [. 修正版本號 [. 編譯版本號 ]] Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]] 示例 : 1.2.1, 2.0, 5.0.0 build-13124git

  • Major 具備相同名稱但不一樣主版本號的程序集不可互換。例如,這適用於對產品的大量重寫,這些重寫使得沒法實現向後兼容性。github

  • Minor 若是兩個程序集的名稱和主版本號相同,而次版本號不一樣,這指示顯著加強,但照顧到了向後兼容性。例如,這適用於產品的修正版或徹底向後兼容的新版本。golang

  • Build 內部版本號的不一樣表示對相同源所做的從新編譯。這適合於更改處理器、平臺或編譯器的狀況。安全

  • Revision 名稱、主版本號和次版本號都相同但修訂號不一樣的程序集應是徹底可互換的。這適用於修復之前發佈的程序集中的安全漏洞。bash

程序集的只有內部版本號或修訂號不一樣的後續版本被認爲是先前版本的修補程序 (Hotfix) 更新。ui

2. 版本號管理策略

1). 項目第一版本時,版本號能夠爲 0.1 或 0.1.0, 也能夠爲 1.0 或 1.0.0.
2). 當項目在進行了局部修改或 bug 修正時,主版本號和子版本號都不變,修正版本號加 1;
3). 當項目在原有的基礎上增長了部分功能時,主版本號不變,子版本號加 1,修正版本號復位爲 0,於是能夠被忽略掉;
4). 當項目在進行了重大修改或局部修正累積較多,而致使項目總體發生全局變化時,主版本號加 1;
5). 另外,編譯版本號通常是編譯器在編譯過程當中自動生成的,咱們只定義其格式,並不進行人爲控制。
this

3. go程序埋入版本信息

3.1 實現

實現方式是每一個服務建立一個version的包用於版本管理,編譯時將版本信息set到version包中.spa

go build -ldflags "-X project/version.Version=v0.0.1" 
複製代碼

如上就是將v0.0.1,賦給version包下version變量,同理咱們能夠聲明其餘變量進行一樣的方式賦值.code

3.2 參數解釋

  • -ldflags build命令中用於調用接連接器的參數,全部定義見go build
-ldflags '[pattern=]arg list'
	arguments to pass on each go tool link invocation.
複製代碼
  • -X 連接器參數,主要用於設置報名,連接器全部參數定義見go tool link
-X importpath.name=value
    Set the value of the string variable in importpath named name to value.
    Note that before Go 1.5 this option took two separate arguments.
    Now it takes one argument split on the first = sign.
複製代碼

4.示例

示例見version-management-example 使用時使用build腳本編譯便可生成帶有提交信息的程序,須要根據程序修改build腳本中參數.

執行後產生的結果以下:

./example -v
Version:  0.0.1
Git commit: de07491
Go version: go version go1.6.2 linux/amd64
Build time: 2017-05-11 16:20:27
複製代碼

參考

go tool link
go build

相關文章
相關標籤/搜索