Golang 如何在编译时注入版本相关元信息, 如 git commit hash, git tag, 构建时timestamp 等

方法一: 使用 -ldflags

package version
var (
	Commit string
)
go build -ldflags="-X app/package/version.Commit=$(git rev-parse HEAD)"

通常配合Makefile等构建工具

方法二: Go1.18以上时, 使用 debug.ReadBuildInfo()

	var Commit = func() string {
		if info, ok := debug.ReadBuildInfo(); ok {
			for _, setting := range info.Settings {
				if setting.Key == "vcs.revision" {
					return setting.Value
				}
			}
		}
		return ""
	}()

问题

CICD平台使用时, 由于是在容器中进行构建, 此时需要在镜像构建时注入信息

...
ARG VERSION
ENV VERSION $VERSION
ARG BUILD_TIMESTAMP
ENV BUILD_TIMESTAMP $BUILD_TIMESTAMP
...
docker build -t "$TAG" -t "$LATEST" --build-arg VERSION="$VERSION" --build-arg BUILD_TIMESTAMP="$BUILD_TIMESTAMP" .