From c4310b7a4b5028feacced018340d39318538285c Mon Sep 17 00:00:00 2001
From: Wouter Deconinck <wdconinc@gmail.com>
Date: Tue, 17 Jan 2023 13:26:19 +0000
Subject: [PATCH] feat: spack arch map, key on docker TARGETPLATFORM

---
 .gitlab-ci.yml                | 31 +++++++++++++++++++------------
 containers/jug/dev.Dockerfile | 21 ++++++++++++++-------
 2 files changed, 33 insertions(+), 19 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ddba3b441..b6954336f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -194,14 +194,19 @@ base:
     matrix:
       - BASE_IMAGE: amd64/debian:testing-20220822-slim
         BUILD_IMAGE: amd64_debian_testing_base
+        PLATFORM: linux/amd64
       - BASE_IMAGE: amd64/ubuntu:20.04
         BUILD_IMAGE: amd64_ubuntu_base
+        PLATFORM: linux/amd64
       - BASE_IMAGE: intel/oneapi-hpckit:2022.3.0-devel-ubuntu20.04
         BUILD_IMAGE: oneapi_base
+        PLATFORM: linux/amd64
       - BASE_IMAGE: nvidia/cuda:11.8.0-devel-ubuntu20.04
         BUILD_IMAGE: cuda_base
+        PLATFORM: linux/amd64
       - BASE_IMAGE: arm64v8/debian:testing-20220822-slim
         BUILD_IMAGE: arm64v8_debian_testing_base
+        PLATFORM: linux/arm64/v8
 #      - BASE_IMAGE: debian:testing-20220822-slim
 #        BUILD_IMAGE: debian_testing_base_multiarch
 #        PLATFORM: linux/amd64,linux/arm64/v8
@@ -225,16 +230,16 @@ jug_dev:default:
     matrix:
       - BASE_IMAGE: amd64_debian_testing_base
         BUILD_IMAGE: jug_dev
-        SPACK_ARCH: x86_64
+        PLATFORM: linux/amd64
       - BASE_IMAGE: arm64v8_debian_testing_base
         BUILD_IMAGE: jug_dev_arm64v8
-        SPACK_ARCH: aarch64
+        PLATFORM: linux/arm64/v8
 #      - BASE_IMAGE: oneapi_base
 #        BUILD_IMAGE: jug_dev_oneapi
-#        SPACK_ARCH: x86_64 
+#        PLATFORM: linux/amd64
 #      - BASE_IMAGE: cuda_base_new
 #        BUILD_IMAGE: jug_dev_cuda
-#        SPACK_ARCH: x86_64
+#        PLATFORM: linux/amd64
   extends: .build
   stage: jug
   needs:
@@ -260,8 +265,8 @@ jug_dev:default:
                    -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:builder-${INTERNAL_TAG}
                    --target=builder
                    -f containers/jug/dev.Dockerfile
+                   ${PLATFORM:+--platform ${PLATFORM}}
                    --build-arg BASE_IMAGE="${BASE_IMAGE}"
-                   --build-arg SPACK_ARCH="${SPACK_ARCH}"
                    --build-arg SPACK_ORGREPO="${SPACK_ORGREPO}"
                    --build-arg SPACK_VERSION="${SPACK_VERSION}"
                    --build-arg SPACK_CHERRYPICKS="${SPACK_CHERRYPICKS}"
@@ -277,8 +282,8 @@ jug_dev:default:
     ## now build our image
     - docker buildx build --load -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG} ${CACHE_FLAG}
                    -f containers/jug/dev.Dockerfile
+                   ${PLATFORM:+--platform ${PLATFORM}}
                    --build-arg BASE_IMAGE="${BASE_IMAGE}"
-                   --build-arg SPACK_ARCH="${SPACK_ARCH}"
                    --build-arg SPACK_ORGREPO="${SPACK_ORGREPO}"
                    --build-arg SPACK_VERSION="${SPACK_VERSION}"
                    --build-arg SPACK_CHERRYPICKS="${SPACK_CHERRYPICKS}"
@@ -316,13 +321,13 @@ jug_xl:default:
     matrix:
       - BASE_IMAGE: jug_dev
         BUILD_IMAGE: jug_xl
-        DOCKER_ARCH: amd64
+        PLATFORM: linux/amd64
       - BASE_IMAGE: jug_dev_arm64v8
         BUILD_IMAGE: jug_xl_arm64v8
-        DOCKER_ARCH: arm64v8
+        PLATFORM: linux/arm64/v8
 #      - BASE_IMAGE: jug_dev_oneapi
 #        BUILD_IMAGE: jug_xl_oneapi
-#        DOCKER_ARCH: amd64
+#        PLATFORM: linux/amd64
   extends: .build
   stage: jug
   needs:
@@ -333,6 +338,7 @@ jug_xl:default:
     - cp detectors.yaml containers/jug
     - docker build -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG}
                    -f containers/jug/xl.Dockerfile
+                   ${PLATFORM:+--platform ${PLATFORM}}
                    --build-arg BASE_IMAGE=${BASE_IMAGE}
                    --build-arg INTERNAL_TAG=${INTERNAL_TAG}
                    --build-arg JUGGLER_VERSION=${JUGGLER_VERSION}
@@ -345,13 +351,13 @@ jug_xl:nightly:
     matrix:
       - BASE_IMAGE: jug_dev
         BUILD_IMAGE: jug_xl
-        DOCKER_ARCH: amd64
+        PLATFORM: linux/amd64
       - BASE_IMAGE: jug_dev_arm64v8
         BUILD_IMAGE: jug_xl_arm64v8
-        DOCKER_ARCH: arm64v8
+        PLATFORM: linux/arm64/v8
 #      - BASE_IMAGE: jug_dev_oneapi
 #        BUILD_IMAGE: jug_xl_oneapi
-#        DOCKER_ARCH: amd64
+#        PLATFORM: linux/amd64
   extends: .build
   stage: jug
   rules:
@@ -368,6 +374,7 @@ jug_xl:nightly:
     - cp detectors.yaml containers/jug
     - docker build -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${NIGHTLY_TAG}
                    -f containers/jug/xl.Dockerfile
+                   ${PLATFORM:+--platform ${PLATFORM}}
                    --build-arg BASE_IMAGE=${BASE_IMAGE}
                    --build-arg INTERNAL_TAG=${INTERNAL_TAG}
                    --build-arg JUG_VERSION=nightly-$(date +%Y-%m-%d_%H-%M-%S)-${INTERNAL_TAG}-$(git rev-parse HEAD)
diff --git a/containers/jug/dev.Dockerfile b/containers/jug/dev.Dockerfile
index c31dc6b06..695bcf6d7 100644
--- a/containers/jug/dev.Dockerfile
+++ b/containers/jug/dev.Dockerfile
@@ -8,6 +8,7 @@ ARG INTERNAL_TAG="testing"
 ## EIC builder image with spack
 ## ========================================================================================
 FROM ${DOCKER_REGISTRY}${BASE_IMAGE}:${INTERNAL_TAG} as builder
+ARG TARGETPLATFORM
 
 ## install some extra spack dependencies
 RUN --mount=type=cache,target=/var/cache/apt                            \
@@ -23,7 +24,6 @@ RUN --mount=type=cache,target=/var/cache/apt                            \
 
 ## Setup spack
 ## parts:
-ARG SPACK_ARCH="x86_64"
 ENV SPACK_ROOT=/opt/spack
 ARG SPACK_ORGREPO="spack/spack"
 ARG SPACK_VERSION="develop"
@@ -39,17 +39,22 @@ RUN git clone https://github.com/${SPACK_ORGREPO}.git ${SPACK_ROOT}     \
  && ln -s $SPACK_ROOT/share/spack/docker/entrypoint.bash                \
           /usr/sbin/interactive-shell                                   \
  && ln -s $SPACK_ROOT/share/spack/docker/entrypoint.bash                \
-          /usr/sbin/spack-env                                           \
- && export PATH=${PATH}:${SPACK_ROOT}/bin                               \
- && spack config --scope site add "packages:all:require:arch=${SPACK_ARCH}" \
+          /usr/sbin/spack-env
+
+SHELL ["docker-shell"]
+
+RUN declare -A arch=(                                                   \
+      ["linux/amd64"]="x86_64"                                          \
+      ["linux/arm64"]="aarch64"                                         \
+    )                                                                   \
+ && arch=${arch[${TARGETPLATFORM}]}                                     \
+ && spack config --scope site add "packages:all:require:arch=${arch}"   \
  && spack config blame packages                                         \
  && spack config --scope site add "config:suppress_gpg_warnings:true"   \
  && spack config --scope site add "config:build_jobs:64"                \
  && spack config --scope site add "config:install_tree:root:/opt/software" \
  && spack config blame config
 
-SHELL ["docker-shell"]
-
 ## Setup spack buildcache mirrors, including an internal
 ## spack mirror using the docker build cache, and
 ## a backup mirror on the internal B010 network
@@ -211,6 +216,7 @@ COPY profile.d/z11_jug_env.sh /etc/profile.d
 COPY singularity.d /.singularity.d
 
 ## Add minio client into /usr/local/bin
+## FIXME: This should download .../linux-arm64/mc for arm64.
 ADD https://dl.min.io/client/mc/release/linux-amd64/mc /usr/local/bin
 RUN chmod a+x /usr/local/bin/mc
 
@@ -219,10 +225,11 @@ RUN chmod a+x /usr/local/bin/mc
 ## Lean target image
 ## ========================================================================================
 FROM ${DOCKER_REGISTRY}${BASE_IMAGE}:${INTERNAL_TAG}
+ARG TARGETPLATFORM
 
 LABEL maintainer="Sylvester Joosten <sjoosten@anl.gov>" \
       name="jug_xl" \
-      march="amd64"
+      march="$TARGETPLATFORM"
 
 ## copy over everything we need from staging in a single layer :-)
 RUN --mount=from=staging,target=/staging                                \
-- 
GitLab