Skip to content

CI

CI #39278

Workflow file for this run

name: CI
on:
push:
branches:
- release
tags:
- "v*"
pull_request:
branches:
- main
merge_group:
branches:
- main
workflow_dispatch:
jobs:
lint:
runs-on: ubuntu-latest
name: Lint
steps:
- name: Checkout DOLFINx
uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.12'
- name: Load environment variables
run: cat .github/workflows/fenicsx-refs.env >> $GITHUB_ENV
- name: Install linting tools
run: pip install clang-format cmake-format[YAML] mypy ruff
- name: ruff .py files in C++ code
run: |
cd cpp/
ruff check .
ruff format --check .
- name: ruff Python interface checks
run: |
cd python/
ruff check .
ruff format --check .
- name: mypy checks
run: |
cd python/
mypy dolfinx
mypy demo
mypy test
- name: clang-format C++ checks
run: |
cd cpp
clang-format --version
find . -type f \( -name "*.cpp" -o -name "*.h" \) | xargs clang-format --dry-run --Werror
- name: clang-format Python binding checks
run: |
cd python/dolfinx/wrappers
clang-format --version
find . -type f \( -name "*.cpp" -o -name "*.h" \) | xargs clang-format --dry-run --Werror
- name: cmake-format (non-blocking)
continue-on-error: true
run: |
find . -type f \( -name "*.cmake" -o -name "*.cmake.in" -o -name "CMakeLists.txt" \) | xargs cmake-format --check
ccpp-build:
runs-on: ubuntu-24.04
needs: [lint]
env:
OMPI_ALLOW_RUN_AS_ROOT: 1
OMPI_ALLOW_RUN_AS_ROOT_CONFIRM: 1
PRTE_MCA_rmaps_default_mapping_policy: :oversubscribe # Newer OpenMPI
OMPI_MCA_rmaps_base_oversubscribe: true # Older OpenMPI
PYTEST_ADDOPTS: "-W error"
name: Build and test
steps:
- uses: actions/checkout@v6
- name: Load environment variables
run: cat .github/workflows/fenicsx-refs.env >> $GITHUB_ENV
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install catch2 cmake g++ libblas-dev libboost-dev \
libhdf5-mpi-dev liblapack-dev libparmetis-dev libpugixml-dev \
libspdlog-dev libsuperlu-dist-dev mpi-default-dev ninja-build pkg-config
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.12"
- name: Install Python build dependencies
working-directory: python
run: |
pip install scikit-build-core setuptools
python -m scikit_build_core.build requires | python -c "import sys, json; print(' '.join(json.load(sys.stdin)))" | xargs pip install
- name: Install FEniCS Python components
run: |
pip install git+https://github.com/${{ env.ufl_repository }}.git@${{ env.ufl_ref }}
pip install -Ccmake.build-type="Developer" --no-build-isolation git+https://github.com/${{ env.basix_repository }}.git@${{ env.basix_ref }}
pip install --no-build-isolation git+https://github.com/${{ env.ffcx_repository }}.git@${{ env.ffcx_ref }}
- name: Configure (C++)
working-directory: cpp
run: >
cmake -B build -S .
-Werror=dev
--warn-uninitialized
-G Ninja
-DCMAKE_BUILD_TYPE=Developer
-DBUILD_TESTING=true
-DDOLFINX_ENABLE_PETSC=false
-DDOLFINX_ENABLE_SUPERLU_DIST=true
-DDOLFINX_ENABLE_PARMETIS=true
- name: Build and install (C++)
working-directory: cpp/build
run: |
cmake --build .
sudo cmake --install .
- name: Run tests via target (C++, serial and parallel)
working-directory: cpp/build
run: cmake --build . --target test
- name: Build Python interface
run: |
pip install --check-build-dependencies --no-build-isolation --config-settings=cmake.build-type="Developer" 'python/[test]'
python -c "from mpi4py import MPI; import dolfinx; assert not dolfinx.has_petsc; assert not dolfinx.has_petsc4py; assert dolfinx.has_superlu_dist"
- name: Run mypy # Use a venv to avoid NumPy upgrades that are incompatible with numba
working-directory: python
run: |
python -m venv mypy-env
. ./mypy-env/bin/activate
pip install mypy types-cffi scipy-stubs
mypy -p dolfinx
# mypy test
# mypy demo
- name: Install gmsh and pyvista (and dependencies)
run: |
sudo apt-get install libglu1-mesa libgl1 libxrender1 libxcursor1 libxft2 libxinerama1
sudo apt-get install libegl1
pip install gmsh pyvista
- name: Run demos (Python, serial)
run: |
pip install pytest-xdist
python -m pytest -n auto -m serial --durations=10 python/demo/test.py
- name: Run demos (Python, MPI, np=3)
run: python -m pytest -m mpi --num-proc=3 python/demo/test.py
- name: Run tests (Python, serial)
run: python -m pytest -n auto -m "not petsc4py and not adios2" python/test/unit
- name: Run tests (Python, MPI, np=3)
run: mpirun -np 3 python -m pytest -m "not petsc4py and not adios2" python/test/unit
ccpp-build-with-petsc:
runs-on: ubuntu-latest
needs: [lint]
strategy:
matrix:
petsc_arch: [linux-gnu-real32-32, linux-gnu-real64-32, linux-gnu-complex64-32, linux-gnu-complex128-32, linux-gnu-real64-64, linux-gnu-complex128-64]
docker_image: ["ghcr.io/fenics/test-env:current-openmpi"]
include:
- docker_image: "ghcr.io/fenics/test-env:current-mpich"
petsc_arch: linux-gnu-real64-32
- docker_image: "ghcr.io/fenics/test-env:current-mpich"
petsc_arch: linux-gnu-complex128-32
container: ${{ matrix.docker_image }}
env:
PETSC_ARCH: ${{ matrix.petsc_arch }}
OMPI_ALLOW_RUN_AS_ROOT: 1
OMPI_ALLOW_RUN_AS_ROOT_CONFIRM: 1
PRTE_MCA_rmaps_default_mapping_policy: :oversubscribe
PYTEST_ADDOPTS: "-W error"
name: Build and test (${{ matrix.petsc_arch }}, ${{ matrix.docker_image }})
steps:
- uses: actions/checkout@v6
- name: Load environment variables
run: cat .github/workflows/fenicsx-refs.env >> $GITHUB_ENV
- name: Install Python build dependencies
working-directory: python
run: |
pip install scikit-build-core
python -m scikit_build_core.build requires | python -c "import sys, json; print(' '.join(json.load(sys.stdin)))" | xargs pip install
- name: Install FEniCS Python components
run: |
pip install git+https://github.com/${{ env.ufl_repository }}.git@${{ env.ufl_ref }}
pip install -Ccmake.build-type="Developer" --no-build-isolation git+https://github.com/${{ env.basix_repository }}.git@${{ env.basix_ref }}
pip install --no-build-isolation git+https://github.com/${{ env.ffcx_repository }}.git@${{ env.ffcx_ref }}
- name: Configure (C++)
working-directory: cpp
run: >
cmake -B build -S .
-Werror=dev
--warn-uninitialized
-G Ninja
-DCMAKE_BUILD_TYPE=Developer
-DDOLFINX_ENABLE_ADIOS2=true
-DDOLFINX_ENABLE_KAHIP=true
-DDOLFINX_ENABLE_PETSC=true
-DDOLFINX_ENABLE_SCOTCH=true
-DDOLFINX_ENABLE_SLEPC=true
-DDOLFINX_ENABLE_PARMETIS=false
- name: Build and install (C++)
working-directory: cpp/build
run: cmake --build . --target install
- name: Build tests (C++, standalone)
working-directory: cpp/test
run: |
cmake -B build -S . -DCMAKE_BUILD_TYPE=Developer -GNinja
cmake --build build
- name: Run tests (C++, serial)
working-directory: cpp/test/build
run: ctest -V --output-on-failure -R unittests_np_1
- name: Run tests (C++, MPI, np=3)
working-directory: cpp/test/build
run: ctest -V --output-on-failure -R unittests_np_3
- name: Build and run C++ regression tests (serial and MPI (np=2))
run: |
cmake -Werror=dev --warn-uninitialized -G Ninja -DCMAKE_BUILD_TYPE=Developer -B build/demo/ -S cpp/demo/
cmake --build build/demo
cd build/demo
ctest -V -R demo -R serial
ctest --output-on-failure -V -R demo -R mpi_2
- name: Build Python interface
run: |
pip install --check-build-dependencies --no-build-isolation --config-settings=cmake.build-type="Developer" 'python/[test]'
python -c "from mpi4py import MPI; import dolfinx; assert dolfinx.has_adios2; assert dolfinx.has_kahip; assert not dolfinx.has_parmetis; assert dolfinx.has_petsc; assert dolfinx.has_petsc4py; assert dolfinx.has_ptscotch; assert dolfinx.has_slepc; assert dolfinx.has_complex_ufcx_kernels"
- name: Run mypy # Use a venv to avoid NumPy upgrades that are incompatible with numba
working-directory: python
run: |
python -m venv mypy-env
. ./mypy-env/bin/activate
pip install mypy types-cffi scipy-stubs
mypy -p dolfinx
# mypy test
# mypy demo
- name: Numpy version
run: python -c "import numpy; print(numpy.__version__)"
- name: Set default DOLFINx JIT options
run: |
mkdir -p ~/.config/dolfinx
echo '{ "cffi_extra_compile_args": ["-g0", "-O0" ] }' > ~/.config/dolfinx/dolfinx_jit_options.json
- name: Install pyvista (and dependencies)
run: |
apt-get install libegl1 libxrender1
pip install pyvista
- name: Run demos (Python, serial)
run: |
pip install pytest-xdist
python -m pytest -n auto -m serial --durations=10 python/demo/test.py
- name: Run demos (Python, MPI (np=3))
run: python -m pytest -m mpi --num-proc=3 python/demo/test.py
- name: Run Python unit tests (serial)
run: python -m pytest -m "petsc4py or adios2" -n=auto --durations=50 python/test/unit/
- name: Run Python unit tests (MPI, np=3)
run: mpirun -np 3 python -m pytest -m "petsc4py or adios2" python/test/unit/
build-and-publish-docs:
runs-on: ubuntu-latest
needs: [lint]
container: "ghcr.io/fenics/test-env:current-openmpi"
env:
PETSC_ARCH: linux-gnu-real64-32
OMPI_ALLOW_RUN_AS_ROOT: 1
OMPI_ALLOW_RUN_AS_ROOT_CONFIRM: 1
PRTE_MCA_rmaps_default_mapping_policy: :oversubscribe
name: Build and publish docs
steps:
- uses: actions/checkout@v6
- name: Load environment variables
run: cat .github/workflows/fenicsx-refs.env >> $GITHUB_ENV
- name: Install Python build dependencies
working-directory: python
run: |
pip install scikit-build-core setuptools
python -m scikit_build_core.build requires | python -c "import sys, json; print(' '.join(json.load(sys.stdin)))" | xargs pip install
- name: Install FEniCS Python components
run: |
pip install git+https://github.com/${{ env.ufl_repository }}.git@${{ env.ufl_ref }}
pip install --no-build-isolation git+https://github.com/${{ env.basix_repository }}.git@${{ env.basix_ref }}
pip install --no-build-isolation git+https://github.com/${{ env.ffcx_repository }}.git@${{ env.ffcx_ref }}
- name: Configure C++
run: |
cmake -Werror=dev --warn-uninitialized -G Ninja -B build -S cpp/
cmake --build build
cmake --install build
- name: Build Python interface
run: |
pip install --check-build-dependencies --no-build-isolation 'python/[docs]'
- name: Build C++ interface documentation
run: |
export DOLFINX_VERSION=`cmake -L build | grep DOXYGEN_DOLFINX_VERSION | cut -f2 -d "="`
echo $DOLFINX_VERSION
cd cpp/doc
doxygen Doxyfile
make html
- name: Upload C++ Doxygen documentation artifact
uses: actions/upload-artifact@v6
with:
name: docs-cpp-doxygen
path: cpp/doc/html
retention-days: 2
- name: Upload C++ Sphinx documentation artifact
uses: actions/upload-artifact@v6
with:
name: docs-cpp-sphinx
path: cpp/doc/build/html
retention-days: 2
- name: Build Python interface documentation
run: |
cd python/doc
python -m sphinx -W -b html source/ build/html/
- name: Upload Python documentation artifact
uses: actions/upload-artifact@v6
with:
name: docs-python
path: python/doc/build/html
retention-days: 2
- name: Checkout FEniCS/docs
if: ${{ github.repository == 'FEniCS/dolfinx' && ( github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') ) }}
uses: actions/checkout@v6
with:
repository: "FEniCS/docs"
path: "docs"
ssh-key: "${{ secrets.SSH_GITHUB_DOCS_PRIVATE_KEY }}"
- name: Set version name
if: ${{ github.repository == 'FEniCS/dolfinx' && ( github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') ) }}
run: |
echo "VERSION_NAME=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Copy documentation into repository
if: ${{ github.repository == 'FEniCS/dolfinx' && ( github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') ) }}
run: |
cd docs
git rm -r --ignore-unmatch dolfinx/${{ env.VERSION_NAME }}/cpp
git rm -r --ignore-unmatch dolfinx/${{ env.VERSION_NAME }}/python
mkdir -p dolfinx/${{ env.VERSION_NAME }}/cpp
mkdir -p dolfinx/${{ env.VERSION_NAME }}/cpp/doxygen
mkdir -p dolfinx/${{ env.VERSION_NAME }}/python
cp -r ../cpp/doc/build/html/* dolfinx/${{ env.VERSION_NAME }}/cpp/
cp -r ../cpp/doc/html/* dolfinx/${{ env.VERSION_NAME }}/cpp/doxygen
cp -r ../python/doc/build/html/* dolfinx/${{ env.VERSION_NAME }}/python
- name: Commit and push documentation to FEniCS/docs
if: ${{ github.repository == 'FEniCS/dolfinx' && ( github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') ) }}
run: |
cd docs
git config --global user.email "fenics@github.com"
git config --global user.name "FEniCS GitHub Actions"
git add --all
git commit --allow-empty -m "C++/Python FEniCS/dolfinx@${{ github.sha }}"
git push