Skip to content

CI

CI #981

Workflow file for this run

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@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1
- uses: astral-sh/setup-uv@77c28f02b3322332d4a4446b3177f426da8bf086 # v3.1.5
- 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@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1
- name: Setup Python
uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0
with:
python-version: ${{ matrix.python-version }}
- uses: astral-sh/setup-uv@77c28f02b3322332d4a4446b3177f426da8bf086 # v3.1.5
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@84480863f228bb9747b473957fcc9e309aa96097 # v4.4.2
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@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1
- uses: astral-sh/setup-uv@77c28f02b3322332d4a4446b3177f426da8bf086 # v3.1.5
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@84480863f228bb9747b473957fcc9e309aa96097 # v4.4.2
with:
name: gpgi_pytest_mpl_results
path: gpgi_pytest_mpl_results/*
- name: Upload pytest-mpl baseline
if: always()
uses: actions/upload-artifact@84480863f228bb9747b473957fcc9e309aa96097 # v4.4.2
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@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1
- uses: astral-sh/setup-uv@77c28f02b3322332d4a4446b3177f426da8bf086 # v3.1.5
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@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1
- uses: astral-sh/setup-uv@77c28f02b3322332d4a4446b3177f426da8bf086 # v3.1.5
- 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@84480863f228bb9747b473957fcc9e309aa96097 # v4.4.2
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@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1
- uses: astral-sh/setup-uv@77c28f02b3322332d4a4446b3177f426da8bf086 # v3.1.5
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@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1
- 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 }}