Skip to content

feat: report the build version at runtime; add release automation - #3

Merged
flaccid merged 3 commits into
mainfrom
ci/release-automation-and-version
Aug 25, 2026
Merged

feat: report the build version at runtime; add release automation#3
flaccid merged 3 commits into
mainfrom
ci/release-automation-and-version

Conversation

@flaccid

@flaccid flaccid commented Aug 25, 2026

Copy link
Copy Markdown
Member

Closes #2. Part of kube-workspaces/deploy#2.

Version at runtime

Nothing recorded which version was running. The Dockerfile built with no
-ldflags, there was no version variable, and no endpoint reported one — so the
only signal was the image tag, which is latest in the default manifests and
therefore says nothing. Reproducing a bug report meant guessing the build.

Version, commit and build date are now compiled in and surfaced:

Surface Output
--version v0.3.0 (commit abc1234, built …, linux/amd64, go1.26.7)
startup log same, so a pod is identifiable from its logs alone

Defaults are dev/unknown, so a plain go build still works.

debug.ReadBuildInfo() is not a substitute here: it reports (devel) for a
build that is not driven by go install module@version, which is the case for
the container build.

The workflow passes VERSION from docker/metadata-action rather than
reconstructing it, so the image tag and the reported version cannot drift.

Release automation

Adds the release workflow and .github/release.yml categories, identical across
the five repositories. The note preamble comes from a shared generator in the
deploy repo which states explicitly when a release has no functional changes —
relevant here, since a component is often tagged only to hold the platform
version line.

The workflow defaults to a dry run so notes can be reviewed before tagging.

Verification

  • `go build`, `go vet` and `--version` all verified locally
  • Note the stdlib `runtime` is aliased to `goruntime`: the k8s apimachinery
    `runtime` is already imported under that name

Part of kube-workspaces/deploy#2.

Adds a release workflow and the .github/release.yml categories used to generate
notes, both identical across the five repositories so a reader moving between
them sees the same structure.

The note preamble comes from a shared generator in the deploy repo, which
classifies the commits since the last tag. That matters here because this
component often has nothing but CI and docs changes in a cycle and still gets
tagged to hold the platform version line — in that case the notes say so
explicitly rather than leaving someone to infer it from a list of CI commits.

The workflow defaults to a dry run so the notes can be reviewed before anything
is tagged.
Closes #2.

Nothing recorded which version was running. The Dockerfile built with no
-ldflags, there was no version variable, and no endpoint reported one — so the
only signal was the image tag, which is `latest` in the default manifests and
therefore says nothing.

Version, commit and build date are now compiled in, defaulting to dev/unknown
so a plain `go build` still works, and surfaced two ways:

  --version       prints and exits
  startup log     structured, via setupLog, before the manager is constructed

Note the stdlib runtime package is imported as goruntime here: the k8s
apimachinery runtime is already imported under that name.

debug.ReadBuildInfo() is not a substitute: it reports "(devel)" for a build not
driven by `go install module@version`, which is the case for the container build.

The workflow passes VERSION from docker/metadata-action rather than
reconstructing it, so the image tag and the reported version cannot drift.

A metric label was considered and deliberately left out for now — it would mean
registering a custom collector, and the startup log plus the aggregated
/platform/version endpoint in the api cover the immediate need.
@flaccid flaccid added enhancement New feature or request ci CI, build and release tooling labels Aug 25, 2026
golangci-lint failed with:

  cmd/main.go:24:1: File is not properly formatted (goimports)

goimports wants a blank line before a comment-led import within a group.
gofmt accepts it either way, which is why this passed locally — the repo lints
with goimports, not plain gofmt.

Verified with goimports -l and golangci-lint run (0 issues).
@flaccid
flaccid merged commit 1b589d4 into main Aug 25, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci CI, build and release tooling enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bake the version into the binary and expose it at runtime

1 participant