make: preload-kind-image now caches the kind image in "bin/downloaded"

Signed-off-by: Maël Valais <mael@vls.dev>
This commit is contained in:
Maël Valais 2022-03-23 17:29:49 +01:00
parent d6ebdda49c
commit 10c4aa808f
2 changed files with 46 additions and 24 deletions

View File

@ -101,18 +101,18 @@ fi
# hack/update-kind-images.sh.
source "${here}/config/kind/kind_cluster_node_versions.env"
case "$k8s_version" in
1.18*) kind_image_sha=$KIND_IMAGE_SHA_K8S_118 ;;
1.19*) kind_image_sha=$KIND_IMAGE_SHA_K8S_119 ;;
1.20*) kind_image_sha=$KIND_IMAGE_SHA_K8S_120 ;;
1.21*) kind_image_sha=$KIND_IMAGE_SHA_K8S_121 ;;
1.22*) kind_image_sha=$KIND_IMAGE_SHA_K8S_122 ;;
1.23*) kind_image_sha=$KIND_IMAGE_SHA_K8S_123 ;;
1.18*) image="${kind_image_repo}:v1.18.0@$KIND_IMAGE_SHA_K8S_118" ;;
1.19*) image="${kind_image_repo}:v1.19.0@$KIND_IMAGE_SHA_K8S_119" ;;
1.20*) image="${kind_image_repo}:v1.20.0@$KIND_IMAGE_SHA_K8S_120" ;;
1.21*) image="${kind_image_repo}:v1.21.0@$KIND_IMAGE_SHA_K8S_121" ;;
1.22*) image="${kind_image_repo}:v1.22.0@$KIND_IMAGE_SHA_K8S_122" ;;
1.23*) image="${kind_image_repo}:v1.23.0@$KIND_IMAGE_SHA_K8S_123" ;;
v*) printf "${red}${redcross}Error${end}: the Kubernetes version must be given without the leading 'v'\n" >&2 && exit 1 ;;
*) printf "${red}${redcross}Error${end}: unsupported Kubernetes version ${yel}${k8s_version}${end}\n" >&2 && exit 1 ;;
esac
if [ -n "$show_image" ]; then
echo "${kind_image_repo}:${k8s_version}@${kind_image_sha}"
echo "$image"
exit 0
fi
@ -140,7 +140,7 @@ setup_kind() {
# (1) Does the kind cluster already exist?
if ! kind get clusters -q | grep -q "^$kind_cluster_name\$"; then
trace kind create cluster --config make/config/kind/v1beta2.yaml \
--image "${kind_image_repo}:${k8s_version}@${kind_image_sha}" \
--image "$image" \
--name "$kind_cluster_name"
fi

View File

@ -37,6 +37,9 @@ IMAGE_projectcontour_arm64 := docker.io/projectcontour/contour:v1.20.1@sha256:19
IMAGE_pebble_arm64 := local/pebble:local
IMAGE_vaultretagged_arm64 := local/vault:local
IMAGE_kind_amd64 := $(shell make/cluster.sh --show-image)
IMAGE_kind_arm64 := $(IMAGE_kind_amd64)
PEBBLE_COMMIT = ba5f81dd80fa870cbc19326f2d5a46f45f0b5ee3
GATEWAY_API_VERSION = 0.4.1
@ -47,7 +50,7 @@ GATEWAY_API_VERSION = 0.4.1
## with `make kind KIND_CLUSTER_NAME=name`.
##
## @category Development
e2e-setup-kind: kind-exists kind-image-prepull
e2e-setup-kind: kind-exists preload-kind-image
@printf "✅ \033[0;32mReady\033[0;0m. The next step is to install cert-manager and the addons with the command:\n" >&2
@printf " \033[0;36mmake -j e2e-setup\033[0;0m\n" >&2
@ -69,15 +72,8 @@ bin/scratch/kind-exists: make/config/kind/v1beta2.yaml make/cluster.sh FORCE bin
.PHONY: kind-exists
kind-exists: bin/scratch/kind-exists
# Let's separate the pulling of the Kind image so that more tasks can be
# run in parallel when running "make -j e2e-setup".
.PHONY: kind-image-prepull
kind-image-prepull:
@$(eval IMAGE = $(shell make/cluster.sh --show-image))
$(CTR) inspect $(IMAGE) 2>/dev/null >&2 || $(CTR) pull $(IMAGE)
# Component Used in IP A record in bind
# --------- ------- -- ----------------
# Component Used in IP A record in bind
# --------- ------- -- ----------------
# e2e-setup-bind DNS-01 tests SERVICE_IP_PREFIX.16
# e2e-setup-ingressnginx HTTP-01 Ingress tests SERVICE_IP_PREFIX.15 *.ingress-nginx.db.http01.example.com
# e2e-setup-projectcontour HTTP-01 GatewayAPI tests SERVICE_IP_PREFIX.14 *.gateway.db.http01.example.com
@ -91,13 +87,17 @@ kind-image-prepull:
## @category Development
e2e-setup: e2e-setup-certmanager e2e-setup-kyverno e2e-setup-vault e2e-setup-bind e2e-setup-sampleexternalissuer e2e-setup-samplewebhook e2e-setup-pebble e2e-setup-ingressnginx e2e-setup-projectcontour
# The function $(call image-tar,traefik) returns the path to the image tarball
# for a given image name such as "traefik". The path looks like this:
# The function "image-tar" returns the path to the image tarball for a given
# image name. For example:
#
# $(call image-tar,traefik)
#
# returns the following path:
#
# bin/downloaded/containers/amd64/docker.io/traefik+2.4.9@sha256+bfba204252.tar
# <---> <--------------------------------------->
# CRI_ARCH IMAGE_traefik_amd64
# (with ":" replaced with "+")
# <---> <--------------------------------------->
# CRI_ARCH IMAGE_traefik_amd64
# (with ":" replaced with "+")
#
# Note the "+" signs. We replace all the "+" with ":" because ":" can't be used
# in make targets. The "+" replacement is safe since it isn't a valid character
@ -106,9 +106,22 @@ e2e-setup: e2e-setup-certmanager e2e-setup-kyverno e2e-setup-vault e2e-setup-bin
# When an image isn't available, i.e., IMAGE_imagename_arm64 is empty, we still
# return a string of the form "bin/downloaded/containers/amd64/missing-imagename.tar".
define image-tar
bin/downloaded/containers/$(CRI_ARCH)/$(if $(IMAGE_$(1)_$(CRI_ARCH)),$(subst :,+,$(IMAGE_$(1)_$(CRI_ARCH))),missing-$(1)_$(CRI_ARCH)).tar
bin/downloaded/containers/$(CRI_ARCH)/$(if $(IMAGE_$(1)_$(CRI_ARCH)),$(subst :,+,$(IMAGE_$(1)_$(CRI_ARCH))),missing-$(1)).tar
endef
# Let's separate the pulling of the Kind image so that more tasks can be
# run in parallel when running "make -j e2e-setup". In CI, the Docker
# engine being stripped on every job, we save the kind image to
# "bin/downloads".
.PHONY: preload-kind-image
ifeq ($(CI),)
preload-kind-image: bin/tools/crane
$(CTR) inspect $(IMAGE_kind_$(CRI_ARCH)) 2>/dev/null >&2 || $(CTR) pull $(IMAGE_kind_$(CRI_ARCH))
else
preload-kind-image: $(call image-tar,kind) bin/tools/crane
$(CTR) inspect $(IMAGE_kind_$(CRI_ARCH)) 2>/dev/null >&2 || $(CTR) load -i $<
endif
LOAD_TARGETS=load-$(call image-tar,ingressnginxprev1) load-$(call image-tar,ingressnginxpostv1) load-$(call image-tar,haproxyingress) load-$(call image-tar,kyverno) load-$(call image-tar,kyvernopre) load-$(call image-tar,traefik) load-$(call image-tar,vault) load-$(call image-tar,bind) load-$(call image-tar,projectcontour) load-$(call image-tar,sampleexternalissuer) load-$(call image-tar,vaultretagged) load-bin/downloaded/containers/$(CRI_ARCH)/pebble.tar load-bin/downloaded/containers/$(CRI_ARCH)/samplewebhook.tar load-bin/containers/cert-manager-controller-linux-$(CRI_ARCH).tar load-bin/containers/cert-manager-acmesolver-linux-$(CRI_ARCH).tar load-bin/containers/cert-manager-cainjector-linux-$(CRI_ARCH).tar load-bin/containers/cert-manager-webhook-linux-$(CRI_ARCH).tar load-bin/containers/cert-manager-ctl-linux-$(CRI_ARCH).tar
.PHONY: $(LOAD_TARGETS)
$(LOAD_TARGETS): load-%: % bin/scratch/kind-exists bin/tools/kind
@ -128,6 +141,15 @@ $(call image-tar,kyverno) $(call image-tar,kyvernopre) $(call image-tar,bind) $(
diff <(echo "$(DIGEST) -" | cut -d: -f2) <(bin/tools/crane manifest --platform=linux/$(CRI_ARCH) $(IMAGE) | sha256sum)
bin/tools/crane pull $(IMAGE_WITHOUT_DIGEST) $@ --platform=linux/$(CRI_ARCH)
# Same as above, except it supports multiarch images.
$(call image-tar,kind): bin/downloaded/containers/$(CRI_ARCH)/%.tar: bin/tools/crane
@$(eval IMAGE=$(subst +,:,$(shell cut -d/ -f2- <<<$*)))
@$(eval IMAGE_WITHOUT_DIGEST=$(shell cut -d@ -f1 <<<"$(IMAGE)"))
@$(eval DIGEST=$(subst $(IMAGE_WITHOUT_DIGEST)@,,$(IMAGE)))
@mkdir -p $(dir $@)
diff <(echo "$(DIGEST) -" | cut -d: -f2) <(bin/tools/crane manifest $(IMAGE) | sha256sum)
bin/tools/crane pull $(IMAGE_WITHOUT_DIGEST) $@ --platform=linux/$(CRI_ARCH)
# Since we dynamically install Vault via Helm during the end-to-end tests,
# we need its image to be retagged to a well-known tag "local/vault:local".
$(call image-tar,vaultretagged): $(call image-tar,vault)