Skip to content

CI

CI #596

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@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: 3.x
- run: |
python -m pip install --upgrade pip
python -m pip install --upgrade check-manifest
python -m pip install --upgrade build
- name: Check build
run: |
python -m check_manifest
python -m build
unit-tests:
strategy:
matrix:
os:
- ubuntu-latest
python-version:
- '3.10'
- '3.11'
- '3.12'
include:
- os: macos-latest
python-version: '3.12'
- os: windows-latest
python-version: '3.12'
# test with minimal requirements
- os: ubuntu-20.04
python-version: '3.10'
deps: minimal
runs-on: ${{ matrix.os }}
steps:
- name: Checkout Source
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Upgrade pip
run: python -m pip install --upgrade pip
- if: matrix.deps == 'minimal'
run: |
pipx run uv pip compile pyproject.toml --resolution=lowest-direct > mindeps.txt
python -m pip install --requirement mindeps.txt
- name: Build library
# install in editable mode to allow coverage measurement
run: python -m pip install --editable .
- run: python -m pip install --requirement requirements/tests.txt
- run: python -m pip list
- name: Test
run: |
python -m pip list
python -m coverage run --parallel-mode -m pytest --color=yes
- 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@v4
with:
name: gpgi_coverage_data-${{ matrix.os }}-${{ matrix.python-version }}
path: .coverage.*
if-no-files-found: ignore
image-tests:
name: Image tests
runs-on: ubuntu-latest
steps:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: 3.x
- uses: actions/checkout@v4
- name: Build library
run: |
python -m pip install --upgrade pip
python -m pip install .
- run: python -m pip install --requirement requirements/tests.txt
- name: Run Image Tests
run: |
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: |
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@v4
with:
name: gpgi_pytest_mpl_results
path: gpgi_pytest_mpl_results/*
- name: Upload pytest-mpl baseline
if: always()
uses: actions/upload-artifact@v4
with:
name: gpgi_pytest_mpl_new_baseline
path: gpgi_pytest_mpl_new_baseline/*
if-no-files-found: ignore
coverage:
name: Combine & check coverage.
runs-on: ubuntu-latest
needs: unit-tests
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
# Use latest Python, so it understands all syntax.
python-version: 3.x
- run: python -m pip install --upgrade coverage[toml]
- uses: actions/download-artifact@v4
with:
pattern: gpgi_coverage_data-*
merge-multiple: true
- name: Check coverage
run: |
python -m coverage combine
python -m coverage html --skip-covered --skip-empty
python -m coverage report --fail-under=100
- name: Upload HTML report if check failed.
uses: actions/upload-artifact@v4
with:
name: gpgi_coverage_report
path: htmlcov
if: ${{ failure() }}
typecheck:
strategy:
matrix:
python-version:
- '3.10'
- '3.12'
runs-on: ubuntu-latest
name: type check
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Build
run: |
python -m pip install --upgrade pip
python -m pip install --requirement requirements/typecheck.txt
- name: Typecheck
run: |
python -m pip freeze
mypy src/gpgi
future:
if: ${{ github.event_name == 'schedule' || github.event_name == 'push' }}
runs-on: ubuntu-latest
name: future proofing
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: 3.12-dev
- name: Build
run: |
python -m pip install --upgrade pip
python -m pip install --pre setuptools wheel Cython
python -m pip install --pre numpy \
--extra-index https://pypi.anaconda.org/scientific-python-nightly-wheels/simple
python -m pip install . --no-build-isolation
- name: Install minimal test env
run: |
python -m pip install --pre pytest
- name: Tests
run: |
python -m pip list
pytest --color=yes
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@v3
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 }}