126 lines
5.0 KiB
Makefile
126 lines
5.0 KiB
Makefile
|
|
# Image URL to use all building/pushing image targets
|
|
IMG ?= controller:latest
|
|
# Platforms to build the image for
|
|
PLATFORMS ?= linux/amd64,linux/arm64
|
|
|
|
# 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.
|
|
# This is a requirement for 'setup-envtest.sh' in the test target.
|
|
# 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
|
|
|
|
all: build
|
|
|
|
##@ General
|
|
|
|
# The help target prints out all targets with their descriptions organized
|
|
# beneath their categories. The categories are represented by '##@' and the
|
|
# target descriptions by '##'. The awk commands is responsible for reading the
|
|
# entire set of makefiles included in this invocation, looking for lines of the
|
|
# file as xyz: ## something, and then pretty-format the target and help. Then,
|
|
# if there's a line with ##@ something, that gets pretty-printed as a category.
|
|
# More info on the usage of ANSI control characters for terminal formatting:
|
|
# https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters
|
|
# More info on the awk command:
|
|
# http://linuxcommand.org/lc3_adv_awk.php
|
|
|
|
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
|
|
|
|
manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.
|
|
$(CONTROLLER_GEN) crd:crdVersions=v1 paths="./api/..." output:crd:artifacts:config=config/crd/bases
|
|
$(CONTROLLER_GEN) rbac:roleName=manager-role webhook paths="./..."
|
|
|
|
generate: controller-gen ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations.
|
|
$(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..."
|
|
|
|
fmt: ## Run go fmt against code.
|
|
go fmt ./...
|
|
|
|
vet: ## Run go vet against code.
|
|
go vet ./...
|
|
|
|
ENVTEST_ASSETS_DIR=$(shell pwd)/testbin
|
|
test: manifests generate fmt vet ## Run tests.
|
|
mkdir -p ${ENVTEST_ASSETS_DIR}
|
|
test -f ${ENVTEST_ASSETS_DIR}/setup-envtest.sh || curl -sSLo ${ENVTEST_ASSETS_DIR}/setup-envtest.sh https://raw.githubusercontent.com/kubernetes-sigs/controller-runtime/v0.8.3/hack/setup-envtest.sh
|
|
source ${ENVTEST_ASSETS_DIR}/setup-envtest.sh; fetch_envtest_tools $(ENVTEST_ASSETS_DIR); setup_envtest_env $(ENVTEST_ASSETS_DIR); go test ./pkg/... -coverprofile cover.out
|
|
|
|
##@ Build
|
|
|
|
build: manifests generate fmt vet ## Build manager binary.
|
|
go build -o bin/manager main.go
|
|
|
|
run: manifests generate fmt vet ## Run a controller from your host.
|
|
go run ./main.go
|
|
|
|
docker-build: ## Build docker image with the manager.
|
|
docker build -t ${IMG} .
|
|
|
|
docker-push: ## Push docker image with the manager.
|
|
docker push ${IMG}
|
|
|
|
# Build and push the multiarchitecture docker images and manifest.
|
|
docker-multiarch:
|
|
docker buildx build -f ./Dockerfile_multiarch --pull --no-cache --platform=$(PLATFORMS) --push . -t $(IMG)
|
|
##@ Deployment
|
|
|
|
install: manifests kustomize ## Install CRDs into the K8s cluster specified in ~/.kube/config.
|
|
$(KUSTOMIZE) build config/crd | kubectl apply -f -
|
|
|
|
uninstall: manifests kustomize ## Uninstall CRDs from the K8s cluster specified in ~/.kube/config.
|
|
$(KUSTOMIZE) build config/crd | kubectl delete -f -
|
|
|
|
deploy: manifests kustomize manifests ## Deploy controller to the K8s cluster specified in ~/.kube/config.
|
|
cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG}
|
|
$(KUSTOMIZE) build config/default | kubectl apply -f -
|
|
echo -e "resources:\n- manager.yaml" > config/manager/kustomization.yaml
|
|
|
|
undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config.
|
|
$(KUSTOMIZE) build config/default | kubectl delete -f -
|
|
|
|
|
|
CONTROLLER_GEN = $(shell pwd)/bin/controller-gen
|
|
controller-gen: ## Download controller-gen locally if necessary.
|
|
ifeq ("$(shell $(CONTROLLER_GEN) --version)", "Version: v0.7.0")
|
|
else
|
|
rm -rf $(CONTROLLER_GEN)
|
|
$(call go-get-tool,$(CONTROLLER_GEN),sigs.k8s.io/controller-tools/cmd/controller-gen@v0.7.0)
|
|
endif
|
|
|
|
KUSTOMIZE = $(shell pwd)/bin/kustomize
|
|
kustomize: ## Download kustomize locally if necessary.
|
|
$(call go-get-tool,$(KUSTOMIZE),sigs.k8s.io/kustomize/kustomize/v3@v3.8.7)
|
|
|
|
GINKGO = $(shell pwd)/bin/ginkgo
|
|
ginkgo: ## Download ginkgo locally if necessary.
|
|
$(call go-get-tool,$(GINKGO),github.com/onsi/ginkgo/ginkgo@v1.16.4)
|
|
|
|
HELM = $(shell pwd)/bin/helm
|
|
helm: ## Download helm locally if necessary.
|
|
$(call go-get-tool,$(HELM),helm.sh/helm/v3@v3.8.1)
|
|
|
|
# go-get-tool will 'go get' any package $2 and install it to $1.
|
|
PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST))))
|
|
define go-get-tool
|
|
@[ -f $(1) ] || { \
|
|
set -e ;\
|
|
TMP_DIR=$$(mktemp -d) ;\
|
|
cd $$TMP_DIR ;\
|
|
go mod init tmp ;\
|
|
echo "Downloading $(2)" ;\
|
|
GOBIN=$(PROJECT_DIR)/bin go get $(2) ;\
|
|
rm -rf $$TMP_DIR ;\
|
|
}
|
|
endef
|