CI/CD #13612
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/CD | |
on: | |
push: | |
pull_request: | |
branches: | |
- main | |
- release/v* | |
# Run daily at 0:01 UTC | |
schedule: | |
- cron: '1 0 * * *' | |
workflow_dispatch: | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
permissions: | |
contents: read | |
jobs: | |
test: | |
runs-on: ${{ matrix.os }} | |
# On push events run the CI only on main by default, but run on any branch if the commit message contains '[ci all]' | |
if: >- | |
github.event_name != 'push' | |
|| (github.event_name == 'push' && github.ref == 'refs/heads/main') | |
|| (github.event_name == 'push' && github.ref != 'refs/heads/main' && contains(github.event.head_commit.message, '[ci all]')) | |
strategy: | |
matrix: | |
os: [ubuntu-latest] | |
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] | |
include: | |
- os: macos-latest | |
python-version: '3.12' | |
# Intel runner | |
- os: macos-13 | |
python-version: '3.12' | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Set up Python ${{ matrix.python-version }} | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python-version }} | |
- name: Install dependencies | |
if: matrix.python-version != '3.8' | |
run: | | |
python -m pip install uv | |
uv pip install --system --upgrade ".[all,test]" | |
# c.f. https://github.com/astral-sh/uv/issues/2062 | |
- name: Install dependencies (Python 3.8) | |
if: matrix.python-version == '3.8' | |
run: | | |
python -m pip install --upgrade pip | |
python -m pip install --upgrade ".[all,test]" | |
- name: List installed Python packages | |
run: python -m pip list | |
- name: Test with pytest and coverage | |
run: | | |
coverage run --module pytest --ignore tests/contrib --ignore tests/benchmarks --ignore tests/test_notebooks.py | |
- name: Launch a tmate session if tests fail | |
if: failure() && github.event_name == 'workflow_dispatch' | |
uses: mxschmitt/action-tmate@v3 | |
- name: Coverage report for core project | |
run: | | |
coverage report | |
coverage xml | |
# Report coverage for oldest and newest Python tested to deal with version differences | |
- name: Report core project coverage with Codecov | |
if: >- | |
github.event_name != 'schedule' && | |
matrix.os == 'ubuntu-latest' | |
uses: codecov/codecov-action@v5 | |
with: | |
fail_ci_if_error: true | |
files: ./coverage.xml | |
flags: unittests-${{ matrix.python-version }} | |
token: ${{ secrets.CODECOV_TOKEN }} | |
- name: Test Contrib module with pytest | |
run: | | |
coverage run --append --module pytest tests/contrib --mpl --mpl-baseline-path tests/contrib/baseline | |
- name: Coverage report with contrib | |
run: | | |
coverage report | |
coverage xml | |
- name: Report contrib coverage with Codecov | |
if: github.event_name != 'schedule' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-latest' | |
uses: codecov/codecov-action@v5 | |
with: | |
fail_ci_if_error: true | |
files: ./coverage.xml | |
flags: contrib | |
token: ${{ secrets.CODECOV_TOKEN }} | |
- name: Test docstring examples with doctest | |
# TODO: Don't currently try to match amd64 and arm64 floating point for docs, but will in the future. | |
if: matrix.python-version == '3.12' && matrix.os != 'macos-latest' | |
run: coverage run --data-file=.coverage-doctest --module pytest src/ README.rst | |
- name: Coverage report for doctest only | |
if: matrix.python-version == '3.12' && matrix.os != 'macos-latest' | |
run: | | |
coverage report --data-file=.coverage-doctest | |
coverage xml --data-file=.coverage-doctest -o doctest-coverage.xml | |
- name: Report doctest coverage with Codecov | |
if: github.event_name != 'schedule' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-latest' | |
uses: codecov/codecov-action@v5 | |
with: | |
fail_ci_if_error: true | |
files: doctest-coverage.xml | |
flags: doctest | |
token: ${{ secrets.CODECOV_TOKEN }} | |
- name: Run benchmarks | |
if: github.event_name == 'schedule' && matrix.python-version == '3.12' | |
run: | | |
pytest --benchmark-sort=mean tests/benchmarks/test_benchmark.py |