Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
128 commits
Select commit Hold shift + click to select a range
0ecd2bb
update page for setting up a private stratum 1
bedroge Feb 15, 2024
d2cbf84
fix typo in bandwidth
bedroge Feb 15, 2024
12900ff
add sentence about SSH keys and sudo
bedroge Feb 15, 2024
6bbc5a0
make site-specific vars file optional
bedroge Feb 16, 2024
0ff336a
add warning about IPS
bedroge Feb 16, 2024
f830adb
added sentence about downside of https
bedroge Feb 16, 2024
b018fb4
change headers of subsections
bedroge Feb 16, 2024
51bca17
Add some documentation on how to debug the test step implemented in h…
Mar 1, 2024
f58c044
add data and overview page
Mar 12, 2024
cf70891
resolve spellcheck
Mar 12, 2024
cf3ba80
add the detailed software pages
Mar 12, 2024
8894f5f
Resolve spellcheck
Mar 12, 2024
fbedcce
resolve merge conflict
Mar 21, 2024
19acdad
Add instructions on how to rebuild software, and how to do debugging …
Mar 27, 2024
8c678fa
Fix typos
Mar 27, 2024
ff4a215
Changed path
Mar 27, 2024
77465da
replace reference to clusters with targets
Apr 2, 2024
b38f40b
spellcheck
Apr 2, 2024
a4851b0
add recommendation for having squid proxies
bedroge Apr 12, 2024
d555b4b
fix typo in mechanisms
bedroge Apr 12, 2024
2b32fa9
reword sentence about replicating from stratum 0 a bit
bedroge Apr 12, 2024
ba51497
discourage https
bedroge Apr 12, 2024
40668b1
extend paragraph about geo api, instructions for disabling it on the …
bedroge Apr 12, 2024
7c6742c
remove note about Squid proxy on Stratum 1, as it's now disabled by d…
bedroge Apr 12, 2024
0fac17c
remove cache hit example
bedroge Apr 12, 2024
93b1c34
use eessi.io instead of eessi-hpc.org
bedroge Apr 12, 2024
46a2f2f
fix typo in however
bedroge Apr 12, 2024
93d1e66
Take Bobs comments into account: add correct naming scheme instructio…
Jun 3, 2024
f230b18
Clarify date format
Jun 3, 2024
1ffa0ca
Fix typo
Jun 3, 2024
2051ac6
resolve merge conflict
Jun 4, 2024
bfc95bd
Update scorecards version
ocaisa Jun 4, 2024
9fdaefe
clean up license header in populate_overview.js
boegel Jun 4, 2024
3034d9d
clean up license header in available_software.py
boegel Jun 4, 2024
5d46667
Update scorecards.yml
ocaisa Jun 4, 2024
71dd132
update for new menu layout and add to index page
Jun 4, 2024
0b1867b
Merge branch 'add_software_overview_page' of github.com:laraPPr/EESSI…
Jun 4, 2024
14150ed
Update scorecards.yml
ocaisa Jun 4, 2024
f698170
Merge pull request #162 from laraPPr/add_software_overview_page
trz42 Jun 4, 2024
3c4e7ec
Merge pull request #163 from laraPPr/add_detail_software_pages
trz42 Jun 4, 2024
7c39eca
Update scorecards.yml
ocaisa Jun 4, 2024
8c5d27b
Merge pull request #181 from EESSI/ocaisa-patch-2
boegel Jun 4, 2024
55b6b25
adding missing space
trz42 Jun 4, 2024
0e3bb05
Merge pull request #158 from EESSI/add_debugging_test_step_instructions
trz42 Jun 4, 2024
318caeb
improve error reporting when available_software.py script is run in i…
boegel Jun 4, 2024
a7f1b29
makes sense
trz42 Jun 4, 2024
34f4690
Merge branch 'main' into add_debugging_instructions_for_rebuilds
bedroge Jun 4, 2024
c7e6e4a
Merge pull request #170 from EESSI/add_debugging_instructions_for_reb…
bedroge Jun 4, 2024
84b5877
exclude zen4 from overview of available software (for now)
boegel Jun 4, 2024
d9ea651
Merge pull request #184 from boegel/available_software_more_robust
laraPPr Jun 4, 2024
1933d2c
Merge pull request #186 from boegel/available_software_exclude_zen4
laraPPr Jun 4, 2024
59e2f8d
remove -p ./roles in ansible-galaxy command
bedroge Jun 4, 2024
9825341
add link to stratum 1 page
bedroge Jun 4, 2024
c6adda4
add section about proxy configuration
bedroge Jun 4, 2024
5ac0a48
add section about configuring an additional stratum 1
bedroge Jun 4, 2024
52bbfd7
move client config part to native installation page
bedroge Jun 4, 2024
d8bb91e
fix link
bedroge Jun 4, 2024
47e3824
fix link
bedroge Jun 4, 2024
994d06a
Update script_module_list.yml
laraPPr Jun 4, 2024
0f16838
Update README.md
laraPPr Jun 4, 2024
8c8ce18
correct paragraph about /srv
bedroge Jun 4, 2024
020139c
remove instructions for mounting an additional file system
bedroge Jun 4, 2024
899e4e0
Merge pull request #187 from laraPPr/Fix_CI
boegel Jun 4, 2024
9e97d4f
remove note, rearrange the sections, add section for larger systems
bedroge Jun 4, 2024
eb50d85
Merge pull request #157 from bedroge/private_s1
casparvl Jun 5, 2024
9d5e76e
add workflow to update overview of available software
boegel Jun 4, 2024
9ce8952
use specific commits for actions used in workflow to update overview …
boegel Jun 5, 2024
49dedbd
Merge pull request #189 from boegel/auto_update_available_software
trz42 Jun 5, 2024
735019f
Update update_available_software.yml
ocaisa Jun 5, 2024
dda0c38
Update update_available_software.yml
ocaisa Jun 6, 2024
760091b
Merge pull request #190 from EESSI/ocaisa-patch-2
trz42 Jun 6, 2024
9ad62f7
also use hash for actions/checkout in workflow to update overview of …
boegel Jun 6, 2024
7a6467f
make codespell ignore generated data for overview of available software
boegel Jun 6, 2024
fb43a21
Merge pull request #193 from boegel/codespell
ocaisa Jun 6, 2024
489ea6c
Merge pull request #192 from boegel/auto_update_available_software
ocaisa Jun 6, 2024
435e040
update overview of available software
ocaisa Jun 6, 2024
b777c99
fix skip option for codespell
boegel Jun 6, 2024
0055423
Merge pull request #194 from EESSIbot/update-software-overview-171765…
ocaisa Jun 6, 2024
d124ab2
add script to check whether JSON data for available software has been…
boegel Jun 6, 2024
abe1c23
remove original JSON files after checking for updates
boegel Jun 6, 2024
9f52029
Merge pull request #195 from boegel/fix_check_update_available_software
ocaisa Jun 6, 2024
bce5bfd
Use hash for flake8 action
ocaisa Jun 6, 2024
07fe5d3
Correct installation of requirements for updating available software
ocaisa Jun 6, 2024
d59c2df
Update update_available_software.yml
ocaisa Jun 6, 2024
37d9384
Merge pull request #197 from EESSI/ocaisa-patch-3
trz42 Jun 6, 2024
41b077e
Merge pull request #196 from EESSI/ocaisa-patch-2
boegel Jun 6, 2024
809b26e
update overview of available software
ocaisa Jun 6, 2024
0b1314b
Merge pull request #199 from EESSIbot/update-software-overview-171766…
boegel Jun 6, 2024
4323fa9
update overview of available software
bedroge Jun 11, 2024
9124654
Merge pull request #200 from EESSIbot/update-software-overview-171809…
bedroge Jun 11, 2024
531c262
Add documentation on running EESSI from a virtual machine on Windows …
Jun 11, 2024
1efba8e
make spell check happy
Jun 11, 2024
ab56e9a
make spell check happy
Jun 11, 2024
bc64742
update link to available software in repository page
Jun 11, 2024
ab064c5
Merge pull request #202 from laraPPr/add_software.eessi.io
boegel Jun 11, 2024
adb7ab5
run workflow to update overview of available software every 4 hours
boegel Jun 11, 2024
a823d4a
Update docs/getting_access/eessi_limactl.md
laraPPr Jun 11, 2024
b9b143d
Update docs/getting_access/eessi_limactl.md
laraPPr Jun 11, 2024
ddef635
Update docs/getting_access/eessi_limactl.md
laraPPr Jun 11, 2024
a86c3c6
Merge pull request #203 from boegel/update_available_software_cron
bedroge Jun 11, 2024
c5f60de
Update docs/getting_access/eessi_limactl.md
laraPPr Jun 11, 2024
c09b9f0
Update docs/getting_access/eessi_wsl.md
laraPPr Jun 11, 2024
0a65804
Update mkdocs.yml
laraPPr Jun 11, 2024
f3c9582
Update docs/getting_access/eessi_wsl.md
laraPPr Jun 11, 2024
7a394f2
Update docs/getting_access/eessi_limactl.md
laraPPr Jun 11, 2024
fb44ae5
Update docs/getting_access/eessi_wsl.md
laraPPr Jun 11, 2024
c9c3280
fix syntax error in workflow to update overview of available software
boegel Jun 11, 2024
dcf1e86
Merge pull request #204 from boegel/update_available_software_cron
bedroge Jun 11, 2024
096972b
fix another syntax error in workflow to update overview of available …
boegel Jun 11, 2024
0346681
Merge pull request #205 from boegel/update_available_software_cron
bedroge Jun 11, 2024
cd834a7
add Rocky 9 template
Jun 11, 2024
abed08b
update overview of available software
bedroge Jun 11, 2024
b209f10
Merge pull request #206 from EESSIbot/update-software-overview-171812…
boegel Jun 11, 2024
ba102cf
update overview of available software
bedroge Jun 14, 2024
b41a959
Merge pull request #208 from EESSIbot/update-software-overview-171833…
boegel Jun 14, 2024
2c9128e
prevent running on forks
bedroge Jun 14, 2024
9ee4c7e
Merge pull request #209 from bedroge/disable_software_overview_on_forks
boegel Jun 14, 2024
c37ec01
add automouting as extra option for wsl
Jun 14, 2024
fd960d6
spell check
Jun 14, 2024
0e4ac4a
Update docs/getting_access/eessi_wsl.md
laraPPr Jun 14, 2024
ee88167
Update mkdocs.yml
laraPPr Jun 14, 2024
e69b9c0
Merge pull request #201 from laraPPr/add_local_desktop
ocaisa Jun 14, 2024
8d810a9
Try to keep menu item to single line
ocaisa Jun 14, 2024
fac70bd
Merge pull request #210 from EESSI/ocaisa-patch-2
bedroge Jun 14, 2024
737f1d5
update overview of available software
bedroge Jun 17, 2024
1e82c19
Merge pull request #211 from EESSIbot/update-software-overview-171864…
bedroge Jun 17, 2024
3f25901
update overview of available software
bedroge Jun 20, 2024
7636881
Merge pull request #213 from EESSIbot/update-software-overview-171885…
bedroge Jun 20, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
13 changes: 4 additions & 9 deletions .github/workflows/scorecards.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,11 @@

name: Scorecards supply-chain security
on:
# For Branch-Protection check. Only the default branch is supported. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
branch_protection_rule:
# To guarantee Maintained check is occasionally updated. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
schedule:
- cron: '25 15 * * 3'
push:
branches: [ "main" ]
pull_request:
branches:
- main

Expand All @@ -36,12 +31,12 @@ jobs:

steps:
- name: "Checkout code"
uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
with:
persist-credentials: false

- name: "Run analysis"
uses: ossf/scorecard-action@99c53751e09b9529366343771cc321ec74e9bd3d # v2.0.6
uses: ossf/scorecard-action@dc50aa9510b46c811795eb24b2f1ba02a914e534 # v2.3.3
with:
results_file: results.sarif
results_format: sarif
Expand All @@ -63,14 +58,14 @@ jobs:
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
# format to the repository Actions tab.
- name: "Upload artifact"
uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
with:
name: SARIF file
path: results.sarif
retention-days: 5

# Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@807578363a7869ca324a79039e6db9c843e0e100 # v2.1.27
uses: github/codeql-action/upload-sarif@9fdb3e49720b44c48891d036bb502feb25684276 # v3.25.6
with:
sarif_file: results.sarif
4 changes: 2 additions & 2 deletions .github/workflows/script_module_list.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Module overview script (lint + test)
on:
push:
paths:
- 'scripts/README.mds/**'
- 'scripts/**'
- './.github/**'
pull_request:
paths:
Expand All @@ -25,7 +25,7 @@ jobs:
with:
python-version: "3.6"
- name: Run flake8
uses: py-actions/flake8@v2
uses: py-actions/flake8@84ec6726560b6d5bd68f2a5bed83d62b52bb50ba # v2.3.0
with:
max-line-length: "120"
path: "scripts/available_software"
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ jobs:
uses: codespell-project/actions-codespell@22ff5a2e4b591290baf82d47c9feadac31c65441 # v1.0
with:
check_filenames: true
skip: '*.pdf,.git'
# MarkDown files in docs/available_software/detail are skipped because they are auto-generated
skip: '*.pdf,.git,*.json,./docs/available_software/detail/*.md'

# - name: Markdown Linting Action
# uses: avto-dev/markdown-lint@v1.2.0
Expand Down
66 changes: 66 additions & 0 deletions .github/workflows/update_available_software.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: Update overview of available software in EESSI

Check failure

Code scanning / Scorecard

Token-Permissions

score is 0: no topLevel permission defined Remediation tip: Visit [https://app.stepsecurity.io/secureworkflow](https://app.stepsecurity.io/secureworkflow/github.com/EESSI/docs/update_available_software.yml/main?enable=permissions). Tick the 'Restrict permissions for GITHUB_TOKEN' Untick other options NOTE: If you want to resolve multiple issues at once, you can visit [https://app.stepsecurity.io/securerepo](https://app.stepsecurity.io/securerepo) instead. Click Remediation section below for further remediation help
on:
workflow_dispatch:
schedule:
# run every 4 hours
- cron: '0 */4 * * *'
jobs:
update_available_software:
if: github.repository_owner == 'EESSI' # Prevent running on forks
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6

- name: set up Python
uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0
with:
python-version: '3.10'
architecture: x64

- name: Mount EESSI
uses: eessi/github-action-eessi@e1f8f20638ea417a18d23ab29443ee34794ff900 # v3.1.0
with:
eessi_stack_version: '2023.06'

- name: update overview of available software
id: update_available_software
run: |
# install required Python packages in virtual environment
python -m venv venv
. venv/bin/activate
pip install -r scripts/available_software/requirements.txt

Check warning

Code scanning / Scorecard

Pinned-Dependencies

score is 5: pipCommand not pinned by hash Click Remediation section below to solve this issue

# copy current JSON data, so we can compare after updating it
cp docs/available_software/data/json_data.json docs/available_software/data/json_data.json.orig
cp docs/available_software/data/json_data_detail.json docs/available_software/data/json_data_detail.json.orig

python scripts/available_software/available_software.py
git status

# determine whether pull request should be opened:
# if JSON files in docs/available_software/data have been updated, then a PR should be opened
json_data_changed=$(python scripts/available_software/check_json_updates.py docs/available_software/data/json_data.json.orig docs/available_software/data/json_data.json)
json_data_detail_changed=$(python scripts/available_software/check_json_updates.py docs/available_software/data/json_data_detail.json.orig docs/available_software/data/json_data_detail.json)
if [[ ${json_data_changed} == "no changes" ]] && [[ ${json_data_detail_changed} == "no changes" ]]; then
echo "JSON files in docs/available_software/data have not been changed, no need to open PR"
echo "json_data_changed=no" >> $GITHUB_OUTPUT
else
echo "JSON files in docs/available_software/data have been changed, PR should be opened"
echo "json_data_changed=yes" >> $GITHUB_OUTPUT
fi

# remove original JSON files, or they'll end up in the PR being opened
rm -f docs/available_software/data/json_data.json.orig docs/available_software/data/json_data_detail.json.orig

- name: create pull request
uses: peter-evans/create-pull-request@6d6857d36972b65feb161a90e484f2984215f83e # v6.0.5
if: steps.update_available_software.outputs.json_data_changed == 'yes'
with:
add-paths: docs/available_software
branch: update-software-overview
branch-suffix: timestamp
commit-message: update overview of available software
title: update overview of available software
body: ''
token: ${{ secrets.EESSIBOT_GITHUB_TOKEN }}
push-to-fork: EESSIbot/docs
58 changes: 58 additions & 0 deletions docs/adding_software/debugging_failed_builds.md
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,64 @@ After some time, this build fails while trying to build `Plumed`, and we can acc
!!! Note
While this might be faster than the easystack-based approach, this is _not_ how the bot builds. So why it _may_ reproduce the failure the bot encounters, it may not reproduce the bug _at all_ (no failure) or run into _different_ bugs. If you want to be sure, use the easystack-based approach.

## Rebuilding software
[Rebuilding software](opening_pr.md#rebuilding_software) requires an additional step at the beginning: the software first needs to be removed. We assume you've already [checked out the feature branch](#fetching-the-feature-branch). Then, you need to start the container with the additional `--fakeroot` argument, otherwise you will not be able to remove files from the `/cvmfs` prefix. Make sure to also include the `--save` argument, as we will need the tarball later on. E.g.
```
SINGULARITY_CACHEDIR=${eessi_common_dir}/container_cache ./eessi_container.sh --access rw --nvidia all --host-injections ${eessi_common_dir}/host_injections --save ${eessi_pr_dir} --fakeroot
```
Then, initialize the EESSI environment
```
source ${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/init/bash
```
and get the diff file for the corresponding PR, e.g. for PR 123:
```
wget https://github.com/EESSI/software-layer/pull/123.diff
```
Finally, run the `EESSI-remove-software.sh` script
```
./EESSI-remove-software.sh`
```

This should remove any software specified in a [rebuild easystack](opening_pr.md#rebuilding_software) that got added in your current feature branch.

Now, exit the container, paying attention to the instructions that are printed to resume later, e.g.:

```
Saved contents of tmp directory '/tmp/eessi.WZxeFUemH2' to tarball '/home/myuser/pr507/EESSI-1711538681.tgz' (to resume session add '--resume /home/myuser/pr507/EESSI-1711538681.tgz')
```

Now, continue with the original instructions to start the container (i.e. either [here](#starting-a-shell-in-the-eessi-container) or [with this alternate approach](#more-efficient-approach-for-multiplecontinued-debugging-sessions)) and make sure to add the `--resume` flag. This way, you are resuming from the tarball (i.e. with the software removed that has to be rebuilt), but in a new container in which you have regular (i.e. no root) permissions.

## Running the test step
If you are still in the prefix layer (i.e. after previously building something), exit it first:
```
$ exit
logout
Leaving Gentoo Prefix with exit status 0
```
Then, source the EESSI init script (again):
```
Apptainer> source ${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/init/bash
Environment set up to use EESSI (2023.06), have fun!
{EESSI 2023.06} Apptainer>
```

!!! Note
If you are in a SLURM environment, make sure to run `for i in $(env | grep SLURM); do unset "${i%=*}"; done` to unset any SLURM environment variables. Failing to do so will cause `mpirun` to pick up on these and e.g. infer how many slots are available. If you run into errors of the form "There are not enough slots available in the system to satisfy the X slots that were requested by the application:", you probably forgot this step.

Then, execute the `run_tests.sh` script. We are assuming you are still in the root of the `software-layer` repository that you cloned earlier:
```
./run_tests.sh
```
if all goes well, you should see (part of) the EESSI test suite being run by ReFrame, finishing with something like

```
[ PASSED ] Ran X/Y test case(s) from Z check(s) (0 failure(s), 0 skipped, 0 aborted)
```

!!! Note
If you are running on a system with hyperthreading enabled, you may still run into the "There are not enough slots available in the system to satisfy the X slots that were requested by the application:" error from `mpirun`, because hardware threads are not considered to be slots by default by OpenMPIs `mpirun`. In this case, run with `OMPI_MCA_hwloc_base_use_hwthreads_as_cpus=1 ./run_tests.sh` (for OpenMPI 4.X) or `PRTE_MCA_rmaps_default_mapping_policy=:hwtcpus ./run_tests.sh` (for OpenMPI 5.X).

## Known causes of issues in EESSI

### The custom system prefix of the compatibility layer
Expand Down
24 changes: 24 additions & 0 deletions docs/adding_software/opening_pr.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ git checkout -b example_branch
```shell
echo ' - example-1.2.3-GCC-12.3.0.eb' >> easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.8.2-2023a.yml
```
Note that the naming scheme is standardized and should be `eessi-<eessi_version>-eb-<eb_version>-<toolchain_version>.yml`. See the [official EasyBuild documentation on easystack files](https://docs.easybuild.io/easystack-files/) for more information on the syntax.

4) Stage and commit the changes into your your branch with a sensible message

Expand All @@ -95,3 +96,26 @@ git push koala example_branch

If all goes well, one or more bots :robot: should almost instantly create a comment in your pull request
with an overview of how it is configured - you will need this information when providing build instructions.

### Rebuilding software
We typically do not rebuild software, since (strictly speaking) this breaks reproducibility for anyone using the software. However, there are certain situations in which it is difficult or impossible to avoid.

To do a rebuild, you add the software you want to rebuild to a dedicated easystack file in the `rebuilds` directory. Use the following naming convention: `YYYYMMDD-eb-<EB_VERSION>-<APPLICATION_NAME>-<APPLICATION_VERSION>-<SHORT_DESCRIPTION>.yml`, where `YYYYMMDD` is the opening date of your PR. E.g. `2024.05.06-eb-4.9.1-CUDA-12.1.1-ship-full-runtime.yml` was added in a PR on the 6th of May 2024 and used to rebuild CUDA-12.1.1 using EasyBuild 4.9.1 to resolve an issue with some runtime libraries missing from the initial CUDA 12.1.1 installation.

At the top of your easystack file, please use comments to include a short description, and make sure to include any relevant links to related issues (e.g. from the GitHub repositories of EESSI, EasyBuild, or the software you are rebuilding).

As an example, consider the full easystack file (`2024.05.06-eb-4.9.1-CUDA-12.1.1-ship-full-runtime.yml`) used for the aforementioned CUDA rebuild:

```yaml
# 2024.05.06
# Original matching of files we could ship was not done correctly. We were
# matching the basename for files (e.g., libcudart.so from libcudart.so.12)
# rather than the name stub (libcudart)
# See https://github.com/EESSI/software-layer/pull/559
easyconfigs:
- CUDA-12.1.1.eb:
options:
accept-eula-for: CUDA
```

By separating rebuilds in dedicated files, we still maintain a complete software bill of materials: it is transparent what got rebuilt, for which reason, and when.
Loading