Skip to content

CI

CI #711

Workflow file for this run

name: CI
on:
push:
paths:
- '**'
- '!.github/**'
- '.github/workflows/ci.yml'
pull_request:
paths:
- '**'
- '!.github/**'
- '.github/workflows/ci.yml'
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
ci:
strategy:
# Allows for matrix sub-jobs to fail without canceling the rest
fail-fast: false
# MATRIX:
# =======
# Required parameters:
# os the os to run on
# python-version the python version to use
# backend the backend to use
# env any additional env variables. Set to '{}' for none
# Optional parameters:
# allowed_failure whether the job is allowed to fail
# extra_hash extra hash str to differentiate from other caches with similar name (must always start with '-')
matrix:
# Tests [amd64]
#
# FIXME: 'cpp' tests seems to fail due to compilation errors (numpy_pythran_unit)
# in all python versions and test failures (builtin_float) in 3.5<
os: [ubuntu-22.04, windows-2019, macos-13]
backend: [c, cpp]
python-version:
- "3.8"
- "3.9"
- "3.10"
- "3.11"
- "3.12"
- "3.13"
env: [{}]
include:
#- python-version: "3.13"
# allowed_failure: true
# Ubuntu sub-jobs:
# ================
# graalpy is really slow...
- os: ubuntu-22.04
python-version: graalpy24
backend: c
env: { NO_CYTHON_COMPILE: 1 }
allowed_failure: true
# GCC 13 (with broad language standards)
- os: ubuntu-22.04
python-version: "3.9"
backend: c
env: { GCC_VERSION: 13, EXTRA_CFLAGS: "-std=c99" }
extra_hash: "-c99"
- os: ubuntu-22.04
python-version: "3.10"
backend: c
env: { GCC_VERSION: 13, EXTRA_CFLAGS: "-std=c17" }
extra_hash: "-gcc11"
- os: ubuntu-22.04
python-version: "3.12"
backend: c
env: { GCC_VERSION: 13, EXTRA_CFLAGS: "-std=c17" }
extra_hash: "-gcc11"
- os: ubuntu-22.04
python-version: "3.13"
backend: cpp
env: { GCC_VERSION: 13, EXTRA_CFLAGS: "-std=c++20" }
extra_hash: "-gcc11"
# compile all modules
- os: ubuntu-22.04
python-version: "3.8"
backend: c
env: { CYTHON_COMPILE_ALL: 1 }
extra_hash: "-all"
- os: ubuntu-22.04
python-version: "3.8"
backend: cpp
env: { CYTHON_COMPILE_ALL: 1 }
extra_hash: "-all"
- os: ubuntu-22.04
python-version: "3.11"
backend: c
env: { CYTHON_COMPILE_ALL: 1 }
extra_hash: "-all"
- os: ubuntu-22.04
python-version: "3.11"
backend: cpp
env: { CYTHON_COMPILE_ALL: 1 }
extra_hash: "-all"
# Linting
- os: ubuntu-22.04
python-version: "3.9"
backend: "c,cpp"
env: { TEST_CODE_STYLE: 1, NO_CYTHON_COMPILE: 1 }
extra_hash: "-codestyle"
# Limited API
- os: ubuntu-22.04
python-version: "3.8"
backend: "c,cpp"
env: { LIMITED_API: "--limited-api", NO_LIMITED_COMPILE: 1, EXCLUDE: "--no-file" }
extra_hash: "-limited_api"
- os: ubuntu-22.04
python-version: "3.11"
backend: "c,cpp"
env: { LIMITED_API: "--limited-api", EXCLUDE: "--no-file" }
extra_hash: "-limited_api"
- os: ubuntu-22.04
python-version: "3.12"
allowed_failure: true
backend: "c,cpp"
env: { LIMITED_API: "--limited-api", EXCLUDE: "--no-file" }
extra_hash: "-limited_api"
- os: ubuntu-22.04
python-version: "3.13"
allowed_failure: true
backend: "c,cpp"
env: { LIMITED_API: "--limited-api", EXCLUDE: "--no-file" }
extra_hash: "-limited_api"
# Type specs
- os: ubuntu-22.04
python-version: "3.12"
backend: c
env: { EXTRA_CFLAGS: "-DCYTHON_USE_TYPE_SPECS=1" }
extra_hash: "-typespecs"
- os: ubuntu-22.04
python-version: "3.9"
backend: c
env: { EXTRA_CFLAGS: "-DCYTHON_USE_TYPE_SPECS=1" }
extra_hash: "-typespecs"
- os: ubuntu-22.04
python-version: "3.8"
backend: c
env: { EXTRA_CFLAGS: "-DCYTHON_USE_TYPE_SPECS=1" }
extra_hash: "-typespecs"
# Stackless
- os: ubuntu-22.04
python-version: "3.8"
backend: c
env: { STACKLESS: true, PY: 3 }
extra_hash: "-stackless"
# Pypy
- os: ubuntu-22.04
python-version: pypy-3.9
backend: c
env: { NO_CYTHON_COMPILE: 1 }
- os: ubuntu-22.04
python-version: pypy-3.10
backend: c
env: { NO_CYTHON_COMPILE: 1 }
# Free-threading
- os: ubuntu-22.04
python-version: 3.13-freethreading
backend: "c,cpp"
env: {}
allowed_failure: true
# This defaults to 360 minutes (6h) which is way too long and if a test gets stuck, it can block other pipelines.
# From testing, the runs tend to take ~20 minutes for ubuntu / macos and ~40 for windows,
# so a limit of 80 minutes should be enough. This can always be changed in the future if needed.
timeout-minutes: 80
runs-on: ${{ matrix.os }}
env:
BACKEND: ${{ matrix.backend }}
PYTHON_VERSION: ${{ matrix.python-version }}
MACOSX_DEPLOYMENT_TARGET: "11.0"
GCC_VERSION: 10
USE_CCACHE: 1
CCACHE_SLOPPINESS: "pch_defines,time_macros"
CCACHE_COMPRESS: 1
CCACHE_MAXSIZE: "200M"
steps:
- name: Checkout repo
uses: actions/checkout@v4.1.1
with:
fetch-depth: 1
- name: Setup python
uses: actions/setup-python@v5.0.0
if: "!endsWith(matrix.python-version, '-freethreading')"
with:
python-version: ${{ matrix.python-version }}
- name: Setup python from deadsnakes
uses: deadsnakes/action@v3.1.0
if: "endsWith(matrix.python-version, '-freethreading')"
with:
python-version: "3.13"
nogil: true
- name: Compilation Cache
uses: hendrikmuhs/ccache-action@v1.2.12
with:
variant: ${{ startsWith(runner.os, 'windows') && 'sccache' || 'ccache' }} # fake ternary
key: ${{ runner.os }}-hendrikmuhs-ccache${{ matrix.extra_hash }}-${{ matrix.python-version }}-${{ matrix.backend == 'c' || matrix.backend == 'c,cpp' }}-${{ contains(matrix.backend, 'cpp') }}-${{ hashFiles('test-requirements*.txt', '.github/**/ci.yml', 'Tools/**/ci-run.sh') }}
max-size: ${{ env.CCACHE_MAXSIZE }}
- name: Run CI
continue-on-error: ${{ matrix.allowed_failure || false }}
env: ${{ matrix.env }}
run: bash ./Tools/ci-run.sh
- name: Upload HTML docs
uses: actions/upload-artifact@v4.3.0
with:
name: htmldocs
path: docs/build/html
if-no-files-found: ignore
- name: Upload wheels
uses: actions/upload-artifact@v4.3.0
with:
name: wheels-${{ runner.os }}-${{ matrix.python-version }}${{ matrix.extra_hash }}
path: dist/*.whl
if-no-files-found: ignore
pycoverage:
runs-on: ubuntu-22.04
env:
BACKEND: c,cpp
OS_NAME: ubuntu-22.04
PYTHON_VERSION: "3.11"
steps:
- name: Checkout repo
uses: actions/checkout@v4.1.1
- name: Setup python
uses: actions/setup-python@v5.0.0
with:
python-version: "3.11"
- name: Run Coverage
env: { COVERAGE: 1, NO_CYTHON_COMPILE: 1 }
run: bash ./Tools/ci-run.sh
- name: Upload Coverage Report
uses: actions/upload-artifact@v4.3.0
with:
name: pycoverage_html
path: coverage-report-html
cycoverage:
runs-on: ubuntu-22.04
env:
BACKEND: c,cpp
OS_NAME: ubuntu-22.04
PYTHON_VERSION: "3.11"
steps:
- name: Checkout repo
uses: actions/checkout@v4.1.1
with:
fetch-depth: 1
- name: Setup python
uses: actions/setup-python@v5.0.0
with:
python-version: "3.11"
- name: Run Coverage
env: { COVERAGE: 1 }
run: bash ./Tools/ci-run.sh
- name: Upload Coverage Report
uses: actions/upload-artifact@v4.3.0
with:
name: cycoverage_html
path: coverage-report-html
codespell:
name: Check for spelling errors
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4.1.1
- name: Codespell
uses: codespell-project/actions-codespell@v2