Replicate upstream changes to CMakeLists.txt, and test C++ wrappers i… #1120
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: RBniCSx CI | |
on: | |
push: | |
branches: | |
- "**" | |
pull_request: | |
branches: | |
- main | |
schedule: | |
- cron: "0 5 * * *" | |
workflow_call: | |
workflow_dispatch: | |
jobs: | |
test: | |
if: >- | |
( | |
( | |
github.event_name == 'schedule' | |
&& github.repository == 'RBniCS/RBniCSx' | |
) || ( | |
github.event_name != 'schedule' | |
&& !( | |
contains(github.event.head_commit.message, '[ci skip]') | |
|| contains(github.event.head_commit.message, '[skip ci]') | |
) | |
) | |
) | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
include: | |
- backend: none-real | |
container: numericalpdes/base_images:slepc4py-real | |
setup_container: | | |
echo "OMPI_ALLOW_RUN_AS_ROOT=1" >> $GITHUB_ENV | |
echo "OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1" >> $GITHUB_ENV | |
rm /usr/local/lib/python3.11/site-packages/petsc4py/py.typed | |
python3 -m pip install nanobind scikit-build-core[pyproject] | |
- backend: none-complex | |
container: numericalpdes/base_images:slepc4py-complex | |
setup_container: | | |
echo "OMPI_ALLOW_RUN_AS_ROOT=1" >> $GITHUB_ENV | |
echo "OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1" >> $GITHUB_ENV | |
rm /usr/local/lib/python3.11/site-packages/petsc4py/py.typed | |
python3 -m pip install nanobind scikit-build-core[pyproject] | |
- backend: dolfinx-real | |
container: ghcr.io/fenics/dolfinx/dolfinx:nightly | |
setup_container: | | |
. /usr/local/bin/dolfinx-real-mode | |
echo "PETSC_ARCH=$PETSC_ARCH" >> $GITHUB_ENV | |
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" >> $GITHUB_ENV | |
echo "PYTHONPATH=$PYTHONPATH" >> $GITHUB_ENV | |
echo "PKG_CONFIG_PATH=$PKG_CONFIG_PATH" >> $GITHUB_ENV | |
echo "CMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH" >> $GITHUB_ENV | |
rm /usr/local/lib/python3.10/dist-packages/petsc4py/py.typed | |
- backend: dolfinx-complex | |
container: ghcr.io/fenics/dolfinx/dolfinx:nightly | |
setup_container: | | |
. /usr/local/bin/dolfinx-complex-mode | |
echo "PETSC_ARCH=$PETSC_ARCH" >> $GITHUB_ENV | |
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" >> $GITHUB_ENV | |
echo "PYTHONPATH=$PYTHONPATH" >> $GITHUB_ENV | |
echo "PKG_CONFIG_PATH=$PKG_CONFIG_PATH" >> $GITHUB_ENV | |
echo "CMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH" >> $GITHUB_ENV | |
rm /usr/local/lib/python3.10/dist-packages/petsc4py/py.typed | |
fail-fast: false | |
container: | |
image: ${{ matrix.container }} | |
options: --user root | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Setup container | |
run: ${{ matrix.setup_container }} | |
- name: Install RBniCSx | |
run: | | |
if [[ "${{ matrix.backend }}" == none* ]]; then | |
python3 -m pip install --check-build-dependencies --no-build-isolation --config-settings=build-dir="build" --config-settings=cmake.build-type="Debug" --verbose .[docs,lint,tests] | |
else | |
python3 -m pip install --check-build-dependencies --no-build-isolation --config-settings=build-dir="build" --config-settings=cmake.build-type="Debug" --verbose .[docs,lint,tests,tutorials] | |
fi | |
shell: bash | |
- name: Update mypy configuration | |
if: startsWith(matrix.backend, 'none') == true | |
run: | | |
echo "[[tool.mypy.overrides]]" >> pyproject.toml | |
echo 'module = "dolfinx"' >> pyproject.toml | |
echo "ignore_missing_imports = true" >> pyproject.toml | |
echo "[[tool.mypy.overrides]]" >> pyproject.toml | |
echo 'module = "dolfinx.*"' >> pyproject.toml | |
echo "ignore_missing_imports = true" >> pyproject.toml | |
sed -i 's@exclude = \[".eggs", "build", "dist"\]@exclude = [".eggs", "build", "dist", "rbnicsx/backends", "tests/unit/backends"]@g' pyproject.toml | |
sed -i 's@exclude = "(^\\\\.eggs|^build|^dist|conftest\\\\.py\$)"@exclude = "(^\\\\.eggs|^build|^dist|conftest\\\\.py\$|^rbnicsx/backends|^tests/unit/backends)"@g' pyproject.toml | |
- name: Run flake8 and mypy checks on python files | |
run: | | |
python3 -m flake8 . | |
python3 -m mypy . | |
- name: Run documentation generation | |
if: startsWith(matrix.backend, 'none') != true | |
run: | | |
cd docs && make html | |
- name: Remove source directory to ensure that package from installation directory is used | |
run: | | |
rm -rf rbnicsx | |
- name: Determine coverage and pytest options for unit tests | |
id: unit_options | |
run: | | |
if [[ "${{ matrix.backend }}" == none* ]]; then | |
COVERAGE_UNIT_OMIT="*/rbnicsx/backends/*.py,*/rbnicsx/_cpp/backends/*.py" | |
PYTEST_UNIT_OPTIONS="--skip-backends" | |
else | |
COVERAGE_UNIT_OMIT="" | |
PYTEST_UNIT_OPTIONS="" | |
fi | |
echo "coverage_omit=${COVERAGE_UNIT_OMIT}" >> ${GITHUB_OUTPUT} | |
echo "pytest_options=${PYTEST_UNIT_OPTIONS}" >> ${GITHUB_OUTPUT} | |
shell: bash | |
- name: Run unit tests (serial) | |
run: | | |
COVERAGE_UNIT_OMIT="${{ steps.unit_options.outputs.coverage_omit }}" | |
PYTEST_UNIT_OPTIONS="${{ steps.unit_options.outputs.pytest_options }}" | |
COVERAGE_FILE=.coverage_unit_serial python3 -m coverage run --source=rbnicsx --omit="${COVERAGE_UNIT_OMIT}" -m pytest ${PYTEST_UNIT_OPTIONS} tests/unit | |
- name: Run unit tests (parallel) | |
run: | | |
COVERAGE_UNIT_OMIT="${{ steps.unit_options.outputs.coverage_omit }}" | |
PYTEST_UNIT_OPTIONS="${{ steps.unit_options.outputs.pytest_options }}" | |
COVERAGE_FILE=.coverage_unit_parallel mpirun -n 2 python3 -m coverage run --source=rbnicsx --parallel-mode --omit="${COVERAGE_UNIT_OMIT}" -m pytest ${PYTEST_UNIT_OPTIONS} tests/unit | |
- name: Combine coverage reports | |
run: | | |
python3 -m coverage combine .coverage* | |
python3 -m coverage report --fail-under=100 --show-missing --skip-covered | |
- name: Run flake8 and mypy checks on tutorial files | |
if: startsWith(matrix.backend, 'none') != true | |
run: | | |
NO_TESTS_COLLECTED=5 | |
python3 -m pytest --ipynb-action=create-notebooks tutorials || (($?==$NO_TESTS_COLLECTED)) | |
python3 -m pytest --ipynb-action=create-notebooks --tag-collapse tutorials || (($?==$NO_TESTS_COLLECTED)) | |
python3 -m pytest --ipynb-action=create-notebooks --np=2 tutorials || (($?==$NO_TESTS_COLLECTED)) | |
python3 -m pytest --ipynb-action=create-notebooks --tag-collapse --np=2 tutorials || (($?==$NO_TESTS_COLLECTED)) | |
python3 -m nbqa flake8 . | |
python3 -m nbqa mypy . | |
shell: bash | |
- name: Check for stray outputs, counts and metadata in tutorial files | |
if: startsWith(matrix.backend, 'none') != true | |
uses: RBniCS/check-jupyter-metadata-action@main | |
with: | |
pattern: "tutorials/**/*.ipynb" | |
- name: Run tutorials (serial) | |
if: startsWith(matrix.backend, 'none') != true | |
run: | | |
python3 -m pytest --tag-collapse --durations=0 --durations-min=1.0 tutorials | |
- name: Run tutorials (parallel) | |
if: startsWith(matrix.backend, 'none') != true | |
run: | | |
python3 -m pytest --tag-collapse --np=2 --durations=0 --durations-min=1.0 tutorials | |
- name: Upload tutorials logs as an artifact in case of failure | |
if: startsWith(matrix.backend, 'none') != true && (failure() || cancelled()) | |
uses: actions/upload-artifact@v3 | |
with: | |
name: "tutorials-logs-${{ matrix.backend }}" | |
path: | | |
tutorials/**/.ipynb_pytest/**/*.log* | |
warn: | |
runs-on: ubuntu-latest | |
if: github.repository == 'RBniCS/RBniCSx' && github.ref == 'refs/heads/main' && github.event_name == 'schedule' | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Warn if scheduled workflow is about to be disabled | |
uses: fem-on-colab/warn-workflow-about-to-be-disabled-action@main | |
with: | |
workflow-filename: ci.yml | |
days-elapsed: 55 |