git版本信息注入go程序

2,256 阅读3分钟

概述

版本管理主要用于对运行程序的版本追踪,从而可以管理线上服务的运行版本,避免各个版本的服务程序混淆.这里通常的做法为在程序中埋入版本标志,同时该版本号会对应到git上的tag或release版本.从而对线上服务更改有一个更全面的信息说明.这里将介绍基于GNU风格一种版本命名方式.

1 版本号命名格式

主版本号 . 子版本号 [. 修正版本号 [. 编译版本号 ]] Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]] 示例 : 1.2.1, 2.0, 5.0.0 build-13124

  • Major 具有相同名称但不同主版本号的程序集不可互换。例如,这适用于对产品的大量重写,这些重写使得无法实现向后兼容性。

  • Minor 如果两个程序集的名称和主版本号相同,而次版本号不同,这指示显著增强,但照顾到了向后兼容性。例如,这适用于产品的修正版或完全向后兼容的新版本。

  • Build 内部版本号的不同表示对相同源所作的重新编译。这适合于更改处理器、平台或编译器的情况。

  • Revision 名称、主版本号和次版本号都相同但修订号不同的程序集应是完全可互换的。这适用于修复以前发布的程序集中的安全漏洞。

程序集的只有内部版本号或修订号不同的后续版本被认为是先前版本的修补程序 (Hotfix) 更新。

2. 版本号管理策略

1). 项目初版本时,版本号可以为 0.1 或 0.1.0, 也可以为 1.0 或 1.0.0.
2). 当项目在进行了局部修改或 bug 修正时,主版本号和子版本号都不变,修正版本号加 1;
3). 当项目在原有的基础上增加了部分功能时,主版本号不变,子版本号加 1,修正版本号复位为 0,因而可以被忽略掉;
4). 当项目在进行了重大修改或局部修正累积较多,而导致项目整体发生全局变化时,主版本号加 1;
5). 另外,编译版本号一般是编译器在编译过程中自动生成的,我们只定义其格式,并不进行人为控制。

3. go程序埋入版本信息

3.1 实现

实现方式是每个服务创建一个version的包用于版本管理,编译时将版本信息set到version包中.

go build -ldflags "-X project/version.Version=v0.0.1" 

如上就是将v0.0.1,赋给version包下version变量,同理我们可以声明其他变量进行同样的方式赋值.

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