diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index b866b8fa..c4839430 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -46,6 +46,10 @@ jobs: image: ${{ env.OPERATOR_NAME }} tags: ${{ env.IMG_TAGS }} platforms: linux/amd64,linux/arm64 + build-args: | + GIT_SHA=${{ github.sha }} + DIRTY=false + dockerfiles: | ./Dockerfile @@ -92,6 +96,9 @@ jobs: image: ${{ env.OPERATOR_NAME }}-bundle tags: ${{ needs.build.outputs.build-tags }} platforms: linux/amd64,linux/arm64 + build-args: | + GIT_SHA=${{ github.sha }} + DIRTY=false dockerfiles: | ./bundle.Dockerfile diff --git a/Dockerfile b/Dockerfile index 36e5cd88..a02cb786 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,15 @@ # Build the manager binary -FROM golang:1.21 as builder +FROM golang:1.21 AS builder ARG TARGETOS ARG TARGETARCH +ARG GIT_SHA +ARG DIRTY + +ENV GIT_SHA=${GIT_SHA:-unknown} +ENV DIRTY=${DIRTY:-unknown} + + WORKDIR /workspace # Copy the Go Modules manifests COPY go.mod go.mod @@ -15,13 +22,12 @@ RUN go mod download COPY cmd/main.go cmd/main.go COPY api/ api/ COPY internal/ internal/ - # Build # the GOARCH has not a default value to allow the binary be built according to the host where the command # was called. For example, if we call make docker-build in a local env which has the Apple Silicon M1 SO # the docker BUILDPLATFORM arg will be linux/arm64 when for Apple x86 it will be linux/amd64. Therefore, # by leaving it empty we can ensure that the container and binary shipped on it will have the same platform. -RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o manager cmd/main.go +RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -ldflags "-X main.gitSHA=${GIT_SHA} -X main.dirty=${DIRTY}" -a -o manager cmd/main.go # Use distroless as minimal base image to package the manager binary # Refer to https://github.com/GoogleContainerTools/distroless for more details diff --git a/Makefile b/Makefile index c8efdca4..3e0635a3 100644 --- a/Makefile +++ b/Makefile @@ -214,19 +214,25 @@ local-deploy-namespaced: docker-build kind-load-image ## Deploy the dns operator ##@ Build .PHONY: build +build: GIT_SHA=$(shell git rev-parse HEAD || echo "unknown") +build: DIRTY=$(shell hack/check-git-dirty.sh || echo "unknown") build: manifests generate fmt vet ## Build manager binary. - go build -o bin/manager cmd/main.go + go build -ldflags "-X main.gitSHA=${GIT_SHA} -X main.dirty=${DIRTY}" -o bin/manager cmd/main.go .PHONY: run +run: GIT_SHA=$(shell git rev-parse HEAD || echo "unknown") +run: DIRTY=$(shell hack/check-git-dirty.sh || echo "unknown") run: manifests generate fmt vet ## Run a controller from your host. - go run ./cmd/main.go --zap-devel --provider inmemory,aws,google,azure + go run -ldflags "-X main.gitSHA=${GIT_SHA} -X main.dirty=${DIRTY}" ./cmd/main.go --zap-devel --provider inmemory,aws,google,azure # If you wish built the manager image targeting other platforms you can use the --platform flag. # (i.e. docker build --platform linux/arm64 ). However, you must enable docker buildKit for it. # More info: https://docs.docker.com/develop/develop-images/build_enhancements/ .PHONY: docker-build +docker-build: GIT_SHA=$(shell git rev-parse HEAD || echo "unknown") +docker-build: DIRTY=$(shell hack/check-git-dirty.sh || echo "unknown") docker-build: ## Build docker image with the manager. - $(CONTAINER_TOOL) build -t ${IMG} . + $(CONTAINER_TOOL) build -t ${IMG} . --build-arg GIT_SHA=$(GIT_SHA) --build-arg DIRTY=$(DIRTY) .PHONY: docker-push docker-push: ## Push docker image with the manager. diff --git a/cmd/main.go b/cmd/main.go index 1e4c7a92..1b01e78b 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -41,12 +41,15 @@ import ( _ "github.com/kuadrant/dns-operator/internal/provider/azure" _ "github.com/kuadrant/dns-operator/internal/provider/google" _ "github.com/kuadrant/dns-operator/internal/provider/inmemory" + "github.com/kuadrant/dns-operator/internal/version" //+kubebuilder:scaffold:imports ) var ( scheme = runtime.NewScheme() setupLog = ctrl.Log.WithName("setup") + gitSHA string // pass ldflag here to display gitSHA hash + dirty string // must be string as passed in by ldflag to determine display . ) const ( @@ -62,6 +65,10 @@ func init() { //+kubebuilder:scaffold:scheme } +func printControllerMetaInfo() { + setupLog.Info("build information", "version", version.Version, "commit", gitSHA, "dirty", dirty) +} + func main() { var metricsAddr string var enableLeaderElection bool @@ -92,6 +99,8 @@ func main() { ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) + printControllerMetaInfo() + var watchNamespaces = "WATCH_NAMESPACES" defaultOptions := ctrl.Options{ Scheme: scheme, diff --git a/hack/check-git-dirty.sh b/hack/check-git-dirty.sh new file mode 100755 index 00000000..8f0687f1 --- /dev/null +++ b/hack/check-git-dirty.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +if ! command -v git &>/dev/null +then + echo "git not found..." >&2 + exit 1 +fi + +if output=$(git diff --stat 2>/dev/null) +then +[ -n "$output" ] && echo "true" || echo "false" +else + # Not a git repository + exit 1 +fi \ No newline at end of file diff --git a/internal/version/version.go b/internal/version/version.go new file mode 100644 index 00000000..e8a5d0db --- /dev/null +++ b/internal/version/version.go @@ -0,0 +1,21 @@ +/* +Copyright 2021 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package version + +var ( + // This variable is dependent on what the current release is e.g. if it is v0.10.0 then this variable, outside of releases, will be v0.10.1-dev . + Version = "0.4.0-dev" // Change as versions are released +)