sigs.k8s.io/cluster-api@v1.7.1/Makefile (about) 1 # Copyright 2018 The Kubernetes Authors. 2 # 3 # Licensed under the Apache License, Version 2.0 (the "License"); 4 # you may not use this file except in compliance with the License. 5 # You may obtain a copy of the License at 6 # 7 # http://www.apache.org/licenses/LICENSE-2.0 8 # 9 # Unless required by applicable law or agreed to in writing, software 10 # distributed under the License is distributed on an "AS IS" BASIS, 11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 # See the License for the specific language governing permissions and 13 # limitations under the License. 14 15 # If you update this file, please follow 16 # https://www.thapaliya.com/en/writings/well-documented-makefiles/ 17 18 # Ensure Make is run with bash shell as some syntax below is bash-specific 19 SHELL:=/usr/bin/env bash 20 21 .DEFAULT_GOAL:=help 22 23 # 24 # Go. 25 # 26 GO_VERSION ?= 1.21.9 27 GO_DIRECTIVE_VERSION ?= 1.21 28 GO_CONTAINER_IMAGE ?= docker.io/library/golang:$(GO_VERSION) 29 30 # Use GOPROXY environment variable if set 31 GOPROXY := $(shell go env GOPROXY) 32 ifeq ($(GOPROXY),) 33 GOPROXY := https://proxy.golang.org 34 endif 35 export GOPROXY 36 37 # Active module mode, as we use go modules to manage dependencies 38 export GO111MODULE=on 39 40 # 41 # Kubebuilder. 42 # 43 export KUBEBUILDER_ENVTEST_KUBERNETES_VERSION ?= 1.30.0 44 export KUBEBUILDER_CONTROLPLANE_START_TIMEOUT ?= 60s 45 export KUBEBUILDER_CONTROLPLANE_STOP_TIMEOUT ?= 60s 46 47 # This option is for running docker manifest command 48 export DOCKER_CLI_EXPERIMENTAL := enabled 49 50 # Enables shell script tracing. Enable by running: TRACE=1 make <target> 51 TRACE ?= 0 52 53 # 54 # Directories. 55 # 56 # Full directory of where the Makefile resides 57 ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) 58 EXP_DIR := exp 59 BIN_DIR := bin 60 TEST_DIR := test 61 TOOLS_DIR := hack/tools 62 TOOLS_BIN_DIR := $(abspath $(TOOLS_DIR)/$(BIN_DIR)) 63 DOCS_DIR := docs 64 E2E_FRAMEWORK_DIR := $(TEST_DIR)/framework 65 CAPD_DIR := $(TEST_DIR)/infrastructure/docker 66 CAPIM_DIR := $(TEST_DIR)/infrastructure/inmemory 67 TEST_EXTENSION_DIR := $(TEST_DIR)/extension 68 GO_INSTALL := ./scripts/go_install.sh 69 OBSERVABILITY_DIR := hack/observability 70 71 export PATH := $(abspath $(TOOLS_BIN_DIR)):$(PATH) 72 73 # Set --output-base for conversion-gen if we are not within GOPATH 74 ifneq ($(abspath $(ROOT_DIR)),$(shell go env GOPATH)/src/sigs.k8s.io/cluster-api) 75 CONVERSION_GEN_OUTPUT_BASE := --output-base=$(ROOT_DIR) 76 CONVERSION_GEN_OUTPUT_BASE_CAPD := --output-base=$(ROOT_DIR)/$(CAPD_DIR) 77 else 78 export GOPATH := $(shell go env GOPATH) 79 endif 80 81 # 82 # Ginkgo configuration. 83 # 84 GINKGO_FOCUS ?= 85 GINKGO_SKIP ?= 86 GINKGO_NODES ?= 1 87 GINKGO_TIMEOUT ?= 2h 88 GINKGO_POLL_PROGRESS_AFTER ?= 60m 89 GINKGO_POLL_PROGRESS_INTERVAL ?= 5m 90 E2E_CONF_FILE ?= $(ROOT_DIR)/$(TEST_DIR)/e2e/config/docker.yaml 91 SKIP_RESOURCE_CLEANUP ?= false 92 USE_EXISTING_CLUSTER ?= false 93 GINKGO_NOCOLOR ?= false 94 95 # to set multiple ginkgo skip flags, if any 96 ifneq ($(strip $(GINKGO_SKIP)),) 97 _SKIP_ARGS := $(foreach arg,$(strip $(GINKGO_SKIP)),-skip="$(arg)") 98 endif 99 100 # Helper function to get dependency version from go.mod 101 get_go_version = $(shell go list -m $1 | awk '{print $$2}') 102 103 # 104 # Binaries. 105 # 106 # Note: Need to use abspath so we can invoke these from subdirectories 107 KUSTOMIZE_VER := v4.5.2 108 KUSTOMIZE_BIN := kustomize 109 KUSTOMIZE := $(abspath $(TOOLS_BIN_DIR)/$(KUSTOMIZE_BIN)-$(KUSTOMIZE_VER)) 110 KUSTOMIZE_PKG := sigs.k8s.io/kustomize/kustomize/v4 111 112 SETUP_ENVTEST_VER := v0.0.0-20240215143116-d0396a3d6f9f 113 SETUP_ENVTEST_BIN := setup-envtest 114 SETUP_ENVTEST := $(abspath $(TOOLS_BIN_DIR)/$(SETUP_ENVTEST_BIN)-$(SETUP_ENVTEST_VER)) 115 SETUP_ENVTEST_PKG := sigs.k8s.io/controller-runtime/tools/setup-envtest 116 117 CONTROLLER_GEN_VER := v0.14.0 118 CONTROLLER_GEN_BIN := controller-gen 119 CONTROLLER_GEN := $(abspath $(TOOLS_BIN_DIR)/$(CONTROLLER_GEN_BIN)-$(CONTROLLER_GEN_VER)) 120 CONTROLLER_GEN_PKG := sigs.k8s.io/controller-tools/cmd/controller-gen 121 122 GOTESTSUM_VER := v1.11.0 123 GOTESTSUM_BIN := gotestsum 124 GOTESTSUM := $(abspath $(TOOLS_BIN_DIR)/$(GOTESTSUM_BIN)-$(GOTESTSUM_VER)) 125 GOTESTSUM_PKG := gotest.tools/gotestsum 126 127 CONVERSION_GEN_VER := v0.29.2 128 CONVERSION_GEN_BIN := conversion-gen 129 # We are intentionally using the binary without version suffix, to avoid the version 130 # in generated files. 131 CONVERSION_GEN := $(abspath $(TOOLS_BIN_DIR)/$(CONVERSION_GEN_BIN)) 132 CONVERSION_GEN_PKG := k8s.io/code-generator/cmd/conversion-gen 133 134 ENVSUBST_BIN := envsubst 135 ENVSUBST_VER := $(call get_go_version,github.com/drone/envsubst/v2) 136 ENVSUBST := $(abspath $(TOOLS_BIN_DIR)/$(ENVSUBST_BIN)-$(ENVSUBST_VER)) 137 ENVSUBST_PKG := github.com/drone/envsubst/v2/cmd/envsubst 138 139 GO_APIDIFF_VER := v0.8.2 140 GO_APIDIFF_BIN := go-apidiff 141 GO_APIDIFF := $(abspath $(TOOLS_BIN_DIR)/$(GO_APIDIFF_BIN)-$(GO_APIDIFF_VER)) 142 GO_APIDIFF_PKG := github.com/joelanford/go-apidiff 143 144 HADOLINT_VER := v2.12.0 145 HADOLINT_FAILURE_THRESHOLD = warning 146 147 SHELLCHECK_VER := v0.9.0 148 149 TRIVY_VER := 0.49.1 150 151 KPROMO_VER := v4.0.5 152 KPROMO_BIN := kpromo 153 KPROMO := $(abspath $(TOOLS_BIN_DIR)/$(KPROMO_BIN)-$(KPROMO_VER)) 154 # KPROMO_PKG may have to be changed if KPROMO_VER increases its major version. 155 KPROMO_PKG := sigs.k8s.io/promo-tools/v4/cmd/kpromo 156 157 YQ_VER := v4.35.2 158 YQ_BIN := yq 159 YQ := $(abspath $(TOOLS_BIN_DIR)/$(YQ_BIN)-$(YQ_VER)) 160 YQ_PKG := github.com/mikefarah/yq/v4 161 162 PLANTUML_VER := 1.2024.3 163 164 GINKGO_BIN := ginkgo 165 GINKGO_VER := $(call get_go_version,github.com/onsi/ginkgo/v2) 166 GINKGO := $(abspath $(TOOLS_BIN_DIR)/$(GINKGO_BIN)-$(GINKGO_VER)) 167 GINKGO_PKG := github.com/onsi/ginkgo/v2/ginkgo 168 169 GOLANGCI_LINT_BIN := golangci-lint 170 GOLANGCI_LINT_VER := $(shell cat .github/workflows/pr-golangci-lint.yaml | grep [[:space:]]version: | sed 's/.*version: //') 171 GOLANGCI_LINT := $(abspath $(TOOLS_BIN_DIR)/$(GOLANGCI_LINT_BIN)-$(GOLANGCI_LINT_VER)) 172 GOLANGCI_LINT_PKG := github.com/golangci/golangci-lint/cmd/golangci-lint 173 174 GOVULNCHECK_BIN := govulncheck 175 GOVULNCHECK_VER := v1.0.4 176 GOVULNCHECK := $(abspath $(TOOLS_BIN_DIR)/$(GOVULNCHECK_BIN)-$(GOVULNCHECK_VER)) 177 GOVULNCHECK_PKG := golang.org/x/vuln/cmd/govulncheck 178 179 IMPORT_BOSS_BIN := import-boss 180 IMPORT_BOSS_VER := v0.28.1 181 IMPORT_BOSS := $(abspath $(TOOLS_BIN_DIR)/$(IMPORT_BOSS_BIN)) 182 IMPORT_BOSS_PKG := k8s.io/code-generator/cmd/import-boss 183 184 CONVERSION_VERIFIER_BIN := conversion-verifier 185 CONVERSION_VERIFIER := $(abspath $(TOOLS_BIN_DIR)/$(CONVERSION_VERIFIER_BIN)) 186 187 OPENAPI_GEN_VER := 70dd376 188 OPENAPI_GEN_BIN := openapi-gen 189 # We are intentionally using the binary without version suffix, to avoid the version 190 # in generated files. 191 OPENAPI_GEN := $(abspath $(TOOLS_BIN_DIR)/$(OPENAPI_GEN_BIN)) 192 OPENAPI_GEN_PKG := k8s.io/kube-openapi/cmd/openapi-gen 193 194 PROWJOB_GEN_BIN := prowjob-gen 195 PROWJOB_GEN := $(abspath $(TOOLS_BIN_DIR)/$(PROWJOB_GEN_BIN)) 196 197 RUNTIME_OPENAPI_GEN_BIN := runtime-openapi-gen 198 RUNTIME_OPENAPI_GEN := $(abspath $(TOOLS_BIN_DIR)/$(RUNTIME_OPENAPI_GEN_BIN)) 199 200 TILT_PREPARE_BIN := tilt-prepare 201 TILT_PREPARE := $(abspath $(TOOLS_BIN_DIR)/$(TILT_PREPARE_BIN)) 202 203 # Define Docker related variables. Releases should modify and double check these vars. 204 REGISTRY ?= gcr.io/$(shell gcloud config get-value project) 205 PROD_REGISTRY ?= registry.k8s.io/cluster-api 206 207 STAGING_REGISTRY ?= gcr.io/k8s-staging-cluster-api 208 STAGING_BUCKET ?= artifacts.k8s-staging-cluster-api.appspot.com 209 210 # core 211 IMAGE_NAME ?= cluster-api-controller 212 CONTROLLER_IMG ?= $(REGISTRY)/$(IMAGE_NAME) 213 214 # bootstrap 215 KUBEADM_BOOTSTRAP_IMAGE_NAME ?= kubeadm-bootstrap-controller 216 KUBEADM_BOOTSTRAP_CONTROLLER_IMG ?= $(REGISTRY)/$(KUBEADM_BOOTSTRAP_IMAGE_NAME) 217 218 # control plane 219 KUBEADM_CONTROL_PLANE_IMAGE_NAME ?= kubeadm-control-plane-controller 220 KUBEADM_CONTROL_PLANE_CONTROLLER_IMG ?= $(REGISTRY)/$(KUBEADM_CONTROL_PLANE_IMAGE_NAME) 221 222 # capd 223 CAPD_IMAGE_NAME ?= capd-manager 224 CAPD_CONTROLLER_IMG ?= $(REGISTRY)/$(CAPD_IMAGE_NAME) 225 226 # capim 227 CAPIM_IMAGE_NAME ?= capim-manager 228 CAPIM_CONTROLLER_IMG ?= $(REGISTRY)/$(CAPIM_IMAGE_NAME) 229 230 # clusterctl 231 CLUSTERCTL_MANIFEST_DIR := cmd/clusterctl/config 232 CLUSTERCTL_IMAGE_NAME ?= clusterctl 233 CLUSTERCTL_IMG ?= $(REGISTRY)/$(CLUSTERCTL_IMAGE_NAME) 234 235 # test extension 236 TEST_EXTENSION_IMAGE_NAME ?= test-extension 237 TEST_EXTENSION_IMG ?= $(REGISTRY)/$(TEST_EXTENSION_IMAGE_NAME) 238 239 # kind 240 CAPI_KIND_CLUSTER_NAME ?= capi-test 241 242 # It is set by Prow GIT_TAG, a git-based tag of the form vYYYYMMDD-hash, e.g., v20210120-v0.3.10-308-gc61521971 243 244 TAG ?= dev 245 ARCH ?= $(shell go env GOARCH) 246 ALL_ARCH ?= amd64 arm arm64 ppc64le s390x 247 248 # Allow overriding the imagePullPolicy 249 PULL_POLICY ?= Always 250 251 # Hosts running SELinux need :z added to volume mounts 252 SELINUX_ENABLED := $(shell cat /sys/fs/selinux/enforce 2> /dev/null || echo 0) 253 254 ifeq ($(SELINUX_ENABLED),1) 255 DOCKER_VOL_OPTS?=:z 256 endif 257 258 # Set build time variables including version details 259 LDFLAGS := $(shell hack/version.sh) 260 261 all: test managers clusterctl 262 263 help: # Display this help 264 @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[0-9A-Za-z_-]+:.*?##/ { printf " \033[36m%-50s\033[0m %s\n", $$1, $$2 } /^\$$\([0-9A-Za-z_-]+\):.*?##/ { gsub("_","-", $$1); printf " \033[36m%-50s\033[0m %s\n", tolower(substr($$1, 3, length($$1)-7)), $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) 265 266 ## -------------------------------------- 267 ## Generate / Manifests 268 ## -------------------------------------- 269 270 ##@ generate: 271 272 ALL_GENERATE_MODULES = core kubeadm-bootstrap kubeadm-control-plane docker-infrastructure in-memory-infrastructure test-extension 273 274 .PHONY: generate 275 generate: ## Run all generate-manifests-*, generate-go-deepcopy-*, generate-go-conversions-* and generate-go-openapi targets 276 $(MAKE) generate-modules generate-manifests generate-go-deepcopy generate-go-conversions generate-go-openapi generate-metrics-config 277 278 .PHONY: generate-manifests 279 generate-manifests: $(addprefix generate-manifests-,$(ALL_GENERATE_MODULES)) ## Run all generate-manifests-* targets 280 281 .PHONY: generate-manifests-core 282 generate-manifests-core: $(CONTROLLER_GEN) $(KUSTOMIZE) ## Generate manifests e.g. CRD, RBAC etc. for core 283 $(MAKE) clean-generated-yaml SRC_DIRS="./config/crd/bases,./config/webhook/manifests.yaml" 284 $(CONTROLLER_GEN) \ 285 paths=./ \ 286 paths=./api/... \ 287 paths=./internal/apis/core/... \ 288 paths=./internal/controllers/... \ 289 paths=./internal/webhooks/... \ 290 paths=./$(EXP_DIR)/api/... \ 291 paths=./$(EXP_DIR)/internal/controllers/... \ 292 paths=./$(EXP_DIR)/internal/webhooks/... \ 293 paths=./$(EXP_DIR)/addons/api/... \ 294 paths=./$(EXP_DIR)/addons/internal/controllers/... \ 295 paths=./$(EXP_DIR)/addons/internal/webhooks/... \ 296 paths=./$(EXP_DIR)/ipam/api/... \ 297 paths=./$(EXP_DIR)/ipam/internal/webhooks/... \ 298 paths=./$(EXP_DIR)/runtime/api/... \ 299 paths=./$(EXP_DIR)/runtime/internal/controllers/... \ 300 crd:crdVersions=v1 \ 301 rbac:roleName=manager-role \ 302 output:crd:dir=./config/crd/bases \ 303 output:webhook:dir=./config/webhook \ 304 webhook 305 $(CONTROLLER_GEN) \ 306 paths=./cmd/clusterctl/api/... \ 307 crd:crdVersions=v1 \ 308 output:crd:dir=./cmd/clusterctl/config/crd/bases 309 $(KUSTOMIZE) build $(CLUSTERCTL_MANIFEST_DIR)/crd > $(CLUSTERCTL_MANIFEST_DIR)/manifest/clusterctl-api.yaml 310 311 .PHONY: generate-manifests-kubeadm-bootstrap 312 generate-manifests-kubeadm-bootstrap: $(CONTROLLER_GEN) ## Generate manifests e.g. CRD, RBAC etc. for kubeadm bootstrap 313 $(MAKE) clean-generated-yaml SRC_DIRS="./bootstrap/kubeadm/config/crd/bases,./bootstrap/kubeadm/config/webhook/manifests.yaml" 314 $(CONTROLLER_GEN) \ 315 paths=./bootstrap/kubeadm \ 316 paths=./bootstrap/kubeadm/api/... \ 317 paths=./bootstrap/kubeadm/internal/controllers/... \ 318 paths=./bootstrap/kubeadm/internal/webhooks/... \ 319 paths=./internal/apis/bootstrap/kubeadm/... \ 320 crd:crdVersions=v1 \ 321 rbac:roleName=manager-role \ 322 output:crd:dir=./bootstrap/kubeadm/config/crd/bases \ 323 output:rbac:dir=./bootstrap/kubeadm/config/rbac \ 324 output:webhook:dir=./bootstrap/kubeadm/config/webhook \ 325 webhook 326 327 .PHONY: generate-manifests-kubeadm-control-plane 328 generate-manifests-kubeadm-control-plane: $(CONTROLLER_GEN) ## Generate manifests e.g. CRD, RBAC etc. for kubeadm control plane 329 $(MAKE) clean-generated-yaml SRC_DIRS="./controlplane/kubeadm/config/crd/bases,./controlplane/kubeadm/config/webhook/manifests.yaml" 330 $(CONTROLLER_GEN) \ 331 paths=./controlplane/kubeadm \ 332 paths=./controlplane/kubeadm/api/... \ 333 paths=./controlplane/kubeadm/internal/controllers/... \ 334 paths=./controlplane/kubeadm/internal/webhooks/... \ 335 paths=./internal/apis/controlplane/kubeadm/... \ 336 crd:crdVersions=v1 \ 337 rbac:roleName=manager-role \ 338 output:crd:dir=./controlplane/kubeadm/config/crd/bases \ 339 output:rbac:dir=./controlplane/kubeadm/config/rbac \ 340 output:webhook:dir=./controlplane/kubeadm/config/webhook \ 341 webhook 342 343 .PHONY: generate-manifests-docker-infrastructure 344 generate-manifests-docker-infrastructure: $(CONTROLLER_GEN) ## Generate manifests e.g. CRD, RBAC etc. for docker infrastructure provider 345 $(MAKE) clean-generated-yaml SRC_DIRS="$(CAPD_DIR)/config/crd/bases,$(CAPD_DIR)/config/webhook/manifests.yaml" 346 cd $(CAPD_DIR); $(CONTROLLER_GEN) \ 347 paths=./ \ 348 paths=./api/... \ 349 paths=./$(EXP_DIR)/api/... \ 350 paths=./$(EXP_DIR)/internal/controllers/... \ 351 paths=./$(EXP_DIR)/internal/webhooks/... \ 352 paths=./internal/controllers/... \ 353 paths=./internal/webhooks/... \ 354 crd:crdVersions=v1 \ 355 rbac:roleName=manager-role \ 356 output:crd:dir=./config/crd/bases \ 357 output:webhook:dir=./config/webhook \ 358 webhook 359 360 361 .PHONY: generate-manifests-in-memory-infrastructure 362 generate-manifests-in-memory-infrastructure: $(CONTROLLER_GEN) ## Generate manifests e.g. CRD, RBAC etc. for in-memory infrastructure provider 363 $(MAKE) clean-generated-yaml SRC_DIRS="$(CAPIM_DIR)/config/crd/bases,$(CAPIM_DIR)/config/webhook/manifests.yaml" 364 cd $(CAPIM_DIR); $(CONTROLLER_GEN) \ 365 paths=./ \ 366 paths=./api/... \ 367 paths=./internal/controllers/... \ 368 paths=./internal/webhooks/... \ 369 crd:crdVersions=v1 \ 370 rbac:roleName=manager-role \ 371 output:crd:dir=./config/crd/bases \ 372 output:webhook:dir=./config/webhook \ 373 webhook 374 375 .PHONY: generate-manifests-test-extension 376 generate-manifests-test-extension: $(CONTROLLER_GEN) ## Generate manifests e.g. RBAC for test-extension provider 377 cd ./test/extension; $(CONTROLLER_GEN) \ 378 paths=./... \ 379 output:rbac:dir=./config/rbac \ 380 rbac:roleName=manager-role 381 382 .PHONY: generate-go-deepcopy 383 generate-go-deepcopy: ## Run all generate-go-deepcopy-* targets 384 $(MAKE) $(addprefix generate-go-deepcopy-,$(ALL_GENERATE_MODULES)) 385 386 .PHONY: generate-go-deepcopy-core 387 generate-go-deepcopy-core: $(CONTROLLER_GEN) ## Generate deepcopy go code for core 388 $(MAKE) clean-generated-deepcopy SRC_DIRS="./api,./$(EXP_DIR)/api,./$(EXP_DIR)/addons/api,./$(EXP_DIR)/runtime/api,./$(EXP_DIR)/runtime/hooks/api" 389 $(CONTROLLER_GEN) \ 390 object:headerFile=./hack/boilerplate/boilerplate.generatego.txt \ 391 paths=./api/... \ 392 paths=./$(EXP_DIR)/api/... \ 393 paths=./$(EXP_DIR)/addons/api/... \ 394 paths=./$(EXP_DIR)/ipam/api/... \ 395 paths=./$(EXP_DIR)/runtime/api/... \ 396 paths=./$(EXP_DIR)/runtime/hooks/api/... \ 397 paths=./internal/runtime/test/... \ 398 paths=./cmd/clusterctl/... \ 399 paths=./internal/test/builder/... 400 401 .PHONY: generate-go-deepcopy-kubeadm-bootstrap 402 generate-go-deepcopy-kubeadm-bootstrap: $(CONTROLLER_GEN) ## Generate deepcopy go code for kubeadm bootstrap 403 $(MAKE) clean-generated-deepcopy SRC_DIRS="./bootstrap/kubeadm/api,./bootstrap/kubeadm/types" 404 $(CONTROLLER_GEN) \ 405 object:headerFile=./hack/boilerplate/boilerplate.generatego.txt \ 406 paths=./bootstrap/kubeadm/api/... \ 407 paths=./bootstrap/kubeadm/types/... 408 409 .PHONY: generate-go-deepcopy-kubeadm-control-plane 410 generate-go-deepcopy-kubeadm-control-plane: $(CONTROLLER_GEN) ## Generate deepcopy go code for kubeadm control plane 411 $(MAKE) clean-generated-deepcopy SRC_DIRS="./controlplane/kubeadm/api" 412 $(CONTROLLER_GEN) \ 413 object:headerFile=./hack/boilerplate/boilerplate.generatego.txt \ 414 paths=./controlplane/kubeadm/api/... 415 416 .PHONY: generate-go-deepcopy-docker-infrastructure 417 generate-go-deepcopy-docker-infrastructure: $(CONTROLLER_GEN) ## Generate deepcopy go code for docker infrastructure provider 418 $(MAKE) clean-generated-deepcopy SRC_DIRS="$(CAPD_DIR)/api,$(CAPD_DIR)/$(EXP_DIR)/api" 419 cd $(CAPD_DIR); $(CONTROLLER_GEN) \ 420 object:headerFile=../../../hack/boilerplate/boilerplate.generatego.txt \ 421 paths=./api/... \ 422 paths=./$(EXP_DIR)/api/... 423 424 .PHONY: generate-go-deepcopy-in-memory-infrastructure 425 generate-go-deepcopy-in-memory-infrastructure: $(CONTROLLER_GEN) ## Generate deepcopy go code for in-memory infrastructure provider 426 $(MAKE) clean-generated-deepcopy SRC_DIRS="$(CAPIM_DIR)/api,$(CAPIM_DIR)/internal/cloud/api" 427 cd $(CAPIM_DIR); $(CONTROLLER_GEN) \ 428 object:headerFile=../../../hack/boilerplate/boilerplate.generatego.txt \ 429 paths=./api/... \ 430 paths=./internal/cloud/api/... 431 432 .PHONY: generate-go-deepcopy-test-extension 433 generate-go-deepcopy-test-extension: $(CONTROLLER_GEN) ## Generate deepcopy go code for test-extension 434 435 .PHONY: generate-go-conversions 436 generate-go-conversions: ## Run all generate-go-conversions-* targets 437 $(MAKE) $(addprefix generate-go-conversions-,$(ALL_GENERATE_MODULES)) 438 439 .PHONY: generate-go-conversions-core 440 generate-go-conversions-core: ## Run all generate-go-conversions-core-* targets 441 $(MAKE) generate-go-conversions-core-api 442 $(MAKE) generate-go-conversions-core-exp 443 $(MAKE) generate-go-conversions-core-exp-ipam 444 $(MAKE) generate-go-conversions-core-runtime 445 446 .PHONY: generate-go-conversions-core-api 447 generate-go-conversions-core-api: $(CONVERSION_GEN) ## Generate conversions go code for core api 448 $(MAKE) clean-generated-conversions SRC_DIRS="./internal/apis/core/v1alpha3,./internal/apis/core/v1alpha4" 449 $(CONVERSION_GEN) \ 450 --input-dirs=./internal/apis/core/v1alpha3 \ 451 --input-dirs=./internal/apis/core/v1alpha4 \ 452 --build-tag=ignore_autogenerated_core \ 453 --output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE) \ 454 --go-header-file=./hack/boilerplate/boilerplate.generatego.txt 455 456 .PHONY: generate-go-conversions-core-exp 457 generate-go-conversions-core-exp: $(CONVERSION_GEN) ## Generate conversions go code for core exp 458 $(MAKE) clean-generated-conversions SRC_DIRS="./internal/apis/core/exp/v1alpha3,./internal/apis/core/exp/addons/v1alpha3,./internal/apis/core/exp/v1alpha4,./internal/apis/core/exp/addons/v1alpha4" 459 $(CONVERSION_GEN) \ 460 --input-dirs=./internal/apis/core/exp/v1alpha3 \ 461 --input-dirs=./internal/apis/core/exp/v1alpha4 \ 462 --input-dirs=./internal/apis/core/exp/addons/v1alpha3 \ 463 --input-dirs=./internal/apis/core/exp/addons/v1alpha4 \ 464 --build-tag=ignore_autogenerated_core_exp \ 465 --extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha3 \ 466 --extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha4 \ 467 --output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE) \ 468 --go-header-file=./hack/boilerplate/boilerplate.generatego.txt 469 470 .PHONY: generate-go-conversions-core-exp-ipam 471 generate-go-conversions-core-exp-ipam: $(CONVERSION_GEN) ## Generate conversions go code for core exp IPAM 472 $(MAKE) clean-generated-conversions SRC_DIRS="./$(EXP_DIR)/ipam/api/v1alpha1" 473 $(CONVERSION_GEN) \ 474 --input-dirs=./$(EXP_DIR)/ipam/api/v1alpha1 \ 475 --build-tag=ignore_autogenerated_core_exp_ipam \ 476 --output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE) \ 477 --go-header-file=./hack/boilerplate/boilerplate.generatego.txt 478 479 .PHONY: generate-go-conversions-core-runtime 480 generate-go-conversions-core-runtime: $(CONVERSION_GEN) ## Generate conversions go code for core runtime 481 $(MAKE) clean-generated-conversions SRC_DIRS="./internal/runtime/test/v1alpha1,./internal/runtime/test/v1alpha2" 482 $(CONVERSION_GEN) \ 483 --input-dirs=./internal/runtime/test/v1alpha1 \ 484 --input-dirs=./internal/runtime/test/v1alpha2 \ 485 --build-tag=ignore_autogenerated_core_runtime \ 486 --output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE) \ 487 --go-header-file=./hack/boilerplate/boilerplate.generatego.txt 488 489 .PHONY: generate-go-conversions-kubeadm-bootstrap 490 generate-go-conversions-kubeadm-bootstrap: $(CONVERSION_GEN) ## Generate conversions go code for kubeadm bootstrap 491 $(MAKE) clean-generated-conversions SRC_DIRS="./internal/apis/bootstrap/kubeadm" 492 $(CONVERSION_GEN) \ 493 --input-dirs=./internal/apis/bootstrap/kubeadm/v1alpha3 \ 494 --input-dirs=./internal/apis/bootstrap/kubeadm/v1alpha4 \ 495 --build-tag=ignore_autogenerated_kubeadm_bootstrap \ 496 --extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha3 \ 497 --extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha4 \ 498 --output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE) \ 499 --go-header-file=./hack/boilerplate/boilerplate.generatego.txt 500 $(MAKE) clean-generated-conversions SRC_DIRS="./bootstrap/kubeadm/types/upstreamv1beta2,./bootstrap/kubeadm/types/upstreamv1beta3" 501 $(CONVERSION_GEN) \ 502 --input-dirs=./bootstrap/kubeadm/types/upstreamv1beta2 \ 503 --input-dirs=./bootstrap/kubeadm/types/upstreamv1beta3 \ 504 --build-tag=ignore_autogenerated_kubeadm_types \ 505 --output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE) \ 506 --go-header-file=./hack/boilerplate/boilerplate.generatego.txt 507 508 .PHONY: generate-go-conversions-kubeadm-control-plane 509 generate-go-conversions-kubeadm-control-plane: $(CONVERSION_GEN) ## Generate conversions go code for kubeadm control plane 510 $(MAKE) clean-generated-conversions SRC_DIRS="./internal/apis/controlplane/kubeadm" 511 $(CONVERSION_GEN) \ 512 --input-dirs=./internal/apis/controlplane/kubeadm/v1alpha3 \ 513 --input-dirs=./internal/apis/controlplane/kubeadm/v1alpha4 \ 514 --build-tag=ignore_autogenerated_kubeadm_controlplane \ 515 --extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha3 \ 516 --extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha4 \ 517 --extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/bootstrap/kubeadm/v1alpha3 \ 518 --extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/bootstrap/kubeadm/v1alpha4 \ 519 --output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE) \ 520 --go-header-file=./hack/boilerplate/boilerplate.generatego.txt 521 522 .PHONY: generate-go-conversions-docker-infrastructure 523 generate-go-conversions-docker-infrastructure: $(CONVERSION_GEN) ## Generate conversions go code for docker infrastructure provider 524 cd $(CAPD_DIR); $(CONVERSION_GEN) \ 525 --input-dirs=./api/v1alpha3 \ 526 --input-dirs=./api/v1alpha4 \ 527 --input-dirs=./$(EXP_DIR)/api/v1alpha3 \ 528 --input-dirs=./$(EXP_DIR)/api/v1alpha4 \ 529 --build-tag=ignore_autogenerated_capd \ 530 --extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha3 \ 531 --extra-peer-dirs=sigs.k8s.io/cluster-api/internal/apis/core/v1alpha4 \ 532 --output-file-base=zz_generated.conversion $(CONVERSION_GEN_OUTPUT_BASE_CAPD) \ 533 --go-header-file=../../../hack/boilerplate/boilerplate.generatego.txt 534 535 .PHONY: generate-go-conversions-in-memory-infrastructure 536 generate-go-conversions-in-memory-infrastructure: $(CONVERSION_GEN) ## Generate conversions go code for in-memory infrastructure provider 537 cd $(CAPIM_DIR) 538 539 .PHONY: generate-go-conversions-test-extension 540 generate-go-conversions-test-extension: $(CONVERSION_GEN) ## Generate conversions go code for in-memory infrastructure provider 541 542 # The tmp/sigs.k8s.io/cluster-api symlink is a workaround to make this target run outside of GOPATH 543 .PHONY: generate-go-openapi 544 generate-go-openapi: $(OPENAPI_GEN) $(CONTROLLER_GEN) ## Generate openapi go code for runtime SDK 545 @mkdir -p ./tmp/sigs.k8s.io; ln -s $(ROOT_DIR) ./tmp/sigs.k8s.io/; cd ./tmp; \ 546 for pkg in "api/v1beta1" "$(EXP_DIR)/runtime/hooks/api/v1alpha1"; do \ 547 (cd ../ && $(MAKE) clean-generated-openapi-definitions SRC_DIRS="./$${pkg}"); \ 548 echo "** Generating openapi schema for types in ./$${pkg} **"; \ 549 $(OPENAPI_GEN) \ 550 --output-dir=../$${pkg} \ 551 --output-file=zz_generated.openapi.go \ 552 --output-pkg=sigs.k8s.io/cluster-api/$${pkg} \ 553 --go-header-file=../hack/boilerplate/boilerplate.generatego.txt \ 554 sigs.k8s.io/cluster-api/$${pkg}; \ 555 done; \ 556 rm sigs.k8s.io/cluster-api 557 558 .PHONY: generate-modules 559 generate-modules: ## Run go mod tidy to ensure modules are up to date 560 go mod tidy 561 cd $(TOOLS_DIR); go mod tidy 562 cd $(TEST_DIR); go mod tidy 563 564 .PHONY: generate-doctoc 565 generate-doctoc: 566 TRACE=$(TRACE) ./hack/generate-doctoc.sh 567 568 .PHONY: generate-e2e-templates 569 generate-e2e-templates: $(KUSTOMIZE) $(addprefix generate-e2e-templates-, v0.3 v0.4 v1.0 v1.5 v1.6 main) ## Generate cluster templates for all versions 570 571 DOCKER_TEMPLATES := test/e2e/data/infrastructure-docker 572 INMEMORY_TEMPLATES := test/e2e/data/infrastructure-inmemory 573 574 .PHONY: generate-e2e-templates-v0.3 575 generate-e2e-templates-v0.3: $(KUSTOMIZE) 576 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/v0.3/cluster-template --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/v0.3/cluster-template.yaml 577 578 .PHONY: generate-e2e-templates-v0.4 579 generate-e2e-templates-v0.4: $(KUSTOMIZE) 580 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/v0.4/cluster-template --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/v0.4/cluster-template.yaml 581 582 .PHONY: generate-e2e-templates-v1.0 583 generate-e2e-templates-v1.0: $(KUSTOMIZE) 584 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/v1.0/cluster-template --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/v1.0/cluster-template.yaml 585 586 .PHONY: generate-e2e-templates-v1.5 587 generate-e2e-templates-v1.5: $(KUSTOMIZE) 588 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/v1.5/cluster-template --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/v1.5/cluster-template.yaml 589 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/v1.5/cluster-template-topology --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/v1.5/cluster-template-topology.yaml 590 591 .PHONY: generate-e2e-templates-v1.6 592 generate-e2e-templates-v1.6: $(KUSTOMIZE) 593 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/v1.6/cluster-template --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/v1.6/cluster-template.yaml 594 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/v1.6/cluster-template-topology --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/v1.6/cluster-template-topology.yaml 595 596 .PHONY: generate-e2e-templates-main 597 generate-e2e-templates-main: $(KUSTOMIZE) 598 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template.yaml 599 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-md-remediation --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-md-remediation.yaml 600 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-kcp-remediation --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-kcp-remediation.yaml 601 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-kcp-adoption/step1 --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-kcp-adoption.yaml 602 echo "---" >> $(DOCKER_TEMPLATES)/main/cluster-template-kcp-adoption.yaml 603 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-kcp-adoption/step2 --load-restrictor LoadRestrictionsNone >> $(DOCKER_TEMPLATES)/main/cluster-template-kcp-adoption.yaml 604 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-machine-pool --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-machine-pool.yaml 605 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-node-drain --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-node-drain.yaml 606 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-upgrades --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-upgrades.yaml 607 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-upgrades-runtimesdk --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-upgrades-runtimesdk.yaml 608 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-kcp-scale-in --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-kcp-scale-in.yaml 609 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-ipv6 --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-ipv6.yaml 610 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-topology-dualstack-ipv6-primary --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-topology-dualstack-ipv6-primary.yaml 611 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-topology-dualstack-ipv4-primary --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-topology-dualstack-ipv4-primary.yaml 612 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-topology-single-node-cluster --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-topology-single-node-cluster.yaml 613 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-topology-autoscaler --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-topology-autoscaler.yaml 614 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-topology --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-topology.yaml 615 $(KUSTOMIZE) build $(DOCKER_TEMPLATES)/main/cluster-template-ignition --load-restrictor LoadRestrictionsNone > $(DOCKER_TEMPLATES)/main/cluster-template-ignition.yaml 616 617 $(KUSTOMIZE) build $(INMEMORY_TEMPLATES)/main/cluster-template --load-restrictor LoadRestrictionsNone > $(INMEMORY_TEMPLATES)/main/cluster-template.yaml 618 619 .PHONY: generate-metrics-config 620 generate-metrics-config: $(ENVSUBST_BIN) ## Generate ./config/metrics/crd-metrics-config.yaml 621 OUTPUT_FILE="./config/metrics/crd-metrics-config.yaml"; \ 622 METRIC_TEMPLATES_DIR="./config/metrics/templates"; \ 623 echo "# This file was auto-generated via: make generate-metrics-config" > "$${OUTPUT_FILE}"; \ 624 cat "$${METRIC_TEMPLATES_DIR}/header.yaml" >> "$${OUTPUT_FILE}"; \ 625 for resource in clusterclass cluster kubeadmcontrolplane kubeadmconfig machine machinedeployment machinehealthcheck machineset machinepool; do \ 626 cat "$${METRIC_TEMPLATES_DIR}/$${resource}.yaml"; \ 627 RESOURCE="$${resource}" ${ENVSUBST_BIN} < "$${METRIC_TEMPLATES_DIR}/common_metrics.yaml"; \ 628 if [[ "$${resource}" != "cluster" ]]; then \ 629 cat "$${METRIC_TEMPLATES_DIR}/owner_metric.yaml"; \ 630 fi \ 631 done >> "$${OUTPUT_FILE}"; \ 632 633 .PHONY: generate-diagrams 634 generate-diagrams: ## Generate diagrams for *.plantuml files 635 $(MAKE) generate-diagrams-book 636 $(MAKE) generate-diagrams-proposals 637 638 .PHONY: generate-diagrams-book 639 generate-diagrams-book: ## Generate diagrams for *.plantuml files in book 640 docker run -v $(ROOT_DIR)/$(DOCS_DIR):/$(DOCS_DIR)$(DOCKER_VOL_OPTS) plantuml/plantuml:$(PLANTUML_VER) /$(DOCS_DIR)/book/**/*.plantuml 641 642 .PHONY: generate-diagrams-proposals 643 generate-diagrams-proposals: ## Generate diagrams for *.plantuml files in proposals 644 docker run -v $(ROOT_DIR)/$(DOCS_DIR):/$(DOCS_DIR)$(DOCKER_VOL_OPTS) plantuml/plantuml:$(PLANTUML_VER) /$(DOCS_DIR)/proposals/**/*.plantuml 645 646 .PHONY: generate-test-infra-prowjobs 647 generate-test-infra-prowjobs: $(PROWJOB_GEN) ## Generates the prowjob configurations in test-infra 648 @if [ -z "${TEST_INFRA_DIR}" ]; then echo "TEST_INFRA_DIR is not set"; exit 1; fi 649 $(PROWJOB_GEN) \ 650 -config "$(TEST_INFRA_DIR)/config/jobs/kubernetes-sigs/cluster-api/cluster-api-prowjob-gen.yaml" \ 651 -templates-dir "$(TEST_INFRA_DIR)/config/jobs/kubernetes-sigs/cluster-api/templates" \ 652 -output-dir "$(TEST_INFRA_DIR)/config/jobs/kubernetes-sigs/cluster-api" 653 654 ## -------------------------------------- 655 ## Lint / Verify 656 ## -------------------------------------- 657 658 ##@ lint and verify: 659 660 .PHONY: lint 661 lint: $(GOLANGCI_LINT) ## Lint the codebase 662 $(GOLANGCI_LINT) run -v $(GOLANGCI_LINT_EXTRA_ARGS) 663 cd $(TEST_DIR); $(GOLANGCI_LINT) run --path-prefix $(TEST_DIR) --config $(ROOT_DIR)/.golangci.yml -v $(GOLANGCI_LINT_EXTRA_ARGS) 664 cd $(TOOLS_DIR); $(GOLANGCI_LINT) run --path-prefix $(TOOLS_DIR) --config $(ROOT_DIR)/.golangci.yml -v $(GOLANGCI_LINT_EXTRA_ARGS) 665 ./scripts/ci-lint-dockerfiles.sh $(HADOLINT_VER) $(HADOLINT_FAILURE_THRESHOLD) 666 667 .PHONY: lint-dockerfiles 668 lint-dockerfiles: 669 ./scripts/ci-lint-dockerfiles.sh $(HADOLINT_VER) $(HADOLINT_FAILURE_THRESHOLD) 670 671 .PHONY: lint-fix 672 lint-fix: $(GOLANGCI_LINT) ## Lint the codebase and run auto-fixers if supported by the linter 673 GOLANGCI_LINT_EXTRA_ARGS=--fix $(MAKE) lint 674 675 .PHONY: tiltfile-fix 676 tiltfile-fix: ## Format the Tiltfile 677 TRACE=$(TRACE) ./hack/verify-starlark.sh fix 678 679 APIDIFF_OLD_COMMIT ?= $(shell git rev-parse origin/main) 680 681 .PHONY: apidiff 682 apidiff: $(GO_APIDIFF) ## Check for API differences 683 $(GO_APIDIFF) $(APIDIFF_OLD_COMMIT) --print-compatible 684 685 ALL_VERIFY_CHECKS = licenses boilerplate shellcheck tiltfile modules gen conversions doctoc capi-book-summary diagrams import-restrictions go-directive 686 687 .PHONY: verify 688 verify: $(addprefix verify-,$(ALL_VERIFY_CHECKS)) lint-dockerfiles ## Run all verify-* targets 689 690 .PHONY: verify-go-directive 691 verify-go-directive: 692 TRACE=$(TRACE) ./hack/verify-go-directive.sh -g $(GO_DIRECTIVE_VERSION) 693 694 .PHONY: verify-modules 695 verify-modules: generate-modules ## Verify go modules are up to date 696 @if !(git diff --quiet HEAD -- go.sum go.mod $(TOOLS_DIR)/go.mod $(TOOLS_DIR)/go.sum $(TEST_DIR)/go.mod $(TEST_DIR)/go.sum); then \ 697 git diff; \ 698 echo "go module files are out of date"; exit 1; \ 699 fi 700 @if (find . -name 'go.mod' | xargs -n1 grep -q -i 'k8s.io/client-go.*+incompatible'); then \ 701 find . -name "go.mod" -exec grep -i 'k8s.io/client-go.*+incompatible' {} \; -print; \ 702 echo "go module contains an incompatible client-go version"; exit 1; \ 703 fi 704 705 .PHONY: verify-gen 706 verify-gen: generate ## Verify go generated files are up to date 707 @if !(git diff --quiet HEAD); then \ 708 git diff; \ 709 echo "generated files are out of date, run make generate"; exit 1; \ 710 fi 711 712 .PHONY: verify-conversions 713 verify-conversions: $(CONVERSION_VERIFIER) ## Verifies expected API conversion are in place 714 $(CONVERSION_VERIFIER) 715 716 .PHONY: verify-doctoc 717 verify-doctoc: generate-doctoc 718 @if !(git diff --quiet HEAD); then \ 719 git diff; \ 720 echo "doctoc is out of date, run make generate-doctoc"; exit 1; \ 721 fi 722 723 .PHONY: verify-capi-book-summary 724 verify-capi-book-summary: 725 TRACE=$(TRACE) ./hack/verify-capi-book-summary.sh 726 727 .PHONY: verify-boilerplate 728 verify-boilerplate: ## Verify boilerplate text exists in each file 729 TRACE=$(TRACE) ./hack/verify-boilerplate.sh 730 731 .PHONY: verify-shellcheck 732 verify-shellcheck: ## Verify shell files 733 TRACE=$(TRACE) ./hack/verify-shellcheck.sh $(SHELLCHECK_VER) 734 735 .PHONY: verify-tiltfile 736 verify-tiltfile: ## Verify Tiltfile format 737 TRACE=$(TRACE) ./hack/verify-starlark.sh 738 739 .PHONY: verify-container-images 740 verify-container-images: ## Verify container images 741 TRACE=$(TRACE) ./hack/verify-container-images.sh $(TRIVY_VER) 742 743 .PHONY: verify-licenses 744 verify-licenses: ## Verify licenses 745 TRACE=$(TRACE) ./hack/verify-licenses.sh $(TRIVY_VER) 746 747 .PHONY: verify-govulncheck 748 verify-govulncheck: $(GOVULNCHECK) ## Verify code for vulnerabilities 749 $(GOVULNCHECK) ./... && R1=$$? || R1=$$?; \ 750 $(GOVULNCHECK) -C "$(TOOLS_DIR)" ./... && R2=$$? || R2=$$?; \ 751 $(GOVULNCHECK) -C "$(TEST_DIR)" ./... && R3=$$? || R3=$$?; \ 752 if [ "$$R1" -ne "0" ] || [ "$$R2" -ne "0" ] || [ "$$R3" -ne "0" ]; then \ 753 exit 1; \ 754 fi 755 756 .PHONY: verify-diagrams 757 verify-diagrams: generate-diagrams ## Verify generated diagrams are up to date 758 @if !(git diff --quiet HEAD); then \ 759 git diff; \ 760 echo "generated diagrams are out of date, run make generate-diagrams"; exit 1; \ 761 fi 762 763 .PHONY: verify-security 764 verify-security: ## Verify code and images for vulnerabilities 765 $(MAKE) verify-container-images && R1=$$? || R1=$$?; \ 766 $(MAKE) verify-govulncheck && R2=$$? || R2=$$?; \ 767 if [ "$$R1" -ne "0" ] || [ "$$R2" -ne "0" ]; then \ 768 echo "Check for vulnerabilities failed! There are vulnerabilities to be fixed"; \ 769 exit 1; \ 770 fi 771 772 .PHONY: verify-import-restrictions 773 verify-import-restrictions: $(IMPORT_BOSS) ## Verify import restrictions with import-boss 774 ./hack/verify-import-restrictions.sh 775 776 ## -------------------------------------- 777 ## Binaries 778 ## -------------------------------------- 779 780 ##@ build: 781 782 .PHONY: clusterctl 783 clusterctl: ## Build the clusterctl binary 784 go build -trimpath -ldflags "$(LDFLAGS)" -o $(BIN_DIR)/clusterctl sigs.k8s.io/cluster-api/cmd/clusterctl 785 786 ALL_MANAGERS = core kubeadm-bootstrap kubeadm-control-plane docker-infrastructure in-memory-infrastructure 787 788 .PHONY: managers 789 managers: $(addprefix manager-,$(ALL_MANAGERS)) ## Run all manager-* targets 790 791 .PHONY: manager-core 792 manager-core: ## Build the core manager binary into the ./bin folder 793 go build -trimpath -ldflags "$(LDFLAGS)" -o $(BIN_DIR)/manager sigs.k8s.io/cluster-api 794 795 .PHONY: manager-kubeadm-bootstrap 796 manager-kubeadm-bootstrap: ## Build the kubeadm bootstrap manager binary into the ./bin folder 797 go build -trimpath -ldflags "$(LDFLAGS)" -o $(BIN_DIR)/kubeadm-bootstrap-manager sigs.k8s.io/cluster-api/bootstrap/kubeadm 798 799 .PHONY: manager-kubeadm-control-plane 800 manager-kubeadm-control-plane: ## Build the kubeadm control plane manager binary into the ./bin folder 801 go build -trimpath -ldflags "$(LDFLAGS)" -o $(BIN_DIR)/kubeadm-control-plane-manager sigs.k8s.io/cluster-api/controlplane/kubeadm 802 803 .PHONY: manager-docker-infrastructure 804 manager-docker-infrastructure: ## Build the docker infrastructure manager binary into the ./bin folder 805 cd $(CAPD_DIR); go build -trimpath -ldflags "$(LDFLAGS)" -o ../../../$(BIN_DIR)/capd-manager sigs.k8s.io/cluster-api/test/infrastructure/docker 806 807 .PHONY: manager-in-memory-infrastructure 808 manager-in-memory-infrastructure: ## Build the in-memory-infrastructure infrastructure manager binary into the ./bin folder 809 cd $(CAPIM_DIR); go build -trimpath -ldflags "$(LDFLAGS)" -o ../../../$(BIN_DIR)/capim-manager sigs.k8s.io/cluster-api/test/infrastructure/inmemory 810 811 .PHONY: docker-pull-prerequisites 812 docker-pull-prerequisites: 813 docker pull docker.io/docker/dockerfile:1.4 814 docker pull $(GO_CONTAINER_IMAGE) 815 docker pull gcr.io/distroless/static:latest 816 817 .PHONY: docker-build-all 818 docker-build-all: $(addprefix docker-build-,$(ALL_ARCH)) ## Build docker images for all architectures 819 820 docker-build-%: 821 $(MAKE) ARCH=$* docker-build 822 823 # Choice of images to build/push 824 ALL_DOCKER_BUILD ?= core kubeadm-bootstrap kubeadm-control-plane docker-infrastructure in-memory-infrastructure test-extension clusterctl 825 826 .PHONY: docker-build 827 docker-build: docker-pull-prerequisites ## Run docker-build-* targets for all the images 828 $(MAKE) ARCH=$(ARCH) $(addprefix docker-build-,$(ALL_DOCKER_BUILD)) 829 830 ALL_DOCKER_BUILD_E2E = core kubeadm-bootstrap kubeadm-control-plane docker-infrastructure in-memory-infrastructure test-extension 831 832 .PHONY: docker-build-e2e 833 docker-build-e2e: ## Run docker-build-* targets for all the images with settings to be used for the e2e tests 834 # please ensure the generated image name matches image names used in the E2E_CONF_FILE; 835 # also the same settings must exist in ci-e2e-lib.sh, capi:buildDockerImage func. 836 $(MAKE) REGISTRY=gcr.io/k8s-staging-cluster-api PULL_POLICY=IfNotPresent TAG=dev $(addprefix docker-build-,$(ALL_DOCKER_BUILD_E2E)) 837 838 .PHONY: docker-build-core 839 docker-build-core: ## Build the docker image for core controller manager 840 ## reads Dockerfile from stdin to avoid an incorrectly cached Dockerfile (https://github.com/moby/buildkit/issues/1368) 841 cat ./Dockerfile | DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg ldflags="$(LDFLAGS)" . -t $(CONTROLLER_IMG)-$(ARCH):$(TAG) --file - 842 $(MAKE) set-manifest-image MANIFEST_IMG=$(CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./config/default/manager_image_patch.yaml" 843 $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./config/default/manager_pull_policy.yaml" 844 845 .PHONY: docker-build-kubeadm-bootstrap 846 docker-build-kubeadm-bootstrap: ## Build the docker image for kubeadm bootstrap controller manager 847 ## reads Dockerfile from stdin to avoid an incorrectly cached Dockerfile (https://github.com/moby/buildkit/issues/1368) 848 cat ./Dockerfile | DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg package=./bootstrap/kubeadm --build-arg ldflags="$(LDFLAGS)" . -t $(KUBEADM_BOOTSTRAP_CONTROLLER_IMG)-$(ARCH):$(TAG) --file - 849 $(MAKE) set-manifest-image MANIFEST_IMG=$(KUBEADM_BOOTSTRAP_CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./bootstrap/kubeadm/config/default/manager_image_patch.yaml" 850 $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./bootstrap/kubeadm/config/default/manager_pull_policy.yaml" 851 852 .PHONY: docker-build-kubeadm-control-plane 853 docker-build-kubeadm-control-plane: ## Build the docker image for kubeadm control plane controller manager 854 ## reads Dockerfile from stdin to avoid an incorrectly cached Dockerfile (https://github.com/moby/buildkit/issues/1368) 855 cat ./Dockerfile | DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg package=./controlplane/kubeadm --build-arg ldflags="$(LDFLAGS)" . -t $(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG)-$(ARCH):$(TAG) --file - 856 $(MAKE) set-manifest-image MANIFEST_IMG=$(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./controlplane/kubeadm/config/default/manager_image_patch.yaml" 857 $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./controlplane/kubeadm/config/default/manager_pull_policy.yaml" 858 859 .PHONY: docker-build-docker-infrastructure 860 docker-build-docker-infrastructure: ## Build the docker image for docker infrastructure controller manager 861 ## reads Dockerfile from stdin to avoid an incorrectly cached Dockerfile (https://github.com/moby/buildkit/issues/1368) 862 cat $(CAPD_DIR)/Dockerfile | DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg ldflags="$(LDFLAGS)" . -t $(CAPD_CONTROLLER_IMG)-$(ARCH):$(TAG) --file - 863 $(MAKE) set-manifest-image MANIFEST_IMG=$(CAPD_CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="$(CAPD_DIR)/config/default/manager_image_patch.yaml" 864 $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="$(CAPD_DIR)/config/default/manager_pull_policy.yaml" 865 866 .PHONY: docker-build-in-memory-infrastructure 867 docker-build-in-memory-infrastructure: ## Build the docker image for in-memory infrastructure controller manager 868 ## reads Dockerfile from stdin to avoid an incorrectly cached Dockerfile (https://github.com/moby/buildkit/issues/1368) 869 cat $(CAPIM_DIR)/Dockerfile | DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg ldflags="$(LDFLAGS)" . -t $(CAPIM_CONTROLLER_IMG)-$(ARCH):$(TAG) --file - 870 $(MAKE) set-manifest-image MANIFEST_IMG=$(CAPIM_CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="$(CAPIM_DIR)/config/default/manager_image_patch.yaml" 871 $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="$(CAPIM_DIR)/config/default/manager_pull_policy.yaml" 872 873 .PHONY: docker-build-clusterctl 874 docker-build-clusterctl: ## Build the docker image for clusterctl 875 ## reads Dockerfile from stdin to avoid an incorrectly cached Dockerfile (https://github.com/moby/buildkit/issues/1368) 876 cat ./cmd/clusterctl/Dockerfile | DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg package=./cmd/clusterctl --build-arg ldflags="$(LDFLAGS)" . -t $(CLUSTERCTL_IMG)-$(ARCH):$(TAG) --file - 877 878 .PHONY: docker-build-test-extension 879 docker-build-test-extension: ## Build the docker image for core controller manager 880 ## reads Dockerfile from stdin to avoid an incorrectly cached Dockerfile (https://github.com/moby/buildkit/issues/1368) 881 cat ./test/extension/Dockerfile | DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg ldflags="$(LDFLAGS)" . -t $(TEST_EXTENSION_IMG)-$(ARCH):$(TAG) --file - 882 $(MAKE) set-manifest-image MANIFEST_IMG=$(TEST_EXTENSION_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./test/extension/config/default/manager_image_patch.yaml" 883 $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./test/extension/config/default/manager_pull_policy.yaml" 884 885 .PHONY: e2e-framework 886 e2e-framework: ## Builds the CAPI e2e framework 887 cd $(E2E_FRAMEWORK_DIR); go build ./... 888 889 .PHONY: build-book 890 build-book: ## Build the book 891 $(MAKE) -C docs/book build 892 893 ## -------------------------------------- 894 ## Testing 895 ## -------------------------------------- 896 897 ##@ test: 898 899 ARTIFACTS ?= ${ROOT_DIR}/_artifacts 900 901 KUBEBUILDER_ASSETS ?= $(shell $(SETUP_ENVTEST) use --use-env -p path $(KUBEBUILDER_ENVTEST_KUBERNETES_VERSION)) 902 903 .PHONY: setup-envtest 904 setup-envtest: $(SETUP_ENVTEST) ## Set up envtest (download kubebuilder assets) 905 @echo KUBEBUILDER_ASSETS=$(KUBEBUILDER_ASSETS) 906 907 .PHONY: test 908 test: $(SETUP_ENVTEST) ## Run unit and integration tests 909 KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test ./... $(TEST_ARGS) 910 911 .PHONY: test-verbose 912 test-verbose: ## Run unit and integration tests with verbose flag 913 $(MAKE) test TEST_ARGS="$(TEST_ARGS) -v" 914 915 .PHONY: test-junit 916 test-junit: $(SETUP_ENVTEST) $(GOTESTSUM) ## Run unit and integration tests and generate a junit report 917 set +o errexit; (KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -json ./... $(TEST_ARGS); echo $$? > $(ARTIFACTS)/junit.exitcode) | tee $(ARTIFACTS)/junit.stdout 918 $(GOTESTSUM) --junitfile $(ARTIFACTS)/junit.xml --raw-command cat $(ARTIFACTS)/junit.stdout 919 exit $$(cat $(ARTIFACTS)/junit.exitcode) 920 921 .PHONY: test-cover 922 test-cover: ## Run unit and integration tests and generate a coverage report 923 $(MAKE) test TEST_ARGS="$(TEST_ARGS) -coverprofile=out/coverage.out" 924 go tool cover -func=out/coverage.out -o out/coverage.txt 925 go tool cover -html=out/coverage.out -o out/coverage.html 926 927 .PHONY: test-docker-infrastructure 928 test-docker-infrastructure: $(SETUP_ENVTEST) ## Run unit and integration tests for docker infrastructure provider 929 cd $(CAPD_DIR); KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test ./... $(TEST_ARGS) 930 931 .PHONY: test-docker-infrastructure-verbose 932 test-docker-infrastructure-verbose: ## Run unit and integration tests for docker infrastructure provider with verbose flag 933 $(MAKE) test-docker-infrastructure TEST_ARGS="$(TEST_ARGS) -v" 934 935 .PHONY: test-docker-infrastructure-junit 936 test-docker-infrastructure-junit: $(SETUP_ENVTEST) $(GOTESTSUM) ## Run unit and integration tests and generate a junit report for docker infrastructure provider 937 cd $(CAPD_DIR); set +o errexit; (KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -json ./... $(TEST_ARGS); echo $$? > $(ARTIFACTS)/junit.infra_docker.exitcode) | tee $(ARTIFACTS)/junit.infra_docker.stdout 938 $(GOTESTSUM) --junitfile $(ARTIFACTS)/junit.infra_docker.xml --raw-command cat $(ARTIFACTS)/junit.infra_docker.stdout 939 exit $$(cat $(ARTIFACTS)/junit.infra_docker.exitcode) 940 941 .PHONY: test-in-memory-infrastructure 942 test-in-memory-infrastructure: $(SETUP_ENVTEST) ## Run unit and integration tests for in-memory infrastructure provider 943 cd $(CAPIM_DIR); KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test ./... $(TEST_ARGS) 944 945 .PHONY: test-in-memory-infrastructure-verbose 946 test-in-memory-infrastructure-verbose: ## Run unit and integration tests for in-memory infrastructure provider with verbose flag 947 $(MAKE) test-in-memory-infrastructure TEST_ARGS="$(TEST_ARGS) -v" 948 949 .PHONY: test-in-memory-infrastructure-junit 950 test-in-memory-infrastructure-junit: $(SETUP_ENVTEST) $(GOTESTSUM) ## Run unit and integration tests and generate a junit report for in-memory infrastructure provider 951 cd $(CAPIM_DIR); set +o errexit; (KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -json ./... $(TEST_ARGS); echo $$? > $(ARTIFACTS)/junit.infra_inmemory.exitcode) | tee $(ARTIFACTS)/junit.infra_inmemory.stdout 952 $(GOTESTSUM) --junitfile $(ARTIFACTS)/junit.infra_inmemory.xml --raw-command cat $(ARTIFACTS)/junit.infra_inmemory.stdout 953 exit $$(cat $(ARTIFACTS)/junit.infra_inmemory.exitcode) 954 955 .PHONY: test-test-extension 956 test-test-extension: $(SETUP_ENVTEST) ## Run unit and integration tests for the test extension 957 cd $(TEST_EXTENSION_DIR); KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test ./... $(TEST_ARGS) 958 959 .PHONY: test-test-extension-verbose 960 test-test-extension-verbose: ## Run unit and integration tests with verbose flag 961 $(MAKE) test-test-extension TEST_ARGS="$(TEST_ARGS) -v" 962 963 .PHONY: test-test-extension-junit 964 test-test-extension-junit: $(SETUP_ENVTEST) $(GOTESTSUM) ## Run unit and integration tests and generate a junit report for the test extension 965 cd $(TEST_EXTENSION_DIR); set +o errexit; (KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -json ./... $(TEST_ARGS); echo $$? > $(ARTIFACTS)/junit.test_extension.exitcode) | tee $(ARTIFACTS)/junit.test_extension.stdout 966 $(GOTESTSUM) --junitfile $(ARTIFACTS)/junit.test_extension.xml --raw-command cat $(ARTIFACTS)/junit.test_extension.stdout 967 exit $$(cat $(ARTIFACTS)/junit.test_extension.exitcode) 968 969 .PHONY: test-e2e 970 test-e2e: $(GINKGO) generate-e2e-templates ## Run the end-to-end tests 971 $(GINKGO) -v --trace -poll-progress-after=$(GINKGO_POLL_PROGRESS_AFTER) \ 972 -poll-progress-interval=$(GINKGO_POLL_PROGRESS_INTERVAL) --tags=e2e --focus="$(GINKGO_FOCUS)" \ 973 $(_SKIP_ARGS) --nodes=$(GINKGO_NODES) --timeout=$(GINKGO_TIMEOUT) --no-color=$(GINKGO_NOCOLOR) \ 974 --output-dir="$(ARTIFACTS)" --junit-report="junit.e2e_suite.1.xml" $(GINKGO_ARGS) $(ROOT_DIR)/$(TEST_DIR)/e2e -- \ 975 -e2e.artifacts-folder="$(ARTIFACTS)" \ 976 -e2e.config="$(E2E_CONF_FILE)" \ 977 -e2e.skip-resource-cleanup=$(SKIP_RESOURCE_CLEANUP) -e2e.use-existing-cluster=$(USE_EXISTING_CLUSTER) 978 979 980 .PHONY: kind-cluster 981 kind-cluster: ## Create a new kind cluster designed for development with Tilt 982 hack/kind-install-for-capd.sh 983 984 .PHONY: tilt-up 985 tilt-up: kind-cluster ## Start tilt and build kind cluster if needed. 986 tilt up 987 988 .PHONY: serve-book 989 serve-book: ## Build and serve the book (with live-reload) 990 $(MAKE) -C docs/book serve 991 992 ## -------------------------------------- 993 ## Release 994 ## -------------------------------------- 995 996 ##@ release: 997 998 ## latest git tag for the commit, e.g., v0.3.10 999 RELEASE_TAG ?= $(shell git describe --abbrev=0 2>/dev/null) 1000 ifneq (,$(findstring -,$(RELEASE_TAG))) 1001 PRE_RELEASE=true 1002 endif 1003 # the previous release tag, e.g., v0.3.9, excluding pre-release tags 1004 PREVIOUS_TAG ?= $(shell git tag -l | grep -E "^v[0-9]+\.[0-9]+\.[0-9]+$$" | sort -V | grep -B1 $(RELEASE_TAG) | head -n 1 2>/dev/null) 1005 ## set by Prow, ref name of the base branch, e.g., main 1006 RELEASE_ALIAS_TAG := $(PULL_BASE_REF) 1007 RELEASE_DIR := out 1008 RELEASE_NOTES_DIR := CHANGELOG 1009 USER_FORK ?= $(shell git config --get remote.origin.url | cut -d/ -f4) # only works on https://github.com/<username>/cluster-api.git style URLs 1010 ifeq ($(USER_FORK),) 1011 USER_FORK := $(shell git config --get remote.origin.url | cut -d: -f2 | cut -d/ -f1) # for git@github.com:<username>/cluster-api.git style URLs 1012 endif 1013 IMAGE_REVIEWERS ?= $(shell ./hack/get-project-maintainers.sh) 1014 1015 .PHONY: $(RELEASE_DIR) 1016 $(RELEASE_DIR): 1017 mkdir -p $(RELEASE_DIR)/ 1018 1019 .PHONY: $(RELEASE_NOTES_DIR) 1020 $(RELEASE_NOTES_DIR): 1021 mkdir -p $(RELEASE_NOTES_DIR)/ 1022 1023 .PHONY: release 1024 release: clean-release ## Build and push container images using the latest git tag for the commit 1025 @if [ -z "${RELEASE_TAG}" ]; then echo "RELEASE_TAG is not set"; exit 1; fi 1026 @if ! [ -z "$$(git status --porcelain)" ]; then echo "Your local git repository contains uncommitted changes, use git clean before proceeding."; exit 1; fi 1027 git checkout "${RELEASE_TAG}" 1028 # Build binaries first. 1029 GIT_VERSION=$(RELEASE_TAG) $(MAKE) release-binaries 1030 # Set the manifest images to the staging/production bucket and Builds the manifests to publish with a release. 1031 $(MAKE) release-manifests-all 1032 1033 .PHONY: release-manifests-all 1034 release-manifests-all: # Set the manifest images to the staging/production bucket and Builds the manifests to publish with a release. 1035 # Set the manifest image to the production bucket. 1036 $(MAKE) manifest-modification REGISTRY=$(PROD_REGISTRY) 1037 ## Build the manifests 1038 $(MAKE) release-manifests 1039 # Set the development manifest image to the staging bucket. 1040 $(MAKE) manifest-modification-dev REGISTRY=$(STAGING_REGISTRY) 1041 ## Build the development manifests 1042 $(MAKE) release-manifests-dev 1043 ## Clean the git artifacts modified in the release process 1044 $(MAKE) clean-release-git 1045 1046 .PHONY: manifest-modification 1047 manifest-modification: # Set the manifest images to the staging/production bucket. 1048 $(MAKE) set-manifest-image \ 1049 MANIFEST_IMG=$(REGISTRY)/$(IMAGE_NAME) MANIFEST_TAG=$(RELEASE_TAG) \ 1050 TARGET_RESOURCE="./config/default/manager_image_patch.yaml" 1051 $(MAKE) set-manifest-image \ 1052 MANIFEST_IMG=$(REGISTRY)/$(KUBEADM_BOOTSTRAP_IMAGE_NAME) MANIFEST_TAG=$(RELEASE_TAG) \ 1053 TARGET_RESOURCE="./bootstrap/kubeadm/config/default/manager_image_patch.yaml" 1054 $(MAKE) set-manifest-image \ 1055 MANIFEST_IMG=$(REGISTRY)/$(KUBEADM_CONTROL_PLANE_IMAGE_NAME) MANIFEST_TAG=$(RELEASE_TAG) \ 1056 TARGET_RESOURCE="./controlplane/kubeadm/config/default/manager_image_patch.yaml" 1057 $(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="./config/default/manager_pull_policy.yaml" 1058 $(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="./bootstrap/kubeadm/config/default/manager_pull_policy.yaml" 1059 $(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="./controlplane/kubeadm/config/default/manager_pull_policy.yaml" 1060 1061 .PHONY: manifest-modification-dev 1062 manifest-modification-dev: # Set the manifest images to the staging bucket. 1063 $(MAKE) set-manifest-image \ 1064 MANIFEST_IMG=$(REGISTRY)/$(CAPD_IMAGE_NAME) MANIFEST_TAG=$(RELEASE_TAG) \ 1065 TARGET_RESOURCE="$(CAPD_DIR)/config/default/manager_image_patch.yaml" 1066 $(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="$(CAPD_DIR)/config/default/manager_pull_policy.yaml" 1067 $(MAKE) set-manifest-image \ 1068 MANIFEST_IMG=$(REGISTRY)/$(CAPIM_IMAGE_NAME) MANIFEST_TAG=$(RELEASE_TAG) \ 1069 TARGET_RESOURCE="$(CAPIM_DIR)/config/default/manager_image_patch.yaml" 1070 $(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="$(CAPIM_DIR)/config/default/manager_pull_policy.yaml" 1071 $(MAKE) set-manifest-image \ 1072 MANIFEST_IMG=$(REGISTRY)/$(TEST_EXTENSION_IMAGE_NAME) MANIFEST_TAG=$(RELEASE_TAG) \ 1073 TARGET_RESOURCE="$(TEST_EXTENSION_DIR)/config/default/manager_image_patch.yaml" 1074 $(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="$(CAPD_DIR)/config/default/manager_pull_policy.yaml" 1075 1076 1077 .PHONY: release-manifests 1078 release-manifests: $(RELEASE_DIR) $(KUSTOMIZE) $(RUNTIME_OPENAPI_GEN) ## Build the manifests to publish with a release 1079 # Build core-components. 1080 $(KUSTOMIZE) build config/default > $(RELEASE_DIR)/core-components.yaml 1081 # Build bootstrap-components. 1082 $(KUSTOMIZE) build bootstrap/kubeadm/config/default > $(RELEASE_DIR)/bootstrap-components.yaml 1083 # Build control-plane-components. 1084 $(KUSTOMIZE) build controlplane/kubeadm/config/default > $(RELEASE_DIR)/control-plane-components.yaml 1085 1086 ## Build cluster-api-components (aggregate of all of the above). 1087 cat $(RELEASE_DIR)/core-components.yaml > $(RELEASE_DIR)/cluster-api-components.yaml 1088 echo "---" >> $(RELEASE_DIR)/cluster-api-components.yaml 1089 cat $(RELEASE_DIR)/bootstrap-components.yaml >> $(RELEASE_DIR)/cluster-api-components.yaml 1090 echo "---" >> $(RELEASE_DIR)/cluster-api-components.yaml 1091 cat $(RELEASE_DIR)/control-plane-components.yaml >> $(RELEASE_DIR)/cluster-api-components.yaml 1092 # Add metadata to the release artifacts 1093 cp metadata.yaml $(RELEASE_DIR)/metadata.yaml 1094 1095 # Generate OpenAPI specification. 1096 $(RUNTIME_OPENAPI_GEN) --version $(RELEASE_TAG) --output-file $(RELEASE_DIR)/runtime-sdk-openapi.yaml 1097 1098 .PHONY: release-manifests-dev 1099 release-manifests-dev: $(RELEASE_DIR) $(KUSTOMIZE) ## Build the development manifests and copies them in the release folder 1100 cd $(CAPD_DIR); $(KUSTOMIZE) build config/default > ../../../$(RELEASE_DIR)/infrastructure-components-development.yaml 1101 cp $(CAPD_DIR)/templates/* $(RELEASE_DIR)/ 1102 cd $(CAPIM_DIR); $(KUSTOMIZE) build config/default > ../../../$(RELEASE_DIR)/infrastructure-components-in-memory-development.yaml 1103 cp $(CAPIM_DIR)/templates/* $(RELEASE_DIR)/ 1104 cd $(TEST_EXTENSION_DIR); $(KUSTOMIZE) build config/default > ../../$(RELEASE_DIR)/runtime-extension-components-development.yaml 1105 1106 .PHONY: release-binaries 1107 release-binaries: ## Build the binaries to publish with a release 1108 RELEASE_BINARY=clusterctl-linux-amd64 BUILD_PATH=./cmd/clusterctl GOOS=linux GOARCH=amd64 $(MAKE) release-binary 1109 RELEASE_BINARY=clusterctl-linux-arm64 BUILD_PATH=./cmd/clusterctl GOOS=linux GOARCH=arm64 $(MAKE) release-binary 1110 RELEASE_BINARY=clusterctl-darwin-amd64 BUILD_PATH=./cmd/clusterctl GOOS=darwin GOARCH=amd64 $(MAKE) release-binary 1111 RELEASE_BINARY=clusterctl-darwin-arm64 BUILD_PATH=./cmd/clusterctl GOOS=darwin GOARCH=arm64 $(MAKE) release-binary 1112 RELEASE_BINARY=clusterctl-windows-amd64.exe BUILD_PATH=./cmd/clusterctl GOOS=windows GOARCH=amd64 $(MAKE) release-binary 1113 RELEASE_BINARY=clusterctl-linux-ppc64le BUILD_PATH=./cmd/clusterctl GOOS=linux GOARCH=ppc64le $(MAKE) release-binary 1114 1115 .PHONY: release-binary 1116 release-binary: $(RELEASE_DIR) 1117 docker run \ 1118 --rm \ 1119 -e CGO_ENABLED=0 \ 1120 -e GOOS=$(GOOS) \ 1121 -e GOARCH=$(GOARCH) \ 1122 -e GOCACHE=/tmp/ \ 1123 --user $$(id -u):$$(id -g) \ 1124 -v "$$(pwd):/workspace$(DOCKER_VOL_OPTS)" \ 1125 -w /workspace \ 1126 golang:$(GO_VERSION) \ 1127 go build -a -trimpath -ldflags "$(LDFLAGS) -extldflags '-static'" \ 1128 -o $(RELEASE_DIR)/$(notdir $(RELEASE_BINARY)) $(BUILD_PATH) 1129 1130 .PHONY: release-staging 1131 release-staging: ## Build and push container images to the staging bucket 1132 REGISTRY=$(STAGING_REGISTRY) $(MAKE) docker-build-all 1133 REGISTRY=$(STAGING_REGISTRY) $(MAKE) docker-image-verify 1134 REGISTRY=$(STAGING_REGISTRY) $(MAKE) docker-push-all 1135 REGISTRY=$(STAGING_REGISTRY) $(MAKE) release-alias-tag 1136 1137 .PHONY: release-staging-nightly 1138 release-staging-nightly: ## Tag and push container images to the staging bucket. Example image tag: cluster-api-controller:nightly_main_20210121 1139 $(eval NEW_RELEASE_ALIAS_TAG := nightly_$(RELEASE_ALIAS_TAG)_$(shell date +'%Y%m%d')) 1140 echo $(NEW_RELEASE_ALIAS_TAG) 1141 $(MAKE) release-alias-tag TAG=$(RELEASE_ALIAS_TAG) RELEASE_ALIAS_TAG=$(NEW_RELEASE_ALIAS_TAG) 1142 # Set the manifest image to the staging bucket. 1143 $(MAKE) manifest-modification REGISTRY=$(STAGING_REGISTRY) RELEASE_TAG=$(NEW_RELEASE_ALIAS_TAG) 1144 ## Build the manifests 1145 $(MAKE) release-manifests 1146 # Set the manifest image to the staging bucket. 1147 $(MAKE) manifest-modification-dev REGISTRY=$(STAGING_REGISTRY) RELEASE_TAG=$(NEW_RELEASE_ALIAS_TAG) 1148 ## Build the dev manifests 1149 $(MAKE) release-manifests-dev 1150 # Example manifest location: artifacts.k8s-staging-cluster-api.appspot.com/components/nightly_main_20210121/bootstrap-components.yaml 1151 gsutil cp $(RELEASE_DIR)/* gs://$(STAGING_BUCKET)/components/$(NEW_RELEASE_ALIAS_TAG) 1152 1153 .PHONY: release-alias-tag 1154 release-alias-tag: ## Add the release alias tag to the last build tag 1155 gcloud container images add-tag $(CONTROLLER_IMG):$(TAG) $(CONTROLLER_IMG):$(RELEASE_ALIAS_TAG) 1156 gcloud container images add-tag $(KUBEADM_BOOTSTRAP_CONTROLLER_IMG):$(TAG) $(KUBEADM_BOOTSTRAP_CONTROLLER_IMG):$(RELEASE_ALIAS_TAG) 1157 gcloud container images add-tag $(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG):$(TAG) $(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG):$(RELEASE_ALIAS_TAG) 1158 gcloud container images add-tag $(CLUSTERCTL_IMG):$(TAG) $(CLUSTERCTL_IMG):$(RELEASE_ALIAS_TAG) 1159 gcloud container images add-tag $(CAPD_CONTROLLER_IMG):$(TAG) $(CAPD_CONTROLLER_IMG):$(RELEASE_ALIAS_TAG) 1160 gcloud container images add-tag $(CAPIM_CONTROLLER_IMG):$(TAG) $(CAPIM_CONTROLLER_IMG):$(RELEASE_ALIAS_TAG) 1161 gcloud container images add-tag $(TEST_EXTENSION_IMG):$(TAG) $(TEST_EXTENSION_IMG):$(RELEASE_ALIAS_TAG) 1162 1163 .PHONY: release-notes-tool 1164 release-notes-tool: 1165 go build -C hack/tools -o $(ROOT_DIR)/bin/notes -tags tools sigs.k8s.io/cluster-api/hack/tools/release/notes 1166 1167 .PHONY: release-notes 1168 release-notes: release-notes-tool 1169 ./bin/notes --release $(RELEASE_TAG) > CHANGELOG/$(RELEASE_TAG).md 1170 1171 .PHONY: test-release-notes-tool 1172 test-release-notes-tool: 1173 go test -C hack/tools -v -tags tools,integration sigs.k8s.io/cluster-api/hack/tools/release/notes 1174 1175 .PHONY: release-provider-issues-tool 1176 release-provider-issues-tool: # Creates GitHub issues in a pre-defined list of CAPI provider repositories 1177 @go run ./hack/tools/release/internal/update_providers/provider_issues.go 1178 1179 .PHONY: release-weekly-update-tool 1180 release-weekly-update-tool: 1181 go build -C hack/tools -o $(ROOT_DIR)/bin/weekly -tags tools sigs.k8s.io/cluster-api/hack/tools/release/weekly 1182 1183 .PHONY: promote-images 1184 promote-images: $(KPROMO) 1185 $(KPROMO) pr --project cluster-api --tag $(RELEASE_TAG) --reviewers "$(IMAGE_REVIEWERS)" --fork $(USER_FORK) --image cluster-api-controller --image kubeadm-control-plane-controller --image kubeadm-bootstrap-controller --image clusterctl 1186 1187 ## -------------------------------------- 1188 ## Docker 1189 ## -------------------------------------- 1190 1191 .PHONY: docker-image-verify 1192 docker-image-verify: ## Verifies all built images to contain the correct binary in the expected arch 1193 ALL_ARCH="$(ALL_ARCH)" TAG="$(TAG)" ./hack/docker-image-verify.sh 1194 1195 .PHONY: docker-push-all 1196 docker-push-all: $(addprefix docker-push-,$(ALL_ARCH)) ## Push the docker images to be included in the release for all architectures + related multiarch manifests 1197 $(MAKE) ALL_ARCH="$(ALL_ARCH)" $(addprefix docker-push-manifest-,$(ALL_DOCKER_BUILD)) 1198 1199 docker-push-%: 1200 $(MAKE) ARCH=$* docker-push 1201 1202 .PHONY: docker-push 1203 docker-push: $(addprefix docker-push-,$(ALL_DOCKER_BUILD)) ## Push the docker images to be included in the release 1204 1205 .PHONY: docker-push-core 1206 docker-push-core: ## Push the core docker image 1207 docker push $(CONTROLLER_IMG)-$(ARCH):$(TAG) 1208 1209 .PHONY: docker-push-manifest-core 1210 docker-push-manifest-core: ## Push the multiarch manifest for the core docker images 1211 docker manifest create --amend $(CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(CONTROLLER_IMG)\-&:$(TAG)~g") 1212 @for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${CONTROLLER_IMG}:${TAG} ${CONTROLLER_IMG}-$${arch}:${TAG}; done 1213 docker manifest push --purge $(CONTROLLER_IMG):$(TAG) 1214 $(MAKE) set-manifest-image MANIFEST_IMG=$(CONTROLLER_IMG) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./config/default/manager_image_patch.yaml" 1215 $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./config/default/manager_pull_policy.yaml" 1216 1217 .PHONY: docker-push-kubeadm-bootstrap 1218 docker-push-kubeadm-bootstrap: ## Push the kubeadm bootstrap docker image 1219 docker push $(KUBEADM_BOOTSTRAP_CONTROLLER_IMG)-$(ARCH):$(TAG) 1220 1221 .PHONY: docker-push-manifest-kubeadm-bootstrap 1222 docker-push-manifest-kubeadm-bootstrap: ## Push the multiarch manifest for the kubeadm bootstrap docker images 1223 docker manifest create --amend $(KUBEADM_BOOTSTRAP_CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(KUBEADM_BOOTSTRAP_CONTROLLER_IMG)\-&:$(TAG)~g") 1224 @for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${KUBEADM_BOOTSTRAP_CONTROLLER_IMG}:${TAG} ${KUBEADM_BOOTSTRAP_CONTROLLER_IMG}-$${arch}:${TAG}; done 1225 docker manifest push --purge $(KUBEADM_BOOTSTRAP_CONTROLLER_IMG):$(TAG) 1226 $(MAKE) set-manifest-image MANIFEST_IMG=$(KUBEADM_BOOTSTRAP_CONTROLLER_IMG) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./bootstrap/kubeadm/config/default/manager_image_patch.yaml" 1227 $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./bootstrap/kubeadm/config/default/manager_pull_policy.yaml" 1228 1229 .PHONY: docker-push-kubeadm-control-plane 1230 docker-push-kubeadm-control-plane: ## Push the kubeadm control plane docker image 1231 docker push $(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG)-$(ARCH):$(TAG) 1232 1233 .PHONY: docker-push-manifest-kubeadm-control-plane 1234 docker-push-manifest-kubeadm-control-plane: ## Push the multiarch manifest for the kubeadm control plane docker images 1235 docker manifest create --amend $(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG)\-&:$(TAG)~g") 1236 @for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${KUBEADM_CONTROL_PLANE_CONTROLLER_IMG}:${TAG} ${KUBEADM_CONTROL_PLANE_CONTROLLER_IMG}-$${arch}:${TAG}; done 1237 docker manifest push --purge $(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG):$(TAG) 1238 $(MAKE) set-manifest-image MANIFEST_IMG=$(KUBEADM_CONTROL_PLANE_CONTROLLER_IMG) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./controlplane/kubeadm/config/default/manager_image_patch.yaml" 1239 $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./controlplane/kubeadm/config/default/manager_pull_policy.yaml" 1240 1241 .PHONY: docker-push-docker-infrastructure 1242 docker-push-docker-infrastructure: ## Push the docker infrastructure provider image 1243 docker push $(CAPD_CONTROLLER_IMG)-$(ARCH):$(TAG) 1244 1245 .PHONY: docker-push-manifest-docker-infrastructure 1246 docker-push-manifest-docker-infrastructure: ## Push the multiarch manifest for the docker infrastructure provider images 1247 docker manifest create --amend $(CAPD_CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(CAPD_CONTROLLER_IMG)\-&:$(TAG)~g") 1248 @for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${CAPD_CONTROLLER_IMG}:${TAG} ${CAPD_CONTROLLER_IMG}-$${arch}:${TAG}; done 1249 docker manifest push --purge $(CAPD_CONTROLLER_IMG):$(TAG) 1250 $(MAKE) set-manifest-image MANIFEST_IMG=$(CAPD_CONTROLLER_IMG) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="$(CAPD_DIR)/config/default/manager_image_patch.yaml" 1251 $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="$(CAPD_DIR)/config/default/manager_pull_policy.yaml" 1252 1253 .PHONY: docker-push-in-memory-infrastructure 1254 docker-push-in-memory-infrastructure: ## Push the in-memory infrastructure provider image 1255 docker push $(CAPIM_CONTROLLER_IMG)-$(ARCH):$(TAG) 1256 1257 .PHONY: docker-push-manifest-in-memory-infrastructure 1258 docker-push-manifest-in-memory-infrastructure: ## Push the multiarch manifest for the in-memory infrastructure provider images 1259 docker manifest create --amend $(CAPIM_CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(CAPIM_CONTROLLER_IMG)\-&:$(TAG)~g") 1260 @for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${CAPIM_CONTROLLER_IMG}:${TAG} ${CAPIM_CONTROLLER_IMG}-$${arch}:${TAG}; done 1261 docker manifest push --purge $(CAPIM_CONTROLLER_IMG):$(TAG) 1262 $(MAKE) set-manifest-image MANIFEST_IMG=$(CAPIM_CONTROLLER_IMG) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="$(CAPIM_DIR)/config/default/manager_image_patch.yaml" 1263 $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="$(CAPIM_DIR)/config/default/manager_pull_policy.yaml" 1264 1265 .PHONY: docker-push-test-extension 1266 docker-push-test-extension: ## Push the test extension provider image 1267 docker push $(TEST_EXTENSION_IMG)-$(ARCH):$(TAG) 1268 1269 .PHONY: docker-push-manifest-test-extension 1270 docker-push-manifest-test-extension: ## Push the multiarch manifest for the test extension provider images 1271 docker manifest create --amend $(TEST_EXTENSION_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(TEST_EXTENSION_IMG)\-&:$(TAG)~g") 1272 @for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${TEST_EXTENSION_IMG}:${TAG} ${TEST_EXTENSION_IMG}-$${arch}:${TAG}; done 1273 docker manifest push --purge $(TEST_EXTENSION_IMG):$(TAG) 1274 $(MAKE) set-manifest-image MANIFEST_IMG=$(TEST_EXTENSION_IMG) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./test/extension/config/default/manager_image_patch.yaml" 1275 $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./test/extension/config/default/manager_pull_policy.yaml" 1276 1277 .PHONY: docker-push-clusterctl 1278 docker-push-clusterctl: ## Push the clusterctl image 1279 docker push $(CLUSTERCTL_IMG)-$(ARCH):$(TAG) 1280 1281 .PHONY: docker-push-manifest-clusterctl 1282 docker-push-manifest-clusterctl: ## Push the multiarch manifest for the clusterctl images 1283 docker manifest create --amend $(CLUSTERCTL_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(CLUSTERCTL_IMG)\-&:$(TAG)~g") 1284 @for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${CLUSTERCTL_IMG}:${TAG} ${CLUSTERCTL_IMG}-$${arch}:${TAG}; done 1285 docker manifest push --purge $(CLUSTERCTL_IMG):$(TAG) 1286 1287 .PHONY: set-manifest-pull-policy 1288 set-manifest-pull-policy: 1289 $(info Updating kustomize pull policy file for manager resources) 1290 sed -i'' -e 's@imagePullPolicy: .*@imagePullPolicy: '"$(PULL_POLICY)"'@' $(TARGET_RESOURCE) 1291 1292 .PHONY: set-manifest-image 1293 set-manifest-image: 1294 $(info Updating kustomize image patch file for manager resource) 1295 sed -i'' -e 's@image: .*@image: '"${MANIFEST_IMG}:$(MANIFEST_TAG)"'@' $(TARGET_RESOURCE) 1296 1297 ## -------------------------------------- 1298 ## Cleanup / Verification 1299 ## -------------------------------------- 1300 1301 ##@ clean: 1302 1303 .PHONY: clean 1304 clean: ## Remove generated binaries, GitBook files, Helm charts, and Tilt build files 1305 $(MAKE) clean-bin 1306 $(MAKE) clean-book 1307 $(MAKE) clean-charts 1308 $(MAKE) clean-tilt 1309 1310 .PHONY: clean-kind 1311 clean-kind: ## Cleans up the kind cluster with the name $CAPI_KIND_CLUSTER_NAME 1312 kind delete cluster --name="$(CAPI_KIND_CLUSTER_NAME)" || true 1313 1314 .PHONY: clean-bin 1315 clean-bin: ## Remove all generated binaries 1316 rm -rf $(BIN_DIR) 1317 rm -rf $(TOOLS_BIN_DIR) 1318 1319 .PHONY: clean-tilt 1320 clean-tilt: clean-charts clean-kind ## Remove all files generated by Tilt 1321 rm -rf ./.tiltbuild 1322 rm -rf ./controlplane/kubeadm/.tiltbuild 1323 rm -rf ./bootstrap/kubeadm/.tiltbuild 1324 rm -rf ./test/infrastructure/docker/.tiltbuild 1325 rm -rf ./test/infrastructure/inmemory/.tiltbuild 1326 1327 .PHONY: clean-charts 1328 clean-charts: ## Remove all local copies of Helm charts in ./hack/observability 1329 (for path in "./hack/observability/*"; do rm -rf $$path/.charts ; done) 1330 1331 .PHONY: clean-book 1332 clean-book: ## Remove all generated GitBook files 1333 rm -rf ./docs/book/_book 1334 1335 .PHONY: clean-release 1336 clean-release: ## Remove the release folder 1337 rm -rf $(RELEASE_DIR) 1338 1339 .PHONY: clean-manifests ## Reset manifests in config directories back to main 1340 clean-manifests: 1341 @read -p "WARNING: This will reset all config directories to local main. Press [ENTER] to continue." 1342 git checkout main config bootstrap/kubeadm/config controlplane/kubeadm/config $(CAPD_DIR)/config 1343 1344 .PHONY: clean-release-git 1345 clean-release-git: ## Restores the git files usually modified during a release 1346 git restore ./*manager_image_patch.yaml ./*manager_pull_policy.yaml 1347 1348 .PHONY: clean-generated-yaml 1349 clean-generated-yaml: ## Remove files generated by conversion-gen from the mentioned dirs. Example SRC_DIRS="./api/v1alpha4" 1350 (IFS=','; for i in $(SRC_DIRS); do find $$i -type f -name '*.yaml' -exec rm -f {} \;; done) 1351 1352 .PHONY: clean-generated-deepcopy 1353 clean-generated-deepcopy: ## Remove files generated by conversion-gen from the mentioned dirs. Example SRC_DIRS="./api/v1alpha4" 1354 (IFS=','; for i in $(SRC_DIRS); do find $$i -type f -name 'zz_generated.deepcopy*' -exec rm -f {} \;; done) 1355 1356 .PHONY: clean-generated-conversions 1357 clean-generated-conversions: ## Remove files generated by conversion-gen from the mentioned dirs. Example SRC_DIRS="./api/v1alpha4" 1358 (IFS=','; for i in $(SRC_DIRS); do find $$i -type f -name 'zz_generated.conversion*' -exec rm -f {} \;; done) 1359 1360 .PHONY: clean-generated-openapi-definitions 1361 clean-generated-openapi-definitions: ## Remove files generated by openapi-gen from the mentioned dirs. Example SRC_DIRS="./api/v1alpha4" 1362 (IFS=','; for i in $(SRC_DIRS); do find $$i -type f -name 'zz_generated.openapi*' -exec rm -f {} \;; done) 1363 1364 ## -------------------------------------- 1365 ## Hack / Tools 1366 ## -------------------------------------- 1367 1368 ##@ hack/tools: 1369 1370 .PHONY: $(CONTROLLER_GEN_BIN) 1371 $(CONTROLLER_GEN_BIN): $(CONTROLLER_GEN) ## Build a local copy of controller-gen. 1372 1373 .PHONY: $(CONVERSION_GEN_BIN) 1374 $(CONVERSION_GEN_BIN): $(CONVERSION_GEN) ## Build a local copy of conversion-gen. 1375 1376 .PHONY: $(OPENAPI_GEN_BIN) 1377 $(OPENAPI_GEN_BIN): $(OPENAPI_GEN) ## Build a local copy of openapi-gen. 1378 1379 .PHONY: $(RUNTIME_OPENAPI_GEN_BIN) 1380 $(RUNTIME_OPENAPI_GEN_BIN): $(RUNTIME_OPENAPI_GEN) ## Build a local copy of runtime-openapi-gen. 1381 1382 .PHONY: $(PROWJOB_GEN_BIN) 1383 $(PROWJOB_GEN_BIN): $(PROWJOB_GEN) ## Build a local copy of prowjob-gen. 1384 1385 .PHONY: $(CONVERSION_VERIFIER_BIN) 1386 $(CONVERSION_VERIFIER_BIN): $(CONVERSION_VERIFIER) ## Build a local copy of conversion-verifier. 1387 1388 .PHONY: $(GOTESTSUM_BIN) 1389 $(GOTESTSUM_BIN): $(GOTESTSUM) ## Build a local copy of gotestsum. 1390 1391 .PHONY: $(GO_APIDIFF_BIN) 1392 $(GO_APIDIFF_BIN): $(GO_APIDIFF) ## Build a local copy of go-apidiff 1393 1394 .PHONY: $(ENVSUBST_BIN) 1395 $(ENVSUBST_BIN): $(ENVSUBST) ## Build a local copy of envsubst. 1396 1397 .PHONY: $(KUSTOMIZE_BIN) 1398 $(KUSTOMIZE_BIN): $(KUSTOMIZE) ## Build a local copy of kustomize. 1399 1400 .PHONY: $(SETUP_ENVTEST_BIN) 1401 $(SETUP_ENVTEST_BIN): $(SETUP_ENVTEST) ## Build a local copy of setup-envtest. 1402 1403 .PHONY: $(KPROMO_BIN) 1404 $(KPROMO_BIN): $(KPROMO) ## Build a local copy of kpromo 1405 1406 .PHONY: $(YQ_BIN) 1407 $(YQ_BIN): $(YQ) ## Build a local copy of yq 1408 1409 .PHONY: $(TILT_PREPARE_BIN) 1410 $(TILT_PREPARE_BIN): $(TILT_PREPARE) ## Build a local copy of tilt-prepare. 1411 1412 .PHONY: $(GINKGO_BIN) 1413 $(GINKGO_BIN): $(GINKGO) ## Build a local copy of ginkgo. 1414 1415 .PHONY: $(GOLANGCI_LINT_BIN) 1416 $(GOLANGCI_LINT_BIN): $(GOLANGCI_LINT) ## Build a local copy of golangci-lint. 1417 1418 .PHONY: $(GOVULNCHECK_BIN) 1419 $(GOVULNCHECK_BIN): $(GOVULNCHECK) ## Build a local copy of govulncheck. 1420 1421 .PHONY: $(IMPORT_BOSS_BIN) 1422 $(IMPORT_BOSS_BIN): $(IMPORT_BOSS) 1423 1424 $(CONTROLLER_GEN): # Build controller-gen from tools folder. 1425 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(CONTROLLER_GEN_PKG) $(CONTROLLER_GEN_BIN) $(CONTROLLER_GEN_VER) 1426 1427 ## We are forcing a rebuilt of conversion-gen via PHONY so that we're always using an up-to-date version. 1428 ## We can't use a versioned name for the binary, because that would be reflected in generated files. 1429 .PHONY: $(CONVERSION_GEN) 1430 $(CONVERSION_GEN): # Build conversion-gen from tools folder. 1431 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(CONVERSION_GEN_PKG) $(CONVERSION_GEN_BIN) $(CONVERSION_GEN_VER) 1432 1433 $(CONVERSION_VERIFIER): $(TOOLS_DIR)/go.mod # Build conversion-verifier from tools folder. 1434 cd $(TOOLS_DIR); go build -tags=tools -o $(BIN_DIR)/$(CONVERSION_VERIFIER_BIN) sigs.k8s.io/cluster-api/hack/tools/conversion-verifier 1435 1436 .PHONY: $(OPENAPI_GEN) 1437 $(OPENAPI_GEN): # Build openapi-gen from tools folder. 1438 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(OPENAPI_GEN_PKG) $(OPENAPI_GEN_BIN) $(OPENAPI_GEN_VER) 1439 1440 ## We are forcing a rebuilt of runtime-openapi-gen via PHONY so that we're always using an up-to-date version. 1441 .PHONY: $(RUNTIME_OPENAPI_GEN) 1442 $(RUNTIME_OPENAPI_GEN): $(TOOLS_DIR)/go.mod # Build openapi-gen from tools folder. 1443 cd $(TOOLS_DIR); go build -tags=tools -o $(BIN_DIR)/$(RUNTIME_OPENAPI_GEN_BIN) sigs.k8s.io/cluster-api/hack/tools/runtime-openapi-gen 1444 1445 .PHONY: $(PROWJOB_GEN) 1446 $(PROWJOB_GEN): $(TOOLS_DIR)/go.mod # Build prowjob-gen from tools folder. 1447 cd $(TOOLS_DIR); go build -tags=tools -o $(BIN_DIR)/$(PROWJOB_GEN_BIN) sigs.k8s.io/cluster-api/hack/tools/prowjob-gen 1448 1449 $(GOTESTSUM): # Build gotestsum from tools folder. 1450 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(GOTESTSUM_PKG) $(GOTESTSUM_BIN) $(GOTESTSUM_VER) 1451 1452 $(GO_APIDIFF): # Build go-apidiff from tools folder. 1453 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(GO_APIDIFF_PKG) $(GO_APIDIFF_BIN) $(GO_APIDIFF_VER) 1454 1455 $(ENVSUBST): # Build gotestsum from tools folder. 1456 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(ENVSUBST_PKG) $(ENVSUBST_BIN) $(ENVSUBST_VER) 1457 1458 $(KUSTOMIZE): # Build kustomize from tools folder. 1459 CGO_ENABLED=0 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(KUSTOMIZE_PKG) $(KUSTOMIZE_BIN) $(KUSTOMIZE_VER) 1460 1461 $(SETUP_ENVTEST): # Build setup-envtest from tools folder. 1462 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(SETUP_ENVTEST_PKG) $(SETUP_ENVTEST_BIN) $(SETUP_ENVTEST_VER) 1463 1464 $(TILT_PREPARE): $(TOOLS_DIR)/go.mod # Build tilt-prepare from tools folder. 1465 cd $(TOOLS_DIR); go build -tags=tools -o $(BIN_DIR)/tilt-prepare sigs.k8s.io/cluster-api/hack/tools/internal/tilt-prepare 1466 1467 $(KPROMO): 1468 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(KPROMO_PKG) $(KPROMO_BIN) ${KPROMO_VER} 1469 1470 $(YQ): 1471 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(YQ_PKG) $(YQ_BIN) ${YQ_VER} 1472 1473 $(GINKGO): # Build ginkgo from tools folder. 1474 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(GINKGO_PKG) $(GINKGO_BIN) $(GINKGO_VER) 1475 1476 $(GOLANGCI_LINT): # Build golangci-lint from tools folder. 1477 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(GOLANGCI_LINT_PKG) $(GOLANGCI_LINT_BIN) $(GOLANGCI_LINT_VER) 1478 1479 $(GOVULNCHECK): # Build govulncheck. 1480 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(GOVULNCHECK_PKG) $(GOVULNCHECK_BIN) $(GOVULNCHECK_VER) 1481 1482 $(IMPORT_BOSS): # Build import-boss 1483 GOBIN=$(TOOLS_BIN_DIR) $(GO_INSTALL) $(IMPORT_BOSS_PKG) $(IMPORT_BOSS_BIN) $(IMPORT_BOSS_VER) 1484 1485 ## -------------------------------------- 1486 ## Helpers 1487 ## -------------------------------------- 1488 1489 ##@ helpers: 1490 1491 go-version: ## Print the go version we use to compile our binaries and images 1492 @echo $(GO_VERSION)