Investigate intermittent regression test failures in GitHub Actions CI #101
This file contains hidden or 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: Pull Request CI | |
| on: | |
| pull_request: | |
| concurrency: | |
| group: pr-${{ github.ref }} | |
| cancel-in-progress: true | |
| env: | |
| OMP_NUM_THREADS: 1 | |
| MKL_NUM_THREADS: 1 | |
| OPENBLAS_NUM_THREADS: 1 | |
| NUMEXPR_NUM_THREADS: 1 | |
| PYTHONHASHSEED: 0 | |
| jobs: | |
| unit: | |
| name: Unit | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: 25 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-24.04, macos-15, windows-2025] | |
| python-version: ["3.12", "3.13", "3.14"] | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 | |
| - name: Set up Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| cache: pip | |
| - name: Install testing dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| python -m pip install -e .[testing] | |
| - name: Pytest (unit) • ${{ matrix.os }}, ${{ matrix.python-version }} | |
| run: python -m pytest tests/unit --cache-clear | |
| discover-systems: | |
| name: Discover regression systems | |
| runs-on: ubuntu-24.04 | |
| outputs: | |
| systems: ${{ steps.set-systems.outputs.systems }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 | |
| - name: Set up Python 3.14 | |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 | |
| with: | |
| python-version: "3.14" | |
| cache: pip | |
| - name: Install testing dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| python -m pip install -e .[testing] | |
| - name: Discover systems | |
| id: set-systems | |
| run: | | |
| SYSTEMS=$(python -m tests.regression.list_systems) | |
| echo "systems=$SYSTEMS" >> $GITHUB_OUTPUT | |
| regression-quick: | |
| name: Regression (fast) • ${{ matrix.system }} | |
| needs: [unit, discover-systems] | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 35 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| system: ${{ fromJson(needs.discover-systems.outputs.systems) }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 | |
| - name: Set up Python 3.14 | |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 | |
| with: | |
| python-version: "3.14" | |
| cache: pip | |
| # Intentionally disabled while debugging CI-only regression flakes. | |
| # The old key was static and could restore stale generated test data: | |
| # codeentropy-testdata-${{ runner.os }}-py314 | |
| # | |
| # - name: Cache testdata | |
| # uses: actions/cache@v4 | |
| # with: | |
| # path: .testdata | |
| # key: codeentropy-testdata-${{ runner.os }}-py314 | |
| - name: Install testing dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| python -m pip install -e .[testing] | |
| - name: Clean local test caches | |
| shell: bash | |
| run: | | |
| rm -rf .pytest_cache | |
| find . -type d -name "__pycache__" -prune -exec rm -rf {} + | |
| - name: Prepare regression test data | |
| shell: bash | |
| run: | | |
| python -m tests.regression.prepare_testdata --system "${{ matrix.system }}" | |
| if [ ! -d .testdata ]; then | |
| echo ".testdata was not created" | |
| exit 1 | |
| fi | |
| - name: Snapshot regression test data before tests | |
| shell: bash | |
| run: | | |
| find .testdata -type f -exec sha256sum {} \; | sort > testdata.before.sha256 | |
| - name: Run fast regression tests (per system) | |
| run: | | |
| python -m pytest tests/regression \ | |
| -m "not slow" \ | |
| --cache-clear \ | |
| -n 1 \ | |
| --system "${{ matrix.system }}" \ | |
| -vv \ | |
| --durations=20 \ | |
| --codeentropy-debug | |
| - name: Snapshot regression test data after tests | |
| if: always() | |
| shell: bash | |
| run: | | |
| find .testdata -type f -exec sha256sum {} \; | sort > testdata.after.sha256 | |
| - name: Check regression test data did not change | |
| if: always() | |
| shell: bash | |
| run: | | |
| diff -u testdata.before.sha256 testdata.after.sha256 | |
| - name: Upload artifacts (failure) | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: quick-regression-failure-${{ matrix.system }} | |
| path: | | |
| .testdata/** | |
| testdata.before.sha256 | |
| testdata.after.sha256 | |
| /tmp/pytest-of-*/pytest-*/** | |
| docs: | |
| name: Docs | |
| needs: unit | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 25 | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 | |
| - name: Set up Python 3.14 | |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 | |
| with: | |
| python-version: "3.14" | |
| cache: pip | |
| - name: Install docs dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| python -m pip install -e .[docs] | |
| - name: Build docs | |
| run: | | |
| make -C docs clean | |
| make -C docs html SPHINXOPTS="-W --keep-going" | |
| - name: Upload docs artifact | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: docs-html | |
| path: docs/_build/html | |
| pre-commit: | |
| name: Pre-commit | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 15 | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 | |
| - name: Set up Python 3.14 | |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 | |
| with: | |
| python-version: "3.14" | |
| cache: pip | |
| - name: Install pre-commit dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| python -m pip install -e .[pre-commit] | |
| - name: Run pre-commit | |
| run: | | |
| pre-commit install | |
| pre-commit run --all-files || { | |
| git status --short | |
| git diff | |
| exit 1 | |
| } | |
| coverage: | |
| name: Coverage | |
| needs: unit | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 30 | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 | |
| - name: Set up Python 3.14 | |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 | |
| with: | |
| python-version: "3.14" | |
| cache: pip | |
| - name: Install testing dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| python -m pip install -e .[testing] | |
| - name: Run coverage | |
| run: | | |
| pytest tests/unit \ | |
| --cache-clear \ | |
| --cov CodeEntropy \ | |
| --cov-report term-missing \ | |
| --cov-report xml \ | |
| -q | |
| - name: Upload coverage to Coveralls | |
| uses: coverallsapp/github-action@5cbfd81b66ca5d10c19b062c04de0199c215fb6e | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| file: coverage.xml | |
| fail-on-error: false |