This is an automated email from the ASF dual-hosted git repository.
chia7712 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/yunikorn-k8shim.git
The following commit(s) were added to refs/heads/master by this push:
new fa7b6add [YUNIKORN-3441] Support podman for building images and
running e2e tests (#1084)
fa7b6add is described below
commit fa7b6add8facb4309aedc732ab2ccbcd4a165f72
Author: PoiBlackTea <[email protected]>
AuthorDate: Sat Sep 5 23:21:56 2026 +0800
[YUNIKORN-3441] Support podman for building images and running e2e tests
(#1084)
Makefile: auto-detect the container engine (docker preferred, podman as
fallback), overridable with DOCKER=podman. Export
KIND_EXPERIMENTAL_PROVIDER when podman is used so kind create/delete
target the same provider.
scripts/run-e2e-tests.sh: load images into kind via image-archive when
using podman, and use the localhost/local registry prefix so helm can
resolve the images.
Closes: #1084
Signed-off-by: Chia-Ping Tsai <[email protected]>
---
Makefile | 27 +++++++++++++++++-----
scripts/run-e2e-tests.sh | 60 +++++++++++++++++++++++++++++++++++-------------
2 files changed, 65 insertions(+), 22 deletions(-)
diff --git a/Makefile b/Makefile
index d9da446e..28290cb5 100644
--- a/Makefile
+++ b/Makefile
@@ -234,6 +234,19 @@ ifeq ($(REGISTRY),)
REGISTRY := apache
endif
+# Container engine used to build images. Can be overridden with DOCKER=podman.
+ifeq ($(DOCKER),)
+ifneq ($(shell command -v docker 2>/dev/null),)
+DOCKER := docker
+else
+DOCKER := podman
+endif
+endif
+
+ifeq ($(DOCKER),podman)
+export KIND_EXPERIMENTAL_PROVIDER := podman
+endif
+
# Force Go modules even when checked out inside GOPATH
GO111MODULE := on
export GO111MODULE
@@ -259,6 +272,8 @@ print_kind_version:
@echo $(KIND_VERSION)
print_helm_version:
@echo $(HELM_VERSION)
+print_docker:
+ @echo $(DOCKER)
# Install tools
tools: $(SHELLCHECK_BIN) $(GOLANGCI_LINT_BIN) $(KUBECTL_BIN) $(KIND_BIN)
$(HELM_BIN) $(GO_LICENSES_BIN) $(GINKGO_BIN)
@@ -405,7 +420,7 @@ $(RELEASE_BIN_DIR)/$(SCHEDULER_BINARY): go.mod go.sum
$(shell find pkg)
@echo "building binary for scheduler docker image"
@mkdir -p "$(RELEASE_BIN_DIR)"
ifeq ($(REPRO),1)
- docker run -t --rm=true --volume "$(DOCKER_BUILDROOT):/buildroot"
"golang:$(GO_REPRO_VERSION)" sh -c "cd $(DOCKER_SRCROOT) && \
+ $(DOCKER) run -t --rm=true --volume "$(DOCKER_BUILDROOT):/buildroot"
"golang:$(GO_REPRO_VERSION)" sh -c "cd $(DOCKER_SRCROOT) && \
CGO_ENABLED=0 GOOS=linux GOARCH=\"${EXEC_ARCH}\" go build \
-a \
-o=${RELEASE_BIN_DIR}/${SCHEDULER_BINARY} \
@@ -444,7 +459,7 @@ sched_image: $(OUTPUT)/third-party-licenses.md scheduler
docker/scheduler
@cp -a "docker/scheduler/." "$(DOCKER_DIR)/scheduler/."
@cp "$(RELEASE_BIN_DIR)/$(SCHEDULER_BINARY)" "$(DOCKER_DIR)/scheduler/."
@cp -a LICENSE NOTICE "$(OUTPUT)/third-party-licenses.md"
"$(DOCKER_DIR)/scheduler/."
- DOCKER_BUILDKIT=1 docker build \
+ DOCKER_BUILDKIT=1 $(DOCKER) build \
"$(DOCKER_DIR)/scheduler" \
-t "$(SCHEDULER_TAG)" \
--platform "linux/${DOCKER_ARCH}" \
@@ -471,7 +486,7 @@ sched_image_instrumented: $(OUTPUT)/third-party-licenses.md
scheduler_instrument
@cp -a "docker/scheduler/." "$(DOCKER_DIR)/scheduler/."
@cp "$(COVERAGE_DIR)/$(SCHEDULER_BINARY)" "$(DOCKER_DIR)/scheduler/."
@cp -a LICENSE NOTICE "$(OUTPUT)/third-party-licenses.md"
"$(DOCKER_DIR)/scheduler/."
- DOCKER_BUILDKIT=1 docker build \
+ DOCKER_BUILDKIT=1 $(DOCKER) build \
"$(DOCKER_DIR)/scheduler" \
-t "$(SCHEDULER_INSTRUMENTED_TAG)" \
--platform "linux/${DOCKER_ARCH}" \
@@ -498,7 +513,7 @@ $(RELEASE_BIN_DIR)/$(ADMISSION_CONTROLLER_BINARY): go.mod
go.sum $(shell find pk
@echo "building admission controller binary"
@mkdir -p "$(RELEASE_BIN_DIR)"
ifeq ($(REPRO),1)
- docker run -t --rm=true --volume "$(DOCKER_BUILDROOT):/buildroot"
"golang:$(GO_REPRO_VERSION)" sh -c "cd $(DOCKER_SRCROOT) && \
+ $(DOCKER) run -t --rm=true --volume "$(DOCKER_BUILDROOT):/buildroot"
"golang:$(GO_REPRO_VERSION)" sh -c "cd $(DOCKER_SRCROOT) && \
CGO_ENABLED=0 GOOS=linux GOARCH=\"${EXEC_ARCH}\" go build \
-a \
-o=$(RELEASE_BIN_DIR)/$(ADMISSION_CONTROLLER_BINARY) \
@@ -524,7 +539,7 @@ adm_image: $(OUTPUT)/third-party-licenses.md admission
docker/admission
@cp -a "docker/admission/." "$(DOCKER_DIR)/admission/."
@cp "$(RELEASE_BIN_DIR)/$(ADMISSION_CONTROLLER_BINARY)"
"$(DOCKER_DIR)/admission/."
@cp -a LICENSE NOTICE "$(OUTPUT)/third-party-licenses.md"
"$(DOCKER_DIR)/admission/."
- DOCKER_BUILDKIT=1 docker build \
+ DOCKER_BUILDKIT=1 $(DOCKER) build \
"$(DOCKER_DIR)/admission" \
-t "$(ADMISSION_TAG)" \
--platform "linux/${DOCKER_ARCH}" \
@@ -555,7 +570,7 @@ webtest_image: $(OUTPUT)/third-party-licenses.md
build_web_test_server_prod dock
@cp -a "docker/webtest/." "$(DOCKER_DIR)/webtest/."
@cp "$(RELEASE_BIN_DIR)/$(TEST_SERVER_BINARY)" "$(DOCKER_DIR)/webtest/."
@cp -a LICENSE NOTICE "$(OUTPUT)/third-party-licenses.md"
"$(DOCKER_DIR)/webtest/."
- DOCKER_BUILDKIT=1 docker build \
+ DOCKER_BUILDKIT=1 $(DOCKER) build \
"$(DOCKER_DIR)/webtest" \
-t "${REGISTRY}/yunikorn:webtest-${DOCKER_ARCH}-${VERSION}" \
--label "yunikorn-e2e-web-image" \
diff --git a/scripts/run-e2e-tests.sh b/scripts/run-e2e-tests.sh
index aadb82d6..57b269a6 100755
--- a/scripts/run-e2e-tests.sh
+++ b/scripts/run-e2e-tests.sh
@@ -20,6 +20,7 @@ TOOLS_DIRECTORY=tools
HELM_VERSION=$(make -s print_helm_version)
KIND_VERSION=$(make -s print_kind_version)
KUBECTL_VERSION=$(make -s print_kubectl_version)
+DOCKER=$(make -s print_docker)
HELM=$TOOLS_DIRECTORY/helm-$HELM_VERSION/helm
KIND=$TOOLS_DIRECTORY/kind-$KIND_VERSION/kind
KUBECTL=$TOOLS_DIRECTORY/kubectl-$KUBECTL_VERSION/kubectl
@@ -97,13 +98,26 @@ function check_os() {
fi
}
-# check docker available and up
+# check docker/podman available and up
function check_docker() {
- check_cmd "docker"
- DOCKER_UP=$(docker version | grep "^Server:")
- if [ -z "${DOCKER_UP}" ]; then
- echo "docker daemon must be running"
- return 1
+ check_cmd "${DOCKER}"
+ "${DOCKER}" info &> /dev/null
+ exit_on_error "${DOCKER} is not available"
+}
+
+# load an image into the kind cluster
+function load_image() {
+ IMAGE=$1
+ if [ "${DOCKER}" = "podman" ]; then
+ ARCHIVE=$(mktemp -t yunikorn-image.XXXXXX)
+ "${DOCKER}" save "${IMAGE}" -o "${ARCHIVE}"
+ exit_on_error "failed to export image: ${IMAGE}"
+ "${KIND}" load image-archive "${ARCHIVE}" --name "${CLUSTER_NAME}"
+ RC=$?
+ rm -f "${ARCHIVE}"
+ return ${RC}
+ else
+ "${KIND}" load docker-image "${IMAGE}" --name "${CLUSTER_NAME}"
fi
}
@@ -133,9 +147,9 @@ function install_cluster() {
# build docker images from latest code, so that we can install yunikorn with
these latest images
echo "step 3/6: building docker images from latest code"
check_docker
- QUIET="--quiet" REGISTRY=local VERSION=latest make image
+ QUIET="--quiet" REGISTRY="${IMAGE_REGISTRY}" VERSION=latest make image
exit_on_error "build docker images failed"
- QUIET="--quiet" REGISTRY=local VERSION=latest make webtest_image
+ QUIET="--quiet" REGISTRY="${IMAGE_REGISTRY}" VERSION=latest make
webtest_image
exit_on_error "build test web images failed"
# create K8s cluster
@@ -149,24 +163,24 @@ function install_cluster() {
echo "cluster node definitions:"
"${KUBECTL}" describe nodes
- # pre-load yunikorn docker images to kind
+ # pre-load yunikorn images to kind
echo "step 5/6: pre-load yunikorn images"
- "${KIND}" load docker-image "local/yunikorn:${SCHEDULER_IMAGE}" --name
"${CLUSTER_NAME}"
+ load_image "${IMAGE_REGISTRY}/yunikorn:${SCHEDULER_IMAGE}"
exit_on_error "pre-load scheduler image failed: ${SCHEDULER_IMAGE}"
- "${KIND}" load docker-image "local/yunikorn:${ADMISSION_IMAGE}" --name
"${CLUSTER_NAME}"
+ load_image "${IMAGE_REGISTRY}/yunikorn:${ADMISSION_IMAGE}"
exit_on_error "pre-load admission controller image failed:
${ADMISSION_IMAGE}"
- "${KIND}" load docker-image "local/yunikorn:${WEBTEST_IMAGE}" --name
"${CLUSTER_NAME}"
+ load_image "${IMAGE_REGISTRY}/yunikorn:${WEBTEST_IMAGE}"
exit_on_error "pre-load web image failed: ${WEBTEST_IMAGE}"
echo "step 6/6: installing yunikorn"
"${HELM}" install yunikorn "${CHART_PATH}" --namespace yunikorn \
- --set image.repository=local/yunikorn \
+ --set image.repository="${IMAGE_REGISTRY}/yunikorn" \
--set image.tag="${SCHEDULER_IMAGE}" \
--set image.pullPolicy=IfNotPresent \
- --set admissionController.image.repository=local/yunikorn \
+ --set admissionController.image.repository="${IMAGE_REGISTRY}/yunikorn" \
--set admissionController.image.tag="${ADMISSION_IMAGE}" \
--set admissionController.image.pullPolicy=IfNotPresent \
- --set web.image.repository=local/yunikorn \
+ --set web.image.repository="${IMAGE_REGISTRY}/yunikorn" \
--set web.image.tag="${WEBTEST_IMAGE}" \
--set web.image.pullPolicy=IfNotPresent \
--set deadlockDetection.enabled=true \
@@ -190,11 +204,15 @@ function print_usage() {
NAME=$(basename "$0")
cat <<EOF
Usage: ${NAME} -a <action> -n <kind-cluster-name> -v <kind-node-image-version>
[-p <chart-path>]
- <action> the action to be executed, must be either
"test" or "cleanup".
+ <action> the action to be executed, must be either
"test", "install" or "cleanup".
<kind-cluster-name> the name of the K8s cluster to be created by
kind
<kind-node-image-version> the kind node image used to provision the K8s
cluster, required for "test" action
<chart-path> local path to helm charts path (default is to
pull from GitHub master)
+Environment:
+ DOCKER container engine, "docker" or "podman";
auto-detected by the Makefile
+ when not set (docker preferred, podman when
docker is absent)
+
Examples:
${NAME} -a test -n yk8s -v kindest/node:v1.24.17
${NAME} -a test -n yk8s -v kindest/node:v1.25.16
@@ -208,6 +226,9 @@ Examples:
Use a local helm chart path:
${NAME} -a test -n yk8s -v kindest/node:v1.32.2 -p
../yunikorn-release/helm-charts/yunikorn
+
+ Force podman even when docker is installed:
+ DOCKER=podman ${NAME} -a test -n yk8s -v kindest/node:v1.32.2
EOF
}
@@ -220,6 +241,11 @@ check_os
CHART_PATH="./build/yunikorn-release/helm-charts/yunikorn"
GIT_CLONE=true
+IMAGE_REGISTRY="local"
+if [ "${DOCKER}" = "podman" ]; then
+ IMAGE_REGISTRY="localhost/local"
+ export KIND_EXPERIMENTAL_PROVIDER=podman
+fi
SCHEDULER_IMAGE="scheduler-${DOCKER_ARCH}-latest"
ADMISSION_IMAGE="admission-${DOCKER_ARCH}-latest"
WEBTEST_IMAGE="webtest-${DOCKER_ARCH}-latest"
@@ -272,6 +298,8 @@ echo " chart path : ${CHART_PATH}"
echo " operating system : ${OS}"
echo " processor arch : ${EXEC_ARCH}"
echo " docker arch : ${DOCKER_ARCH}"
+echo " docker : ${DOCKER}"
+echo " image registry : ${IMAGE_REGISTRY}"
echo " scheduler image : ${SCHEDULER_IMAGE}"
echo " admission image : ${ADMISSION_IMAGE}"
echo " web image : ${WEBTEST_IMAGE}"
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]