Golang寫的程式注入一些版本資訊,Debug速度自然快不少

firefule發表於2021-09-09

背景

Go程式執行時列印git提交資訊編譯資訊
Golang編譯資訊注入程式
當在debug的過程中,我們需要明確當前執行的go程式是什麼版本
不要浪費時間在確認版本的問題上
在go build編譯的時候是可以注入外部引數的
讓go程式在執行的時候就可以列印編譯時候的引數情況

以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

最終實現的go程式執行時終端列印的資訊如下

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]

具體實現

入口檔案
main.go

package main

import (
	"fmt"
)

var (
	AppName      string // 應用名稱
	AppVersion   string // 應用版本
	BuildVersion string // 編譯版本
	BuildTime    string // 編譯時間
	GitRevision  string // Git版本
	GitBranch    string // Git分支
	GoVersion    string // Golang資訊
)


func main() {
	Version()
	// 你的業務程式碼入口
}

// Version 版本資訊
func Version() {
	fmt.Printf("App Name:t%sn", AppName)
	fmt.Printf("App Version:t%sn", AppVersion)
	fmt.Printf("Build version:t%sn", BuildVersion)
	fmt.Printf("Build time:t%sn", BuildTime)
	fmt.Printf("Git revision:t%sn", GitRevision)
	fmt.Printf("Git branch:t%sn", GitBranch)
	fmt.Printf("Golang Version: %sn", GoVersion)
}

build編譯構建指令碼
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

本質上是用 -ldflags 引數注入了的外部引數到go的變數當中
go的更多build引數幫助可以透過 go help build獲取

問答

Q: 開發環境是windows,沒有bash環境怎麼辦?
A: 都裝了git的吧,那麼用Git Bash終端是支援的

釋出!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1834/viewspace-2824750/,如需轉載,請註明出處,否則將追究法律責任。

相關文章