golang服务记录版本信息

 

背景

在多版本部署的情景下,我们可能需要一个快捷的方式来获取部署的服务的版本信息。这个信息可以用于快速定位问题,减少debug成本等等,还是比较重要的。

实现

记录版本号等信息

  1. 实现: 在代码中声明版本号等变量:
package version

var (
    Version string
    Tag     string
    // ...
)

在编译时添加-ldflags参数,将版本号等信息通过命令行编译进去,程序运行时即可获取到对应值:

go build -ldflags "-X github.com/sasakiyori/xxxrepo/version.Version=1.0.0 -X github.com/sasakiyori/xxxrepo/version.Tag=v0.1.1"
  1. 相关输出信息
    • 获取latest tag: git describe --tags --abbrev=0
    • 获取tag指向commit: git show-ref {TAG_NAME}
    • 获取latest tag + tag基础上的commit数 + 当前commit SHA: git describe --tags
    • 获取当前commit: git describe --always --long --dirty

命令行参数获取version信息

使用go语言基础包flag解决,同时将可执行文件的运行方式区分为两种:

  1. 启动命令带-version或者--version,则只获取版本号,不启动程序,不走程序逻辑
  2. 启动命令不带flag,则正常启动程序,走程序逻辑
// 集成到package version中
func ShowOrRun(RunFunc func()) {
    var flagVersion bool
    flag.BoolVar(&flagVersion, "version", false, "show process version")
    flag.Parse()
    if flagVersion {
    	fmt.Println("process version: ", version)
    } else {
    	RunFunc()	
    }
}

// 服务主逻辑
func Run() {
    // ...
}

// 服务入口
func main() {
    version.ShowOrRun(Run)
}

运行命令./a.out --version,得到结果

process version: 1.0.0

运行命令./a.out,得到结果

Server Is Starting...

参考