背景
在多版本部署的情景下,我们可能需要一个快捷的方式来获取部署的服务的版本信息。这个信息可以用于快速定位问题,减少debug成本等等,还是比较重要的。
实现
记录版本号等信息
- 实现: 在代码中声明版本号等变量:
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"
- 相关输出信息
- 获取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
- 获取latest tag:
命令行参数获取version信息
使用go语言基础包flag
解决,同时将可执行文件的运行方式区分为两种:
- 启动命令带
-version
或者--version
,则只获取版本号,不启动程序,不走程序逻辑 - 启动命令不带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...
参考
PREVIOUSgolang对fork仓库的使用
NEXTetcd使用技巧