From 0c40064872efc8c8440c8eeb0cdb7095785617cb Mon Sep 17 00:00:00 2001 From: TheiLLeniumStudios <104288623+TheiLLeniumStudios@users.noreply.github.com> Date: Sun, 28 Dec 2025 08:47:57 +0100 Subject: [PATCH] build: update build configuration to use internal metadata package and improve ldflags injection, fix defer resp.Body.Close() usage, replace os.Setenv with t.Setenv in tests, correct error message casing, and adjust Dockerfile and Makefile for cmd/reloader structure --- .goreleaser.yml | 9 ++++++- Dockerfile | 12 +++++----- Dockerfile.ubi | 1 + Makefile | 15 ++++++++---- internal/pkg/alerting/http.go | 2 +- internal/pkg/metadata/metadata_test.go | 32 +++++++------------------ internal/pkg/metrics/prometheus_test.go | 11 ++++----- internal/pkg/webhook/webhook.go | 2 +- internal/pkg/webhook/webhook_test.go | 2 +- internal/pkg/workload/registry.go | 2 +- 10 files changed, 43 insertions(+), 45 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 08953b78..b49ad229 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -1,5 +1,7 @@ builds: -- env: +- main: ./cmd/reloader + binary: reloader + env: - CGO_ENABLED=0 goos: - windows @@ -11,6 +13,11 @@ builds: - arm - arm64 - ppc64le + ldflags: + - -s -w + - -X github.com/stakater/Reloader/internal/pkg/metadata.Version={{.Version}} + - -X github.com/stakater/Reloader/internal/pkg/metadata.Commit={{.Commit}} + - -X github.com/stakater/Reloader/internal/pkg/metadata.BuildDate={{.Date}} archives: - name_template: "{{ .ProjectName }}_v{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}" snapshot: diff --git a/Dockerfile b/Dockerfile index 53cc26d8..0391463c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,9 +23,8 @@ COPY go.sum go.sum RUN go mod download # Copy the go source -COPY main.go main.go +COPY cmd/ cmd/ COPY internal/ internal/ -COPY pkg/ pkg/ # Build RUN CGO_ENABLED=0 \ @@ -34,10 +33,11 @@ RUN CGO_ENABLED=0 \ GOPROXY=${GOPROXY} \ GOPRIVATE=${GOPRIVATE} \ GO111MODULE=on \ - go build -ldflags="-s -w -X github.com/stakater/Reloader/pkg/common.Version=${VERSION} \ - -X github.com/stakater/Reloader/pkg/common.Commit=${COMMIT} \ - -X github.com/stakater/Reloader/pkg/common.BuildDate=${BUILD_DATE}" \ - -installsuffix 'static' -mod=mod -a -o manager ./ + go build -ldflags="-s -w \ + -X github.com/stakater/Reloader/internal/pkg/metadata.Version=${VERSION} \ + -X github.com/stakater/Reloader/internal/pkg/metadata.Commit=${COMMIT} \ + -X github.com/stakater/Reloader/internal/pkg/metadata.BuildDate=${BUILD_DATE}" \ + -installsuffix 'static' -mod=mod -a -o manager ./cmd/reloader # Use distroless as minimal base image to package the manager binary # Refer to https://github.com/GoogleContainerTools/distroless for more details diff --git a/Dockerfile.ubi b/Dockerfile.ubi index 43597300..b33a7990 100644 --- a/Dockerfile.ubi +++ b/Dockerfile.ubi @@ -1,6 +1,7 @@ ARG BUILDER_IMAGE ARG BASE_IMAGE +# First stage: Build the binary (using the standard Dockerfile as builder) FROM --platform=${BUILDPLATFORM} ${BUILDER_IMAGE} AS SRC FROM ${BASE_IMAGE:-registry.access.redhat.com/ubi9/ubi:latest} AS ubi diff --git a/Makefile b/Makefile index 8444e1f7..1f756537 100644 --- a/Makefile +++ b/Makefile @@ -20,10 +20,17 @@ BUILD= GOCMD = go GOFLAGS ?= $(GOFLAGS:) -LDFLAGS = GOPROXY ?= GOPRIVATE ?= +# Version information for ldflags +GIT_COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo "unknown") +BUILD_DATE ?= $(shell date -u +"%Y-%m-%dT%H:%M:%SZ") +LDFLAGS = -s -w \ + -X github.com/stakater/Reloader/internal/pkg/metadata.Version=$(VERSION) \ + -X github.com/stakater/Reloader/internal/pkg/metadata.Commit=$(GIT_COMMIT) \ + -X github.com/stakater/Reloader/internal/pkg/metadata.BuildDate=$(BUILD_DATE) + ## Location to install dependencies to LOCALBIN ?= $(shell pwd)/bin $(LOCALBIN): @@ -97,10 +104,10 @@ install: "$(GOCMD)" mod download run: - go run ./main.go + go run ./cmd/reloader build: - "$(GOCMD)" build ${GOFLAGS} ${LDFLAGS} -o "${BINARY}" + "$(GOCMD)" build ${GOFLAGS} -ldflags '${LDFLAGS}' -o "${BINARY}" ./cmd/reloader lint: golangci-lint ## Run golangci-lint on the codebase $(GOLANGCI_LINT) run ./... @@ -140,7 +147,7 @@ manifest: docker manifest annotate --arch $(ARCH) $(REPOSITORY_GENERIC) $(REPOSITORY_ARCH) test: - "$(GOCMD)" test -timeout 1800s -v ./... + "$(GOCMD)" test -timeout 1800s -v ./cmd/... ./internal/... stop: @docker stop "${BINARY}" diff --git a/internal/pkg/alerting/http.go b/internal/pkg/alerting/http.go index 827091e7..ab086e57 100644 --- a/internal/pkg/alerting/http.go +++ b/internal/pkg/alerting/http.go @@ -46,7 +46,7 @@ func (c *httpClient) post(ctx context.Context, url string, body []byte) error { if err != nil { return fmt.Errorf("sending request: %w", err) } - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() if resp.StatusCode < 200 || resp.StatusCode >= 300 { body, _ := io.ReadAll(resp.Body) diff --git a/internal/pkg/metadata/metadata_test.go b/internal/pkg/metadata/metadata_test.go index b001da6a..2ef4f575 100644 --- a/internal/pkg/metadata/metadata_test.go +++ b/internal/pkg/metadata/metadata_test.go @@ -3,7 +3,6 @@ package metadata import ( "context" "encoding/json" - "os" "testing" "github.com/go-logr/logr" @@ -112,12 +111,8 @@ func TestNewReloaderOptions(t *testing.T) { func TestMetaInfo_ToConfigMap(t *testing.T) { // Set environment variables - os.Setenv(EnvReloaderNamespace, "reloader-ns") - os.Setenv(EnvReloaderDeploymentName, "reloader-deploy") - defer func() { - os.Unsetenv(EnvReloaderNamespace) - os.Unsetenv(EnvReloaderDeploymentName) - }() + t.Setenv(EnvReloaderNamespace, "reloader-ns") + t.Setenv(EnvReloaderDeploymentName, "reloader-deploy") cfg := config.NewDefault() metaInfo := NewMetaInfo(cfg) @@ -164,8 +159,8 @@ func TestMetaInfo_ToConfigMap(t *testing.T) { } func TestPublisher_Publish_NoNamespace(t *testing.T) { - // Ensure RELOADER_NAMESPACE is not set - os.Unsetenv(EnvReloaderNamespace) + // Ensure RELOADER_NAMESPACE is not set (empty value) + t.Setenv(EnvReloaderNamespace, "") scheme := runtime.NewScheme() _ = corev1.AddToScheme(scheme) @@ -182,12 +177,8 @@ func TestPublisher_Publish_NoNamespace(t *testing.T) { func TestPublisher_Publish_CreateNew(t *testing.T) { // Set environment variables - os.Setenv(EnvReloaderNamespace, "test-ns") - os.Setenv(EnvReloaderDeploymentName, "test-deploy") - defer func() { - os.Unsetenv(EnvReloaderNamespace) - os.Unsetenv(EnvReloaderDeploymentName) - }() + t.Setenv(EnvReloaderNamespace, "test-ns") + t.Setenv(EnvReloaderDeploymentName, "test-deploy") scheme := runtime.NewScheme() _ = corev1.AddToScheme(scheme) @@ -215,12 +206,8 @@ func TestPublisher_Publish_CreateNew(t *testing.T) { func TestPublisher_Publish_UpdateExisting(t *testing.T) { // Set environment variables - os.Setenv(EnvReloaderNamespace, "test-ns") - os.Setenv(EnvReloaderDeploymentName, "test-deploy") - defer func() { - os.Unsetenv(EnvReloaderNamespace) - os.Unsetenv(EnvReloaderDeploymentName) - }() + t.Setenv(EnvReloaderNamespace, "test-ns") + t.Setenv(EnvReloaderDeploymentName, "test-deploy") scheme := runtime.NewScheme() _ = corev1.AddToScheme(scheme) @@ -273,8 +260,7 @@ func TestPublisher_Publish_UpdateExisting(t *testing.T) { func TestPublishMetaInfoConfigMap(t *testing.T) { // Set environment variables - os.Setenv(EnvReloaderNamespace, "test-ns") - defer os.Unsetenv(EnvReloaderNamespace) + t.Setenv(EnvReloaderNamespace, "test-ns") scheme := runtime.NewScheme() _ = corev1.AddToScheme(scheme) diff --git a/internal/pkg/metrics/prometheus_test.go b/internal/pkg/metrics/prometheus_test.go index 47b4392d..b1b85101 100644 --- a/internal/pkg/metrics/prometheus_test.go +++ b/internal/pkg/metrics/prometheus_test.go @@ -1,7 +1,6 @@ package metrics import ( - "os" "testing" "github.com/prometheus/client_golang/prometheus" @@ -97,8 +96,7 @@ func TestRecordReload_MultipleIncrements(t *testing.T) { func TestRecordReload_WithNamespaceTracking(t *testing.T) { // Enable namespace tracking - os.Setenv("METRICS_COUNT_BY_NAMESPACE", "enabled") - defer os.Unsetenv("METRICS_COUNT_BY_NAMESPACE") + t.Setenv("METRICS_COUNT_BY_NAMESPACE", "enabled") collectors := NewCollectors() collectors.RecordReload(true, "kube-system") @@ -117,8 +115,8 @@ func TestRecordReload_WithNamespaceTracking(t *testing.T) { } func TestRecordReload_WithoutNamespaceTracking(t *testing.T) { - // Ensure namespace tracking is disabled - os.Unsetenv("METRICS_COUNT_BY_NAMESPACE") + // Ensure namespace tracking is disabled (t.Setenv to empty resets it) + t.Setenv("METRICS_COUNT_BY_NAMESPACE", "") collectors := NewCollectors() collectors.RecordReload(true, "kube-system") @@ -139,8 +137,7 @@ func TestNilCollectors_NoPanic(t *testing.T) { } func TestRecordReload_DifferentNamespaces(t *testing.T) { - os.Setenv("METRICS_COUNT_BY_NAMESPACE", "enabled") - defer os.Unsetenv("METRICS_COUNT_BY_NAMESPACE") + t.Setenv("METRICS_COUNT_BY_NAMESPACE", "enabled") collectors := NewCollectors() collectors.RecordReload(true, "namespace-a") diff --git a/internal/pkg/webhook/webhook.go b/internal/pkg/webhook/webhook.go index a40c5a5c..d5b3c4cd 100644 --- a/internal/pkg/webhook/webhook.go +++ b/internal/pkg/webhook/webhook.go @@ -73,7 +73,7 @@ func (c *Client) Send(ctx context.Context, payload Payload) error { if err != nil { return fmt.Errorf("sending request: %w", err) } - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() if resp.StatusCode < 200 || resp.StatusCode >= 300 { return fmt.Errorf("webhook returned status %d", resp.StatusCode) diff --git a/internal/pkg/webhook/webhook_test.go b/internal/pkg/webhook/webhook_test.go index acb7b983..b88ed246 100644 --- a/internal/pkg/webhook/webhook_test.go +++ b/internal/pkg/webhook/webhook_test.go @@ -74,7 +74,7 @@ func TestSend_MarshalPayload(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { body, _ := io.ReadAll(r.Body) - json.Unmarshal(body, &receivedPayload) + _ = json.Unmarshal(body, &receivedPayload) w.WriteHeader(http.StatusOK) })) defer server.Close() diff --git a/internal/pkg/workload/registry.go b/internal/pkg/workload/registry.go index 5e7ad0c1..920a7eab 100644 --- a/internal/pkg/workload/registry.go +++ b/internal/pkg/workload/registry.go @@ -73,7 +73,7 @@ func (r *Registry) FromObject(obj client.Object) (WorkloadAccessor, error) { return NewCronJobWorkload(o), nil case *argorolloutv1alpha1.Rollout: if !r.argoRolloutsEnabled { - return nil, fmt.Errorf("Argo Rollouts support is not enabled") + return nil, fmt.Errorf("argo Rollouts support is not enabled") } return NewRolloutWorkload(o), nil default: