sigs.k8s.io/cluster-api-provider-aws@v1.5.5/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 ROOT_DIR_RELATIVE := . 16 17 include $(ROOT_DIR_RELATIVE)/common.mk 18 19 # If you update this file, please follow 20 # https://suva.sh/posts/well-documented-makefiles 21 22 # Directories. 23 ARTIFACTS ?= $(REPO_ROOT)/_artifacts 24 TOOLS_DIR := hack/tools 25 TOOLS_DIR_DEPS := $(TOOLS_DIR)/go.sum $(TOOLS_DIR)/go.mod $(TOOLS_DIR)/Makefile 26 TOOLS_BIN_DIR := $(TOOLS_DIR)/bin 27 GO_INSTALL := ./scripts/go_install.sh 28 29 API_DIRS := cmd/clusterawsadm/api api exp/api controlplane/eks/api bootstrap/eks/api iam/api 30 API_FILES := $(foreach dir, $(API_DIRS), $(call rwildcard,../../$(dir),*.go)) 31 32 BIN_DIR := bin 33 REPO_ROOT := $(shell git rev-parse --show-toplevel) 34 GH_ORG_NAME ?= kubernetes-sigs 35 GH_REPO_NAME ?= cluster-api-provider-aws 36 GH_REPO ?= $(GH_ORG_NAME)/$(GH_REPO_NAME) 37 TEST_E2E_DIR := test/e2e 38 39 # Files 40 E2E_DATA_DIR ?= $(REPO_ROOT)/test/e2e/data 41 E2E_CONF_PATH ?= $(E2E_DATA_DIR)/e2e_conf.yaml 42 E2E_EKS_CONF_PATH ?= $(E2E_DATA_DIR)/e2e_eks_conf.yaml 43 KUBETEST_CONF_PATH ?= $(abspath $(E2E_DATA_DIR)/kubetest/conformance.yaml) 44 EXP_DIR := exp 45 46 # Binaries. 47 GO_APIDIFF_BIN := $(BIN_DIR)/go-apidiff 48 GO_APIDIFF := $(TOOLS_DIR)/$(GO_APIDIFF_BIN) 49 CLUSTERCTL := $(BIN_DIR)/clusterctl 50 CONTROLLER_GEN := $(TOOLS_BIN_DIR)/controller-gen 51 CONVERSION_GEN := $(TOOLS_BIN_DIR)/conversion-gen 52 CONVERSION_VERIFIER := $(TOOLS_BIN_DIR)/conversion-verifier 53 DEFAULTER_GEN := $(TOOLS_BIN_DIR)/defaulter-gen 54 ENVSUBST := $(TOOLS_BIN_DIR)/envsubst 55 GH := $(TOOLS_BIN_DIR)/gh 56 GINKGO := $(TOOLS_BIN_DIR)/ginkgo 57 GOJQ := $(TOOLS_BIN_DIR)/gojq 58 GOLANGCI_LINT := $(TOOLS_BIN_DIR)/golangci-lint 59 KIND := $(TOOLS_BIN_DIR)/kind 60 KUSTOMIZE := $(TOOLS_BIN_DIR)/kustomize 61 MOCKGEN := $(TOOLS_BIN_DIR)/mockgen 62 SSM_PLUGIN := $(TOOLS_BIN_DIR)/session-manager-plugin 63 CLUSTERAWSADM_SRCS := $(call rwildcard,.,cmd/clusterawsadm/*.*) 64 65 PATH := $(abspath $(TOOLS_BIN_DIR)):$(PATH) 66 DOCKER_CLI_EXPERIMENTAL=enabled 67 DOCKER_BUILDKIT=1 68 69 export ACK_GINKGO_DEPRECATIONS := 1.16.4 70 71 # Set --output-base for conversion-gen if we are not within GOPATH 72 ifneq ($(abspath $(REPO_ROOT)),$(shell go env GOPATH)/src/sigs.k8s.io/cluster-api-provider-aws) 73 GEN_OUTPUT_BASE := --output-base=$(REPO_ROOT) 74 else 75 export GOPATH := $(shell go env GOPATH) 76 endif 77 78 # Release variables 79 80 STAGING_REGISTRY ?= gcr.io/k8s-staging-cluster-api-aws 81 STAGING_BUCKET ?= artifacts.k8s-staging-cluster-api-aws.appspot.com 82 BUCKET ?= $(STAGING_BUCKET) 83 PROD_REGISTRY := registry.k8s.io/cluster-api-aws 84 REGISTRY ?= $(STAGING_REGISTRY) 85 RELEASE_TAG ?= $(shell git describe --abbrev=0 2>/dev/null) 86 PULL_BASE_REF ?= $(RELEASE_TAG) # PULL_BASE_REF will be provided by Prow 87 RELEASE_ALIAS_TAG ?= $(PULL_BASE_REF) 88 RELEASE_DIR := out 89 RELEASE_POLICIES := $(RELEASE_DIR)/AWSIAMManagedPolicyControllers.json $(RELEASE_DIR)/AWSIAMManagedPolicyControllersWithEKS.json $(RELEASE_DIR)/AWSIAMManagedPolicyCloudProviderControlPlane.json $(RELEASE_DIR)/AWSIAMManagedPolicyCloudProviderNodes.json $(RELEASE_DIR)/AWSIAMManagedPolicyControllersWithS3.json 90 BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD) 91 92 # image name used to build the cmd/clusterawsadm 93 TOOLCHAIN_IMAGE := toolchain 94 95 TAG ?= dev 96 ARCH ?= $(shell go env GOARCH) 97 ALL_ARCH ?= amd64 arm arm64 ppc64le s390x 98 99 # main controller 100 CORE_IMAGE_NAME ?= cluster-api-aws-controller 101 CORE_CONTROLLER_IMG ?= $(REGISTRY)/$(CORE_IMAGE_NAME) 102 CORE_CONTROLLER_PROMOTED_IMG := $(PROD_REGISTRY)/$(CORE_IMAGE_NAME) 103 CORE_CONTROLLER_ORIGINAL_IMG := gcr.io/k8s-staging-cluster-api-aws/cluster-api-aws-controller 104 CORE_CONTROLLER_NAME := capa-controller-manager 105 CORE_MANIFEST_FILE := infrastructure-components 106 CORE_CONFIG_DIR := config/default 107 CORE_NAMESPACE := capa-system 108 109 # Allow overriding manifest generation destination directory 110 MANIFEST_ROOT ?= config 111 CRD_ROOT ?= $(MANIFEST_ROOT)/crd/bases 112 CRD_DOCS_DIR := docs/book/src/crd 113 CRD_DOCS := $(CRD_DOCS_DIR)/index.md 114 WEBHOOK_ROOT ?= $(MANIFEST_ROOT)/webhook 115 RBAC_ROOT ?= $(MANIFEST_ROOT)/rbac 116 117 # Allow overriding the imagePullPolicy 118 PULL_POLICY ?= Always 119 120 # Set build time variables including version details 121 LDFLAGS := $(shell source ./hack/version.sh; version::ldflags) 122 123 # Set USE_EXISTING_CLUSTER to use an existing kubernetes context 124 USE_EXISTING_CLUSTER ?= "false" 125 126 # Set E2E_SKIP_EKS_UPGRADE to false to test EKS upgrades. 127 # Warning, this takes a long time 128 E2E_SKIP_EKS_UPGRADE ?= "false" 129 130 # Set EKS_SOURCE_TEMPLATE to override the source template 131 EKS_SOURCE_TEMPLATE ?= eks/cluster-template-eks-control-plane-only.yaml 132 133 # set up `setup-envtest` to install kubebuilder dependency 134 export KUBEBUILDER_ENVTEST_KUBERNETES_VERSION ?= 1.23.3 135 SETUP_ENVTEST_VER := v0.0.0-20211110210527-619e6b92dab9 136 SETUP_ENVTEST_BIN := setup-envtest 137 SETUP_ENVTEST := $(abspath $(TOOLS_BIN_DIR)/$(SETUP_ENVTEST_BIN)-$(SETUP_ENVTEST_VER)) 138 SETUP_ENVTEST_PKG := sigs.k8s.io/controller-runtime/tools/setup-envtest 139 140 GINKGO_FOCUS ?= "" 141 GINKGO_SKIP ?= "" 142 143 # Enable Cluster API Framework tests for the purposes of running the PR blocking test 144 ifeq ($(findstring \[PR-Blocking\],$(GINKGO_FOCUS)),\[PR-Blocking\]) 145 override undefine GINKGO_SKIP 146 endif 147 148 override E2E_ARGS += -artifacts-folder="$(ARTIFACTS)" --data-folder="$(E2E_DATA_DIR)" -use-existing-cluster=$(USE_EXISTING_CLUSTER) 149 override GINKGO_ARGS += -stream -progress -v -trace 150 151 # DEPRECATED, use GINKGO_FOCUS instead 152 ifdef E2E_UNMANAGED_FOCUS 153 override GINKGO_ARGS += -focus="$(E2E_UNMANAGED_FOCUS)" 154 endif 155 156 # ALL tests will take ~ 1 hour @ 24 node concurrency. 157 # Set the number of nodes using GINKGO_ARGS=-nodes 24 158 # Ginkgo will default to the number of logical CPUs you have available. 159 # Should be safe to set more nodes than available CPU cores as most of the time is spent in 160 # infrastructure reconciliation 161 162 # Instead, you can run a quick smoke test, it should run fast (9 minutes)... 163 # GINKGO_FOCUS := "\\[smoke\\]" 164 # For running CAPI e2e tests: GINKGO_FOCUS := "\\[Cluster API Framework\\]" 165 # For running CAPI blocking e2e test: GINKGO_FOCUS := "\\[PR-Blocking\\]" 166 ifeq ($(E2E_SKIP_EKS_UPGRADE),"true") 167 override EKS_E2E_ARGS += --skip-eks-upgrade-tests 168 endif 169 170 ##@ generate: 171 172 .PHONY: defaulters 173 defaulters: $(DEFAULTER_GEN) ## Generate all Go types 174 $(DEFAULTER_GEN) \ 175 --input-dirs=./api/v1alpha3 \ 176 --input-dirs=./api/v1alpha4 \ 177 --input-dirs=./api/v1beta1 \ 178 --input-dirs=./$(EXP_DIR)/api/v1beta1 \ 179 --input-dirs=./cmd/clusterawsadm/api/bootstrap/v1beta1 \ 180 --input-dirs=./cmd/clusterawsadm/api/bootstrap/v1alpha1 \ 181 --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1beta1 \ 182 --v=0 $(GEN_OUTPUT_BASE) \ 183 --go-header-file=./hack/boilerplate/boilerplate.generatego.txt 184 185 .PHONY: generate 186 generate: ## Generate code 187 $(MAKE) generate-go 188 $(MAKE) $(CRD_DOCS) 189 190 $(CRD_DOCS_DIR)/%: $(API_FILES) 191 $(MAKE) -C docs/book src/crd/$* 192 193 .PHONY: generate-go ## Generate all Go api files 194 generate-go: $(MOCKGEN) 195 $(MAKE) generate-go-apis 196 go generate ./... 197 198 .PHONY: generate-go-apis 199 generate-go-apis: ## Alias for .build/generate-go-apis 200 $(MAKE) .build/generate-go-apis 201 202 .build: ## Create the .build folder 203 mkdir -p .build 204 205 .build/generate-go-apis: .build $(API_FILES) $(CONTROLLER_GEN) $(DEFAULTER_GEN) $(CONVERSION_GEN) ## Generate all Go api files 206 $(CONTROLLER_GEN) \ 207 paths=./api/... \ 208 paths=./$(EXP_DIR)/api/... \ 209 paths=./bootstrap/eks/api/... \ 210 paths=./controlplane/eks/api/... \ 211 paths=./iam/api/... \ 212 output:crd:dir=config/crd/bases \ 213 object:headerFile=./hack/boilerplate/boilerplate.generatego.txt \ 214 crd:crdVersions=v1 \ 215 rbac:roleName=manager-role \ 216 webhook 217 218 $(CONTROLLER_GEN) \ 219 paths=./cmd/... \ 220 object:headerFile=./hack/boilerplate/boilerplate.generatego.txt 221 222 $(MAKE) defaulters 223 224 $(CONVERSION_GEN) \ 225 --input-dirs=./api/v1alpha3 \ 226 --input-dirs=./api/v1alpha4 \ 227 --input-dirs=./cmd/clusterawsadm/api/bootstrap/v1alpha1 \ 228 --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha3 \ 229 --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha4 \ 230 --build-tag=ignore_autogenerated_conversions \ 231 --output-file-base=zz_generated.conversion $(GEN_OUTPUT_BASE) \ 232 --go-header-file=./hack/boilerplate/boilerplate.generatego.txt 233 234 $(CONVERSION_GEN) \ 235 --input-dirs=./bootstrap/eks/api/v1alpha3 \ 236 --input-dirs=./bootstrap/eks/api/v1alpha4 \ 237 --extra-peer-dirs=sigs.k8s.io/cluster-api-provider-aws/api/v1alpha3 \ 238 --extra-peer-dirs=sigs.k8s.io/cluster-api-provider-aws/api/v1alpha4 \ 239 --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha3 \ 240 --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha4 \ 241 --build-tag=ignore_autogenerated_conversions \ 242 --output-file-base=zz_generated.conversion $(GEN_OUTPUT_BASE) \ 243 --go-header-file=./hack/boilerplate/boilerplate.generatego.txt 244 245 $(CONVERSION_GEN) \ 246 --input-dirs=./controlplane/eks/api/v1alpha3 \ 247 --input-dirs=./controlplane/eks/api/v1alpha4 \ 248 --extra-peer-dirs=sigs.k8s.io/cluster-api-provider-aws/api/v1alpha3 \ 249 --extra-peer-dirs=sigs.k8s.io/cluster-api-provider-aws/api/v1alpha4 \ 250 --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha3 \ 251 --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha4 \ 252 --build-tag=ignore_autogenerated_conversions \ 253 --output-file-base=zz_generated.conversion $(GEN_OUTPUT_BASE) \ 254 --go-header-file=./hack/boilerplate/boilerplate.generatego.txt 255 256 $(CONVERSION_GEN) \ 257 --input-dirs=./$(EXP_DIR)/api/v1alpha3 \ 258 --input-dirs=./$(EXP_DIR)/api/v1alpha4 \ 259 --extra-peer-dirs=sigs.k8s.io/cluster-api-provider-aws/api/v1alpha3 \ 260 --extra-peer-dirs=sigs.k8s.io/cluster-api-provider-aws/api/v1alpha4 \ 261 --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha3 \ 262 --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1alpha4 \ 263 --build-tag=ignore_autogenerated_conversions \ 264 --output-file-base=zz_generated.conversion $(GEN_OUTPUT_BASE) \ 265 --go-header-file=./hack/boilerplate/boilerplate.generatego.txt 266 267 touch $@ 268 269 ##@ lint and verify: 270 271 .PHONY: modules 272 273 .PHONY: lint 274 lint: $(GOLANGCI_LINT) ## Lint codebase 275 $(GOLANGCI_LINT) run -v --fast=false $(GOLANGCI_LINT_EXTRA_ARGS) 276 277 .PHONY: lint-fix 278 lint-fix: $(GOLANGCI_LINT) ## Lint the codebase and run auto-fixers if supported by the linter 279 GOLANGCI_LINT_EXTRA_ARGS=--fix $(MAKE) lint 280 281 modules: ## Runs go mod to ensure proper vendoring. 282 go mod tidy 283 cd $(TOOLS_DIR); go mod tidy 284 285 .PHONY: verify ## Verify ties together the rest of the verification targets into one target 286 verify: verify-boilerplate verify-modules verify-gen verify-conversions verify-shellcheck verify-book-links release-manifests 287 288 .PHONY: verify-boilerplate 289 verify-boilerplate: ## Verify boilerplate 290 -rm -f ./hack/tools/bin/*.sh 291 ./hack/verify-boilerplate.sh 292 293 .PHONY: verify-modules 294 verify-modules: modules ## Verify go modules integrity 295 @if !(git diff --quiet HEAD -- go.sum go.mod hack/tools/go.mod hack/tools/go.sum); then \ 296 git diff; \ 297 echo "go module files are out of date"; exit 1; \ 298 fi 299 300 .PHONY: verify-conversions 301 verify-conversions: $(CONVERSION_VERIFIER) ## Verifies expected API conversion are in place 302 echo verification of api conversions initiated 303 $(CONVERSION_VERIFIER) 304 305 .PHONY: verify-shellcheck 306 verify-shellcheck: ## Verify shell files 307 ./hack/verify-shellcheck.sh 308 309 .PHONY: verify-book-links 310 verify-book-links: ## Verify book links 311 $(MAKE) -C docs/book verify 312 313 .PHONY: verify-gen 314 verify-gen: generate ## Verify generated files 315 @if !(git diff --quiet HEAD); then \ 316 git diff; \ 317 echo "generated files are out of date, run make generate"; exit 1; \ 318 fi 319 320 .PHONY: apidiff 321 apidiff: APIDIFF_OLD_COMMIT ?= $(shell git rev-parse origin/main) 322 apidiff: $(GO_APIDIFF) ## Check for API differences 323 @$(call checkdiff) > /dev/null 324 @if ($(call checkdiff) | grep "api/"); then \ 325 $(GO_APIDIFF) $(APIDIFF_OLD_COMMIT) --print-compatible; \ 326 else 327 @echo "No changes to 'api/'. Nothing to do." 328 fi 329 330 define checkdiff 331 git --no-pager diff --name-only FETCH_HEAD 332 endef 333 334 ##@ build: 335 336 .PHONY: binaries 337 binaries: managers clusterawsadm ## Builds and installs all binaries 338 339 .PHONY: clusterawsadm 340 clusterawsadm: ## Build clusterawsadm binary 341 go build -ldflags "$(LDFLAGS)" -o $(BIN_DIR)/clusterawsadm ./cmd/clusterawsadm 342 343 344 .PHONY: docker-build 345 docker-build: docker-pull-prerequisites ## Build the docker image for controller-manager 346 docker build --build-arg ARCH=$(ARCH) --build-arg LDFLAGS="$(LDFLAGS)" . -t $(CORE_CONTROLLER_IMG)-$(ARCH):$(TAG) 347 348 .PHONY: docker-build-all ## Build all the architecture docker images 349 docker-build-all: $(addprefix docker-build-,$(ALL_ARCH)) 350 351 docker-build-%: ## Build docker images for a given ARCH 352 $(MAKE) ARCH=$* docker-build 353 354 .PHONY: docker-pull-prerequisites 355 docker-pull-prerequisites: ## Build prerequisites using docker 356 docker pull docker.io/docker/dockerfile:1.1-experimental 357 docker pull gcr.io/distroless/static:latest 358 359 .PHONY: managers 360 managers: ## Alias for manager-aws-infrastructure 361 $(MAKE) manager-aws-infrastructure 362 363 .PHONY: manager-aws-infrastructure 364 manager-aws-infrastructure: ## Build manager binary 365 CGO_ENABLED=0 GOOS=linux GOARCH=${ARCH} go build -ldflags "${LDFLAGS} -extldflags '-static'" -o $(BIN_DIR)/manager . 366 367 ##@ test: 368 369 $(ARTIFACTS): 370 mkdir -p $@ 371 372 .PHONY: generate-test-flavors 373 generate-test-flavors: $(KUSTOMIZE) ## Generate test template flavors 374 ./hack/gen-test-flavors.sh 375 376 .PHONY: e2e-image 377 e2e-image: docker-pull-prerequisites $(TOOLS_BIN_DIR)/start.sh $(TOOLS_BIN_DIR)/restart.sh ## Build an e2e test image 378 docker build -f Dockerfile --tag="gcr.io/k8s-staging-cluster-api/capa-manager:e2e" . 379 380 .PHONY: install-setup-envtest 381 install-setup-envtest: # Install setup-envtest so that setup-envtest's eval is executed after the tool has been installed. 382 GOBIN=$(abspath $(TOOLS_BIN_DIR)) $(GO_INSTALL) $(SETUP_ENVTEST_PKG) $(SETUP_ENVTEST_BIN) $(SETUP_ENVTEST_VER) 383 384 .PHONY: setup-envtest 385 setup-envtest: install-setup-envtest # Build setup-envtest from tools folder. 386 @if [ $(shell go env GOOS) == "darwin" ]; then \ 387 $(eval KUBEBUILDER_ASSETS := $(shell $(SETUP_ENVTEST) use --use-env -p path --arch amd64 $(KUBEBUILDER_ENVTEST_KUBERNETES_VERSION))) \ 388 echo "kube-builder assets set using darwin OS"; \ 389 else \ 390 $(eval KUBEBUILDER_ASSETS := $(shell $(SETUP_ENVTEST) use --use-env -p path $(KUBEBUILDER_ENVTEST_KUBERNETES_VERSION))) \ 391 echo "kube-builder assets set using other OS"; \ 392 fi 393 394 .PHONY: test 395 test: setup-envtest ## Run tests 396 KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test ./... 397 398 .PHONY: test-verbose 399 test-verbose: setup-envtest ## Run tests with verbose settings. 400 KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -v ./... 401 402 .PHONY: test-e2e ## Run e2e tests using clusterctl 403 test-e2e: $(GINKGO) $(KIND) $(SSM_PLUGIN) $(KUSTOMIZE) generate-test-flavors e2e-image ## Run e2e tests 404 time $(GINKGO) -tags=e2e -focus="$(GINKGO_FOCUS)" -skip="$(GINKGO_SKIP)" $(GINKGO_ARGS) -p ./test/e2e/suites/unmanaged/... -- -config-path="$(E2E_CONF_PATH)" $(E2E_ARGS) 405 406 .PHONY: test-e2e-eks ## Run EKS e2e tests using clusterctl 407 test-e2e-eks: generate-test-flavors $(GINKGO) $(KIND) $(SSM_PLUGIN) $(KUSTOMIZE) e2e-image ## Run eks e2e tests 408 time $(GINKGO) -tags=e2e -focus="$(GINKGO_FOCUS)" -skip="$(GINKGO_SKIP)" $(GINKGO_ARGS) ./test/e2e/suites/managed/... -- -config-path="$(E2E_EKS_CONF_PATH)" --source-template="$(EKS_SOURCE_TEMPLATE)" $(E2E_ARGS) $(EKS_E2E_ARGS) 409 410 .PHONY: test-e2e-gc ## Run garbage collection e2e tests using clusterctl 411 test-e2e-gc: generate-test-flavors $(GINKGO) $(KIND) $(SSM_PLUGIN) $(KUSTOMIZE) e2e-image ## Run eks e2e tests 412 time $(GINKGO) -tags=e2e -focus="$(GINKGO_FOCUS)" -skip="$(GINKGO_SKIP)" $(GINKGO_ARGS) -p ./test/e2e/suites/gc_unmanaged/... -- -config-path="$(E2E_CONF_PATH)" $(E2E_ARGS) 413 414 .PHONY: test-e2e-eks-gc ## Run EKS garbage collection e2e tests using clusterctl 415 test-e2e-eks-gc: generate-test-flavors $(GINKGO) $(KIND) $(SSM_PLUGIN) $(KUSTOMIZE) e2e-image ## Run eks e2e tests 416 time $(GINKGO) -tags=e2e -focus="$(GINKGO_FOCUS)" -skip="$(GINKGO_SKIP)" $(GINKGO_ARGS) ./test/e2e/suites/gc_managed/... -- -config-path="$(E2E_EKS_CONF_PATH)" --source-template="$(EKS_SOURCE_TEMPLATE)" $(E2E_ARGS) $(EKS_E2E_ARGS) 417 418 419 CONFORMANCE_E2E_ARGS ?= -kubetest.config-file=$(KUBETEST_CONF_PATH) 420 CONFORMANCE_E2E_ARGS += $(E2E_ARGS) 421 CONFORMANCE_GINKGO_ARGS += $(GINKGO_ARGS) 422 .PHONY: test-conformance 423 test-conformance: generate-test-flavors $(GINKGO) $(KIND) $(SSM_PLUGIN) $(KUSTOMIZE) e2e-image ## Run clusterctl based conformance test on workload cluster (requires Docker). 424 time $(GINKGO) -tags=e2e -focus="conformance" $(CONFORMANCE_GINKGO_ARGS) ./test/e2e/suites/conformance/... -- -config-path="$(E2E_CONF_PATH)" $(CONFORMANCE_E2E_ARGS) 425 426 .PHONY: test-cover 427 test-cover: setup-envtest ## Run tests with code coverage and code generate reports 428 KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -coverprofile=coverage.out ./... $(TEST_ARGS) 429 go tool cover -func=coverage.out -o coverage.txt 430 go tool cover -html=coverage.out -o coverage.html 431 432 .PHONY: serve-book 433 serve-book: ## Run a server with the documentation book 434 $(MAKE) -C docs/book serve 435 436 .PHONY: compile-e2e 437 compile-e2e: ## Test e2e compilation 438 go test -c -o /dev/null -tags=e2e ./test/e2e/suites/unmanaged 439 go test -c -o /dev/null -tags=e2e ./test/e2e/suites/conformance 440 go test -c -o /dev/null -tags=e2e ./test/e2e/suites/managed 441 go test -c -o /dev/null -tags=e2e ./test/e2e/suites/gc_managed 442 go test -c -o /dev/null -tags=e2e ./test/e2e/suites/gc_unmanaged 443 444 445 .PHONY: docker-pull-e2e-preloads 446 docker-pull-e2e-preloads: ## Preloads the docker images used for e2e testing and can speed it up 447 -docker pull registry.k8s.io/cluster-api/kubeadm-control-plane-controller:$(CAPI_VERSION) 448 -docker pull registry.k8s.io/cluster-api/kubeadm-bootstrap-controller:$(CAPI_VERSION) 449 -docker pull registry.k8s.io/cluster-api/cluster-api-controller:$(CAPI_VERSION) 450 -docker pull quay.io/jetstack/cert-manager-controller:$(CERT_MANAGER_VERSION) 451 -docker pull quay.io/jetstack/cert-manager-cainjector:$(CERT_MANAGER_VERSION) 452 -docker pull quay.io/jetstack/cert-manager-webhook:$(CERT_MANAGER_VERSION) 453 454 ##@ release: 455 456 $(RELEASE_DIR): 457 mkdir -p $@ 458 459 .PHONY: build-toolchain 460 build-toolchain: ## Build the toolchain 461 docker build --target toolchain -t $(TOOLCHAIN_IMAGE) . 462 463 .PHONY: check-github-token 464 check-github-token: ## Check if the github token is set 465 @if [ -z "${GITHUB_TOKEN}" ]; then echo "GITHUB_TOKEN is not set"; exit 1; fi 466 467 .PHONY: check-previous-release-tag 468 check-previous-release-tag: ## Check if the previous release tag is set 469 @if [ -z "${PREVIOUS_VERSION}" ]; then echo "PREVIOUS_VERSION is not set"; exit 1; fi 470 471 .PHONY: check-release-tag 472 check-release-tag: ## Check if the release tag is set 473 @if [ -z "${RELEASE_TAG}" ]; then echo "RELEASE_TAG is not set"; exit 1; fi 474 @if ! [ -z "$$(git status --porcelain)" ]; then echo "Your local git repository contains uncommitted changes, use git clean before proceeding."; exit 1; fi 475 476 .PHONY: create-gh-release 477 create-gh-release:$(GH) ## Create release on Github 478 $(GH) release create $(VERSION) -d -F $(RELEASE_DIR)/CHANGELOG.md -t $(VERSION) -R $(GH_REPO) 479 480 .PHONY: compiled-manifest 481 compiled-manifest: $(RELEASE_DIR) $(KUSTOMIZE) ## Compile the manifest files 482 $(MAKE) image-patch-source-manifest 483 $(MAKE) image-patch-pull-policy 484 $(MAKE) image-patch-kustomization 485 $(KUSTOMIZE) build $(IMAGE_PATCH_DIR)/$(PROVIDER) > $(RELEASE_DIR)/$(PROVIDER).yaml 486 487 .PHONY: docker-push 488 docker-push: ## Push the docker image 489 docker push $(CORE_CONTROLLER_IMG)-$(ARCH):$(TAG) 490 491 .PHONY: docker-push-all ## Push all the architecture docker images 492 docker-push-all: $(addprefix docker-push-,$(ALL_ARCH)) 493 $(MAKE) docker-push-core-manifest 494 495 docker-push-%: ## Docker push 496 $(MAKE) ARCH=$* docker-push 497 498 .PHONY: docker-push-core-manifest 499 docker-push-core-manifest: ## Push the fat manifest docker image. 500 ## Minimum docker version 18.06.0 is required for creating and pushing manifest images. 501 $(MAKE) docker-push-manifest CONTROLLER_IMG=$(CORE_CONTROLLER_IMG) MANIFEST_FILE=$(CORE_MANIFEST_FILE) 502 503 .PHONY: docker-push-manifest 504 docker-push-manifest: ## Push the manifest image 505 docker manifest create --amend $(CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(CONTROLLER_IMG)\-&:$(TAG)~g") 506 @for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${CONTROLLER_IMG}:${TAG} ${CONTROLLER_IMG}-$${arch}:${TAG}; done 507 docker manifest push --purge ${CONTROLLER_IMG}:${TAG} 508 509 .PHONY: image-patch-source-manifest 510 image-patch-source-manifest: $(IMAGE_PATCH_DIR) $(KUSTOMIZE) ## Patch the source manifest 511 mkdir -p $(IMAGE_PATCH_DIR)/$(PROVIDER) 512 $(KUSTOMIZE) build $(PROVIDER_CONFIG_DIR) > $(IMAGE_PATCH_DIR)/$(PROVIDER)/source-manifest.yaml 513 514 .PHONY: image-patch-kustomization 515 image-patch-kustomization: $(IMAGE_PATCH_DIR) ## Alias for image-patch-kustomization-without-webhook 516 mkdir -p $(IMAGE_PATCH_DIR)/$(PROVIDER) 517 $(MAKE) image-patch-kustomization-without-webhook 518 519 .PHONY: image-patch-kustomization-without-webhook 520 image-patch-kustomization-without-webhook: $(IMAGE_PATCH_DIR) $(GOJQ) ## Patch the image in the kustomization file 521 mkdir -p $(IMAGE_PATCH_DIR)/$(PROVIDER) 522 $(GOJQ) --yaml-input --yaml-output '.images[0]={"name":"$(OLD_IMG)","newName":"$(MANIFEST_IMG)","newTag":"$(TAG)"}|.patchesJson6902[0].target.name="$(CONTROLLER_NAME)"|.patchesJson6902[0].target.namespace="$(NAMESPACE)"' \ 523 "hack/image-patch/kustomization.yaml" > $(IMAGE_PATCH_DIR)/$(PROVIDER)/kustomization.yaml 524 525 .PHONY: image-patch-pull-policy 526 image-patch-pull-policy: $(IMAGE_PATCH_DIR) $(GOJQ) ## Patch the pull policy 527 mkdir -p $(IMAGE_PATCH_DIR)/$(PROVIDER) 528 echo Setting imagePullPolicy to $(PULL_POLICY) 529 $(GOJQ) --yaml-input --yaml-output '.[0].value="$(PULL_POLICY)"' "hack/image-patch/pull-policy-patch.yaml" > $(IMAGE_PATCH_DIR)/$(PROVIDER)/pull-policy-patch.yaml 530 531 .PHONY: list-staging-releases 532 list-staging-releases: ## List staging images for image promotion 533 @echo $(CORE_IMAGE_NAME): 534 $(MAKE) list-image RELEASE_TAG=$(RELEASE_TAG) IMAGE=$(CORE_IMAGE_NAME) 535 536 list-image: ## List images for RELEASE_TAG 537 gcloud container images list-tags $(STAGING_REGISTRY)/$(IMAGE) --filter="tags=('$(RELEASE_TAG)')" --format=json 538 539 .PHONY: release 540 release: clean-release check-release-tag $(RELEASE_DIR) ## Builds and push container images using the latest git tag for the commit. 541 git checkout "${RELEASE_TAG}" 542 $(MAKE) release-changelog 543 $(MAKE) release-binaries 544 CORE_CONTROLLER_IMG=$(PROD_REGISTRY)/$(CORE_IMAGE_NAME) $(MAKE) release-manifests 545 $(MAKE) release-templates 546 $(MAKE) release-policies 547 548 release-policies: $(RELEASE_POLICIES) ## Release policies 549 550 $(RELEASE_DIR)/AWSIAMManagedPolicyControllers.json: $(RELEASE_DIR) $(CLUSTERAWSADM_SRCS) 551 go run ./cmd/clusterawsadm bootstrap iam print-policy --document AWSIAMManagedPolicyControllers > $@ 552 553 $(RELEASE_DIR)/AWSIAMManagedPolicyControllersWithEKS.json: $(RELEASE_DIR) $(CLUSTERAWSADM_SRCS) 554 go run ./cmd/clusterawsadm bootstrap iam print-policy --document AWSIAMManagedPolicyControllers --config hack/eks-clusterawsadm-config.yaml > $@ 555 556 $(RELEASE_DIR)/AWSIAMManagedPolicyCloudProviderControlPlane.json: $(RELEASE_DIR) $(CLUSTERAWSADM_SRCS) 557 go run ./cmd/clusterawsadm bootstrap iam print-policy --document AWSIAMManagedPolicyCloudProviderControlPlane > $(RELEASE_DIR)/AWSIAMManagedPolicyCloudProviderControlPlane.json 558 559 $(RELEASE_DIR)/AWSIAMManagedPolicyCloudProviderNodes.json: $(RELEASE_DIR) $(CLUSTERAWSADM_SRCS) 560 go run ./cmd/clusterawsadm bootstrap iam print-policy --document AWSIAMManagedPolicyCloudProviderNodes > $(RELEASE_DIR)/AWSIAMManagedPolicyCloudProviderNodes.json 561 562 $(RELEASE_DIR)/AWSIAMManagedPolicyControllersWithS3.json: $(RELEASE_DIR) $(CLUSTERAWSADM_SRCS) 563 go run ./cmd/clusterawsadm bootstrap iam print-policy --document AWSIAMManagedPolicyControllers --config hack/s3-clusterawsadm-config.yaml > $@ 564 565 .PHONY: release-manifests 566 release-manifests: ## Release manifest files 567 $(MAKE) $(RELEASE_DIR)/$(CORE_MANIFEST_FILE).yaml TAG=$(RELEASE_TAG) PULL_POLICY=IfNotPresent 568 # Add metadata to the release artifacts 569 cp metadata.yaml $(RELEASE_DIR)/metadata.yaml 570 571 .PHONY: release-changelog 572 release-changelog: $(GH) ## Generates release notes using Github release notes. 573 ./hack/releasechangelog.sh > $(RELEASE_DIR)/CHANGELOG.md 574 575 .PHONY: release-binaries 576 release-binaries: ## Builds the binaries to publish with a release 577 RELEASE_BINARY=./cmd/clusterawsadm GOOS=linux GOARCH=amd64 $(MAKE) release-binary 578 RELEASE_BINARY=./cmd/clusterawsadm GOOS=linux GOARCH=arm64 $(MAKE) release-binary 579 RELEASE_BINARY=./cmd/clusterawsadm GOOS=darwin GOARCH=amd64 $(MAKE) release-binary 580 RELEASE_BINARY=./cmd/clusterawsadm GOOS=darwin GOARCH=arm64 $(MAKE) release-binary 581 582 .PHONY: release-binary 583 release-binary: $(RELEASE_DIR) versions.mk build-toolchain ## Release binary 584 docker run \ 585 --rm \ 586 -e CGO_ENABLED=0 \ 587 -e GOOS=$(GOOS) \ 588 -e GOARCH=$(GOARCH) \ 589 --mount=source=gocache,target=/go/pkg/mod \ 590 --mount=source=gocache,target=/root/.cache/go-build \ 591 -v "$$(pwd):/workspace$(DOCKER_VOL_OPTS)" \ 592 -w /workspace \ 593 $(TOOLCHAIN_IMAGE) \ 594 go build -ldflags '$(LDFLAGS) -extldflags "-static"' \ 595 -o $(RELEASE_DIR)/$(notdir $(RELEASE_BINARY))-$(GOOS)-$(GOARCH) $(RELEASE_BINARY) 596 597 .PHONY: release-staging 598 release-staging: ## Builds and push container images and manifests to the staging bucket. 599 $(MAKE) docker-build-all 600 $(MAKE) docker-push-all 601 $(MAKE) release-alias-tag 602 $(MAKE) staging-manifests 603 $(MAKE) upload-staging-artifacts 604 605 .PHONY: release-staging-nightly 606 release-staging-nightly: ## Tags and push container images to the staging bucket. 607 $(eval NEW_RELEASE_ALIAS_TAG := nightly_$(RELEASE_ALIAS_TAG)_$(shell date +'%Y%m%d')) 608 echo $(NEW_RELEASE_ALIAS_TAG) 609 $(MAKE) release-alias-tag TAG=$(RELEASE_ALIAS_TAG) RELEASE_ALIAS_TAG=$(NEW_RELEASE_ALIAS_TAG) 610 $(MAKE) staging-manifests RELEASE_ALIAS_TAG=$(NEW_RELEASE_ALIAS_TAG) 611 $(MAKE) upload-staging-artifacts RELEASE_ALIAS_TAG=$(NEW_RELEASE_ALIAS_TAG) 612 613 .PHONY: release-alias-tag 614 release-alias-tag: # Adds the tag to the last build tag. 615 gcloud container images add-tag -q $(CORE_CONTROLLER_IMG):$(TAG) $(CORE_CONTROLLER_IMG):$(RELEASE_ALIAS_TAG) 616 617 .PHONY: release-templates 618 release-templates: $(RELEASE_DIR) ## Generate release templates 619 cp templates/cluster-template*.yaml $(RELEASE_DIR)/ 620 621 .PHONY: upload-staging-artifacts 622 upload-staging-artifacts: ## Upload release artifacts to the staging bucket 623 gsutil cp $(RELEASE_DIR)/* gs://$(BUCKET)/components/$(RELEASE_ALIAS_TAG) 624 625 .PHONY: upload-gh-artifacts 626 upload-gh-artifacts: $(GH) ## Upload artifacts to Github release 627 $(GH) release upload $(VERSION) -R $(GH_REPO) --clobber $(RELEASE_DIR)/* 628 629 IMAGE_PATCH_DIR := $(ARTIFACTS)/image-patch 630 631 $(IMAGE_PATCH_DIR): $(ARTIFACTS) 632 mkdir -p $@ 633 634 .PHONY: $(RELEASE_DIR)/$(CORE_MANIFEST_FILE).yaml 635 $(RELEASE_DIR)/$(CORE_MANIFEST_FILE).yaml: 636 $(MAKE) compiled-manifest \ 637 PROVIDER=$(CORE_MANIFEST_FILE) \ 638 OLD_IMG=$(CORE_CONTROLLER_ORIGINAL_IMG) \ 639 MANIFEST_IMG=$(CORE_CONTROLLER_IMG) \ 640 CONTROLLER_NAME=$(CORE_CONTROLLER_NAME) \ 641 PROVIDER_CONFIG_DIR=$(CORE_CONFIG_DIR) \ 642 NAMESPACE=$(CORE_NAMESPACE) \ 643 644 .PHONY: staging-manifests 645 staging-manifests: ## Staging manifests 646 $(MAKE) $(RELEASE_DIR)/$(CORE_MANIFEST_FILE).yaml PULL_POLICY=IfNotPresent TAG=$(RELEASE_ALIAS_TAG) 647 648 ##@ clean: 649 650 .PHONY: clean 651 clean: ## Remove all generated files 652 $(MAKE) -C hack/tools clean 653 $(MAKE) clean-bin 654 $(MAKE) clean-temporary 655 656 .PHONY: clean-artifacts 657 clean-artifacts: ## Remove the _artifacts directory 658 rm -rf _artifacts 659 660 .PHONY: clean-bin 661 clean-bin: ## Remove all generated binaries 662 rm -rf bin 663 664 .PHONY: clean-release 665 clean-release: ## Remove the release folder 666 rm -rf $(RELEASE_DIR) 667 668 .PHONY: clean-temporary 669 clean-temporary: ## Remove all temporary files and folders 670 rm -f minikube.kubeconfig 671 rm -f kubeconfig 672 rm -rf _artifacts 673 rm -rf test/e2e/.artifacts/* 674 rm -rf test/e2e/*.xml 675 rm -rf test/e2e/capa-controller-manager 676 rm -rf test/e2e/capi-controller-manager 677 rm -rf test/e2e/capi-kubeadm-bootstrap-controller-manager 678 rm -rf test/e2e/capi-kubeadm-control-plane-controller-manager 679 rm -rf test/e2e/logs 680 rm -rf test/e2e/resources 681