diff --git a/src/Makefile b/src/Makefile index ac41dde3..bb5c9faf 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,13 +1,10 @@ PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST)))) -CONTROLLER_GEN = $(PROJECT_DIR)/bin/controller-gen -KO = $(PROJECT_DIR)/bin/ko -ENVTEST = $(PROJECT_DIR)/bin/setup-envtest -GINKGO = $(PROJECT_DIR)/bin/ginkgo -TOOLCHAIN = \ - $(CONTROLLER_GEN) \ - $(KO) \ - $(ENVTEST) \ - $(GINKGO) +BIN_DIR := $(PROJECT_DIR)/bin +SCRIPTS_DIR := $(PROJECT_DIR)/scripts +CONTROLLER_GEN = $(BIN_DIR)controller-gen +KO = $(BIN_DIR)/ko +SETUP_ENVTEST = $(BIN_DIR)/setup-envtest +GINKGO = $(BIN_DIR)/ginkgo HELM_BASE_OPTS ?= --set serviceAccount.annotations.eks\\.amazonaws\\.com/role-arn=${NTHV2_IAM_ROLE_ARN} GINKGO_BASE_OPTS ?= --coverpkg $(shell head -n 1 $(PROJECT_DIR)/go.mod | cut -s -d ' ' -f 2)/pkg/... KODATA = \ @@ -15,6 +12,7 @@ KODATA = \ cmd/controller/kodata/refs \ cmd/webhook/kodata/HEAD \ cmd/webhook/kodata/refs +CODECOVERAGE_OUT = $(PROJECT_DIR)/coverprofile.out # Image URL to use all building/pushing image targets IMG ?= controller:latest @@ -51,11 +49,24 @@ SHELL = /usr/bin/env bash -o pipefail help: ## Display this help. @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) -$(TOOLCHAIN) &: - @./scripts/toolchain.sh -d "$(PROJECT_DIR)/bin" - ##@ Development +$(CONTROLLER_GEN): + GOBIN="$(BIN_DIR)" go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.8.0 + +$(GINKGO): + GOBIN="$(BIN_DIR)" go install github.com/onsi/ginkgo/v2/ginkgo@v2.1.3 + +$(KO): + GOBIN="$(BIN_DIR)" go install github.com/google/ko@v0.9.3 + +$(SETUP_ENVTEST): + GOBIN="$(BIN_DIR)" go install sigs.k8s.io/controller-runtime/tools/setup-envtest@v0.0.0-20220217150738-f62a0f579d73 + PATH="$(BIN_DIR):$(PATH)" $(SCRIPTS_DIR)/download-kubebuilder-assets.sh + +.PHONY: tools +tools: $(CONTROLLER_GEN) $(GINKGO) $(KO) $(SETUP_ENVTEST) ## Pre-install additional tools. + .PHONY: generate generate: $(CONTROLLER_GEN) ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations. $(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..." @@ -65,11 +76,21 @@ verify: ## Run go fmt and go vet against code. go fmt $(PROJECT_DIR)/... go vet $(PROJECT_DIR)/... -.PHONY: test -test: $(GINKGO) ## Run tests. +$(CODECOVERAGE_OUT): $(GINKGO) go vet $(PROJECT_DIR)/... $(GINKGO) run $(GINKGO_BASE_OPTS) $(GINKGO_OPTS) $(PROJECT_DIR)/test/ +.PHONY: delete-test-coverage +delete-test-coverage: + rm -f $(CODECOVERAGE_OUT) + +.PHONY: test +test: delete-test-coverage $(CODECOVERAGE_OUT) ## Run tests. + +.PHONY: explore-test-coverage +explore-test-coverage: $(CODECOVERAGE_OUT) ## Display test coverage report in default web browser. + go tool cover -html=$< + ##@ Build .PHONY: run diff --git a/src/scripts/download-kubebuilder-assets.sh b/src/scripts/download-kubebuilder-assets.sh new file mode 100755 index 00000000..494a7521 --- /dev/null +++ b/src/scripts/download-kubebuilder-assets.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +set -euo pipefail + +k8s_version="${K8S_VERSION:-1.21.x}" +kubebuilder_assets_dir="${KUBEBUILDER_ASSETS:-$HOME/.kubebuilder/bin}" + +usage=$(cat << EOM +usage: $(basename "$0") -h | [-k VERSION] [-d PATH] + + Download kubebuilder assets to PATH. + + Arguments: + -h Print usage message then exit. + -k VERSION Kubernetes version (default ${k8s_version}). + -d PATH Destination directory for downloaded assets (default ${kubebuilder_assets_dir}). + +EOM +) + +while getopts "k:d:h" opt; do + case $opt in + k ) k8s_version="$OPTARG" + ;; + d ) kubebuilder_assets_dir="$OPTARG" + ;; + * ) echo "$usage" 1>&2 + exit 1 + ;; + esac +done + +# Kubebuilder does not support darwin/arm64 so use amd64 through Rosetta instead. +arch="$(go env GOARCH)" +if [[ "$(go env GOOS)/$arch" == "darwin/arm64" ]]; then + arch="amd64" +fi + +mkdir -p "$kubebuilder_assets_dir" +ln -sf "$(setup-envtest use -p path "$k8s_version" --arch="$arch" --bin-dir="$kubebuilder_assets_dir")"/* "$kubebuilder_assets_dir" +find "$kubebuilder_assets_dir" diff --git a/src/scripts/toolchain.sh b/src/scripts/toolchain.sh deleted file mode 100755 index 85265c1f..00000000 --- a/src/scripts/toolchain.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -usage=$(cat << EOM -usage: $(basename "$0") -h | -d PATH - - Download tools to PATH. - - Arguments: - -h Print usage message then exit. - -d PATH Destination directory for downloaded tools. - -EOM -) - -k8s_version="${K8S_VERSION:-1.21.x}" -kubebuilder_assets_dir="${KUBEBUILDER_ASSETS:-$HOME/.kubebuilder/bin}" - -tools=( - "github.com/google/ko@v0.9.3" - "sigs.k8s.io/controller-tools/cmd/controller-gen@v0.8.0" - # setup-envtest version specifiers: - # https://pkg.go.dev/sigs.k8s.io/controller-runtime/tools/setup-envtest/versions?tab=versions - "sigs.k8s.io/controller-runtime/tools/setup-envtest@v0.0.0-20220217150738-f62a0f579d73" - "github.com/onsi/ginkgo/v2/ginkgo@v2.1.3" -) - -bin_dir="" - -while getopts "d:h" opt; do - case $opt in - d ) bin_dir="$OPTARG" - ;; - * ) echo "$usage" 1>&2 - exit 1 - ;; - esac -done - -if [[ -z "$bin_dir" ]]; then - echo "error: missing destination path" - echo "$usage" 1>&2 - exit 1 -fi - -for tool in ${tools[@]}; do - echo "Downloading $tool" - GOBIN="$bin_dir" go install "$tool" -done - -# Kubebuilder does not support darwin/arm64 so use amd64 through Rosetta instead. -arch="$(go env GOARCH)" -if [[ "$(go env GOOS)/$arch" == "darwin/arm64" ]]; then - arch="amd64" -fi - -mkdir -p "$kubebuilder_assets_dir" -ln -sf "$("$bin_dir/setup-envtest" use -p path "$k8s_version" --arch="$arch" --bin-dir="$kubebuilder_assets_dir")"/* "$kubebuilder_assets_dir" -find "$kubebuilder_assets_dir"