Relatively new to github actions I see them being used in the Fortran community but see no repositories or lists pointing to standard components. There is a distributable file for fpm, but not many examples. I am just beginning to put together a list myself and am wondering what the state of the art is and if fortran-lang should host a repository of them.
I find it very appealing that I can copy my .github directory to another github site hosting an fpm package and it immediately builds on Ubunto with ifort/gfortran, MacOS and Windows with gfortran, and rebuilds documenation with ford(1) and all I have to change is the title in the ford.md file.
Are there already existing YML files to install and run doxygen, other compilers, other compilers and containers? Do others find a list of files or pointers to examples would be useful?
I’m currently working on a setup action for Fortran compilers, I got GFortran working with plenty of versions on Ubuntu, MacOS and Windows this way, but haven’t come around to get Intel oneAPI or NVHPC in yet. At least for Linux and MacOS I have working snippets to efficiently install and use Intel oneAPI in a workflow.
Help is definitely welcome, once it becomes a real thing we can move it to the Fortran-lang organization.
NVHPC download is huuuge. I think the best way to implement this for NVHPC is using Gitlab CI/CD and Docker containers. Note that NVIDIA provides official Docker containers here: NVIDIA NGC
This Github repo runs CI with gfortran-9 and -10 using Github’s VMs and using ifort and nvfortran using containers (which you are welcome to use too). I moved to containers after finding that downloading and installing the Intel or Fortran compilers on the Github VMs was unhappily slow.
Easiest would be to install LFortran form the conda-forge channel (feedstock). For GitHub actions there is a workflow to use micromamba for setting up an environment:
I’m using gfortran on Ubuntu + MacOS and ifort and ifx on Ubuntu:
I agree with @RobertPincus that the installation of the Intel toolchain is very slow, it is in the order of 15 min as far as I remember. Theoretically, one can cache an installation, but I did not figure out how to do that for system packages In the example I’m doing that to avoid compilation of PETSc.
Basically, after adding Intel’s package signing key and updating the apt cache, it downloads the .deb packages from Intel’s official oneAPI repo for Ubuntu, then installs them. The packages themselves are huge (on the order of several GiB), so if this has to be done for every single CI workflow, it’s a waste of both time and bandwidth (doing the same thing repeatedly!)
For my project, it seems sufficient to install only intel-oneapi-common-vars and intel-oneapi-compiler-fortran. It downloads ~600 MB data and takes ~2 min. Note, however, that I use only the bare ifort and ifx without any other components of oneAPI, which may not be the case for your GitHub Actions.
Here is the script I use to install ifort and ifx on GitHub-hosted ubuntu-latest runners. You need to make sure that your actions can locate ifort / ifx by putting them on your path or making a symlink in, e.g., /usr/bin.
Click to see the script
#!/bin/bash
# do the job in /tmp
cd /tmp || exit 1
# use wget to fetch the Intel repository public key
wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB
# add to your apt sources keyring so that archives signed with this key will be trusted.
sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB
# optionally, remove the public key
rm GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB
# the installation
echo "deb https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list
sudo add-apt-repository "deb https://apt.repos.intel.com/oneapi all main"
sudo apt-get update
#sudo apt install intel-basekit intel-hpckit # Instead of this line, the following line seems to suffice
sudo apt-get install -y intel-oneapi-common-vars intel-oneapi-compiler-fortran
# source `setvars.sh`
if [[ -f /opt/intel/oneapi/setvars.sh ]] ; then
source /opt/intel/oneapi/setvars.sh > /dev/null ; env | grep intel | sed "s/:\/User.*$//" \
| sed 's/^/export /' > "/tmp/setenv.sh"
source "/tmp/setenv.sh"
# The above lines source `setvars.sh` and save the relevant settings in `/tmp/setenv.sh`.
# It may be OK to do only `source /opt/intel/oneapi/setvars.sh`, but my actions need
# `/tmp/setenv.sh` out of this script.
else
exit 2
fi