From edcafed4a2ff88470b9453f3fb410be73d8b96f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aitor=20P=C3=A9rez=20Cedres?= Date: Fri, 18 Aug 2023 16:32:42 +0100 Subject: [PATCH] Refactor Makefile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some variables were mandatory for every target, even tho those were not used at all in most targets. For example, building the operator binary does not require information about the registry, yet, variables with information registry were checked and failed if not present. After this change, the variables are only checked in the targets relevant to those variables. For example, docker-push now checks that registry and operator image are set. It is no longer required to have all variables defined. The targets that make use of the variables will check and fail if variables are not set, with a relevant error message as of what target requires them. Signed-off-by: Aitor PĂ©rez Cedres --- Makefile | 151 ++++++++++++++++++++++++++++--------------------- go.mod | 5 +- go.sum | 12 ++-- tools/tools.go | 1 + 4 files changed, 97 insertions(+), 72 deletions(-) diff --git a/Makefile b/Makefile index 4d3a3234a..2196495c4 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,29 @@ SHELL := bash platform := $(shell uname | tr A-Z a-z) +ARCHITECTURE := $(shell uname -m) + +ifeq ($(ARCHITECTURE),x86_64) + ARCHITECTURE=amd64 +endif .DEFAULT_GOAL = help .PHONY: help help: @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' -ENVTEST_K8S_VERSION ?= 1.22.1 -ARCHITECTURE = amd64 +### Helper functions +### https://stackoverflow.com/questions/10858261/how-to-abort-makefile-if-variable-not-set +check_defined = \ + $(strip $(foreach 1,$1, \ + $(call __check_defined,$1,$(strip $(value 2))))) +__check_defined = \ + $(if $(value $1),, \ + $(error Undefined $1$(if $2, ($2))$(if $(value @), \ + required by target '$@'))) +### + +# The latest 1.25 available for envtest +ENVTEST_K8S_VERSION ?= 1.25.0 LOCAL_TESTBIN = $(CURDIR)/testbin $(LOCAL_TESTBIN): mkdir -p $@ @@ -25,11 +41,15 @@ SYSTEM_TEST_NAMESPACE ?= rabbitmq-system export KUBEBUILDER_ASSETS = $(LOCAL_TESTBIN)/k8s/$(ENVTEST_K8S_VERSION)-$(platform)-$(ARCHITECTURE) $(KUBEBUILDER_ASSETS): - setup-envtest --os $(platform) --arch $(ARCHITECTURE) --bin-dir $(LOCAL_TESTBIN) use $(ENVTEST_K8S_VERSION) + setup-envtest -v info --os $(platform) --arch $(ARCHITECTURE) --bin-dir $(LOCAL_TESTBIN) use $(ENVTEST_K8S_VERSION) .PHONY: kubebuilder-assets kubebuilder-assets: $(KUBEBUILDER_ASSETS) +.PHONY: kubebuilder-assets-rm +kubebuilder-assets-rm: + setup-envtest -v debug --os $(platform) --arch $(ARCHITECTURE) --bin-dir $(LOCAL_TESTBIN) cleanup + .PHONY: unit-tests unit-tests: install-tools $(KUBEBUILDER_ASSETS) generate fmt vet vuln manifests ## Run unit tests ginkgo -r --randomize-all api/ internal/ pkg/ @@ -52,6 +72,11 @@ api-reference: install-tools ## Generate API reference documentation --output-path ./docs/api/rabbitmq.com.ref.asciidoc \ --max-depth 30 +.PHONY: checks +checks::fmt ## Runs fmt + vet +govulncheck against the current code +checks::vet +checks::vuln + # Run go fmt against code fmt: go fmt ./... @@ -70,7 +95,7 @@ generate: install-tools api-reference controller-gen object:headerFile=./hack/NOTICE.go.txt paths=./internal/status/... # Build manager binary -manager: generate fmt vet vuln +manager: generate checks go mod download go build -o bin/manager main.go @@ -79,6 +104,8 @@ deploy-manager: ## Deploy manager kustomize build config/default/base | kubectl apply -f - deploy-manager-dev: + @$(call check_defined, OPERATOR_IMAGE, path to the Operator image within the registry e.g. rabbitmq/cluster-operator) + @$(call check_defined, DOCKER_REGISTRY_SERVER, URL of docker registry containing the Operator image e.g. registry.my-company.com) kustomize build config/crd | kubectl apply -f - kustomize build config/default/overlays/dev | sed 's@((operator_docker_image))@"$(DOCKER_REGISTRY_SERVER)/$(OPERATOR_IMAGE):$(GIT_COMMIT)"@' | kubectl apply -f - @@ -91,12 +118,22 @@ destroy: ## Cleanup all controller artefacts kustomize build config/rbac/ | kubectl delete --ignore-not-found=true -f - kustomize build config/namespace/base/ | kubectl delete --ignore-not-found=true -f - -run: generate manifests fmt vet vuln install deploy-namespace-rbac just-run ## Run operator binary locally against the configured Kubernetes cluster in ~/.kube/config +.PHONY: run +run::generate ## Run operator binary locally against the configured Kubernetes cluster in ~/.kube/config +run::manifests +run::checks +run::install +run::deploy-namespace-rbac +run::just-run just-run: ## Just runs 'go run main.go' without regenerating any manifests or deploying RBACs KUBECONFIG=${HOME}/.kube/config OPERATOR_NAMESPACE=$(K8S_OPERATOR_NAMESPACE) go run ./main.go -metrics-bind-address 127.0.0.1:9782 --zap-devel $(OPERATOR_ARGS) -delve: generate install deploy-namespace-rbac just-delve ## Deploys CRD, Namespace, RBACs and starts Delve debugger +.PHONY: delve +delve::generate ## Deploys CRD, Namespace, RBACs and starts Delve debugger +delve::install +delve::deploy-namespace-rbac +delve::just-delve just-delve: install-tools ## Just starts Delve debugger KUBECONFIG=${HOME}/.kube/config OPERATOR_NAMESPACE=$(K8S_OPERATOR_NAMESPACE) dlv debug @@ -108,17 +145,28 @@ deploy-namespace-rbac: kustomize build config/namespace/base | kubectl apply -f - kustomize build config/rbac | kubectl apply -f - -deploy: manifests deploy-namespace-rbac deploy-manager ## Deploy operator in the configured Kubernetes cluster in ~/.kube/config - -deploy-dev: check-env-docker-credentials docker-build-dev manifests deploy-namespace-rbac docker-registry-secret deploy-manager-dev ## Deploy operator in the configured Kubernetes cluster in ~/.kube/config, with local changes - -deploy-kind: check-env-docker-repo git-commit-sha manifests deploy-namespace-rbac ## Load operator image and deploy operator into current KinD cluster +.PHONY: deploy +deploy::manifests ## Deploy operator in the configured Kubernetes cluster in ~/.kube/config +deploy::deploy-namespace-rbac +deploy::deploy-manager + +.PHONY: deploy-dev +deploy-dev::docker-build-dev ## Deploy operator in the configured Kubernetes cluster in ~/.kube/config, with local changes +deploy-dev::manifests +deploy-dev::deploy-namespace-rbac +deploy-dev::docker-registry-secret +deploy-dev::deploy-manager-dev + +GIT_COMMIT := $(shell git rev-parse --short HEAD) +deploy-kind: manifests deploy-namespace-rbac ## Load operator image and deploy operator into current KinD cluster + @$(call check_defined, OPERATOR_IMAGE, path to the Operator image within the registry e.g. rabbitmq/cluster-operator) + @$(call check_defined, DOCKER_REGISTRY_SERVER, URL of docker registry containing the Operator image e.g. registry.my-company.com) docker buildx build --build-arg=GIT_COMMIT=$(GIT_COMMIT) -t $(DOCKER_REGISTRY_SERVER)/$(OPERATOR_IMAGE):$(GIT_COMMIT) . kind load docker-image $(DOCKER_REGISTRY_SERVER)/$(OPERATOR_IMAGE):$(GIT_COMMIT) kustomize build config/crd | kubectl apply -f - kustomize build config/default/overlays/kind | sed 's@((operator_docker_image))@"$(DOCKER_REGISTRY_SERVER)/$(OPERATOR_IMAGE):$(GIT_COMMIT)"@' | kubectl apply -f - -YTT_VERSION ?= v0.44.1 +YTT_VERSION ?= v0.45.3 YTT = $(LOCAL_TESTBIN)/ytt $(YTT): | $(LOCAL_TESTBIN) mkdir -p $(LOCAL_TESTBIN) @@ -132,22 +180,19 @@ generate-installation-manifest: | $(YTT) kustomize build config/installation/ > releases/cluster-operator.yml $(YTT) -f releases/cluster-operator.yml -f config/ytt/overlay-manager-image.yaml --data-value operator_image=$(QUAY_IO_OPERATOR_IMAGE) > releases/cluster-operator-quay-io.yml -# Build the docker image -docker-build: check-env-docker-repo git-commit-sha +docker-build: ## Build the docker image with tag `latest` + @$(call check_defined, OPERATOR_IMAGE, path to the Operator image within the registry e.g. rabbitmq/cluster-operator) + @$(call check_defined, DOCKER_REGISTRY_SERVER, URL of docker registry containing the Operator image e.g. registry.my-company.com) docker buildx build --build-arg=GIT_COMMIT=$(GIT_COMMIT) -t $(DOCKER_REGISTRY_SERVER)/$(OPERATOR_IMAGE):latest . -# Push the docker image -docker-push: check-env-docker-repo +docker-push: ## Push the docker image with tag `latest` + @$(call check_defined, OPERATOR_IMAGE, path to the Operator image within the registry e.g. rabbitmq/cluster-operator) + @$(call check_defined, DOCKER_REGISTRY_SERVER, URL of docker registry containing the Operator image e.g. registry.my-company.com) docker push $(DOCKER_REGISTRY_SERVER)/$(OPERATOR_IMAGE):latest -git-commit-sha: -ifeq ("", git diff --stat) -GIT_COMMIT=$(shell git rev-parse --short HEAD) -else -GIT_COMMIT=$(shell git rev-parse --short HEAD)- -endif - -docker-build-dev: check-env-docker-repo git-commit-sha +docker-build-dev: + @$(call check_defined, OPERATOR_IMAGE, path to the Operator image within the registry e.g. rabbitmq/cluster-operator) + @$(call check_defined, DOCKER_REGISTRY_SERVER, URL of docker registry containing the Operator image e.g. registry.my-company.com) docker buildx build --build-arg=GIT_COMMIT=$(GIT_COMMIT) -t $(DOCKER_REGISTRY_SERVER)/$(OPERATOR_IMAGE):$(GIT_COMMIT) . docker push $(DOCKER_REGISTRY_SERVER)/$(OPERATOR_IMAGE):$(GIT_COMMIT) @@ -159,7 +204,7 @@ $(CMCTL): | $(LOCAL_TMP) $(LOCAL_TESTBIN) CERT_MANAGER_VERSION ?= 1.9.2 .PHONY: cert-manager -cert-manager: | $(CMCTL) ## Setup cert-manager +cert-manager: | $(CMCTL) ## Setup cert-manager. Use CERT_MANAGER_VERSION to customise the version e.g. CERT_MANAGER_VERSION="1.9.2" @echo "Installing Cert Manager" kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v$(CERT_MANAGER_VERSION)/cert-manager.yaml $(CMCTL) check api --wait=5m @@ -169,54 +214,28 @@ cert-manager-rm: @echo "Deleting Cert Manager" kubectl delete -f https://github.com/cert-manager/cert-manager/releases/download/v$(CERT_MANAGER_VERSION)/cert-manager.yaml --ignore-not-found -kind-prepare: ## Prepare KIND to support LoadBalancer services - # Note that created LoadBalancer services will have an unreachable external IP - @kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/namespace.yaml - @kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml - @kubectl apply -f config/metallb/config.yaml - @kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(shell openssl rand -base64 128)" - -kind-unprepare: ## Remove KIND support for LoadBalancer services - # remove MetalLB - @kubectl delete -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml - @kubectl delete -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/namespace.yaml - system-tests: install-tools ## Run end-to-end tests against Kubernetes cluster defined in ~/.kube/config NAMESPACE="$(SYSTEM_TEST_NAMESPACE)" K8S_OPERATOR_NAMESPACE="$(K8S_OPERATOR_NAMESPACE)" ginkgo -nodes=3 --randomize-all -r system_tests/ kubectl-plugin-tests: ## Run kubectl-rabbitmq tests - echo "running kubectl plugin tests" + @echo "running kubectl plugin tests" PATH=$(PWD)/bin:$$PATH ./bin/kubectl-rabbitmq.bats -tests: unit-tests integration-tests system-tests kubectl-plugin-tests - -docker-registry-secret: check-env-docker-credentials - echo "creating registry secret and patching default service account" +.PHONY: tests +tests::unit-tests ## Runs all test suites: unit, integration, system and kubectl-plugin +tests::integration-tests +tests::system-tests +tests::kubectl-plugin-tests + +docker-registry-secret: + @$(call check_defined, DOCKER_REGISTRY_SERVER, URL of docker registry containing the Operator image e.g. registry.my-company.com) + @$(call check_defined, DOCKER_REGISTRY_USERNAME, Username for accessing the docker registry e.g. robot-123) + @$(call check_defined, DOCKER_REGISTRY_PASSWORD, Password for accessing the docker registry e.g. password) + @$(call check_defined, DOCKER_REGISTRY_SECRET, Name of Kubernetes secret in which to store the Docker registry username and password) + @printf "creating registry secret and patching default service account" @kubectl -n $(K8S_OPERATOR_NAMESPACE) create secret docker-registry $(DOCKER_REGISTRY_SECRET) --docker-server='$(DOCKER_REGISTRY_SERVER)' --docker-username="$$DOCKER_REGISTRY_USERNAME" --docker-password="$$DOCKER_REGISTRY_PASSWORD" || true @kubectl -n $(K8S_OPERATOR_NAMESPACE) patch serviceaccount rabbitmq-cluster-operator -p '{"imagePullSecrets": [{"name": "$(DOCKER_REGISTRY_SECRET)"}]}' +.PHONY: install-tools install-tools: - go mod download - grep _ tools/tools.go | awk -F '"' '{print $$2}' | xargs -t go install - go install "golang.org/x/vuln/cmd/govulncheck@latest" - -check-env-docker-repo: check-env-registry-server -ifndef OPERATOR_IMAGE - $(error OPERATOR_IMAGE is undefined: path to the Operator image within the registry specified in DOCKER_REGISTRY_SERVER (e.g. rabbitmq/cluster-operator - without leading slash)) -endif - -check-env-docker-credentials: check-env-registry-server -ifndef DOCKER_REGISTRY_USERNAME - $(error DOCKER_REGISTRY_USERNAME is undefined: Username for accessing the docker registry) -endif -ifndef DOCKER_REGISTRY_PASSWORD - $(error DOCKER_REGISTRY_PASSWORD is undefined: Password for accessing the docker registry) -endif -ifndef DOCKER_REGISTRY_SECRET - $(error DOCKER_REGISTRY_SECRET is undefined: Name of Kubernetes secret in which to store the Docker registry username and password) -endif - -check-env-registry-server: -ifndef DOCKER_REGISTRY_SERVER - $(error DOCKER_REGISTRY_SERVER is undefined: URL of docker registry containing the Operator image (e.g. registry.my-company.com)) -endif + grep _ tools/tools.go | awk -F '"' '{print $$2}' | xargs -t go install -mod=mod diff --git a/go.mod b/go.mod index 9508e8dd5..c2baaa4d4 100644 --- a/go.mod +++ b/go.mod @@ -17,6 +17,7 @@ require ( github.com/sclevine/yj v0.0.0-20200815061347-554173e71934 golang.org/x/mod v0.12.0 golang.org/x/net v0.14.0 + golang.org/x/vuln v1.0.1 gopkg.in/ini.v1 v1.67.0 k8s.io/api v0.27.2 k8s.io/apimachinery v0.27.4 @@ -117,12 +118,12 @@ require ( go.uber.org/zap v1.24.0 // indirect golang.org/x/crypto v0.12.0 // indirect golang.org/x/oauth2 v0.5.0 // indirect - golang.org/x/sync v0.2.0 // indirect + golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.11.0 // indirect golang.org/x/term v0.11.0 // indirect golang.org/x/text v0.12.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.9.3 // indirect + golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect gomodules.xyz/jsonpatch/v2 v2.3.0 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/go.sum b/go.sum index a26ff456d..9411ecd11 100644 --- a/go.sum +++ b/go.sum @@ -119,6 +119,7 @@ github.com/google/certificate-transparency-go v1.1.4 h1:hCyXHDbtqlr/lMXU0D4Wgbal github.com/google/certificate-transparency-go v1.1.4/go.mod h1:D6lvbfwckhNrbM9WVl1EVeMOyzC19mpIjMOI4nxBHtQ= github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/go-cmdtest v0.4.1-0.20220921163831-55ab3332a786 h1:rcv+Ippz6RAtvaGgKxc+8FQIpxHgsF+HBzPyYL2cyVU= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -133,6 +134,7 @@ github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 h1:SJ+NtwL6QaZ21U+IrK7d0gGgpjGGvd2kz+FzTHVzdqI= github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2/go.mod h1:Tv1PlzqC9t8wNnpPdctvtSUOPUUg4SHeE6vR1Ir2hmg= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= @@ -415,8 +417,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -496,8 +498,10 @@ golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 h1:Vve/L0v7CXXuxUmaMGIEK/dEeq7uiqb5qBgQrZzIE7E= +golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/vuln v1.0.1 h1:KUas02EjQK5LTuIx1OylBQdKKZ9jeugs+HiqO5HormU= +golang.org/x/vuln v1.0.1/go.mod h1:bb2hMwln/tqxg32BNY4CcxHWtHXuYa3SbIBmtsyjxtM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/tools/tools.go b/tools/tools.go index 7421b4572..29f5911e3 100644 --- a/tools/tools.go +++ b/tools/tools.go @@ -8,6 +8,7 @@ import ( _ "github.com/mikefarah/yq/v4" _ "github.com/onsi/ginkgo/v2/ginkgo" _ "github.com/sclevine/yj" + _ "golang.org/x/vuln/cmd/govulncheck" _ "sigs.k8s.io/controller-runtime/tools/setup-envtest" _ "sigs.k8s.io/controller-tools/cmd/controller-gen" _ "sigs.k8s.io/kind"