Files
2025-12-25 22:10:57 +00:00

148 lines
4.3 KiB
Makefile

# Image URL to use all building/pushing image targets
IMG ?= ghcr.io/lukaszraczylo/kubemirror:latest
IMG_SECONDARY_TAG ?= ""
# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
ifeq (,$(shell go env GOBIN))
GOBIN=$(shell go env GOPATH)/bin
else
GOBIN=$(shell go env GOBIN)
endif
# Setting SHELL to bash allows bash commands to be executed by recipes.
# Options are set to exit when a recipe line exits non-zero or a piped command fails.
SHELL = /usr/bin/env bash -o pipefail
.SHELLFLAGS = -ec
.PHONY: all
all: build
##@ General
.PHONY: help
help: ## Display this help.
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
##@ Development
.PHONY: fmt
fmt: ## Run go fmt against code.
go fmt ./...
.PHONY: vet
vet: ## Run go vet against code.
go vet ./...
.PHONY: lint
lint: ## Run staticcheck, gosec, and other linters.
@command -v staticcheck >/dev/null 2>&1 || { echo "Installing staticcheck..."; go install honnef.co/go/tools/cmd/staticcheck@latest; }
@command -v gosec >/dev/null 2>&1 || { echo "Installing gosec..."; go install github.com/securego/gosec/v2/cmd/gosec@latest; }
@command -v deadcode >/dev/null 2>&1 || { echo "Installing deadcode..."; go install golang.org/x/tools/cmd/deadcode@latest; }
staticcheck ./...
gosec -exclude=G115 ./...
deadcode ./...
.PHONY: test
test: fmt vet ## Run tests.
go test ./... -coverprofile cover.out
.PHONY: test-race
test-race: fmt vet ## Run tests with race detector.
go test -race ./...
.PHONY: test-verbose
test-verbose: fmt vet ## Run tests with verbose output.
go test -v -race ./...
.PHONY: bench
bench: ## Run benchmarks.
go test -race -bench=. -benchmem ./...
.PHONY: cover
cover: test ## Run tests and open coverage in browser.
go tool cover -html=cover.out
##@ Build
.PHONY: build
build: fmt vet ## Build controller binary.
go build -o kubemirror ./cmd/kubemirror
.PHONY: run
run: fmt vet ## Run controller from your host (against current kubeconfig).
go run ./cmd/kubemirror --dry-run=true
.PHONY: clean
clean: ## Clean build artifacts.
rm -f kubemirror cover.out
rm -rf dist/
.PHONY: docker-build
docker-build: test ## Build docker image.
docker build -t ${IMG} .
.PHONY: docker-push
docker-push: ## Push docker image.
docker push ${IMG}
# PLATFORMS defines the target platforms for the manager image
PLATFORMS ?= linux/arm64,linux/amd64
.PHONY: docker-buildx
docker-buildx: ## Build and push docker image for cross-platform support
- docker buildx create --name kubemirror-builder
docker buildx use kubemirror-builder
if [ -z "$(IMG_SECONDARY_TAG)" ]; then \
docker buildx build --push --platform=$(PLATFORMS) --tag ${IMG} .; \
else \
docker buildx build --push --platform=$(PLATFORMS) --tag ${IMG} --tag ${IMG_SECONDARY_TAG} .; \
fi
- docker buildx rm kubemirror-builder
##@ Deployment
ifndef ignore-not-found
ignore-not-found = false
endif
.PHONY: deploy
deploy: ## Deploy controller to the K8s cluster specified in ~/.kube/config.
kubectl apply -k deploy/
.PHONY: undeploy
undeploy: ## Remove controller from the K8s cluster.
kubectl delete -k deploy/ --ignore-not-found=$(ignore-not-found)
.PHONY: logs
logs: ## Show controller logs.
kubectl -n kubemirror-system logs -l app.kubernetes.io/name=kubemirror -f
.PHONY: status
status: ## Show controller status.
kubectl -n kubemirror-system get pods -l app.kubernetes.io/name=kubemirror
kubectl -n kubemirror-system get deployments
kubectl -n kubemirror-system get services
##@ Code Quality
.PHONY: tidy
tidy: ## Run go mod tidy.
go mod tidy
.PHONY: verify
verify: fmt vet lint test-race ## Run all verification steps (format, vet, lint, test with race).
.PHONY: ci
ci: verify bench ## Run full CI pipeline locally.
##@ Release
.PHONY: release-dry
release-dry: ## Run GoReleaser in dry-run mode.
@command -v goreleaser >/dev/null 2>&1 || { echo "Installing goreleaser..."; go install github.com/goreleaser/goreleaser@latest; }
goreleaser release --snapshot --clean
.PHONY: release
release: ## Run GoReleaser (requires tag).
@command -v goreleaser >/dev/null 2>&1 || { echo "Installing goreleaser..."; go install github.com/goreleaser/goreleaser@latest; }
goreleaser release --clean