From 8567361ae9c3a5e4ecc2419cb00e1a31da7b8fb5 Mon Sep 17 00:00:00 2001 From: Peter Svensson Date: Thu, 7 May 2026 11:39:16 +0200 Subject: [PATCH] feat: stamp version/gitCommit/buildDate into manager binary Standard kubebuilder pattern. Linker injects build metadata into package-level vars in cmd/manager; the values are logged once at startup so triage can identify exactly which image is running. - cmd/manager/main.go: declare version/gitCommit/buildDate vars, log them after zap is configured. - Dockerfile: accept VERSION, GIT_COMMIT, BUILD_DATE build args and pass them through -ldflags to go build. - .github/workflows/build-and-scan.yaml: pass docker meta version, github.sha and an ISO-8601 build date as build args. --- .github/workflows/build-and-scan.yaml | 8 ++++++++ Dockerfile | 12 ++++++++---- cmd/manager/main.go | 10 ++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-and-scan.yaml b/.github/workflows/build-and-scan.yaml index 1f45b00..b33337d 100644 --- a/.github/workflows/build-and-scan.yaml +++ b/.github/workflows/build-and-scan.yaml @@ -64,6 +64,10 @@ jobs: type=sha,prefix=sha- type=raw,value=latest,enable={{is_default_branch}} + - name: Compute build date + id: build_date + run: echo "date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT" + - name: Build and push Docker image uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0 id: build @@ -73,6 +77,10 @@ jobs: push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} + build-args: | + VERSION=${{ steps.meta.outputs.version }} + GIT_COMMIT=${{ github.sha }} + BUILD_DATE=${{ steps.build_date.outputs.date }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/Dockerfile b/Dockerfile index 8b2cf8c..2f2068c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,6 +4,9 @@ FROM golang:1.26-alpine@sha256:f85330846cde1e57ca9ec309382da3b8e6ae3ab943d273950 ARG TARGETOS ARG TARGETARCH ARG ENABLE_COVERAGE=false +ARG VERSION=dev +ARG GIT_COMMIT=none +ARG BUILD_DATE=unknown WORKDIR /workspace @@ -20,11 +23,12 @@ COPY cmd/ cmd/ COPY api/ api/ COPY internal/ internal/ -# Build with optional coverage instrumentation -RUN if [ "$ENABLE_COVERAGE" = "true" ]; then \ - CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -cover -covermode=atomic -tags=cover -a -o manager ./cmd/manager; \ +# Build with optional coverage instrumentation. Build metadata stamped via -ldflags. +RUN LDFLAGS="-X main.version=${VERSION} -X main.gitCommit=${GIT_COMMIT} -X main.buildDate=${BUILD_DATE}" && \ + if [ "$ENABLE_COVERAGE" = "true" ]; then \ + CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -cover -covermode=atomic -tags=cover -a -ldflags "$LDFLAGS" -o manager ./cmd/manager; \ else \ - CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o manager ./cmd/manager; \ + CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -ldflags "$LDFLAGS" -o manager ./cmd/manager; \ fi # Use distroless as minimal base image to package the manager binary diff --git a/cmd/manager/main.go b/cmd/manager/main.go index 344cc46..f511fb5 100644 --- a/cmd/manager/main.go +++ b/cmd/manager/main.go @@ -22,6 +22,11 @@ import ( var ( scheme = runtime.NewScheme() setupLog = ctrl.Log.WithName("setup") + + // Build metadata, populated at link time via -ldflags "-X main.=...". + version = "dev" + gitCommit = "none" + buildDate = "unknown" ) func init() { @@ -44,6 +49,11 @@ func main() { ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) + setupLog.Info("starting database-user-operator", + "version", version, + "gitCommit", gitCommit, + "buildDate", buildDate) + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ Scheme: scheme, Metrics: metricsserver.Options{