From c0a3ff09a3a38737af5a922fdf581aa7b2dd6c88 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 13 Jan 2026 13:13:28 +0100 Subject: [PATCH 01/11] Changes needed to make builds use everything from the cloned software-layer-scripts, instead of from the deployed stuff in software.eessi.io --- EESSI-install-software.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/EESSI-install-software.sh b/EESSI-install-software.sh index e4834545..a4c3af36 100755 --- a/EESSI-install-software.sh +++ b/EESSI-install-software.sh @@ -327,7 +327,7 @@ echo "Going to install full CUDA SDK and cu* libraries under host_injections if temp_install_storage=${TMPDIR}/temp_install_storage mkdir -p ${temp_install_storage} if [ -z "${skip_cuda_install}" ] || [ ! "${skip_cuda_install}" ]; then - ${EESSI_PREFIX}/scripts/gpu_support/nvidia/install_cuda_and_libraries.sh \ + ${TOPDIR}/scripts/gpu_support/nvidia/install_cuda_and_libraries.sh \ -t ${temp_install_storage} \ --accept-cuda-eula \ --accept-cudnn-eula @@ -338,7 +338,7 @@ fi # Install NVIDIA drivers in host_injections (if they exist) if nvidia_gpu_available; then echo "Installing NVIDIA drivers for use in prefix shell..." - ${EESSI_PREFIX}/scripts/gpu_support/nvidia/link_nvidia_host_libraries.sh + ${TOPDIR}/scripts/gpu_support/nvidia/link_nvidia_host_libraries.sh fi @@ -396,6 +396,10 @@ else # load EasyBuild module (will be installed if it's not available yet) source ${TOPDIR}/load_easybuild_module.sh ${eb_version} + # Set EASYBUILD_HOOKS to use the hooks from the software-layer-scripts, to make it easier to use updated hooks + export EASYBUILD_HOOKS=$TOPDIR/eb_hooks.py + echo "Overwrite EASYBUILD_HOOKS to use the eb_hooks from software-layer-scripts: EASYBUILD_HOOKS=${EASYBUILD_HOOKS}" + ${EB} --show-config echo_green "All set, let's start installing some software with EasyBuild v${eb_version} in ${EASYBUILD_INSTALLPATH}..." From 029523209f859d77de7811be49a7b8815cf988e6 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 10 Aug 2026 15:42:25 +0200 Subject: [PATCH 02/11] Make EESSI-extend respect EESSI_EASYBUILD_HOOKS_OVERRIDE --- EESSI-extend-easybuild.eb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/EESSI-extend-easybuild.eb b/EESSI-extend-easybuild.eb index c8be0660..464a995e 100644 --- a/EESSI-extend-easybuild.eb +++ b/EESSI-extend-easybuild.eb @@ -205,7 +205,12 @@ setenv ("EASYBUILD_SYSROOT", sysroot) setenv ("EASYBUILD_PREFIX", pathJoin(working_dir, "easybuild")) setenv ("EASYBUILD_INSTALLPATH", easybuild_installpath) eessi_init_prefix = os.getenv("EESSI_INIT_PREFIX") or pathJoin(os.getenv("EESSI_PREFIX"), "init") -setenv ("EASYBUILD_HOOKS", pathJoin(eessi_init_prefix, "easybuild", "eb_hooks.py")) +eessi_easybuild_hooks_override = os.getenv("EESSI_EASYBUILD_HOOKS_OVERRIDE") +if eessi_easybuild_hooks_override ~= nil) then + setenv ("EASYBUILD_HOOKS", eessi_easybuild_hooks_override) +else + setenv ("EASYBUILD_HOOKS", pathJoin(eessi_init_prefix, "easybuild", "eb_hooks.py")) +end -- Make sure to use the general umask that allows a global read setenv ("EASYBUILD_UMASK", "022") From b60f0ce5d39dc40b786dc34fb34342c4b447ad95 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 10 Aug 2026 15:59:35 +0200 Subject: [PATCH 03/11] Make sure to leverage EESSI_EASYBUILD_HOOKS_OVERRIDE to override the hooks being used during builds to the eb_hooks.py from the software-layer-scripts clone --- EESSI-install-software.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/EESSI-install-software.sh b/EESSI-install-software.sh index ce2266a6..a786a535 100755 --- a/EESSI-install-software.sh +++ b/EESSI-install-software.sh @@ -314,6 +314,9 @@ elif [[ -n "$EESSI_ACCELERATOR_TARGET_OVERRIDE" ]]; then export EESSI_ACCELERATOR_INSTALL=1 fi +# Make sure we use the hooks from the local software-layer-scripts clone: +export EESSI_EASYBUILD_HOOKS_OVERRIDE=$TOPDIR/eb_hooks.py + echo "DEBUG: before loading EESSI-extend // EASYBUILD_INSTALLPATH='${EASYBUILD_INSTALLPATH}'" source $TOPDIR/load_eessi_extend_module.sh ${EESSI_VERSION} echo "DEBUG: after loading EESSI-extend // EASYBUILD_INSTALLPATH='${EASYBUILD_INSTALLPATH}'" From 5b6d1e2a1bf97e3168df892b99cc34f3af80a9b5 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 10 Aug 2026 16:01:55 +0200 Subject: [PATCH 04/11] Remove original override of EB hooks, since that wasn't being applied to e.g. install_cuda_and_libraries.sh. Doing it via EESSI-extend is more robust --- EESSI-install-software.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/EESSI-install-software.sh b/EESSI-install-software.sh index a786a535..0729cfa4 100755 --- a/EESSI-install-software.sh +++ b/EESSI-install-software.sh @@ -316,6 +316,7 @@ fi # Make sure we use the hooks from the local software-layer-scripts clone: export EESSI_EASYBUILD_HOOKS_OVERRIDE=$TOPDIR/eb_hooks.py +echo "Set EESSI_EASYBUILD_HOOKS_OVERRIDE to ${EESSI_EASYBUILD_HOOKS_OVERRIDE}" echo "DEBUG: before loading EESSI-extend // EASYBUILD_INSTALLPATH='${EASYBUILD_INSTALLPATH}'" source $TOPDIR/load_eessi_extend_module.sh ${EESSI_VERSION} @@ -428,10 +429,6 @@ else # load EasyBuild module (will be installed if it's not available yet) source ${TOPDIR}/load_easybuild_module.sh ${eb_version} - # Set EASYBUILD_HOOKS to use the hooks from the software-layer-scripts, to make it easier to use updated hooks - export EASYBUILD_HOOKS=$TOPDIR/eb_hooks.py - echo "Overwrite EASYBUILD_HOOKS to use the eb_hooks from software-layer-scripts: EASYBUILD_HOOKS=${EASYBUILD_HOOKS}" - ${EB} --show-config echo_green "All set, let's start installing some software with EasyBuild v${eb_version} in ${EASYBUILD_INSTALLPATH}..." From 169e720fb633a926052d3b07e5d80697d7086d67 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 10 Aug 2026 16:09:02 +0200 Subject: [PATCH 05/11] Fix syntax issue --- EESSI-extend-easybuild.eb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EESSI-extend-easybuild.eb b/EESSI-extend-easybuild.eb index 464a995e..7c4b2c1a 100644 --- a/EESSI-extend-easybuild.eb +++ b/EESSI-extend-easybuild.eb @@ -206,7 +206,7 @@ setenv ("EASYBUILD_PREFIX", pathJoin(working_dir, "easybuild")) setenv ("EASYBUILD_INSTALLPATH", easybuild_installpath) eessi_init_prefix = os.getenv("EESSI_INIT_PREFIX") or pathJoin(os.getenv("EESSI_PREFIX"), "init") eessi_easybuild_hooks_override = os.getenv("EESSI_EASYBUILD_HOOKS_OVERRIDE") -if eessi_easybuild_hooks_override ~= nil) then +if (eessi_easybuild_hooks_override ~= nil) then setenv ("EASYBUILD_HOOKS", eessi_easybuild_hooks_override) else setenv ("EASYBUILD_HOOKS", pathJoin(eessi_init_prefix, "easybuild", "eb_hooks.py")) From 373e9b2bcd233dc2a1450d997a3b1ade98cfb487 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 10 Aug 2026 16:19:15 +0200 Subject: [PATCH 06/11] Add a test easystack file --- .../2025.06/eessi-2025.06-eb-5.3.1-001-system.yml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 easystacks/software.eessi.io/2025.06/eessi-2025.06-eb-5.3.1-001-system.yml diff --git a/easystacks/software.eessi.io/2025.06/eessi-2025.06-eb-5.3.1-001-system.yml b/easystacks/software.eessi.io/2025.06/eessi-2025.06-eb-5.3.1-001-system.yml new file mode 100644 index 00000000..44fe4d92 --- /dev/null +++ b/easystacks/software.eessi.io/2025.06/eessi-2025.06-eb-5.3.1-001-system.yml @@ -0,0 +1,2 @@ +easyconfigs: + - cowsay-3.04.eb From 84ab6ea9d96b059b7ad0ff8c55ee6ae1c392bd05 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 10 Aug 2026 17:07:22 +0200 Subject: [PATCH 07/11] Change order of tests, so we can first run tests on any changes made in the GH repo, before we actually deploy these to CVMFS --- .../workflows/tests_eessi_extend_module.yml | 73 ++++++++++++------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/.github/workflows/tests_eessi_extend_module.yml b/.github/workflows/tests_eessi_extend_module.yml index de51b650..153336c8 100644 --- a/.github/workflows/tests_eessi_extend_module.yml +++ b/.github/workflows/tests_eessi_extend_module.yml @@ -28,7 +28,7 @@ jobs: eessi_stack_version: ${{matrix.eessi_version}} use_eessi_module: true - - name: Install the EESSI-extend shipped with the repository and verify it is consistent with the CVMFS repo + - name: Install the EESSI-extend shipped with the repository run: | # Define a function to check the values of environment variables # and another that checks an environment does not contain environment @@ -52,30 +52,6 @@ jobs: eb EESSI-extend-easybuild.eb --rebuild module unload EasyBuild - # Verify that we can pick the installed version up - module use $MY_INSTALLATION_PATH/modules/all - # Verify we can run "module show" on the module - module show EESSI-extend/${{matrix.eessi_version}}-easybuild - # Now load it and run additional checks - module load EESSI-extend/${{matrix.eessi_version}}-easybuild - echo $EBROOTEESSIMINEXTEND | grep $MY_INSTALLATION_PATH || { echo "ERROR: Installed version of EESSI-extend not picked up (loaded $EBROOTEESSIMINEXTEND)" >&2; exit 1; } - # Do a test rebuild (with default and local hooks) - echo "Testing a rebuild using the hooks shipped with EESSI" - eb --rebuild ${{matrix.rebuild_software}} - echo "Testing a rebuild using the hooks in the current branch" - eb --rebuild --hooks=./eb_hooks.py ${{matrix.rebuild_software}} - - # First, check if it differs against what is currently shipped by CVMFS - diff <(grep -v '^local root = ' /cvmfs/software.eessi.io/versions/${{matrix.eessi_version}}/software/linux/$(uname -m)/generic/modules/all/EESSI-extend/${{matrix.eessi_version}}-easybuild.lua) <(grep -v '^local root = ' $MY_INSTALLATION_PATH/modules/all/EESSI-extend/${{matrix.eessi_version}}-easybuild.lua) - # Then do a consistency check in CVMFS for all architectures - .github/workflows/scripts/diff_eessi_extend.sh - - # Proceed with unload and checking the environment variables - module unload EESSI-extend - # That should have unset all EasyBuild envvars (including EASYBUILD_PREFIX) - check_disallowed_env_prefix EASYBUILD_ - module unuse $MY_INSTALLATION_PATH/modules/all - - name: Run tests for EESSI-extend in the various CPU-only scenarios run: | export MY_INSTALLATION_PATH=/tmp/easybuild @@ -170,6 +146,15 @@ jobs: check_disallowed_env_prefix EASYBUILD_ unset EESSI_USER_INSTALL + # Now test overriding the EasyBuild hooks + echo "Checking EESSI-extend EasyBuild hooks override" + export EESSI_EASYBUILD_HOOKS_OVERRIDE="$GITHUB_WORKSPACE/eb_hooks.py" + module load EESSI-extend/${{matrix.eessi_version}}-easybuild + check_env_var "EASYBUILD_HOOKS" "$EESSI_EASYBUILD_HOOKS_OVERRIDE" + module unload EESSI-extend + check_disallowed_env_prefix EASYBUILD_ + unset EESSI_EASYBUILD_HOOKS_OVERRIDE + - name: Run tests for EESSI-extend in the various GPU scenarios run: | export MY_INSTALLATION_PATH=/tmp/easybuild @@ -270,4 +255,40 @@ jobs: module unload EESSI-extend check_disallowed_env_prefix EASYBUILD_ unset EESSI_ACCELERATOR_INSTALL - unset EESSI_USER_INSTALL + unset EESSI_USER_INSTALL + + - name: Verify the EESSI-extend module is consistent with the CVMFS repo + run: | + # Define a function to check the values of environment variables + # and another that checks an environment does not contain environment + # variables matching a certain pattern + source .github/workflows/scripts/test_utils.sh + export MY_INSTALLATION_PATH=/tmp/easybuild + + # Let's start from a clean slate + module --force purge + module load EESSI/${{matrix.eessi_version}} + + # Verify that we can pick the installed version up + module use $MY_INSTALLATION_PATH/modules/all + # Verify we can run "module show" on the module + module show EESSI-extend/${{matrix.eessi_version}}-easybuild + # Now load it and run additional checks + module load EESSI-extend/${{matrix.eessi_version}}-easybuild + echo $EBROOTEESSIMINEXTEND | grep $MY_INSTALLATION_PATH || { echo "ERROR: Installed version of EESSI-extend not picked up (loaded $EBROOTEESSIMINEXTEND)" >&2; exit 1; } + # Do a test rebuild (with default and local hooks) + echo "Testing a rebuild using the hooks shipped with EESSI" + eb --rebuild ${{matrix.rebuild_software}} + echo "Testing a rebuild using the hooks in the current branch" + eb --rebuild --hooks=./eb_hooks.py ${{matrix.rebuild_software}} + + # First, check if it differs against what is currently shipped by CVMFS + diff <(grep -v '^local root = ' /cvmfs/software.eessi.io/versions/${{matrix.eessi_version}}/software/linux/$(uname -m)/generic/modules/all/EESSI-extend/${{matrix.eessi_version}}-easybuild.lua) <(grep -v '^local root = ' $MY_INSTALLATION_PATH/modules/all/EESSI-extend/${{matrix.eessi_version}}-easybuild.lua) + # Then do a consistency check in CVMFS for all architectures + .github/workflows/scripts/diff_eessi_extend.sh + + # Proceed with unload and checking the environment variables + module unload EESSI-extend + # That should have unset all EasyBuild envvars (including EASYBUILD_PREFIX) + check_disallowed_env_prefix EASYBUILD_ + module unuse $MY_INSTALLATION_PATH/modules/all From ed961e82e3f3c504594c5a8dcbe415aea77b4a0e Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 10 Aug 2026 17:35:06 +0200 Subject: [PATCH 08/11] Remove test easystack file --- .../2025.06/eessi-2025.06-eb-5.3.1-001-system.yml | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 easystacks/software.eessi.io/2025.06/eessi-2025.06-eb-5.3.1-001-system.yml diff --git a/easystacks/software.eessi.io/2025.06/eessi-2025.06-eb-5.3.1-001-system.yml b/easystacks/software.eessi.io/2025.06/eessi-2025.06-eb-5.3.1-001-system.yml deleted file mode 100644 index 44fe4d92..00000000 --- a/easystacks/software.eessi.io/2025.06/eessi-2025.06-eb-5.3.1-001-system.yml +++ /dev/null @@ -1,2 +0,0 @@ -easyconfigs: - - cowsay-3.04.eb From 4010445113205b7d4db79a1ca77266f9727fa8c5 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 11 Aug 2026 12:47:59 +0200 Subject: [PATCH 09/11] Split off the EESSI initialization, to deduplicate code. Also, check loading of EESSI-extend only on the first instance, that's enough. --- .../workflows/tests_eessi_extend_module.yml | 153 ++++++++++-------- 1 file changed, 87 insertions(+), 66 deletions(-) diff --git a/.github/workflows/tests_eessi_extend_module.yml b/.github/workflows/tests_eessi_extend_module.yml index 153336c8..1fd89737 100644 --- a/.github/workflows/tests_eessi_extend_module.yml +++ b/.github/workflows/tests_eessi_extend_module.yml @@ -28,6 +28,12 @@ jobs: eessi_stack_version: ${{matrix.eessi_version}} use_eessi_module: true + - name: Set the installation path for EESSI-extend + run: | + # Configuration item used throughout this workflow: + # adjust this to change where EESSI-extend is (re)built and picked up from + echo "MY_INSTALLATION_PATH=/tmp/easybuild" >> "$GITHUB_ENV" + - name: Install the EESSI-extend shipped with the repository run: | # Define a function to check the values of environment variables @@ -46,32 +52,19 @@ jobs: # Load EasyBuild to install EESSI-extend module load EasyBuild - # Set an installation path - export MY_INSTALLATION_PATH=/tmp/easybuild export EASYBUILD_PREFIX=$MY_INSTALLATION_PATH eb EESSI-extend-easybuild.eb --rebuild module unload EasyBuild - - name: Run tests for EESSI-extend in the various CPU-only scenarios + - name: Run tests for EESSI-extend in the CVMFS install scenario run: | - export MY_INSTALLATION_PATH=/tmp/easybuild - - # Define a function to check the values of environment variables - # and another that checks an environment does not contain environment - # variables matching a certain pattern source .github/workflows/scripts/test_utils.sh - - # Let's start from a clean slate - module --force purge - module load EESSI/${{matrix.eessi_version}} - # Access the installed EESSI-extend - module use "$MY_INSTALLATION_PATH"/modules/all - check_disallowed_env_prefix EASYBUILD_ + init_eessi_environment --eessi-version ${{matrix.eessi_version}} --installation-path "$MY_INSTALLATION_PATH" # Configure for CVMFS install - echo "Checking EESSI-extend CVMFS install" export EESSI_CVMFS_INSTALL=1 module load EESSI-extend/${{matrix.eessi_version}}-easybuild + echo $EBROOTEESSIMINEXTEND | grep $MY_INSTALLATION_PATH || { echo "ERROR: Installed version of EESSI-extend not picked up (loaded $EBROOTEESSIMINEXTEND)" >&2; exit 1; } # check some common EasyBuild settings check_env_var "EASYBUILD_READ_ONLY_INSTALLDIR" "1" check_env_var "EASYBUILD_ALLOW_LOADED_MODULES" "EasyBuild,EESSI-extend" @@ -100,8 +93,12 @@ jobs: check_disallowed_env_prefix EASYBUILD_ unset EESSI_CVMFS_INSTALL - # Now configure for a site - echo "Checking EESSI-extend site install" + - name: Run tests for EESSI-extend in the site install scenario + run: | + source .github/workflows/scripts/test_utils.sh + init_eessi_environment --eessi-version ${{matrix.eessi_version}} --installation-path "$MY_INSTALLATION_PATH" + + # Configure for a site install export EESSI_SITE_INSTALL=1 module load EESSI-extend/${{matrix.eessi_version}}-easybuild # check some specific envvars @@ -114,8 +111,12 @@ jobs: check_disallowed_env_prefix EASYBUILD_ unset EESSI_SITE_INSTALL - # Now for a project - echo "Checking EESSI-extend project install" + - name: Run tests for EESSI-extend in the project install scenario + run: | + source .github/workflows/scripts/test_utils.sh + init_eessi_environment --eessi-version ${{matrix.eessi_version}} --installation-path "$MY_INSTALLATION_PATH" + + # Configure for a project install export EESSI_PROJECT_INSTALL="$MY_INSTALLATION_PATH" module load EESSI-extend/${{matrix.eessi_version}}-easybuild # check some specific envvars @@ -130,8 +131,12 @@ jobs: check_disallowed_env_prefix EASYBUILD_ unset EESSI_PROJECT_INSTALL - # Now for a user - echo "Checking EESSI-extend user install" + - name: Run tests for EESSI-extend in the user install scenario + run: | + source .github/workflows/scripts/test_utils.sh + init_eessi_environment --eessi-version ${{matrix.eessi_version}} --installation-path "$MY_INSTALLATION_PATH" + + # Configure for a user install export EESSI_USER_INSTALL="$MY_INSTALLATION_PATH/$USER" mkdir -p $EESSI_USER_INSTALL # must exist module load EESSI-extend/${{matrix.eessi_version}}-easybuild @@ -146,8 +151,12 @@ jobs: check_disallowed_env_prefix EASYBUILD_ unset EESSI_USER_INSTALL - # Now test overriding the EasyBuild hooks - echo "Checking EESSI-extend EasyBuild hooks override" + - name: Run tests for EESSI-extend in the EasyBuild hooks override scenario + run: | + source .github/workflows/scripts/test_utils.sh + init_eessi_environment --eessi-version ${{matrix.eessi_version}} --installation-path "$MY_INSTALLATION_PATH" + + # Test overriding the EasyBuild hooks export EESSI_EASYBUILD_HOOKS_OVERRIDE="$GITHUB_WORKSPACE/eb_hooks.py" module load EESSI-extend/${{matrix.eessi_version}}-easybuild check_env_var "EASYBUILD_HOOKS" "$EESSI_EASYBUILD_HOOKS_OVERRIDE" @@ -155,29 +164,20 @@ jobs: check_disallowed_env_prefix EASYBUILD_ unset EESSI_EASYBUILD_HOOKS_OVERRIDE - - name: Run tests for EESSI-extend in the various GPU scenarios + - name: Set accelerator target override environment variables for GPU tests run: | - export MY_INSTALLATION_PATH=/tmp/easybuild + echo "STORED_EESSI_ACCELERATOR_TARGET_OVERRIDE=accel/nvidia/cc80" >> "$GITHUB_ENV" + echo "STORED_CUDA_CC=8.0" >> "$GITHUB_ENV" - # Define a function to check the values of environment variables - # and another that checks an environment does not contain environment - # variables matching a certain pattern + - name: Run tests for EESSI-extend with accelerators in the CVMFS install scenario + run: | source .github/workflows/scripts/test_utils.sh - - # Set an environment variable to use when we want to target accelerators - export STORED_EESSI_ACCELERATOR_TARGET_OVERRIDE="accel/nvidia/cc80" - export STORED_CUDA_CC="8.0" - - # Let's start from a clean slate - module --force purge - export EESSI_ACCELERATOR_TARGET_OVERRIDE=$STORED_EESSI_ACCELERATOR_TARGET_OVERRIDE - module load EESSI/${{matrix.eessi_version}} - # Access the installed EESSI-extend - module use "$MY_INSTALLATION_PATH"/modules/all - check_disallowed_env_prefix EASYBUILD_ + init_eessi_environment --eessi-version ${{matrix.eessi_version}} \ + --installation-path "$MY_INSTALLATION_PATH" \ + --accelerator-target "$STORED_EESSI_ACCELERATOR_TARGET_OVERRIDE" \ + --cuda-cc "$STORED_CUDA_CC" # Configure for CVMFS install - echo "Checking EESSI-extend CVMFS install" export EESSI_CVMFS_INSTALL=1 module load EESSI-extend/${{matrix.eessi_version}}-easybuild check_env_var "EASYBUILD_INSTALLPATH" "$EESSI_SOFTWARE_PATH" # installation path should be the same unless we ask for an explicit GPU installation @@ -195,8 +195,15 @@ jobs: unset EESSI_ACCELERATOR_INSTALL unset EESSI_CVMFS_INSTALL - # Now configure for a site - echo "Checking EESSI-extend site install" + - name: Run tests for EESSI-extend with accelerators in the site install scenario + run: | + source .github/workflows/scripts/test_utils.sh + init_eessi_environment --eessi-version ${{matrix.eessi_version}} \ + --installation-path "$MY_INSTALLATION_PATH" \ + --accelerator-target "$STORED_EESSI_ACCELERATOR_TARGET_OVERRIDE" \ + --cuda-cc "$STORED_CUDA_CC" + + # Configure for a site install export EESSI_SITE_INSTALL=1 module load EESSI-extend/${{matrix.eessi_version}}-easybuild check_env_var "EASYBUILD_INSTALLPATH" "$EESSI_SITE_SOFTWARE_PATH" # installation path should be the same unless we ask for an explicit GPU installation @@ -214,8 +221,15 @@ jobs: unset EESSI_ACCELERATOR_INSTALL unset EESSI_SITE_INSTALL - # Now for a project - echo "Checking EESSI-extend project install" + - name: Run tests for EESSI-extend with accelerators in the project install scenario + run: | + source .github/workflows/scripts/test_utils.sh + init_eessi_environment --eessi-version ${{matrix.eessi_version}} \ + --installation-path "$MY_INSTALLATION_PATH" \ + --accelerator-target "$STORED_EESSI_ACCELERATOR_TARGET_OVERRIDE" \ + --cuda-cc "$STORED_CUDA_CC" + + # Configure for a project install export EESSI_PROJECT_INSTALL="$MY_INSTALLATION_PATH" export EXPECTED_INSTALLATION_PATH="$MY_INSTALLATION_PATH/versions/$EESSI_VERSION/software/linux/$EESSI_SOFTWARE_SUBDIR" module load EESSI-extend/${{matrix.eessi_version}}-easybuild @@ -224,7 +238,7 @@ jobs: check_env_var "EASYBUILD_CUDA_COMPUTE_CAPABILITIES" "$STORED_CUDA_CC" module unload EESSI-extend export EESSI_ACCELERATOR_INSTALL=1 - module load EESSI-extend/${{matrix.eessi_version}}-easybuild # reload for an GPU actual installation + module load EESSI-extend/${{matrix.eessi_version}}-easybuild # reload for an actual GPU installation check_env_var "EASYBUILD_INSTALLPATH" "$EXPECTED_INSTALLATION_PATH" # installation path should be the same for project case check_env_var "EESSI_ACCELERATOR_TARGET" "$STORED_EESSI_ACCELERATOR_TARGET_OVERRIDE" check_env_var "EASYBUILD_CUDA_COMPUTE_CAPABILITIES" "$STORED_CUDA_CC" @@ -234,14 +248,20 @@ jobs: unset EESSI_ACCELERATOR_INSTALL unset EESSI_PROJECT_INSTALL - # Now for a user - echo "Checking EESSI-extend user install" + - name: Run tests for EESSI-extend with accelerators in the user install scenario + run: | + source .github/workflows/scripts/test_utils.sh + init_eessi_environment --eessi-version ${{matrix.eessi_version}} \ + --installation-path "$MY_INSTALLATION_PATH" \ + --accelerator-target "$STORED_EESSI_ACCELERATOR_TARGET_OVERRIDE" \ + --cuda-cc "$STORED_CUDA_CC" + + # Configure for a user install export EESSI_USER_INSTALL="$MY_INSTALLATION_PATH/$USER" mkdir -p $EESSI_USER_INSTALL # must exist module load EESSI-extend/${{matrix.eessi_version}}-easybuild # check some specific envvars export EXPECTED_INSTALLATION_PATH="$MY_INSTALLATION_PATH/$USER/versions/$EESSI_VERSION/software/linux/$EESSI_SOFTWARE_SUBDIR" - module load EESSI-extend/${{matrix.eessi_version}}-easybuild check_env_var "EASYBUILD_INSTALLPATH" "$EXPECTED_INSTALLATION_PATH" # installation path should be the same unless we ask for an explicit GPU installation check_env_var "EESSI_ACCELERATOR_TARGET" "$STORED_EESSI_ACCELERATOR_TARGET_OVERRIDE" check_env_var "EASYBUILD_CUDA_COMPUTE_CAPABILITIES" "$STORED_CUDA_CC" @@ -257,30 +277,31 @@ jobs: unset EESSI_ACCELERATOR_INSTALL unset EESSI_USER_INSTALL - - name: Verify the EESSI-extend module is consistent with the CVMFS repo + - name: Dryrun tests with hooks from github and hooks from the CVMFS repo run: | - # Define a function to check the values of environment variables - # and another that checks an environment does not contain environment - # variables matching a certain pattern source .github/workflows/scripts/test_utils.sh - export MY_INSTALLATION_PATH=/tmp/easybuild - - # Let's start from a clean slate - module --force purge - module load EESSI/${{matrix.eessi_version}} + init_eessi_environment --eessi-version ${{matrix.eessi_version}} --installation-path "$MY_INSTALLATION_PATH" - # Verify that we can pick the installed version up - module use $MY_INSTALLATION_PATH/modules/all - # Verify we can run "module show" on the module - module show EESSI-extend/${{matrix.eessi_version}}-easybuild - # Now load it and run additional checks module load EESSI-extend/${{matrix.eessi_version}}-easybuild - echo $EBROOTEESSIMINEXTEND | grep $MY_INSTALLATION_PATH || { echo "ERROR: Installed version of EESSI-extend not picked up (loaded $EBROOTEESSIMINEXTEND)" >&2; exit 1; } # Do a test rebuild (with default and local hooks) echo "Testing a rebuild using the hooks shipped with EESSI" eb --rebuild ${{matrix.rebuild_software}} echo "Testing a rebuild using the hooks in the current branch" eb --rebuild --hooks=./eb_hooks.py ${{matrix.rebuild_software}} + # unload and check the environment is clean again + module unload EESSI-extend + check_disallowed_env_prefix EASYBUILD_ + module unuse $MY_INSTALLATION_PATH/modules/all + + - name: Verify the EESSI-extend module is consistent with the CVMFS repo + run: | + source .github/workflows/scripts/test_utils.sh + init_eessi_environment --eessi-version ${{matrix.eessi_version}} --installation-path "$MY_INSTALLATION_PATH" + + # Verify we can run "module show" on the module + module show EESSI-extend/${{matrix.eessi_version}}-easybuild + # Now load it and run additional checks + module load EESSI-extend/${{matrix.eessi_version}}-easybuild # First, check if it differs against what is currently shipped by CVMFS diff <(grep -v '^local root = ' /cvmfs/software.eessi.io/versions/${{matrix.eessi_version}}/software/linux/$(uname -m)/generic/modules/all/EESSI-extend/${{matrix.eessi_version}}-easybuild.lua) <(grep -v '^local root = ' $MY_INSTALLATION_PATH/modules/all/EESSI-extend/${{matrix.eessi_version}}-easybuild.lua) @@ -291,4 +312,4 @@ jobs: module unload EESSI-extend # That should have unset all EasyBuild envvars (including EASYBUILD_PREFIX) check_disallowed_env_prefix EASYBUILD_ - module unuse $MY_INSTALLATION_PATH/modules/all + module unuse $MY_INSTALLATION_PATH/modules/all From f2ee646ad8e0d11a041f2d249766332249943553 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 11 Aug 2026 12:58:53 +0200 Subject: [PATCH 10/11] Remove dead code. State is reset between steps anyway --- .github/workflows/tests_eessi_extend_module.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/tests_eessi_extend_module.yml b/.github/workflows/tests_eessi_extend_module.yml index 1fd89737..71ffbeef 100644 --- a/.github/workflows/tests_eessi_extend_module.yml +++ b/.github/workflows/tests_eessi_extend_module.yml @@ -291,7 +291,6 @@ jobs: # unload and check the environment is clean again module unload EESSI-extend check_disallowed_env_prefix EASYBUILD_ - module unuse $MY_INSTALLATION_PATH/modules/all - name: Verify the EESSI-extend module is consistent with the CVMFS repo run: | @@ -312,4 +311,3 @@ jobs: module unload EESSI-extend # That should have unset all EasyBuild envvars (including EASYBUILD_PREFIX) check_disallowed_env_prefix EASYBUILD_ - module unuse $MY_INSTALLATION_PATH/modules/all From 50f45bdcb84193282e0598237845d37c3ddcae95 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 11 Aug 2026 13:14:19 +0200 Subject: [PATCH 11/11] Split of the init logic for EESSI, since this has to be repeated in every step --- .github/workflows/scripts/test_utils.sh | 55 +++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/.github/workflows/scripts/test_utils.sh b/.github/workflows/scripts/test_utils.sh index 66d47460..4b335534 100644 --- a/.github/workflows/scripts/test_utils.sh +++ b/.github/workflows/scripts/test_utils.sh @@ -45,3 +45,58 @@ check_disallowed_env_prefix() { echo "✅ No disallowed environment variables with prefix '$prefix' found." fi } + +init_eessi_environment() { + # Helper function to initialize the EESSI environment, and optionally add + # a path to the modulepath in which EESSI-extend has made local installs + # Expected usage: + # init_eessi_environment --eessi-version [--installation-path ] \ + # [--accelerator-target ] [--cuda-cc ] + local eessi_version="" + local eessi_extend_installation_path="" + local accelerator_target_override="" + local cuda_cc="" + + while [[ $# -gt 0 ]]; do + case "$1" in + --eessi-version) + eessi_version="$2" + shift 2 + ;; + --installation-path) + eessi_extend_installation_path="$2" + shift 2 + ;; + --accelerator-target) + accelerator_target_override="$2" + shift 2 + ;; + --cuda-cc) + cuda_cc="$2" + shift 2 + ;; + *) + echo "ERROR: Unknown option '$1' passed to init_eessi_environment" >&2 + return 1 + ;; + esac + done + + if [ -z "$eessi_version" ]; then + echo "ERROR: --eessi-version is required" >&2 + return 1 + fi + + # Let's start from a clean slate + module --force purge + if [ -n "$accelerator_target_override" ]; then + export EESSI_ACCELERATOR_TARGET_OVERRIDE="$accelerator_target_override" + fi + # Load the EESSI module + module load EESSI/$eessi_version + # Access the installed EESSI-extend (if an installation path was provided) + if [ -n "$eessi_extend_installation_path" ]; then + module use "$eessi_extend_installation_path"/modules/all + fi + check_disallowed_env_prefix EASYBUILD_ +}