From a4025a84120051b4cce1e17e5ce047ecb5c06ee8 Mon Sep 17 00:00:00 2001 From: nbykov0 <166552198+nbykov0@users.noreply.github.com> Date: Tue, 20 May 2025 20:38:48 +0300 Subject: [PATCH] core/installer: multi-arch talos support Signed-off-by: nbykov0 <166552198+nbykov0@users.noreply.github.com> --- hack/upload-assets.sh | 10 +++++ packages/core/installer/Makefile | 42 ++++++++++++++----- packages/core/installer/hack/gen-profiles.sh | 22 ++++++---- packages/core/installer/hack/gen-versions.sh | 14 +++++-- .../installer/images/cozystack/Dockerfile | 15 ++++--- .../core/installer/images/matchbox/Dockerfile | 6 ++- .../{initramfs.yaml => initramfs-amd64.yaml} | 0 .../talos/profiles/initramfs-arm64.yaml | 27 ++++++++++++ .../{installer.yaml => installer-amd64.yaml} | 0 .../talos/profiles/installer-arm64.yaml | 27 ++++++++++++ .../profiles/{iso.yaml => iso-amd64.yaml} | 0 .../images/talos/profiles/iso-arm64.yaml | 27 ++++++++++++ .../{kernel.yaml => kernel-amd64.yaml} | 0 .../images/talos/profiles/kernel-arm64.yaml | 27 ++++++++++++ .../profiles/{metal.yaml => metal-amd64.yaml} | 0 .../images/talos/profiles/metal-arm64.yaml | 27 ++++++++++++ .../{nocloud.yaml => nocloud-amd64.yaml} | 0 .../images/talos/profiles/nocloud-arm64.yaml | 27 ++++++++++++ 18 files changed, 242 insertions(+), 29 deletions(-) rename packages/core/installer/images/talos/profiles/{initramfs.yaml => initramfs-amd64.yaml} (100%) create mode 100644 packages/core/installer/images/talos/profiles/initramfs-arm64.yaml rename packages/core/installer/images/talos/profiles/{installer.yaml => installer-amd64.yaml} (100%) create mode 100644 packages/core/installer/images/talos/profiles/installer-arm64.yaml rename packages/core/installer/images/talos/profiles/{iso.yaml => iso-amd64.yaml} (100%) create mode 100644 packages/core/installer/images/talos/profiles/iso-arm64.yaml rename packages/core/installer/images/talos/profiles/{kernel.yaml => kernel-amd64.yaml} (100%) create mode 100644 packages/core/installer/images/talos/profiles/kernel-arm64.yaml rename packages/core/installer/images/talos/profiles/{metal.yaml => metal-amd64.yaml} (100%) create mode 100644 packages/core/installer/images/talos/profiles/metal-arm64.yaml rename packages/core/installer/images/talos/profiles/{nocloud.yaml => nocloud-amd64.yaml} (100%) create mode 100644 packages/core/installer/images/talos/profiles/nocloud-arm64.yaml diff --git a/hack/upload-assets.sh b/hack/upload-assets.sh index 9788c04f..96aa3970 100755 --- a/hack/upload-assets.sh +++ b/hack/upload-assets.sh @@ -4,8 +4,18 @@ set -xe version=${VERSION:-$(git describe --tags)} gh release upload --clobber $version _out/assets/cozystack-installer.yaml + gh release upload --clobber $version _out/assets/metal-amd64.iso +gh release upload --clobber $version _out/assets/metal-arm64.iso + gh release upload --clobber $version _out/assets/metal-amd64.raw.xz +gh release upload --clobber $version _out/assets/metal-arm64.raw.xz + gh release upload --clobber $version _out/assets/nocloud-amd64.raw.xz +gh release upload --clobber $version _out/assets/nocloud-arm64.raw.xz + gh release upload --clobber $version _out/assets/kernel-amd64 +gh release upload --clobber $version _out/assets/kernel-arm64 + gh release upload --clobber $version _out/assets/initramfs-metal-amd64.xz +gh release upload --clobber $version _out/assets/initramfs-metal-arm64.xz diff --git a/packages/core/installer/Makefile b/packages/core/installer/Makefile index f2146529..b0e57012 100644 --- a/packages/core/installer/Makefile +++ b/packages/core/installer/Makefile @@ -1,10 +1,12 @@ NAME=installer NAMESPACE=cozy-system -TALOS_VERSION=$(shell awk '/^version:/ {print $$2}' images/talos/profiles/installer.yaml) +TALOS_VERSION=$(shell awk '/^version:/ {print $$2}' images/talos/profiles/installer-amd64.yaml) include ../../../scripts/common-envs.mk +ARCH := $(shell echo "$(PLATFORM)" | sed 's:linux/::g;s:,: :g') + pre-checks: ../../../hack/pre-checks.sh @@ -17,8 +19,10 @@ apply: diff: helm template -n $(NAMESPACE) $(NAME) . | kubectl diff -f - -update: - hack/gen-profiles.sh +update: update-amd64 update-arm64 + +update-%: + hack/gen-profiles.sh $* image: pre-checks image-matchbox image-cozystack image-talos @@ -26,9 +30,10 @@ image-cozystack: make -C ../../.. repos docker buildx build -f images/cozystack/Dockerfile ../../.. \ --provenance false \ + --builder=$(BUILDER) \ + --platform=$(PLATFORM) \ --tag $(REGISTRY)/installer:$(call settag,$(TAG)) \ --cache-from type=registry,ref=$(REGISTRY)/installer:latest \ - --platform linux/amd64 \ --cache-to type=inline \ --metadata-file images/installer.json \ --push=$(PUSH) \ @@ -39,14 +44,28 @@ image-cozystack: rm -f images/installer.json image-talos: - test -f ../../../_out/assets/installer-amd64.tar || make talos-installer - skopeo copy docker-archive:../../../_out/assets/installer-amd64.tar docker://$(REGISTRY)/talos:$(call settag,$(TALOS_VERSION)) + # assets for different architectures may be built on a single host + for arch in amd64 arm64; do \ + test -f ../../../_out/assets/installer-$${arch}.tar || make talos-installer-$${arch}; \ + skopeo copy --override-os=linux --override-arch=$${arch} docker-archive:../../../_out/assets/installer-$${arch}.tar \ + docker://$(REGISTRY)/talos-$${arch}:$(call settag,$(TALOS_VERSION)); \ + done + # assemble multiarch image from two parts + docker buildx imagetools create \ + --builder=$(BUILDER) \ + --tag $(REGISTRY)/talos:$(call settag,$(TALOS_VERSION)) \ + $(REGISTRY)/talos-amd64:$(call settag,$(TALOS_VERSION)) \ + $(REGISTRY)/talos-arm64:$(call settag,$(TALOS_VERSION)) image-matchbox: - test -f ../../../_out/assets/kernel-amd64 || make talos-kernel - test -f ../../../_out/assets/initramfs-metal-amd64.xz || make talos-initramfs + for arch in $(ARCH); do \ + test -f ../../../_out/assets/kernel-$${arch} || make talos-kernel-$${arch}; \ + test -f ../../../_out/assets/initramfs-metal-$${arch}.xz || make talos-initramfs-$${arch}; \ + done docker buildx build -f images/matchbox/Dockerfile ../../.. \ --provenance false \ + --builder=$(BUILDER) \ + --platform=$(PLATFORM) \ --tag $(REGISTRY)/matchbox:$(call settag,$(TAG)) \ --tag $(REGISTRY)/matchbox:$(call settag,$(TALOS_VERSION)-$(TAG)) \ --cache-from type=registry,ref=$(REGISTRY)/matchbox:latest \ @@ -59,10 +78,13 @@ image-matchbox: > ../../extra/bootbox/images/matchbox.tag rm -f images/matchbox.json -assets: talos-iso talos-nocloud talos-metal talos-kernel talos-initramfs +assets: assets-amd64 assets-arm64 -talos-initramfs talos-kernel talos-installer talos-iso talos-nocloud talos-metal: +assets-amd64 assets-arm64: assets-%: talos-iso-% talos-nocloud-% talos-metal-% talos-kernel-% talos-initramfs-% + +talos-%: mkdir -p ../../../_out/assets + @echo Building $@... cat images/talos/profiles/$(subst talos-,,$@).yaml | \ docker run --rm -i -v /dev:/dev --privileged "ghcr.io/siderolabs/imager:$(TALOS_VERSION)" --tar-to-stdout - | \ tar -C ../../../_out/assets -xzf- diff --git a/packages/core/installer/hack/gen-profiles.sh b/packages/core/installer/hack/gen-profiles.sh index 5225ace6..30e26217 100755 --- a/packages/core/installer/hack/gen-profiles.sh +++ b/packages/core/installer/hack/gen-profiles.sh @@ -2,6 +2,12 @@ set -e set -u +case ${1:-} in + amd64|arm64) ARCH=$1; talos_version="";; + *) ARCH=${2:-"amd64"}; talos_version=${1:-""};; #this supports previously available script call syntax +esac +echo "ARCH=$ARCH" + PROFILES="initramfs kernel iso installer nocloud metal" FIRMWARES="amd-ucode amdgpu-firmware bnx2-bnx2x i915-ucode intel-ice-firmware intel-ucode qlogic-firmware" EXTENSIONS="drbd zfs" @@ -9,7 +15,7 @@ EXTENSIONS="drbd zfs" mkdir -p images/talos/profiles printf "fetching talos version: " -talos_version=${1:-$(skopeo --override-os linux --override-arch amd64 list-tags docker://ghcr.io/siderolabs/imager | jq -r '.Tags[]' | grep '^v[0-9]\+.[0-9]\+.[0-9]\+$' | sort -V | tail -n 1)} +talos_version=${talos_version:-$(skopeo --override-os=linux --override-arch=$ARCH list-tags docker://ghcr.io/siderolabs/imager | jq -r '.Tags[]' | grep '^v[0-9]\+.[0-9]\+.[0-9]\+$' | sort -V | tail -n 1)} echo "$talos_version" export "TALOS_VERSION=$talos_version" @@ -17,7 +23,7 @@ export "TALOS_VERSION=$talos_version" for firmware in $FIRMWARES; do printf "fetching %s version: " "$firmware" firmware_var=$(echo "$firmware" | tr '[:lower:]' '[:upper:]' | tr - _)_VERSION - version=$(skopeo list-tags docker://ghcr.io/siderolabs/$firmware | jq -r '.Tags[]|select(length == 8)|select(startswith("20"))' | sort -V | tail -n 1) + version=$(skopeo --override-os=linux --override-arch=$ARCH list-tags docker://ghcr.io/siderolabs/$firmware | jq -r '.Tags[]|select(length == 8)|select(startswith("20"))' | sort -V | tail -n 1) echo "$version" export "$firmware_var=$version" done @@ -25,13 +31,13 @@ done for extension in $EXTENSIONS; do printf "fetching %s version: " "$extension" extension_var=$(echo "$extension" | tr '[:lower:]' '[:upper:]' | tr - _)_VERSION - version=$(skopeo --override-os linux --override-arch amd64 list-tags docker://ghcr.io/siderolabs/$extension | jq -r '.Tags[]' | grep "\-${talos_version}$" | sort -V | tail -n1) + version=$(skopeo --override-os=linux --override-arch=$ARCH list-tags docker://ghcr.io/siderolabs/$extension | jq -r '.Tags[]' | grep "\-${talos_version}$" | sort -V | tail -n1) echo "$version" export "$extension_var=$version" done for profile in $PROFILES; do - echo "writing profile images/talos/profiles/$profile.yaml" + echo "writing profile images/talos/profiles/${profile}-${ARCH}.yaml" case "$profile" in initramfs|kernel|iso) image_options="{}" @@ -63,18 +69,18 @@ for profile in $PROFILES; do ;; esac - cat > images/talos/profiles/$profile.yaml < images/talos/profiles/${profile}-${ARCH}.yaml <