diff --git a/Makefile b/Makefile index 50c24a66..edf17865 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,8 @@ KODATA = \ cmd/webhook/kodata/refs CODECOVERAGE_OUT = $(PROJECT_DIR)/coverprofile.out GITHUB_REPO_FULL_NAME = "aws/aws-node-termination-handler" +ECR_PUBLIC_REGISTRY ?= "public.ecr.aws/aws-ec2" +ECR_PUBLIC_REPOSITORY_ROOT = "aws-node-termination-handler-2" # Image URL to use all building/pushing image targets IMG ?= controller:latest @@ -125,6 +127,10 @@ delete: ## Delete controller from current kubernetes cluster. ##@ Release +.PHONY: build-and-push-images +build-and-push-images: $(KO) $(KODATA) ## Build controller and webhook images and push to ECR public repository. + @PATH="$(BIN_DIR):$(PATH)" $(PROJECT_DIR)/scripts/build-and-push-images.sh -r "$(ECR_PUBLIC_REGISTRY)/$(ECR_PUBLIC_REPOSITORY_ROOT)" + .PHONY: create-release-prep-pr create-release-prep-pr: $(GUM) ## Update version numbers in documents and open a PR. @PATH="$(BIN_DIR):$(PATH)" $(PROJECT_DIR)/scripts/prepare-for-release.sh @@ -141,3 +147,5 @@ latest-release-tag: ## Get tag of most recent release. repo-full-name: ## Get the full name of the GitHub repository for Node Termination Handler. @echo "$(GITHUB_REPO_FULL_NAME)" +.PHONY: version +version: latest-release-tag ## Get the most recent release version. diff --git a/scripts/build-and-push-images.sh b/scripts/build-and-push-images.sh new file mode 100755 index 00000000..721c33e8 --- /dev/null +++ b/scripts/build-and-push-images.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +set -euo pipefail + +repo_root_path="$(cd "$(dirname "$0")"; cd ..; pwd -P)" +makefile_path="${repo_root_path}/Makefile" + +if ! command -v ko >/dev/null; then + echo "error: required executable 'ko' not found" >&2 + exit 1 +fi + +version="$(make -s -f "${makefile_path}" version)" +platforms="linux/amd64" +image_repository="${KO_DOCKER_REPO}" +goproxy="direct|https://proxy.golang.org" + +usage=$(cat << EOM +usage: $(basename $0) -h | [-p PLATFORMS] [-r REPOSITORY] [-v VERSION] + + Build and push Docker images for each platform. + + Optional: + -h Display this help message then exit. + -g GOPROXY See documentation in "go help environment". Defaults to "${goproxy}". + -p PLATFORMS Comma separated list of OS and Arch identifiers, e.g. "linux/amd64,linux/arm64". Defaults to "${platforms}". + -r REPOSITORY Image repository to push the built images. Defaults to "${image_repository}". + -v VERSION Version to include in tag of docker image. Defaults "${version}". + +EOM +) + +while getopts "g:p:r:v:h" opt; do + case "${opt}" in + g ) goproxy="${OPTARG}" + ;; + p ) platforms="${OPTARG}" + ;; + r ) image_repository="${OPTARG}" + ;; + v ) version="${OPTARG}" + ;; + h ) echo "${usage}" + exit 0 + ;; + \?) echo "${usage}" >&2 + exit 1 + ;; + esac +done + +assert_not_empty() { + if [[ -z "${!1}" ]]; then + echo "error: missing argument ${1}" >&2 + echo "${usage}" >&2 + exit 1 + fi +} + +assert_not_empty goproxy +assert_not_empty platforms +assert_not_empty image_repository +assert_not_empty version + +for app in "controller" "webhook"; do + GOPROXY="${goproxy}" KO_DOCKER_REPO="${image_repository}" ko publish \ + --base-import-paths \ + --tags "${version}" \ + --platform "${platforms}" \ + "github.com/aws/aws-node-termination-handler/cmd/${app}" +done