|  | 
|  | 1 | +# VERSION defines the project version for the bundle. | 
|  | 2 | +# Update this value when you upgrade the version of your project. | 
|  | 3 | +# To re-generate a bundle for another specific version without changing the standard setup, you can: | 
|  | 4 | +# - use the VERSION as arg of the bundle target (e.g make bundle VERSION=0.0.2) | 
|  | 5 | +# - use environment variables to overwrite this value (e.g export VERSION=0.0.2) | 
|  | 6 | +VERSION ?= 0.0.1 | 
|  | 7 | + | 
|  | 8 | +# CHANNELS define the bundle channels used in the bundle. | 
|  | 9 | +# Add a new line here if you would like to change its default config. (E.g CHANNELS = "candidate,fast,stable") | 
|  | 10 | +# To re-generate a bundle for other specific channels without changing the standard setup, you can: | 
|  | 11 | +# - use the CHANNELS as arg of the bundle target (e.g make bundle CHANNELS=candidate,fast,stable) | 
|  | 12 | +# - use environment variables to overwrite this value (e.g export CHANNELS="candidate,fast,stable") | 
|  | 13 | +ifneq ($(origin CHANNELS), undefined) | 
|  | 14 | +BUNDLE_CHANNELS := --channels=$(CHANNELS) | 
|  | 15 | +endif | 
|  | 16 | + | 
|  | 17 | +# DEFAULT_CHANNEL defines the default channel used in the bundle. | 
|  | 18 | +# Add a new line here if you would like to change its default config. (E.g DEFAULT_CHANNEL = "stable") | 
|  | 19 | +# To re-generate a bundle for any other default channel without changing the default setup, you can: | 
|  | 20 | +# - use the DEFAULT_CHANNEL as arg of the bundle target (e.g make bundle DEFAULT_CHANNEL=stable) | 
|  | 21 | +# - use environment variables to overwrite this value (e.g export DEFAULT_CHANNEL="stable") | 
|  | 22 | +ifneq ($(origin DEFAULT_CHANNEL), undefined) | 
|  | 23 | +BUNDLE_DEFAULT_CHANNEL := --default-channel=$(DEFAULT_CHANNEL) | 
|  | 24 | +endif | 
|  | 25 | +BUNDLE_METADATA_OPTS ?= $(BUNDLE_CHANNELS) $(BUNDLE_DEFAULT_CHANNEL) | 
|  | 26 | + | 
|  | 27 | +# IMAGE_TAG_BASE defines the docker.io namespace and part of the image name for remote images. | 
|  | 28 | +# This variable is used to construct full image tags for bundle and catalog images. | 
|  | 29 | +# | 
|  | 30 | +# For example, running 'make bundle-build bundle-push catalog-build catalog-push' will build and push both | 
|  | 31 | +# nginx.org/operators-bundle:$VERSION and nginx.org/operators-catalog:$VERSION. | 
|  | 32 | +IMAGE_TAG_BASE ?= nginx.org/operators | 
|  | 33 | + | 
|  | 34 | +# BUNDLE_IMG defines the image:tag used for the bundle. | 
|  | 35 | +# You can use it as an arg. (E.g make bundle-build BUNDLE_IMG=<some-registry>/<project-name-bundle>:<tag>) | 
|  | 36 | +BUNDLE_IMG ?= $(IMAGE_TAG_BASE)-bundle:v$(VERSION) | 
|  | 37 | + | 
|  | 38 | +# BUNDLE_GEN_FLAGS are the flags passed to the operator-sdk generate bundle command | 
|  | 39 | +BUNDLE_GEN_FLAGS ?= -q --overwrite --version $(VERSION) $(BUNDLE_METADATA_OPTS) | 
|  | 40 | + | 
|  | 41 | +# USE_IMAGE_DIGESTS defines if images are resolved via tags or digests | 
|  | 42 | +# You can enable this value if you would like to use SHA Based Digests | 
|  | 43 | +# To enable set flag to true | 
|  | 44 | +USE_IMAGE_DIGESTS ?= false | 
|  | 45 | +ifeq ($(USE_IMAGE_DIGESTS), true) | 
|  | 46 | +	BUNDLE_GEN_FLAGS += --use-image-digests | 
|  | 47 | +endif | 
|  | 48 | + | 
|  | 49 | +# Set the Operator SDK version to use. By default, what is installed on the system is used. | 
|  | 50 | +# This is useful for CI or a project to utilize a specific version of the operator-sdk toolkit. | 
|  | 51 | +OPERATOR_SDK_VERSION ?= v1.41.1 | 
|  | 52 | + | 
|  | 53 | +# Container tool to use for building and pushing images | 
|  | 54 | +CONTAINER_TOOL ?= docker | 
|  | 55 | + | 
|  | 56 | +# Image URL to use all building/pushing image targets | 
|  | 57 | +IMG ?= controller:latest | 
|  | 58 | + | 
|  | 59 | +.PHONY: all | 
|  | 60 | +all: docker-build | 
|  | 61 | + | 
|  | 62 | +##@ General | 
|  | 63 | + | 
|  | 64 | +# The help target prints out all targets with their descriptions organized | 
|  | 65 | +# beneath their categories. The categories are represented by '##@' and the | 
|  | 66 | +# target descriptions by '##'. The awk commands is responsible for reading the | 
|  | 67 | +# entire set of makefiles included in this invocation, looking for lines of the | 
|  | 68 | +# file as xyz: ## something, and then pretty-format the target and help. Then, | 
|  | 69 | +# if there's a line with ##@ something, that gets pretty-printed as a category. | 
|  | 70 | +# More info on the usage of ANSI control characters for terminal formatting: | 
|  | 71 | +# https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters | 
|  | 72 | +# More info on the awk command: | 
|  | 73 | +# http://linuxcommand.org/lc3_adv_awk.php | 
|  | 74 | + | 
|  | 75 | +.PHONY: help | 
|  | 76 | +help: ## Display this help. | 
|  | 77 | +	@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) | 
|  | 78 | + | 
|  | 79 | +##@ Build | 
|  | 80 | + | 
|  | 81 | +.PHONY: run | 
|  | 82 | +run: helm-operator ## Run against the configured Kubernetes cluster in ~/.kube/config | 
|  | 83 | +	$(HELM_OPERATOR) run | 
|  | 84 | + | 
|  | 85 | +.PHONY: docker-build | 
|  | 86 | +docker-build: ## Build docker image with the manager. | 
|  | 87 | +	$(CONTAINER_TOOL) build -t ${IMG} . | 
|  | 88 | + | 
|  | 89 | +.PHONY: docker-push | 
|  | 90 | +docker-push: ## Push docker image with the manager. | 
|  | 91 | +	$(CONTAINER_TOOL) push ${IMG} | 
|  | 92 | + | 
|  | 93 | +# PLATFORMS defines the target platforms for  the manager image be build to provide support to multiple | 
|  | 94 | +# architectures. (i.e. make docker-buildx IMG=myregistry/mypoperator:0.0.1). To use this option you need to: | 
|  | 95 | +# - able to use docker buildx . More info: https://docs.docker.com/build/buildx/ | 
|  | 96 | +# - have enable BuildKit, More info: https://docs.docker.com/develop/develop-images/build_enhancements/ | 
|  | 97 | +# - be able to push the image for your registry (i.e. if you do not inform a valid value via IMG=<myregistry/image:<tag>> than the export will fail) | 
|  | 98 | +# To properly provided solutions that supports more than one platform you should use this option. | 
|  | 99 | +PLATFORMS ?= linux/arm64,linux/amd64,linux/s390x,linux/ppc64le | 
|  | 100 | +.PHONY: docker-buildx | 
|  | 101 | +docker-buildx: ## Build and push docker image for the manager for cross-platform support | 
|  | 102 | +	- $(CONTAINER_TOOL) buildx create --name project-v3-builder | 
|  | 103 | +	$(CONTAINER_TOOL) buildx use project-v3-builder | 
|  | 104 | +	- $(CONTAINER_TOOL) buildx build --push --platform=$(PLATFORMS) --tag ${IMG} -f Dockerfile . | 
|  | 105 | +	- $(CONTAINER_TOOL) buildx rm project-v3-builder | 
|  | 106 | + | 
|  | 107 | +##@ Deployment | 
|  | 108 | + | 
|  | 109 | +.PHONY: install | 
|  | 110 | +install: kustomize ## Install CRDs into the K8s cluster specified in ~/.kube/config. | 
|  | 111 | +	$(KUSTOMIZE) build config/crd | kubectl apply -f - | 
|  | 112 | + | 
|  | 113 | +.PHONY: uninstall | 
|  | 114 | +uninstall: kustomize ## Uninstall CRDs from the K8s cluster specified in ~/.kube/config. | 
|  | 115 | +	$(KUSTOMIZE) build config/crd | kubectl delete -f - | 
|  | 116 | + | 
|  | 117 | +.PHONY: deploy | 
|  | 118 | +deploy: kustomize ## Deploy controller to the K8s cluster specified in ~/.kube/config. | 
|  | 119 | +	cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG} | 
|  | 120 | +	$(KUSTOMIZE) build config/default | kubectl apply -f - | 
|  | 121 | + | 
|  | 122 | +.PHONY: undeploy | 
|  | 123 | +undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config. | 
|  | 124 | +	$(KUSTOMIZE) build config/default | kubectl delete -f - | 
|  | 125 | + | 
|  | 126 | +OS := $(shell uname -s | tr '[:upper:]' '[:lower:]') | 
|  | 127 | +ARCH := $(shell uname -m | sed 's/x86_64/amd64/' | sed 's/aarch64/arm64/') | 
|  | 128 | + | 
|  | 129 | +.PHONY: kustomize | 
|  | 130 | +KUSTOMIZE = $(shell pwd)/bin/kustomize | 
|  | 131 | +kustomize: ## Download kustomize locally if necessary. | 
|  | 132 | +ifeq (,$(wildcard $(KUSTOMIZE))) | 
|  | 133 | +ifeq (,$(shell which kustomize 2>/dev/null)) | 
|  | 134 | +	@{ \ | 
|  | 135 | +	set -e ;\ | 
|  | 136 | +	mkdir -p $(dir $(KUSTOMIZE)) ;\ | 
|  | 137 | +	curl -sSLo - https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v5.6.0/kustomize_v5.6.0_$(OS)_$(ARCH).tar.gz | \ | 
|  | 138 | +	tar xzf - -C bin/ ;\ | 
|  | 139 | +	} | 
|  | 140 | +else | 
|  | 141 | +KUSTOMIZE = $(shell which kustomize) | 
|  | 142 | +endif | 
|  | 143 | +endif | 
|  | 144 | + | 
|  | 145 | +.PHONY: helm-operator | 
|  | 146 | +HELM_OPERATOR = $(shell pwd)/bin/helm-operator | 
|  | 147 | +helm-operator: ## Download helm-operator locally if necessary, preferring the $(pwd)/bin path over global if both exist. | 
|  | 148 | +ifeq (,$(wildcard $(HELM_OPERATOR))) | 
|  | 149 | +ifeq (,$(shell which helm-operator 2>/dev/null)) | 
|  | 150 | +	@{ \ | 
|  | 151 | +	set -e ;\ | 
|  | 152 | +	mkdir -p $(dir $(HELM_OPERATOR)) ;\ | 
|  | 153 | +	curl -sSLo $(HELM_OPERATOR) https://github.com/operator-framework/operator-sdk/releases/download/v1.41.1/helm-operator_$(OS)_$(ARCH) ;\ | 
|  | 154 | +	chmod +x $(HELM_OPERATOR) ;\ | 
|  | 155 | +	} | 
|  | 156 | +else | 
|  | 157 | +HELM_OPERATOR = $(shell which helm-operator) | 
|  | 158 | +endif | 
|  | 159 | +endif | 
|  | 160 | + | 
|  | 161 | +.PHONY: operator-sdk | 
|  | 162 | +OPERATOR_SDK ?= $(LOCALBIN)/operator-sdk | 
|  | 163 | +operator-sdk: ## Download operator-sdk locally if necessary. | 
|  | 164 | +ifeq (,$(wildcard $(OPERATOR_SDK))) | 
|  | 165 | +ifeq (, $(shell which operator-sdk 2>/dev/null)) | 
|  | 166 | +	@{ \ | 
|  | 167 | +	set -e ;\ | 
|  | 168 | +	mkdir -p $(dir $(OPERATOR_SDK)) ;\ | 
|  | 169 | +	curl -sSLo $(OPERATOR_SDK) https://github.com/operator-framework/operator-sdk/releases/download/$(OPERATOR_SDK_VERSION)/operator-sdk_$(OS)_$(ARCH) ;\ | 
|  | 170 | +	chmod +x $(OPERATOR_SDK) ;\ | 
|  | 171 | +	} | 
|  | 172 | +else | 
|  | 173 | +OPERATOR_SDK = $(shell which operator-sdk) | 
|  | 174 | +endif | 
|  | 175 | +endif | 
|  | 176 | + | 
|  | 177 | + | 
|  | 178 | +.PHONY: bundle | 
|  | 179 | +bundle: kustomize operator-sdk ## Generate bundle manifests and metadata, then validate generated files. | 
|  | 180 | +	$(OPERATOR_SDK) generate kustomize manifests -q | 
|  | 181 | +	cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG) | 
|  | 182 | +	$(KUSTOMIZE) build config/manifests | $(OPERATOR_SDK) generate bundle $(BUNDLE_GEN_FLAGS) | 
|  | 183 | +	$(OPERATOR_SDK) bundle validate ./bundle | 
|  | 184 | + | 
|  | 185 | +.PHONY: bundle-build | 
|  | 186 | +bundle-build: ## Build the bundle image. | 
|  | 187 | +	$(CONTAINER_TOOL) build -f bundle.Dockerfile -t $(BUNDLE_IMG) . | 
|  | 188 | + | 
|  | 189 | +.PHONY: bundle-push | 
|  | 190 | +bundle-push: ## Push the bundle image. | 
|  | 191 | +	$(MAKE) docker-push IMG=$(BUNDLE_IMG) | 
|  | 192 | + | 
|  | 193 | +.PHONY: opm | 
|  | 194 | +OPM = $(LOCALBIN)/opm | 
|  | 195 | +opm: ## Download opm locally if necessary. | 
|  | 196 | +ifeq (,$(wildcard $(OPM))) | 
|  | 197 | +ifeq (,$(shell which opm 2>/dev/null)) | 
|  | 198 | +	@{ \ | 
|  | 199 | +	set -e ;\ | 
|  | 200 | +	mkdir -p $(dir $(OPM)) ;\ | 
|  | 201 | +	curl -sSLo $(OPM) https://github.com/operator-framework/operator-registry/releases/download/v1.55.0/$(OS)-$(ARCH)-opm ;\ | 
|  | 202 | +	chmod +x $(OPM) ;\ | 
|  | 203 | +	} | 
|  | 204 | +else | 
|  | 205 | +OPM = $(shell which opm) | 
|  | 206 | +endif | 
|  | 207 | +endif | 
|  | 208 | + | 
|  | 209 | +# A comma-separated list of bundle images (e.g. make catalog-build BUNDLE_IMGS=example.com/operator-bundle:v0.1.0,example.com/operator-bundle:v0.2.0). | 
|  | 210 | +# These images MUST exist in a registry and be pull-able. | 
|  | 211 | +BUNDLE_IMGS ?= $(BUNDLE_IMG) | 
|  | 212 | + | 
|  | 213 | +# The image tag given to the resulting catalog image (e.g. make catalog-build CATALOG_IMG=example.com/operator-catalog:v0.2.0). | 
|  | 214 | +CATALOG_IMG ?= $(IMAGE_TAG_BASE)-catalog:v$(VERSION) | 
|  | 215 | + | 
|  | 216 | +# Set CATALOG_BASE_IMG to an existing catalog image tag to add $BUNDLE_IMGS to that image. | 
|  | 217 | +ifneq ($(origin CATALOG_BASE_IMG), undefined) | 
|  | 218 | +FROM_INDEX_OPT := --from-index $(CATALOG_BASE_IMG) | 
|  | 219 | +endif | 
|  | 220 | + | 
|  | 221 | +# Build a catalog image by adding bundle images to an empty catalog using the operator package manager tool, 'opm'. | 
|  | 222 | +# This recipe invokes 'opm' in 'semver' bundle add mode. For more information on add modes, see: | 
|  | 223 | +# https://github.com/operator-framework/community-operators/blob/7f1438c/docs/packaging-operator.md#updating-your-existing-operator | 
|  | 224 | +.PHONY: catalog-build | 
|  | 225 | +catalog-build: opm ## Build a catalog image. | 
|  | 226 | +	$(OPM) index add --container-tool $(CONTAINER_TOOL) --mode semver --tag $(CATALOG_IMG) --bundles $(BUNDLE_IMGS) $(FROM_INDEX_OPT) | 
|  | 227 | + | 
|  | 228 | +# Push the catalog image. | 
|  | 229 | +.PHONY: catalog-push | 
|  | 230 | +catalog-push: ## Push a catalog image. | 
|  | 231 | +	$(MAKE) docker-push IMG=$(CATALOG_IMG) | 
0 commit comments