Skip to content

Commit

Permalink
Enable support for multiple platforms in the Linux Bridge CNI.
Browse files Browse the repository at this point in the history
These updates allow the building and pushing of Linux Bridge container images
for multiple platforms (e.g., amd64, s390x) using a single Dockerfile.
Multi-platform build support is provided for both Docker and Podman container runtimes.

Signed-off-by: Ashok Pariya <[email protected]>
  • Loading branch information
ashokpariya0 committed Dec 8, 2024
1 parent 302ad3e commit e6d21e2
Showing 1 changed file with 68 additions and 11 deletions.
79 changes: 68 additions & 11 deletions hack/components/bump-linux-bridge.sh
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,31 @@ echo 'Build container image with linux-bridge binaries'
LINUX_BRIDGE_TAR_CONTAINER_DIR=/usr/src/github.com/containernetworking/plugins/bin
LINUX_BRIDGE_IMAGE=quay.io/kubevirt/cni-default-plugins
LINUX_BRIDGE_IMAGE_TAGGED=${LINUX_BRIDGE_IMAGE}:${LINUX_BRIDGE_TAG}
(
cd ${LINUX_BRIDGE_PATH}
DOCKER_BUILDER="${DOCKER_BUILDER:-linux-bridge-docker-builder}"
# By default, the build will be based on the host architecture.
# To build for other platforms, you can:
# 1. Export all supported platforms: export PLATFORMS=all
# 2. Or specify specific platforms: export PLATFORMS=linux/amd64,linux/arm64
PLATFORM_LIST="linux/amd64,linux/s390x,linux/arm64"
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
[ -z "$PLATFORMS" ] && PLATFORMS="linux/${ARCH}"
[ "$PLATFORMS" == "all" ] && PLATFORMS="${PLATFORM_LIST}"
IFS=',' read -r -a PLATFORM_LIST <<< "$PLATFORMS"

create_dockerfile() {
cat <<EOF > Dockerfile
FROM registry.access.redhat.com/ubi8/ubi-minimal AS builder
FROM --platform=\$BUILDPLATFORM registry.access.redhat.com/ubi8/ubi-minimal AS builder
ARG TARGETOS
ARG TARGETARCH
RUN microdnf install -y golang git
RUN \
git clone https://${LINUX_BRIDGE_REPO} ${LINUX_BRIDGE_PATH} && \
cd ${LINUX_BRIDGE_PATH} && \
git checkout ${LINUX_BRIDGE_TAG}
WORKDIR ${LINUX_BRIDGE_PATH}
RUN GOFLAGS=-mod=vendor ./build_linux.sh
RUN GOFLAGS=-mod=vendor GOARCH=\${TARGETARCH} GOOS=\${TARGETOS} ./build_linux.sh
FROM registry.access.redhat.com/ubi8/ubi-minimal
FROM --platform=linux/\$TARGETARCH registry.access.redhat.com/ubi8/ubi-minimal
LABEL org.opencontainers.image.authors="[email protected]"
ENV SOURCE_DIR=${REMOTE_SOURCE_DIR}/app
RUN mkdir -p ${LINUX_BRIDGE_TAR_CONTAINER_DIR}
Expand All @@ -49,14 +61,59 @@ COPY --from=builder ${LINUX_BRIDGE_PATH}/bin/tuning ${LINUX_BRIDGE_TAR_CONTAINER
RUN sha256sum ${LINUX_BRIDGE_TAR_CONTAINER_DIR}/bridge >${LINUX_BRIDGE_TAR_CONTAINER_DIR}/bridge.checksum
RUN sha256sum ${LINUX_BRIDGE_TAR_CONTAINER_DIR}/tuning >${LINUX_BRIDGE_TAR_CONTAINER_DIR}/tuning.checksum
EOF
${OCI_BIN} build -t ${LINUX_BRIDGE_IMAGE_TAGGED} .
)
}

echo 'Push the image to KubeVirt repo'
(
if [ ! -z ${PUSH_IMAGES} ]; then
${OCI_BIN} push "${LINUX_BRIDGE_IMAGE_TAGGED}"
check_and_create_docker_builder() {
existing_builder=$(docker buildx ls | grep -w "$DOCKER_BUILDER" | awk '{print $1}' || true)
if [ -n "$existing_builder" ]; then
echo "Builder '$DOCKER_BUILDER' already exists. Using existing builder."
docker buildx use "$DOCKER_BUILDER"
else
echo "Creating a new Docker Buildx builder: $DOCKER_BUILDER"
docker buildx create --driver-opt network=host --use --name "$DOCKER_BUILDER"
fi
}

build_docker_image() {
docker buildx build --platform "${PLATFORMS}" -t "${LINUX_BRIDGE_IMAGE_TAGGED}" . --push
docker buildx rm "$DOCKER_BUILDER"
}

build_podman_image() {
podman manifest rm "${LINUX_BRIDGE_IMAGE_TAGGED}" 2>/dev/null || true
podman rmi "${LINUX_BRIDGE_IMAGE_TAGGED}" 2>/dev/null || true
podman manifest create "${LINUX_BRIDGE_IMAGE_TAGGED}"

for platform in "${PLATFORM_LIST[@]}"; do
podman build --platform "$platform" --manifest "${LINUX_BRIDGE_IMAGE_TAGGED}" .
done
}

push_image_to_kubevirt_repo() {
echo 'Push the image to KubeVirt repo'
if [ "${OCI_BIN}" == "podman" ]; then
if [ ! -z "${PUSH_IMAGES}" ]; then
podman manifest push "${LINUX_BRIDGE_IMAGE_TAGGED}"
fi
fi
}


(
cd ${LINUX_BRIDGE_PATH}
create_dockerfile
(
if [[ "${OCI_BIN}" == "docker" ]]; then
check_and_create_docker_builder
build_docker_image
elif [[ "${OCI_BIN}" == "podman" ]]; then
build_podman_image
push_image_to_kubevirt_repo
else
echo "Invalid OCI_BIN value. It must be either 'docker' or 'podman'."
exit 1
fi
)
)

if [[ -n "$(docker-utils::check_image_exists "${LINUX_BRIDGE_IMAGE}" "${LINUX_BRIDGE_TAG}")" ]]; then
Expand Down

0 comments on commit e6d21e2

Please sign in to comment.