This post will go over how to embed the Git commit hash inside a Go binary in order to support a /versionz endpoint. A /versionz could include multiple things, including manually defined version numbers, but another nice to have is the Git commit hash which produced the binary of the running software.
An example of doing this could be using a combination of GitHub actions to automate builds, Dockerfile, and Go’s ldflags build flags.
- Specify a Dockerfile build
ARGvariable for the Git commit hash. - Inside GitHub actions build pipeline pass
GITHUB_SHAENV variable or github.sha context to the above Dockerfile build argument. Now the commit hash that triggered the build is available within the Dockerfile andgo buildcontext. - Use
go buildwith-ldflagsto link the commit hash to a variable inside the binary.
Putting it all together:
Dockerfile:
...
ARG GIT_SHA
...
Inside the GitHub Actions definition pass the commit hash which triggered the build to GIT_SHA. Your build structure may vary, but the idea is the same. Here we use the github context.
...
docker-build-args = ... --build-arg GIT_SHA=${{ github.sha }} ...
...
Build the binary with -ldflags -X option:
RUN go build -ldflags="-X main.sha=${GIT_SHA}" cmd/my-project/main.go
After the build, inside main the variable sha is now set to the Git commit hash and available at runtime.
main.go
package main
...
// Gets set at build time via `-ldflags "-X main.sha=<value>"`
var sha = "local"
...