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) $( ENVTEST_K8S_VERSION) ) " 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 ) 
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 ) 
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 ) 
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 ) 
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 }}/' ${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 ) ${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 ) ${HELM_REPO_DEST} /${OPERATOR_NAME}  ./charts/${OPERATOR_NAME} 
239+ 	$( HELM ) ${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