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

相关文章
相关标签/搜索