CI #989
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: CI | |
on: | |
push: | |
branches: | |
- main | |
pull_request: | |
schedule: | |
# run this every Wednesday at 3 am UTC | |
- cron: 0 3 * * 3 | |
workflow_dispatch: | |
concurrency: | |
# auto-cancel any in-progress job *on the same branch* | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
jobs: | |
build-test: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout Source | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
- uses: astral-sh/setup-uv@3b9817b1bf26186f03ab8277bab9b827ea5cc254 # v3.2.0 | |
- name: Check build | |
run: | | |
uvx check-manifest | |
uv build | |
unit-tests: | |
name: ${{matrix.os}} x py${{matrix.python-version}} ${{matrix.marker}} | |
strategy: | |
matrix: | |
os: | |
- ubuntu-latest | |
python-version: | |
- '3.11' | |
- '3.12' | |
- '3.13' | |
marker: [''] # needed to avoid collision with PY_LIB job | |
include: | |
- os: macos-latest | |
python-version: '3.13' | |
- os: windows-latest | |
python-version: '3.13' | |
# test with minimal requirements | |
- marker: minimal | |
os: ubuntu-20.04 | |
python-version: '3.11' | |
install-args: --resolution=lowest-direct | |
# test GPGI_PY_LIB | |
- marker: PY_LIB | |
os: ubuntu-latest | |
python-version: '3.13' | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout Source | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
- name: Setup Python | |
uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 | |
with: | |
python-version: ${{ matrix.python-version }} | |
- uses: astral-sh/setup-uv@3b9817b1bf26186f03ab8277bab9b827ea5cc254 # v3.2.0 | |
with: | |
enable-cache: true | |
cache-dependency-glob: | | |
**/requirements/tests.txt | |
**/pyproject.toml | |
- run: echo $(pwd) # TODO: clean up (maybe use it on other archs first) | |
if: matrix.os == 'ubuntu-latest' | |
- name: Test | |
env: | |
GPGI_PY_LIB: ${{ matrix.marker == 'PY_LIB' }} | |
shell: bash # for windows-compat (using `\` as a line continuation) | |
# pinning [email protected] inline so it's up to date | |
# even with UV_RESOLUTION=lowest-direct | |
run: | | |
uvx --with-requirements=requirements/tests.txt --no-build ${{ matrix.install-args }} \ | |
[email protected] run --parallel-mode -m pytest --color=yes -ra | |
- name: Upload coverage data | |
# only using reports from ubuntu because | |
# combining reports from multiple platforms is tricky (or impossible ?) | |
if: matrix.os == 'ubuntu-latest' | |
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 | |
with: | |
name: gpgi_coverage_data-${{matrix.os}}-${{matrix.python-version}}-${{matrix.marker}} | |
path: .coverage.* | |
if-no-files-found: ignore | |
include-hidden-files: true | |
image-tests: | |
name: Image tests | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
- uses: astral-sh/setup-uv@3b9817b1bf26186f03ab8277bab9b827ea5cc254 # v3.2.0 | |
with: | |
enable-cache: true | |
cache-dependency-glob: | | |
**/requirements/tests.txt | |
**/pyproject.toml | |
- run: uv python install 3.13 | |
- name: Run Image Tests | |
run: | | |
uvx --with-requirements=requirements/tests.txt --no-build \ | |
pytest --color=yes --mpl -m mpl_image_compare \ | |
--mpl-generate-summary=html \ | |
--mpl-results-path=gpgi_pytest_mpl_results \ | |
--mpl-baseline-path=tests/pytest_mpl_baseline | |
- name: Generate new image baseline | |
if: failure() | |
run: | | |
uvx --with-requirements=requirements/tests.txt --no-build \ | |
pytest --color=yes --mpl -m mpl_image_compare \ | |
--mpl-generate-path=gpgi_pytest_mpl_new_baseline \ | |
--last-failed | |
# always attempt to upload artifacts, even | |
# (and especially) in case of failure. | |
- name: Upload pytest-mpl report | |
if: always() | |
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 | |
with: | |
name: gpgi_pytest_mpl_results | |
path: gpgi_pytest_mpl_results/* | |
- name: Upload pytest-mpl baseline | |
if: always() | |
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 | |
with: | |
name: gpgi_pytest_mpl_new_baseline | |
path: gpgi_pytest_mpl_new_baseline/* | |
if-no-files-found: ignore | |
concurrency-tests: | |
name: Thread concurrency tests | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
- uses: astral-sh/setup-uv@3b9817b1bf26186f03ab8277bab9b827ea5cc254 # v3.2.0 | |
with: | |
enable-cache: true | |
cache-dependency-glob: | | |
**/requirements/tests.txt | |
**/pyproject.toml | |
- run: uv python install 3.13 | |
- name: Run Concurrency Tests | |
run: | | |
uvx --with-requirements=requirements/tests.txt --no-build \ | |
pytest --color=yes --count 500 tests/test_concurrent.py | |
coverage: | |
name: Combine & check coverage. | |
runs-on: ubuntu-latest | |
needs: unit-tests | |
steps: | |
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
- uses: astral-sh/setup-uv@3b9817b1bf26186f03ab8277bab9b827ea5cc254 # v3.2.0 | |
- run: uv python install 3.13 | |
- uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
with: | |
pattern: gpgi_coverage_data-* | |
merge-multiple: true | |
- name: Check coverage | |
run: | | |
uv tool install coverage | |
coverage combine | |
coverage html --skip-covered --skip-empty | |
coverage report --fail-under=100 # >> $GITHUB_STEP_SUMMARY | |
- name: Upload HTML report if check failed. | |
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 | |
with: | |
name: gpgi_coverage_report | |
path: htmlcov | |
if: ${{ failure() }} | |
typecheck: | |
strategy: | |
matrix: | |
python-version: | |
- '3.11' | |
- '3.12' | |
- '3.13' | |
runs-on: ubuntu-latest | |
name: type check | |
steps: | |
- name: Checkout repo | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
- uses: astral-sh/setup-uv@3b9817b1bf26186f03ab8277bab9b827ea5cc254 # v3.2.0 | |
with: | |
enable-cache: true | |
cache-dependency-glob: | | |
**/requirements/typecheck.txt | |
**/pyproject.toml | |
- run: uv python install ${{ matrix.python-version }} | |
- name: Typecheck | |
run: | | |
uvx --with-requirements=requirements/typecheck.txt \ | |
mypy src/gpgi | |
future: | |
name: free-threading Python 3.13 | |
runs-on: ubuntu-latest | |
timeout-minutes: 20 | |
steps: | |
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
- uses: deadsnakes/action@e640ac8743173a67cca4d7d77cd837e514bf98e8 # v3.2.0 | |
with: | |
python-version: 3.13 | |
nogil: true | |
- name: Build | |
# not using uv here because it doesn't currently (0.2.33) detect python3.13t as | |
# the active interpreter, and may instead see 3.10, which is not supported in gpgi | |
run: | | |
python -m pip install -U pip | |
python -m pip install --pre setuptools wheel | |
python -m pip install --pre numpy Cython \ | |
--only-binary ':all:' \ | |
--extra-index-url \ | |
https://pypi.anaconda.org/scientific-python-nightly-wheels/simple | |
python -m pip install . --no-build-isolation --no-deps | |
- name: Install minimal test env | |
run: python -m pip install --pre pytest pytest-repeat | |
- run: python -m pip list | |
- name: Tests | |
run: | | |
pytest --color=yes | |
pytest --color=yes --count 500 tests/test_concurrent.py | |
create-issue: | |
if: ${{ failure() && github.event_name == 'schedule' }} | |
needs: [future] | |
permissions: | |
issues: write | |
runs-on: ubuntu-latest | |
name: Create issue on failure | |
steps: | |
- name: Create issue on failure | |
uses: imjohnbo/issue-bot@572eed14422c4d6ca37e870f97e7da209422f5bd # v3.4.4 | |
with: | |
title: 'TST: Upcoming dependency test failures' | |
body: | | |
The weekly build with future Python, Cython and numpy | |
has failed. Check the logs for any updates that need to be | |
made in gpgi. | |
https://github.com/${{github.repository}}/actions/runs/${{github.run_id}} | |
pinned: false | |
close-previous: false | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |