Golang写的程序注入一些版本信息

分享到:

Golang写的程序注入一些版本信息

Golang写的程序注入一些版本信息

背景

Go程序运行时打印git提交信息编译信息

Golang编译信息注入程序

当在debug的过程中,我们需要明确当前运行的go程序是什么版本

不要浪费时间在确认版本的问题上

在go build编译的时候是可以注入外部参数的

让go程序在运行的时候就可以打印编译时候的参数情况

以gitlab-runner为例

1gitlab-runner -v
2Version:      11.10.1
3Git revision: 1f513601
4Git branch:   11-10-stable
5GO version:   go1.8.7
6Built:        2019-04-24T09:29:18+0000
7OS/Arch:      linux/amd64

最终实现的go程序运行时终端打印的信息如下

1App Name:       app-api
2App Version:    v2.0.1
3Build version:  84d4ffb verdor
4Build time:     2019-08-06T09:58:48+0800
5Git revision:   84d4ffb
6Git branch:     master
7Golang Version: go version go1.12.2 linux/amd64
82019-07-24 10:53:34.732 11516: http server started listening on [:20000]

具体实现

入口文件main.go

 1package main
 2
 3import (
 4    "fmt"
 5)
 6
 7var (
 8    AppName      string // 应用名称
 9    AppVersion   string // 应用版本
10    BuildVersion string // 编译版本
11    BuildTime    string // 编译时间
12    GitRevision  string // Git版本
13    GitBranch    string // Git分支
14    GoVersion    string // Golang信息
15)
16
17
18func main() {
19    Version()
20    // 你的业务代码入口
21}
22
23// Version 版本信息
24func Version() {
25    fmt.Printf("App Name:\t%s\n", AppName)
26    fmt.Printf("App Version:\t%s\n", AppVersion)
27    fmt.Printf("Build version:\t%s\n", BuildVersion)
28    fmt.Printf("Build time:\t%s\n", BuildTime)
29    fmt.Printf("Git revision:\t%s\n", GitRevision)
30    fmt.Printf("Git branch:\t%s\n", GitBranch)
31    fmt.Printf("Golang Version: %s\n", GoVersion)
32}

build编译构建脚本build.sh

 1#!/bin/bash
 2
 3set -e
 4
 5PROJECT_NAME="app-api"
 6BINARY="app-api"
 7
 8OUTPUT_DIR=output
 9GOOS=$(go env GOOS)
10
11APP_NAME=${PROJECT_NAME}
12APP_VERSION=$(git log -1 --oneline)
13BUILD_VERSION=$(git log -1 --oneline)
14BUILD_TIME=$(date "+%FT%T%z")
15GIT_REVISION=$(git rev-parse --short HEAD)
16GIT_BRANCH=$(git name-rev --name-only HEAD)
17GO_VERSION=$(go version)
18
19CGO_ENABLED=0 go build -a -installsuffix cgo -v -mod=vendor \
20-ldflags "-s -X 'main.AppName=${APP_NAME}' \
21            -X 'main.AppVersion=${APP_VERSION}' \
22            -X 'main.BuildVersion=${BUILD_VERSION}' \
23            -X 'main.BuildTime=${BUILD_TIME}' \
24            -X 'main.GitRevision=${GIT_REVISION}' \
25            -X 'main.GitBranch=${GIT_BRANCH}' \
26            -X 'main.GoVersion=${GO_VERSION}'" \
27-o ${OUTPUT_DIR}/${BINARY} cmd/${BINARY}.go

本质上是用 -ldflags 参数注入了的外部参数到go的变量当中go的更多build参数帮助可以通过 go help build获取

windows用Git Bash终端

Demo

 1package main
 2
 3import "fmt"
 4
 5var AppName string // 应用名称
 6func main() {
 7
 8	fmt.Println("AppName=", AppName)
 9}
10
1go build -ldflags "-s -X 'main.AppName=XXX'" cmd.go