From fdc62d97655bc952bf06a9de4a2783e32ac2eac5 Mon Sep 17 00:00:00 2001 From: Nikolas Zimmermann Date: Mon, 8 Apr 2024 23:41:45 +0200 Subject: [PATCH 1/5] Build wkdev-sdk for non-amd64 6architectures. Podman allows to build multi-architecture OCI images, that combine e.g. amd64 images + arm64 + ... in one image. Combined with qemu, one can easily build images for foreign architectures from amd64 hosts. Use that to extend wkdev-sdk to 'linux/arm/v7', besides the existing 'linux/amd64' support. Extend the GitHub workflow to produce multi-architecture images. Let's see where this goes :-) --- .github/workflows/wkdev-sdk.yml | 6 +++--- scripts/host-only/wkdev-sdk-bakery | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/wkdev-sdk.yml b/.github/workflows/wkdev-sdk.yml index b1226c5..ad3a782 100644 --- a/.github/workflows/wkdev-sdk.yml +++ b/.github/workflows/wkdev-sdk.yml @@ -20,8 +20,8 @@ jobs: fi echo "WKDEV_SDK_CONTAINER_REGISTRY_USER_NAME=$(echo ${GITHUB_REPOSITORY_OWNER} | tr '[:upper:]' '[:lower:]')" >> "${GITHUB_ENV}" - - name: Install podman - run: sudo apt-get update && sudo apt-get -y install podman fuse-overlayfs + - name: Install dependencies + run: sudo apt-get update && sudo apt-get -y install podman fuse-overlayfs qemu-user-static - name: Checkout repo uses: actions/checkout@v4 @@ -29,7 +29,7 @@ jobs: - name: Build image run: | source ./register-sdk-on-host.sh - wkdev-sdk-bakery --mode=build --verbose + wkdev-sdk-bakery --mode=build --platforms=linux/arm/v7,linux/amd64 --verbose wkdev-sdk-bakery --mode=export --verbose - name: Archive image diff --git a/scripts/host-only/wkdev-sdk-bakery b/scripts/host-only/wkdev-sdk-bakery index 25b9164..ac14674 100755 --- a/scripts/host-only/wkdev-sdk-bakery +++ b/scripts/host-only/wkdev-sdk-bakery @@ -20,6 +20,7 @@ argsparse_use_option =verbose "Increase verbosity of this script" argsparse_use_option =name: "Name of container image" mandatory default:wkdev-sdk argsparse_use_option =env: "Environment variable as string array, e.g. -e KEY=value,FOO=bar" cumulative argsparse_use_option =mode: "Operation mode: 'build', 'deploy', or 'export'" mandatory +argsparse_use_option =platforms: "Build container for given set of platforms" mandatory default:"linux/amd64" argsparse_use_option idle-cores: "Number of CPU cores to leave idle, when building the image" type:uint default:2 argsparse_use_option =tag: "Tag to use for created image." default:$(get_default_container_tag) argsparse_use_option =arch: "Container architecture." @@ -46,6 +47,7 @@ process_command_line_arguments() { idle_cores=${program_options["idle-cores"]} operation_mode="${program_options["mode"]}" + platforms="${program_options["platforms"]}" [ "${operation_mode}" != 'build' ] && [ "${operation_mode}" != 'deploy' ] && [ "${operation_mode}" != 'export' ] && _abort_ "Unknown operation mode: '${operation_mode}' (valid choices are 'build', 'deploy', or 'export')" } @@ -75,7 +77,9 @@ build_image() { podman_argument+=("--env" "${environment_variable}") done - run_podman_silent_unless_verbose build ${podman_argument[@]} . || _abort_ "Container image build failed" + run_podman_silent manifest rm "$(get_tag_for_build)" + run_podman_silent_unless_verbose manifest create "$(get_tag_for_build)" || _abort_ "Container image manifest creation failed" + run_podman_silent_unless_verbose build --jobs ${podman_argument[@]} --platform "${platforms}" --manifest "$(get_tag_for_build)" . || _abort_ "Container image build failed" timer_stop popd &>/dev/null } @@ -88,7 +92,8 @@ deploy_image() { local image_directory="$(get_image_directory_by_name "${container_image_name}")" pushd "${image_directory}" &>/dev/null || _abort_ "Switching to directory '${image_directory}' failed" - run_podman_silent_unless_verbose push "$(get_tag_for_build)" || _abort_ "Pushing to registry failed" + run_podman_silent_unless_verbose push "$(get_tag_for_build)" || _abort_ "Pushing image to registry failed" + run_podman_silent_unless_verbose manifest push "${container_image_name}:$(get_container_tag)" "docker://$(get_tag_for_build)" || _abort_ "Pushing manifest to registry failed" popd &>/dev/null } From e342143fa42e4f81bbdfb367daabed7a643df4e0 Mon Sep 17 00:00:00 2001 From: Justin Michaud Date: Wed, 19 Mar 2025 16:42:41 -0600 Subject: [PATCH 2/5] . --- .github/workflows/wkdev-sdk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wkdev-sdk.yml b/.github/workflows/wkdev-sdk.yml index ad3a782..a925fe3 100644 --- a/.github/workflows/wkdev-sdk.yml +++ b/.github/workflows/wkdev-sdk.yml @@ -29,7 +29,7 @@ jobs: - name: Build image run: | source ./register-sdk-on-host.sh - wkdev-sdk-bakery --mode=build --platforms=linux/arm/v7,linux/amd64 --verbose + wkdev-sdk-bakery --mode=build --platforms=linux/arm/v7,linux/amd64 --verbose --tag=armtest wkdev-sdk-bakery --mode=export --verbose - name: Archive image From 0e3451b132439b587fac074e9cbbceb85782cb5a Mon Sep 17 00:00:00 2001 From: Justin Michaud Date: Wed, 19 Mar 2025 16:43:23 -0600 Subject: [PATCH 3/5] . --- scripts/host-only/wkdev-sdk-bakery | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/host-only/wkdev-sdk-bakery b/scripts/host-only/wkdev-sdk-bakery index ac14674..a0b43b1 100755 --- a/scripts/host-only/wkdev-sdk-bakery +++ b/scripts/host-only/wkdev-sdk-bakery @@ -79,7 +79,7 @@ build_image() { run_podman_silent manifest rm "$(get_tag_for_build)" run_podman_silent_unless_verbose manifest create "$(get_tag_for_build)" || _abort_ "Container image manifest creation failed" - run_podman_silent_unless_verbose build --jobs ${podman_argument[@]} --platform "${platforms}" --manifest "$(get_tag_for_build)" . || _abort_ "Container image build failed" + run_podman_silent_unless_verbose build ${podman_argument[@]} --platform "${platforms}" --manifest "$(get_tag_for_build)" . || _abort_ "Container image build failed" timer_stop popd &>/dev/null } From b3b63fdcb6eaa980d45d950656de8413193fa976 Mon Sep 17 00:00:00 2001 From: Justin Michaud Date: Wed, 19 Mar 2025 19:56:13 -0600 Subject: [PATCH 4/5] . --- .github/workflows/wkdev-sdk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wkdev-sdk.yml b/.github/workflows/wkdev-sdk.yml index a925fe3..1e3b429 100644 --- a/.github/workflows/wkdev-sdk.yml +++ b/.github/workflows/wkdev-sdk.yml @@ -29,7 +29,7 @@ jobs: - name: Build image run: | source ./register-sdk-on-host.sh - wkdev-sdk-bakery --mode=build --platforms=linux/arm/v7,linux/amd64 --verbose --tag=armtest + wkdev-sdk-bakery --mode=build --platforms=linux/arm64,linux/amd64 --verbose --tag=armtest wkdev-sdk-bakery --mode=export --verbose - name: Archive image From 1ccd77e900eb9547bff19b3d211c3fa64a879187 Mon Sep 17 00:00:00 2001 From: Justin Michaud Date: Wed, 19 Mar 2025 20:37:05 -0600 Subject: [PATCH 5/5] . --- .github/workflows/wkdev-sdk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wkdev-sdk.yml b/.github/workflows/wkdev-sdk.yml index 1e3b429..93794db 100644 --- a/.github/workflows/wkdev-sdk.yml +++ b/.github/workflows/wkdev-sdk.yml @@ -29,7 +29,7 @@ jobs: - name: Build image run: | source ./register-sdk-on-host.sh - wkdev-sdk-bakery --mode=build --platforms=linux/arm64,linux/amd64 --verbose --tag=armtest + wkdev-sdk-bakery --mode=build --platforms=linux/arm64,linux/amd64 --verbose --tag=armtest2 wkdev-sdk-bakery --mode=export --verbose - name: Archive image