2
2
# Image URL to use all building/pushing image targets
3
3
IMG ?= controller:latest
4
4
# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary.
5
- ENVTEST_K8S_VERSION = 1.27.1
5
+ ENVTEST_K8S_VERSION = 1.29.0
6
6
7
7
# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
8
8
ifeq (,$(shell go env GOBIN) )
11
11
GOBIN =$(shell go env GOBIN)
12
12
endif
13
13
14
+ # CONTAINER_TOOL defines the container tool to be used for building images.
15
+ # Be aware that the target commands are only tested with Docker which is
16
+ # scaffolded by default. However, you might want to replace it to use other
17
+ # tools. (i.e. podman)
18
+ CONTAINER_TOOL ?= docker
19
+
14
20
# Setting SHELL to bash allows bash commands to be executed by recipes.
15
21
# Options are set to exit when a recipe line exits non-zero or a piped command fails.
16
22
SHELL = /usr/bin/env bash -o pipefail
@@ -40,11 +46,7 @@ help: ## Display this help.
40
46
41
47
.PHONY : manifests
42
48
manifests : controller-gen # # Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.
43
- # Note that the option maxDescLen=0 was added in the default scaffold in order to sort out the issue
44
- # Too long: must have at most 262144 bytes. By using kubectl apply to create / update resources an annotation
45
- # is created by K8s API to store the latest version of the resource ( kubectl.kubernetes.io/last-applied-configuration).
46
- # However, it has a size limit and if the CRD is too big with so many long descriptions as this one it will cause the failure.
47
- $(CONTROLLER_GEN) rbac:roleName=manager-role crd:maxDescLen=0 webhook paths="./..." output:crd:artifacts:config=config/crd/bases
49
+ $(CONTROLLER_GEN ) rbac:roleName=manager-role crd webhook paths=" ./..." output:crd:artifacts:config=config/crd/bases
48
50
49
51
.PHONY : generate
50
52
generate : controller-gen # # Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations.
@@ -60,7 +62,20 @@ vet: ## Run go vet against code.
60
62
61
63
.PHONY : test
62
64
test : manifests generate fmt vet envtest # # Run tests.
63
- KUBEBUILDER_ASSETS=" $( shell $( ENVTEST) use $( ENVTEST_K8S_VERSION) --bin-dir $( LOCALBIN) -p path) " go test ./... -coverprofile cover.out
65
+ KUBEBUILDER_ASSETS=" $( shell $( ENVTEST) use $( ENVTEST_K8S_VERSION) --bin-dir $( LOCALBIN) -p path) " go test $$(go list ./... | grep -v /e2e ) -coverprofile cover.out
66
+
67
+ # Utilize Kind or modify the e2e tests to load the image locally, enabling compatibility with other vendors.
68
+ .PHONY : test-e2e # Run the e2e tests against a Kind k8s instance that is spun up.
69
+ test-e2e :
70
+ go test ./test/e2e/ -v -ginkgo.v
71
+
72
+ .PHONY : lint
73
+ lint : golangci-lint # # Run golangci-lint linter & yamllint
74
+ $(GOLANGCI_LINT ) run
75
+
76
+ .PHONY : lint-fix
77
+ lint-fix : golangci-lint # # Run golangci-lint linter and perform fixes
78
+ $(GOLANGCI_LINT ) run --fix
64
79
65
80
# #@ Build
66
81
@@ -76,12 +91,12 @@ run: manifests generate fmt vet ## Run a controller from your host.
76
91
# (i.e. docker build --platform linux/arm64). However, you must enable docker buildKit for it.
77
92
# More info: https://docs.docker.com/develop/develop-images/build_enhancements/
78
93
.PHONY : docker-build
79
- docker-build : test # # Build docker image with the manager.
80
- docker build -t ${IMG} .
94
+ docker-build : # # Build docker image with the manager.
95
+ $( CONTAINER_TOOL ) build -t ${IMG} .
81
96
82
97
.PHONY : docker-push
83
98
docker-push : # # Push docker image with the manager.
84
- docker push ${IMG}
99
+ $( CONTAINER_TOOL ) push ${IMG}
85
100
86
101
# PLATFORMS defines the target platforms for the manager image be built to provide support to multiple
87
102
# architectures. (i.e. make docker-buildx IMG=myregistry/mypoperator:0.0.1). To use this option you need to:
@@ -91,15 +106,26 @@ docker-push: ## Push docker image with the manager.
91
106
# To adequately provide solutions that are compatible with multiple platforms, you should consider using this option.
92
107
PLATFORMS ?= linux/arm64,linux/amd64,linux/s390x,linux/ppc64le
93
108
.PHONY : docker-buildx
94
- docker-buildx : test # # Build and push docker image for the manager for cross-platform support
109
+ docker-buildx : # # Build and push docker image for the manager for cross-platform support
95
110
# copy existing Dockerfile and insert --platform=${BUILDPLATFORM} into Dockerfile.cross, and preserve the original Dockerfile
96
111
sed -e ' 1 s/\(^FROM\)/FROM --platform=\$$\{BUILDPLATFORM\}/; t' -e ' 1,// s//FROM --platform=\$$\{BUILDPLATFORM\}/' Dockerfile > Dockerfile.cross
97
- - docker buildx create --name project-v3-builder
98
- docker buildx use project-v3-builder
99
- - docker buildx build --push --platform=$(PLATFORMS ) --tag ${IMG} -f Dockerfile.cross .
100
- - docker buildx rm project-v3-builder
112
+ - $( CONTAINER_TOOL ) buildx create --name project-v3-builder
113
+ $( CONTAINER_TOOL ) buildx use project-v3-builder
114
+ - $( CONTAINER_TOOL ) buildx build --push --platform=$(PLATFORMS ) --tag ${IMG} -f Dockerfile.cross .
115
+ - $( CONTAINER_TOOL ) buildx rm project-v3-builder
101
116
rm Dockerfile.cross
102
117
118
+ .PHONY : build-installer
119
+ build-installer : manifests generate kustomize # # Generate a consolidated YAML with CRDs and deployment.
120
+ mkdir -p dist
121
+ echo " ---" > dist/install.yaml # Clean previous content
122
+ @if [ -d " config/crd" ]; then \
123
+ $(KUSTOMIZE ) build config/crd > dist/install.yaml; \
124
+ echo " ---" >> dist/install.yaml; \
125
+ fi
126
+ cd config/manager && $(KUSTOMIZE ) edit set image controller=${IMG}
127
+ $(KUSTOMIZE ) build config/default >> dist/install.yaml
128
+
103
129
# #@ Deployment
104
130
105
131
ifndef ignore-not-found
@@ -108,54 +134,71 @@ endif
108
134
109
135
.PHONY : install
110
136
install : manifests kustomize # # Install CRDs into the K8s cluster specified in ~/.kube/config.
111
- $(KUSTOMIZE ) build config/crd | kubectl apply -f -
137
+ $(KUSTOMIZE ) build config/crd | $( KUBECTL ) apply -f -
112
138
113
139
.PHONY : uninstall
114
140
uninstall : manifests kustomize # # Uninstall CRDs from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion.
115
- $(KUSTOMIZE ) build config/crd | kubectl delete --ignore-not-found=$(ignore-not-found ) -f -
141
+ $(KUSTOMIZE ) build config/crd | $( KUBECTL ) delete --ignore-not-found=$(ignore-not-found ) -f -
116
142
117
143
.PHONY : deploy
118
144
deploy : manifests kustomize # # Deploy controller to the K8s cluster specified in ~/.kube/config.
119
145
cd config/manager && $(KUSTOMIZE ) edit set image controller=${IMG}
120
- $(KUSTOMIZE ) build config/default | kubectl apply -f -
146
+ $(KUSTOMIZE ) build config/default | $( KUBECTL ) apply -f -
121
147
122
148
.PHONY : undeploy
123
- undeploy : # # Undeploy controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion.
124
- $(KUSTOMIZE ) build config/default | kubectl delete --ignore-not-found=$(ignore-not-found ) -f -
149
+ undeploy : kustomize # # Undeploy controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion.
150
+ $(KUSTOMIZE ) build config/default | $( KUBECTL ) delete --ignore-not-found=$(ignore-not-found ) -f -
125
151
126
- # #@ Build Dependencies
152
+ # #@ Dependencies
127
153
128
154
# # Location to install dependencies to
129
155
LOCALBIN ?= $(shell pwd) /bin
130
156
$(LOCALBIN ) :
131
157
mkdir -p $(LOCALBIN )
132
158
133
159
# # Tool Binaries
134
- KUSTOMIZE ?= $(LOCALBIN ) /kustomize
135
- CONTROLLER_GEN ?= $(LOCALBIN ) /controller-gen
136
- ENVTEST ?= $(LOCALBIN ) /setup-envtest
160
+ KUBECTL ?= kubectl
161
+ KUSTOMIZE ?= $(LOCALBIN ) /kustomize-$(KUSTOMIZE_VERSION )
162
+ CONTROLLER_GEN ?= $(LOCALBIN ) /controller-gen-$(CONTROLLER_TOOLS_VERSION )
163
+ ENVTEST ?= $(LOCALBIN ) /setup-envtest-$(ENVTEST_VERSION )
164
+ GOLANGCI_LINT = $(LOCALBIN ) /golangci-lint-$(GOLANGCI_LINT_VERSION )
137
165
138
166
# # Tool Versions
139
- KUSTOMIZE_VERSION ?= v5.0.0
140
- CONTROLLER_TOOLS_VERSION ?= v0.12.0
167
+ KUSTOMIZE_VERSION ?= v5.3.0
168
+ CONTROLLER_TOOLS_VERSION ?= v0.14.0
169
+ ENVTEST_VERSION ?= release-0.17
170
+ GOLANGCI_LINT_VERSION ?= v1.54.2
141
171
142
- KUSTOMIZE_INSTALL_SCRIPT ?= "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"
143
172
.PHONY : kustomize
144
- kustomize : $(KUSTOMIZE ) # # Download kustomize locally if necessary. If wrong version is installed, it will be removed before downloading.
173
+ kustomize : $(KUSTOMIZE ) # # Download kustomize locally if necessary.
145
174
$(KUSTOMIZE ) : $(LOCALBIN )
146
- @if test -x $(LOCALBIN ) /kustomize && ! $(LOCALBIN ) /kustomize version | grep -q $(KUSTOMIZE_VERSION ) ; then \
147
- echo " $( LOCALBIN) /kustomize version is not expected $( KUSTOMIZE_VERSION) . Removing it before installing." ; \
148
- rm -rf $(LOCALBIN ) /kustomize; \
149
- fi
150
- test -s $(LOCALBIN ) /kustomize || { curl -Ss $( KUSTOMIZE_INSTALL_SCRIPT) --output install_kustomize.sh && bash install_kustomize.sh $( subst v,,$( KUSTOMIZE_VERSION) ) $( LOCALBIN) ; rm install_kustomize.sh; }
175
+ $(call go-install-tool,$(KUSTOMIZE ) ,sigs.k8s.io/kustomize/kustomize/v5,$(KUSTOMIZE_VERSION ) )
151
176
152
177
.PHONY : controller-gen
153
- controller-gen : $(CONTROLLER_GEN ) # # Download controller-gen locally if necessary. If wrong version is installed, it will be overwritten.
178
+ controller-gen : $(CONTROLLER_GEN ) # # Download controller-gen locally if necessary.
154
179
$(CONTROLLER_GEN ) : $(LOCALBIN )
155
- test -s $(LOCALBIN ) /controller-gen && $(LOCALBIN ) /controller-gen --version | grep -q $(CONTROLLER_TOOLS_VERSION ) || \
156
- GOBIN=$(LOCALBIN ) go install sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_TOOLS_VERSION )
180
+ $(call go-install-tool,$(CONTROLLER_GEN ) ,sigs.k8s.io/controller-tools/cmd/controller-gen,$(CONTROLLER_TOOLS_VERSION ) )
157
181
158
182
.PHONY : envtest
159
- envtest : $(ENVTEST ) # # Download envtest- setup locally if necessary.
183
+ envtest : $(ENVTEST ) # # Download setup-envtest locally if necessary.
160
184
$(ENVTEST ) : $(LOCALBIN )
161
- test -s $(LOCALBIN ) /setup-envtest || GOBIN=$(LOCALBIN ) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest
185
+ $(call go-install-tool,$(ENVTEST ) ,sigs.k8s.io/controller-runtime/tools/setup-envtest,$(ENVTEST_VERSION ) )
186
+
187
+ .PHONY : golangci-lint
188
+ golangci-lint : $(GOLANGCI_LINT ) # # Download golangci-lint locally if necessary.
189
+ $(GOLANGCI_LINT ) : $(LOCALBIN )
190
+ $(call go-install-tool,$(GOLANGCI_LINT ) ,github.com/golangci/golangci-lint/cmd/golangci-lint,${GOLANGCI_LINT_VERSION})
191
+
192
+ # go-install-tool will 'go install' any package with custom target and name of binary, if it doesn't exist
193
+ # $1 - target path with name of binary (ideally with version)
194
+ # $2 - package url which can be installed
195
+ # $3 - specific version of package
196
+ define go-install-tool
197
+ @[ -f $(1 ) ] || { \
198
+ set -e; \
199
+ package=$(2 ) @$(3 ) ;\
200
+ echo "Downloading $${package}" ;\
201
+ GOBIN=$(LOCALBIN ) go install $${package} ;\
202
+ mv "$$(echo "$(1 ) " | sed "s/-$(3 ) $$//" ) " $(1 ) ;\
203
+ }
204
+ endef
0 commit comments