11CHART_REPO_URL ?= http://example.com
22HELM_REPO_DEST ?= /tmp/gh-pages
33OPERATOR_NAME ?=$(shell basename -z `pwd`)
4+ HELM_VERSION ?= v3.8.0
5+ KIND_VERSION ?= v0.11.1
6+ KUBECTL_VERSION ?= v1.21.1
7+ VAULT_VERSION ?= 1.9.3
48
59# VERSION defines the project version for the bundle.
610# Update this value when you upgrade the version of your project.
@@ -94,6 +98,13 @@ vet: ## Run go vet against code.
9498test : manifests generate fmt vet envtest # # Run tests.
9599 KUBEBUILDER_ASSETS=" $( shell $( ENVTEST) use $( ENVTEST_K8S_VERSION) -p path) " go test ./... -coverprofile cover.out
96100
101+ .PHONY : kind-setup
102+ kind-setup : kind kubectl helm
103+ $(KIND ) delete cluster
104+ $(KIND ) create cluster --image docker.io/kindest/node:$(KUBECTL_VERSION ) --config=./integration/cluster-kind.yaml
105+ $(HELM ) upgrade ingress-nginx ./integration/helm/ingress-nginx -i --create-namespace -n ingress-nginx --atomic
106+ $(KUBECTL ) wait --namespace ingress-nginx --for=condition=ready pod --selector=app.kubernetes.io/component=controller --timeout=90s
107+
97108# #@ Build
98109
99110build : generate fmt vet # # Build manager binary.
@@ -110,18 +121,18 @@ docker-push: ## Push docker image with the manager.
110121
111122# #@ Deployment
112123
113- install : manifests kustomize # # Install CRDs into the K8s cluster specified in ~/.kube/config.
114- $(KUSTOMIZE ) build config/crd | kubectl apply -f -
124+ install : manifests kustomize kubectl # # Install CRDs into the K8s cluster specified in ~/.kube/config.
125+ $(KUSTOMIZE ) build config/crd | $( KUBECTL ) apply -f -
115126
116- uninstall : manifests kustomize # # Uninstall CRDs from the K8s cluster specified in ~/.kube/config.
117- $(KUSTOMIZE ) build config/crd | kubectl delete -f -
127+ uninstall : manifests kustomize kubectl # # Uninstall CRDs from the K8s cluster specified in ~/.kube/config.
128+ $(KUSTOMIZE ) build config/crd | $( KUBECTL ) delete -f -
118129
119- deploy : manifests kustomize # # Deploy controller to the K8s cluster specified in ~/.kube/config.
130+ deploy : manifests kustomize kubectl # # Deploy controller to the K8s cluster specified in ~/.kube/config.
120131 cd config/manager && $(KUSTOMIZE ) edit set image controller=${IMG}
121- $(KUSTOMIZE ) build config/default | kubectl apply -f -
132+ $(KUSTOMIZE ) build config/default | $( KUBECTL ) apply -f -
122133
123- undeploy : # # Undeploy controller from the K8s cluster specified in ~/.kube/config.
124- $(KUSTOMIZE ) build config/default | kubectl delete -f -
134+ undeploy : kustomize kubectl # # Undeploy controller from the K8s cluster specified in ~/.kube/config.
135+ $(KUSTOMIZE ) build config/default | $( KUBECTL ) delete -f -
125136
126137
127138CONTROLLER_GEN = $(shell pwd) /bin/controller-gen
@@ -207,7 +218,7 @@ catalog-push: ## Push a catalog image.
207218 $(MAKE ) docker-push IMG=$(CATALOG_IMG )
208219
209220# Generate helm chart
210- helmchart : kustomize
221+ helmchart : kustomize helm
211222 mkdir -p ./charts/${OPERATOR_NAME} /templates
212223 mkdir -p ./charts/${OPERATOR_NAME} /crds
213224 repo=${OPERATOR_NAME} envsubst < ./config/local-development/tilt/env-replace-image.yaml > ./config/local-development/tilt/replace-image.yaml
@@ -220,15 +231,80 @@ helmchart: kustomize
220231 version=${VERSION} image_repo=$$ {IMG%:* } envsubst < ./config/helmchart/values.yaml.tpl > ./charts/${OPERATOR_NAME} /values.yaml
221232 sed -i ' 1s/^/{{ if .Values.enableMonitoring }}/' ./charts/${OPERATOR_NAME} /templates/monitoring.coreos.com_v1_servicemonitor_${OPERATOR_NAME} -controller-manager-metrics-monitor.yaml
222233 echo {{ end }} >> ./charts/${OPERATOR_NAME} /templates/monitoring.coreos.com_v1_servicemonitor_${OPERATOR_NAME} -controller-manager-metrics-monitor.yaml
223- helm lint ./charts/${OPERATOR_NAME}
234+ $( HELM ) lint ./charts/${OPERATOR_NAME}
224235
225236helmchart-repo : helmchart
226237 mkdir -p ${HELM_REPO_DEST} /${OPERATOR_NAME}
227- helm package -d ${HELM_REPO_DEST} /${OPERATOR_NAME} ./charts/${OPERATOR_NAME}
228- helm repo index --url ${CHART_REPO_URL} ${HELM_REPO_DEST}
238+ $( HELM ) package -d ${HELM_REPO_DEST} /${OPERATOR_NAME} ./charts/${OPERATOR_NAME}
239+ $( HELM ) repo index --url ${CHART_REPO_URL} ${HELM_REPO_DEST}
229240
230241helmchart-repo-push : helmchart-repo
231242 git -C ${HELM_REPO_DEST} add .
232243 git -C ${HELM_REPO_DEST} status
233244 git -C ${HELM_REPO_DEST} commit -m " Release ${VERSION} "
234245 git -C ${HELM_REPO_DEST} push origin " gh-pages"
246+
247+ HELM_TEST_IMG_NAME ?= ${OPERATOR_NAME}
248+ HELM_TEST_IMG_TAG ?= helmchart-test
249+
250+ # Deploy the helmchart to a kind cluster to test deployment.
251+ # If the test-metrics sidecar in the prometheus pod is ready, the metrics work and the test is successful.
252+ .PHONY : helmchart-test
253+ helmchart-test : kind-setup helmchart
254+ $(MAKE ) IMG=${HELM_TEST_IMG_NAME} :${HELM_TEST_IMG_TAG} docker-build
255+ docker tag ${HELM_TEST_IMG_NAME} :${HELM_TEST_IMG_TAG} docker.io/library/${HELM_TEST_IMG_NAME} :${HELM_TEST_IMG_TAG}
256+ $(KIND ) load docker-image ${HELM_TEST_IMG_NAME} :${HELM_TEST_IMG_TAG} docker.io/library/${HELM_TEST_IMG_NAME} :${HELM_TEST_IMG_TAG}
257+ $(HELM ) repo add jetstack https://charts.jetstack.io
258+ $(HELM ) install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.7.1 --set installCRDs=true
259+ $(HELM ) repo add prometheus-community https://prometheus-community.github.io/helm-charts
260+ $(HELM ) install kube-prometheus-stack prometheus-community/kube-prometheus-stack -n default -f integration/kube-prometheus-stack-values.yaml
261+ $(HELM ) install prometheus-rbac integration/helm/prometheus-rbac -n default
262+ $(HELM ) upgrade -i ${OPERATOR_NAME} -local charts/${OPERATOR_NAME} -n ${OPERATOR_NAME} -local --create-namespace \
263+ --set enableCertManager=true \
264+ --set image.repository=${HELM_TEST_IMG_NAME} \
265+ --set image.tag=${HELM_TEST_IMG_TAG}
266+ $(KUBECTL ) wait --namespace ${OPERATOR_NAME} -local --for=condition=ready pod --selector=app.kubernetes.io/name=${OPERATOR_NAME} --timeout=90s
267+ $(KUBECTL ) wait --namespace default --for=condition=ready pod prometheus-kube-prometheus-stack-prometheus-0 --timeout=180s
268+ $(KUBECTL ) exec prometheus-kube-prometheus-stack-prometheus-0 -n default -c test-metrics -- /bin/sh -c " echo 'Example metrics...' && cat /tmp/ready"
269+
270+ .PHONY : kind
271+ KIND = ./bin/kind
272+ kind : # # Download kind locally if necessary.
273+ ifeq (,$(wildcard $(KIND ) ) )
274+ ifeq (,$(shell which kind 2>/dev/null) )
275+ $(call go-get-tool,$(KIND),sigs.k8s.io/kind@${KIND_VERSION})
276+ else
277+ KIND = $(shell which kind)
278+ endif
279+ endif
280+
281+ .PHONY : kubectl
282+ KUBECTL = ./bin/kubectl
283+ kubectl : # # Download kubectl locally if necessary.
284+ ifeq (,$(wildcard $(KUBECTL ) ) )
285+ ifeq (,$(shell which kubectl 2>/dev/null) )
286+ echo "Downloading ${KUBECTL} for managing k8s resources."
287+ OS=$(shell go env GOOS) ;\
288+ ARCH=$(shell go env GOARCH) ;\
289+ curl --create-dirs -sSLo ${KUBECTL} https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/$${OS}/$${ARCH}/kubectl ;\
290+ chmod +x ${KUBECTL}
291+ else
292+ KUBECTL = $(shell which kubectl)
293+ endif
294+ endif
295+
296+ .PHONY : helm
297+ HELM = ./bin/helm
298+ helm : # # Download helm locally if necessary.
299+ ifeq (,$(wildcard $(HELM ) ) )
300+ ifeq (,$(shell which helm 2>/dev/null) )
301+ echo "Downloading ${HELM}."
302+ OS=$(shell go env GOOS) ;\
303+ ARCH=$(shell go env GOARCH) ;\
304+ curl --create-dirs -sSLo ${HELM}.tar.gz https://get.helm.sh/helm-${HELM_VERSION}-$${OS}-$${ARCH}.tar.gz ;\
305+ tar -xf ${HELM}.tar.gz -C ./bin/ ;\
306+ mv ./bin/$${OS}-$${ARCH}/helm ${HELM}
307+ else
308+ HELM = $(shell which helm)
309+ endif
310+ endif
0 commit comments