From a97dd76c62393e1b4c8b755db3c88ec028aa5e06 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Eric=20M=C3=BCller?= <mueller@kip.uni-heidelberg.de>
Date: Tue, 4 Feb 2025 14:30:51 +0100
Subject: [PATCH] feat(CI): add build-esd-image_JUSUF

---
 .gitlab-ci.yml | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 59 insertions(+)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6b7b273d..4ad58d7c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -264,6 +264,65 @@ sync-esd-image:
     - if: ($CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH == "experimental_rel" || $CI_COMMIT_BRANCH =~ /^ebrains/) && $CI_PROJECT_PATH =~ /platform\/esd\/ebrains-spack-builds/ && $CI_PIPELINE_SOURCE != "schedule"
       when: manual
 
+# build test on JUSUF login node
+build-esd-image_JUSUF:
+  stage: build
+  tags:
+    - esd_image_JUSUF
+  variables:
+    CI_SPACK_ENV: esd
+    SPACK_JOBS: 4
+    # we access the branch-specific cache here (and also update it!)
+    OCI_CACHE_PREFIX: ${HARBOR_HOST}/${HARBOR_PROJECT}/${CI_COMMIT_BRANCH}_jusuf
+    UPDATE_SPACK_OCI_CACHES: false
+    OCI_IMAGE_PREFIX: ${HARBOR_HOST}/${HARBOR_PROJECT}/${CI_COMMIT_BRANCH}_jusuf/image
+    INSTALLATION_ROOT: /esd
+    SANDBOX_ROOT_RELATIVE: esd_image
+    TMPDIR: /dev/shm/ecm_gitlab_ci
+    SANDBOX_ROOT: ${TMPDIR}/${SANDBOX_ROOT_RELATIVE}
+    SYSTEMNAME: image-jusuf
+  script:
+    # create a sandbox/image for performing an spack install inside based on some base image/install
+    - rm -rf $TMPDIR
+    - mkdir $TMPDIR || true
+    - apptainer build --fix-perms --force --sandbox ${SANDBOX_ROOT}/ docker://${BUILD_ENV_DOCKER_IMAGE}
+    # run installation script inside future container environment
+    #   => DAG concretization, subsequent cache access + fetching and actual build should be separate steps
+    - mkdir --mode=0777 -p ${SANDBOX_ROOT}/${INSTALLATION_ROOT}
+    # begin of fixup for JUSUF
+    - mkdir --mode=0777 -p ${SANDBOX_ROOT}/p
+    - mkdir --mode=0777 -p ${SANDBOX_ROOT}/etc/FZJ
+    # end of fixup for JUSUF
+    - apptainer exec --writable --bind ${CI_PROJECT_DIR}:${INSTALLATION_ROOT} --cwd ${INSTALLATION_ROOT} ${SANDBOX_ROOT} bash ./install_spack_env.sh $SPACK_JOBS $INSTALLATION_ROOT ${INSTALLATION_ROOT} $CI_SPACK_ENV "" $UPDATE_SPACK_OCI_CACHES $OCI_CACHE_PREFIX
+    - echo "export SYSTEMNAME=${SYSTEMNAME}" >> ${SANDBOX_ROOT}/.singularity.d/env/90-environment.sh
+    - echo ". ${INSTALLATION_ROOT}/vendor/spack/var/spack/environments/${CI_SPACK_ENV}/load_env.sh" >> ${SANDBOX_ROOT}/.singularity.d/env/90-environment.sh
+    # begin of fixup for JUSUF
+    - rm -rf ${SANDBOX_ROOT}/p
+    - rm -rf ${SANDBOX_ROOT}/etc/FZJ
+    # end of fixup for JUSUF
+    # preparing to assemble the image: move in the CI project contents...
+    - shopt -s dotglob
+    - find . -maxdepth 1 -and -not -name "." -and -not -name "${SANDBOX_ROOT_RELATIVE}" -exec mv -t ${SANDBOX_ROOT}/${INSTALLATION_ROOT} {} \;
+    # convert to SIF image file
+    - apptainer build latest.sif "${SANDBOX_ROOT}"
+  after_script:
+    - mkdir -p $CI_PROJECT_DIR/spack_logs/installed $CI_PROJECT_DIR/spack_logs/not_installed
+      # for succesfully installed packages: keep the spack logs for any package modified during this CI job
+    - PKG_DIR=${SANDBOX_ROOT}/${INSTALLATION_ROOT}/spack/opt/spack/**/linux-ubuntu20.04-x86_64/gcc-10.3.0
+    - if cd $PKG_DIR; then find . \( -name ".spack" -o -name ".build" \) -exec cp -r --parents "{}" $CI_PROJECT_DIR/spack_logs/installed \;; fi
+      # for not succesfully installed packages: also keep the spack logs for any packages that failed
+    - if cd /tmp/$(whoami)/spack-stage/; then find . -maxdepth 2 \( -name "*.txt" -o -name ".install_time_tests" \) -exec cp -r --parents "{}" $CI_PROJECT_DIR/spack_logs/not_installed \;; fi
+  artifacts:
+    paths:
+      - spack_logs
+    when: always
+  timeout: 2 days
+  rules:
+    # branches that update the gitlab-runner upstream (read-only) installation and the spack OCI caches
+    - if: $CI_PIPELINE_SOURCE != "schedule" && $CI_PIPELINE_SOURCE != "merge_request_event"
+    #- if: ($CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH == "experimental_rel" || $CI_COMMIT_BRANCH =~ /^ebrains/) && $CI_PROJECT_PATH =~ /platform\/esd\/ebrains-spack-builds/ && $CI_PIPELINE_SOURCE != "schedule"
+    #  when: manual
+
 # update gitlab-runner upstream (read-only) installation
 sync-gitlab-spack-instance:
   stage: build
-- 
GitLab