背景
Go程序運(yùn)行時(shí)打印git提交信息編譯信息
Golang編譯信息注入程序
當(dāng)在debug的過(guò)程中,我們需要明確當(dāng)前運(yùn)行的go程序是什么版本
不要浪費(fèi)時(shí)間在確認(rèn)版本的問(wèn)題上
在go build編譯的時(shí)候是可以注入外部參數(shù)的
讓go程序在運(yùn)行的時(shí)候就可以打印編譯時(shí)候的參數(shù)情況
以gitlab-runner為例
gitlab-runner -v
Version: 11.10.1
Git revision: 1f513601
Git branch: 11-10-stable
GO version: go1.8.7
Built: 2019-04-24T09:29:18+0000
OS/Arch: linux/amd64
最終實(shí)現(xiàn)的go程序運(yùn)行時(shí)終端打印的信息如下
App Name: app-api
App Version: v2.0.1
Build version: 84d4ffb verdor
Build time: 2019-08-06T09:58:48+0800
Git revision: 84d4ffb
Git branch: master
Golang Version: go version go1.12.2 linux/amd64
2019-07-24 10:53:34.732 11516: http server started listening on [:20000]
具體實(shí)現(xiàn)
入口文件
main.go
package main
import (
"fmt"
)
var (
AppName string // 應(yīng)用名稱(chēng)
AppVersion string // 應(yīng)用版本
BuildVersion string // 編譯版本
BuildTime string // 編譯時(shí)間
GitRevision string // Git版本
GitBranch string // Git分支
GoVersion string // Golang信息
)
func main() {
Version()
// 你的業(yè)務(wù)代碼入口
}
// Version 版本信息
func Version() {
fmt.Printf("App Name:\t%s\n", AppName)
fmt.Printf("App Version:\t%s\n", AppVersion)
fmt.Printf("Build version:\t%s\n", BuildVersion)
fmt.Printf("Build time:\t%s\n", BuildTime)
fmt.Printf("Git revision:\t%s\n", GitRevision)
fmt.Printf("Git branch:\t%s\n", GitBranch)
fmt.Printf("Golang Version: %s\n", GoVersion)
}
build編譯構(gòu)建腳本
build.sh
#!/bin/bash
set -e
PROJECT_NAME="app-api"
BINARY="app-api"
OUTPUT_DIR=output
GOOS=$(go env GOOS)
APP_NAME=${PROJECT_NAME}
APP_VERSION=$(git log -1 --oneline)
BUILD_VERSION=$(git log -1 --oneline)
BUILD_TIME=$(date "+%FT%T%z")
GIT_REVISION=$(git rev-parse --short HEAD)
GIT_BRANCH=$(git name-rev --name-only HEAD)
GO_VERSION=$(go version)
CGO_ENABLED=0 go build -a -installsuffix cgo -v -mod=vendor \
-ldflags "-s -X 'main.AppName=${APP_NAME}' \
-X 'main.AppVersion=${APP_VERSION}' \
-X 'main.BuildVersion=${BUILD_VERSION}' \
-X 'main.BuildTime=${BUILD_TIME}' \
-X 'main.GitRevision=${GIT_REVISION}' \
-X 'main.GitBranch=${GIT_BRANCH}' \
-X 'main.GoVersion=${GO_VERSION}'" \
-o ${OUTPUT_DIR}/${BINARY} cmd/${BINARY}.go
本質(zhì)上是用 -ldflags 參數(shù)注入了的外部參數(shù)到go的變量當(dāng)中
go的更多build參數(shù)幫助可以通過(guò) go help build獲取
問(wèn)答
Q: 開(kāi)發(fā)環(huán)境是windows般堆,沒(méi)有bash環(huán)境怎么辦在孝?
A: 都裝了git的吧,那么用Git Bash終端是支持的
流水理魚(yú) 發(fā)布淮摔!