diff --git a/.github/workflows/test-install.yml b/.github/workflows/test-install.yml new file mode 100644 index 00000000..5c3c6acb --- /dev/null +++ b/.github/workflows/test-install.yml @@ -0,0 +1,166 @@ +name: Install and test asQ + +on: + # Run on pushes to master + push: + branches: + - master + # And all pull requests + pull_request: + schedule: + # Scheduled run over at 0217 UTC Sunday to detect any upstream breaks. + # * is a special character in YAML so you have to quote this string + - cron: '17 2 * * 0' + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +concurrency: + # Cancels jobs running if new commits are pushed + group: > + ${{ github.workflow }}- + ${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + build: + name: "Build and test asQ" + # Use Firedrake's Linux runners + runs-on: [self-hosted, Linux] + # Use the firedrake container without asQ installed - we want to run the repo version. + container: + image: firedrakeproject/firedrake-vanilla-default:latest + env: + # Sometimes we want to determine if tests are running on CI + ASQ_CI_TESTS: 1 + # Tell pyop2 to complain if SPMD assumptions are broken + PYOP2_SPMD_STRICT: 1 + # Make sure tests with >8 processes are not silently skipped + PYTEST_MPI_MAX_NPROCS: 8 + # Common arguments for pytest. TODO: Is pytest coverage possible firedrake-run-split-tests? + PYTEST_ARGS: --durations=50 --timeout=500 --timeout-method=thread -o faulthandler_timeout=600 --verbose asQ-repo/tests/ + # venv activation script + ACTIVATE: venv-asQ/bin/activate + steps: + - name: Fix HOME + # For unknown reasons GitHub actions overwrite HOME to /github/home + # which will break everything unless fixed + # (https://github.com/actions/runner/issues/863) + run: echo "HOME=/home/firedrake" >> "$GITHUB_ENV" + + - name: Pre-cleanup + # TODO: Why do we need to do this? + run: | + : # Wipe everything away in the current directory + find . -delete + firedrake-clean + + - uses: actions/checkout@v4 + with: + # Download asQ into a subdirectory not called 'asQ' to make sure + # that the package installs correctly. Otherwise 'import asQ' may + # work even if the installation failed because it is a subdirectory. + path: asQ-repo + + - name: Create virtual environment + # pass '--system-site-packages' so Firedrake can be found + run: python3 -m venv --system-site-packages venv-asQ + + - name: Install asQ + id: install + run: | + . $ACTIVATE + python --version + pip --version + pip install ./asQ-repo + pip list + python -m pytest --version + # TODO: firedrake-status doesn't work without $VIRTUAL_ENV/src. Is it obsolete now? + # firedrake-status + + - name: Lint + run: | + . $ACTIVATE + python -m pip install flake8 + cd ./asQ-repo + flake8 . + + - name: Run tests (nprocs = 1) + # Run even if earlier tests failed + if: success() || steps.install.conclusion == 'success' + run: | + . $ACTIVATE + : # Use pytest-xdist here so we can have a single collated output (not possible + : # for parallel tests) + firedrake-run-split-tests 1 1 -n 12 --dist worksteal "$PYTEST_ARGS" + timeout-minutes: 20 + + - name: Run tests (nprocs = 2) + # Run even if earlier tests failed + if: success() || steps.install.conclusion == 'success' + run: | + . $ACTIVATE + firedrake-run-split-tests 2 6 "$PYTEST_ARGS" + timeout-minutes: 20 + + - name: Run tests (nprocs = 3) + # Run even if earlier tests failed + if: success() || steps.install.conclusion == 'success' + run: | + . $ACTIVATE + firedrake-run-split-tests 3 4 "$PYTEST_ARGS" + timeout-minutes: 20 + + - name: Run tests (nprocs = 4) + # Run even if earlier tests failed + if: success() || steps.install.conclusion == 'success' + run: | + . $ACTIVATE + firedrake-run-split-tests 4 3 "$PYTEST_ARGS" + timeout-minutes: 20 + + - name: Run tests (nprocs = 5) + # Run even if earlier tests failed + if: success() || steps.install.conclusion == 'success' + run: | + . $ACTIVATE + firedrake-run-split-tests 5 2 "$PYTEST_ARGS" + timeout-minutes: 20 + + - name: Run tests (nprocs = 6) + # Run even if earlier tests failed + if: success() || steps.install.conclusion == 'success' + run: | + . $ACTIVATE + firedrake-run-split-tests 6 2 "$PYTEST_ARGS" + timeout-minutes: 20 + + - name: Run tests (nprocs = 7) + # Run even if earlier tests failed + if: success() || steps.install.conclusion == 'success' + run: | + . $ACTIVATE + firedrake-run-split-tests 7 1 "$PYTEST_ARGS" + timeout-minutes: 20 + + - name: Run tests (nprocs = 8) + # Run even if earlier tests failed + if: success() || steps.install.conclusion == 'success' + run: | + . $ACTIVATE + firedrake-run-split-tests 8 1 "$PYTEST_ARGS" + timeout-minutes: 20 + + - name: Upload pytest log files + uses: actions/upload-artifact@v4 + if: success() || steps.install.conclusion == 'success' + with: + name: pytest-logs + path: pytest_*.log + retention-days: 5 + + - name: Post-cleanup + if: always() + run: | + find . -delete + firedrake-clean diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 34031b9b..00000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,85 +0,0 @@ -name: Lint and test - -on: - # Run on pushes to master - push: - branches: - - master - # And all pull requests - pull_request: - schedule: - # * is a special character in YAML so you have to quote this string - # Scheduled run over the weekend to detect any upstream breaks. - - cron: '0 1 * * 0' - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -concurrency: - # Cancels jobs running if new commits are pushed - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - build: - name: "Build and test asQ" - # The type of runner that the job will run on - # runs-on: ubuntu-latest - runs-on: [self-hosted, Linux] - # The docker container to use. - container: - image: firedrakeproject/firedrake-vanilla:latest - env: - ASQ_CI_TESTS: 1 - OMP_NUM_THREADS: 1 - OPENBLAS_NUM_THREADS: 1 - PYOP2_SPMD_STRICT: 1 - # Steps represent a sequence of tasks that will be executed as - # part of the jobs - steps: - - name: Fix permissions - # Firedrake's Dockerfile sets USER to firedrake instead of - # using the default user, so we need to update file - # permissions for this image to work on GH Actions. - # See https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners#docker-container-filesystem - # (copied from https://help.github.com/en/actions/migrating-to-github-actions/migrating-from-circleci-to-github-actions) - run: | - sudo chmod -R 777 $GITHUB_WORKSPACE /github /__w/_temp - - uses: actions/checkout@v4 - - name: Install test dependencies - run: | - . /home/firedrake/firedrake/bin/activate - python -m pip install pytest-timeout - python -m pip install pytest-cov - # try and reduce the number of warnings to sift through - python -m pip install siphash24 - - name: Install - run: | - . /home/firedrake/firedrake/bin/activate - python -m pip install -e . - python --version - python -m pytest --version - flake8 --version - firedrake-status - - name: Lint - run: | - . /home/firedrake/firedrake/bin/activate - flake8 . - - name: Test - unit tests - run: | - . /home/firedrake/firedrake/bin/activate - python -m pytest \ - -n 3 --dist worksteal \ - --durations=40 \ - --timeout=300 \ - --cov=asQ --cov-report=term \ - -v tests/unit - - name: Test - integration tests - run: | - . /home/firedrake/firedrake/bin/activate - python -m pytest \ - -n 3 --dist worksteal \ - --durations=40 \ - --timeout=600 \ - --cov=asQ --cov-report=term --cov-append \ - -v tests/integration