pyo3/.github/workflows/ci.yml

507 lines
17 KiB
YAML
Raw Normal View History

name: CI
2019-11-16 12:39:59 +00:00
2020-08-16 13:36:15 +00:00
on:
push:
branches:
2021-03-16 22:14:57 +00:00
- main
2020-08-16 13:36:15 +00:00
pull_request:
2023-06-04 13:29:41 +00:00
merge_group:
types: [checks_requested]
workflow_dispatch:
2019-11-16 12:39:59 +00:00
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref_name }}
cancel-in-progress: true
2020-09-01 19:59:28 +00:00
env:
CARGO_TERM_COLOR: always
2019-11-16 12:39:59 +00:00
jobs:
2020-08-08 17:03:16 +00:00
fmt:
2022-11-21 02:52:31 +00:00
if: github.ref != 'refs/heads/main'
2020-08-08 17:03:16 +00:00
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
- run: python -m pip install --upgrade pip && pip install nox
- uses: dtolnay/rust-toolchain@stable
2020-08-08 17:03:16 +00:00
with:
2020-08-16 13:36:15 +00:00
components: rustfmt
2023-10-26 07:52:07 +00:00
- name: Check python formatting and lints (ruff)
run: nox -s ruff
2020-08-08 17:03:16 +00:00
- name: Check rust formatting (rustfmt)
2023-10-26 07:52:07 +00:00
run: nox -s rustfmt
2020-08-08 17:03:16 +00:00
2023-11-18 13:25:05 +00:00
semver-checks:
if: github.ref != 'refs/heads/main'
needs: [fmt]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
2023-11-18 13:25:05 +00:00
- uses: obi1kenobi/cargo-semver-checks-action@v2
check-msrv:
needs: [fmt]
runs-on: ubuntu-latest
if: github.ref != 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.56.0
targets: x86_64-unknown-linux-gnu
components: rust-src
- uses: actions/setup-python@v5
with:
architecture: "x64"
- uses: Swatinem/rust-cache@v2
with:
key: check-msrv-1.56.0
continue-on-error: true
- run: python -m pip install --upgrade pip && pip install nox
- name: Prepare minimal package versions
run: nox -s set-minimal-package-versions
- run: nox -s check-all
env:
CARGO_BUILD_TARGET: x86_64-unknown-linux-gnu
2020-08-08 17:03:16 +00:00
clippy:
2021-08-30 08:13:43 +00:00
needs: [fmt]
2022-12-24 19:17:25 +00:00
runs-on: ${{ matrix.platform.os }}
if: github.ref != 'refs/heads/main'
2021-08-30 08:13:43 +00:00
strategy:
# If one platform fails, allow the rest to keep testing if `CI-no-fail-fast` label is present
fail-fast: ${{ !contains(github.event.pull_request.labels.*.name, 'CI-no-fail-fast') }}
2021-08-30 08:13:43 +00:00
matrix:
2022-12-24 19:17:25 +00:00
rust: [stable]
platform: [
{
os: "macos-latest",
python-architecture: "x64",
rust-target: "x86_64-apple-darwin",
},
{
os: "ubuntu-latest",
python-architecture: "x64",
rust-target: "x86_64-unknown-linux-gnu",
},
{
os: "ubuntu-latest",
python-architecture: "x64",
rust-target: "powerpc64le-unknown-linux-gnu",
},
{
os: "ubuntu-latest",
python-architecture: "x64",
rust-target: "s390x-unknown-linux-gnu",
},
{
os: "ubuntu-latest",
python-architecture: "x64",
rust-target: "wasm32-wasi",
},
{
os: "windows-latest",
python-architecture: "x64",
rust-target: "x86_64-pc-windows-msvc",
},
{
os: "windows-latest",
python-architecture: "x86",
rust-target: "i686-pc-windows-msvc",
},
]
include:
# Run beta clippy as a way to detect any incoming lints which may affect downstream users
- rust: beta
platform:
{
os: "ubuntu-latest",
python-architecture: "x64",
rust-target: "x86_64-unknown-linux-gnu",
}
2022-12-24 19:17:25 +00:00
name: clippy/${{ matrix.platform.rust-target }}/${{ matrix.rust }}
continue-on-error: ${{ matrix.platform.rust != 'stable' }}
2021-08-30 08:13:43 +00:00
steps:
- uses: actions/checkout@v4
2022-12-24 19:17:25 +00:00
- uses: dtolnay/rust-toolchain@master
2021-08-30 08:13:43 +00:00
with:
2022-12-24 19:17:25 +00:00
toolchain: ${{ matrix.rust }}
targets: ${{ matrix.platform.rust-target }}
components: clippy,rust-src
- uses: actions/setup-python@v5
2022-12-24 19:17:25 +00:00
with:
architecture: ${{ matrix.platform.python-architecture }}
- uses: Swatinem/rust-cache@v2
with:
key: clippy-${{ matrix.platform.rust-target }}-${{ matrix.platform.os }}-${{ matrix.rust }}
continue-on-error: true
- run: python -m pip install --upgrade pip && pip install nox
2022-12-24 19:17:25 +00:00
- run: nox -s clippy-all
env:
CARGO_BUILD_TARGET: ${{ matrix.platform.rust-target }}
2021-08-30 08:13:43 +00:00
2022-11-21 02:52:31 +00:00
build-pr:
2023-06-07 21:22:32 +00:00
if: ${{ !contains(github.event.pull_request.labels.*.name, 'CI-build-full') && github.event_name == 'pull_request' }}
2022-11-21 02:52:31 +00:00
name: python${{ matrix.python-version }}-${{ matrix.platform.python-architecture }} ${{ matrix.platform.os }} rust-${{ matrix.rust }}
2022-12-24 19:17:25 +00:00
needs: [fmt]
2022-11-21 02:52:31 +00:00
uses: ./.github/workflows/build.yml
with:
os: ${{ matrix.platform.os }}
python-version: ${{ matrix.python-version }}
python-architecture: ${{ matrix.platform.python-architecture }}
rust: ${{ matrix.rust }}
rust-target: ${{ matrix.platform.rust-target }}
extra-features: ${{ matrix.platform.extra-features }}
secrets: inherit
strategy:
# If one platform fails, allow the rest to keep testing if `CI-no-fail-fast` label is present
fail-fast: ${{ !contains(github.event.pull_request.labels.*.name, 'CI-no-fail-fast') }}
matrix:
extra-features: ["multiple-pymethods"]
rust: [stable]
2023-10-02 20:12:33 +00:00
python-version: ["3.12"]
2022-11-21 02:52:31 +00:00
platform:
[
{
os: "macos-latest",
python-architecture: "x64",
rust-target: "x86_64-apple-darwin",
},
{
os: "ubuntu-latest",
python-architecture: "x64",
rust-target: "x86_64-unknown-linux-gnu",
},
{
os: "windows-latest",
python-architecture: "x64",
rust-target: "x86_64-pc-windows-msvc",
},
2022-12-24 19:17:25 +00:00
{
os: "windows-latest",
python-architecture: "x86",
rust-target: "i686-pc-windows-msvc",
},
2022-11-21 02:52:31 +00:00
]
include:
# Test nightly Rust on PRs so that PR authors have a chance to fix nightly
# failures, as nightly does not block merge.
- rust: nightly
python-version: "3.12"
platform:
{
os: "ubuntu-latest",
python-architecture: "x64",
rust-target: "x86_64-unknown-linux-gnu",
}
extra-features: "nightly multiple-pymethods"
2022-11-21 02:52:31 +00:00
build-full:
2023-06-07 21:22:32 +00:00
if: ${{ contains(github.event.pull_request.labels.*.name, 'CI-build-full') || (github.event_name != 'pull_request' && github.ref != 'refs/heads/main') }}
2022-02-14 21:47:39 +00:00
name: python${{ matrix.python-version }}-${{ matrix.platform.python-architecture }} ${{ matrix.platform.os }} rust-${{ matrix.rust }}
2022-12-24 19:17:25 +00:00
needs: [fmt]
2022-11-21 02:52:31 +00:00
uses: ./.github/workflows/build.yml
with:
os: ${{ matrix.platform.os }}
python-version: ${{ matrix.python-version }}
python-architecture: ${{ matrix.platform.python-architecture }}
rust: ${{ matrix.rust }}
rust-target: ${{ matrix.platform.rust-target }}
extra-features: ${{ matrix.platform.extra-features }}
secrets: inherit
2019-11-16 12:39:59 +00:00
strategy:
# If one platform fails, allow the rest to keep testing if `CI-no-fail-fast` label is present
fail-fast: ${{ !contains(github.event.pull_request.labels.*.name, 'CI-no-fail-fast') }}
2019-11-16 12:39:59 +00:00
matrix:
2022-11-21 02:52:31 +00:00
extra-features: ["multiple-pymethods"] # Because MSRV doesn't support this
2020-08-16 13:36:15 +00:00
rust: [stable]
2022-02-05 00:22:09 +00:00
python-version: [
"3.7",
"3.8",
"3.9",
"3.10",
2023-02-27 22:25:07 +00:00
"3.11",
2023-10-02 19:57:41 +00:00
"3.12",
2023-06-07 07:22:11 +00:00
"pypy3.7",
"pypy3.8",
"pypy3.9",
2023-07-03 10:26:45 +00:00
"pypy3.10",
2022-02-05 00:22:09 +00:00
]
platform:
[
{
os: "macos-latest",
python-architecture: "x64",
rust-target: "x86_64-apple-darwin",
},
{
os: "ubuntu-latest",
python-architecture: "x64",
rust-target: "x86_64-unknown-linux-gnu",
},
{
os: "windows-latest",
python-architecture: "x64",
rust-target: "x86_64-pc-windows-msvc",
},
]
2020-08-16 13:36:15 +00:00
include:
# Test minimal supported Rust version
2023-06-04 08:29:24 +00:00
- rust: 1.56.0
2023-10-02 20:12:33 +00:00
python-version: "3.12"
platform:
{
os: "ubuntu-latest",
python-architecture: "x64",
rust-target: "x86_64-unknown-linux-gnu",
}
2022-11-21 02:52:31 +00:00
extra-features: ""
# Test the `nightly` feature
- rust: nightly
2023-10-02 20:12:33 +00:00
python-version: "3.12"
platform:
{
os: "ubuntu-latest",
python-architecture: "x64",
rust-target: "x86_64-unknown-linux-gnu",
}
2022-11-21 02:52:31 +00:00
extra-features: "nightly multiple-pymethods"
# Run rust beta to help catch toolchain regressions
- rust: beta
python-version: "3.12"
platform:
{
os: "ubuntu-latest",
python-architecture: "x64",
rust-target: "x86_64-unknown-linux-gnu",
}
extra-features: "multiple-pymethods"
# Test 32-bit Windows only with the latest Python version
- rust: stable
2023-10-02 20:12:33 +00:00
python-version: "3.12"
platform:
{
os: "windows-latest",
python-architecture: "x86",
rust-target: "i686-pc-windows-msvc",
}
2022-11-21 02:52:31 +00:00
extra-features: "multiple-pymethods"
2022-12-14 21:30:55 +00:00
valgrind:
if: ${{ contains(github.event.pull_request.labels.*.name, 'CI-build-full') || (github.event_name != 'pull_request' && github.ref != 'refs/heads/main') }}
needs: [fmt]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
2022-11-02 01:42:55 +00:00
- uses: Swatinem/rust-cache@v2
with:
key: cargo-valgrind
continue-on-error: true
- uses: dtolnay/rust-toolchain@stable
- uses: taiki-e/install-action@valgrind
- run: python -m pip install --upgrade pip && pip install nox
- run: nox -s test-rust -- release skip-full
env:
CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUNNER: valgrind --leak-check=no --error-exitcode=1
RUST_BACKTRACE: 1
TRYBUILD: overwrite
careful:
if: ${{ contains(github.event.pull_request.labels.*.name, 'CI-build-full') || (github.event_name != 'pull_request' && github.ref != 'refs/heads/main') }}
needs: [fmt]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
2022-11-02 01:42:55 +00:00
- uses: Swatinem/rust-cache@v2
with:
key: cargo-careful
continue-on-error: true
- uses: dtolnay/rust-toolchain@nightly
with:
components: rust-src
2023-10-16 19:16:01 +00:00
- uses: taiki-e/install-action@cargo-careful
- run: python -m pip install --upgrade pip && pip install nox
- run: nox -s test-rust -- careful skip-full
env:
RUST_BACKTRACE: 1
TRYBUILD: overwrite
docsrs:
if: ${{ contains(github.event.pull_request.labels.*.name, 'CI-build-full') || (github.event_name != 'pull_request' && github.ref != 'refs/heads/main') }}
needs: [fmt]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
- uses: Swatinem/rust-cache@v2
with:
key: cargo-careful
continue-on-error: true
- uses: dtolnay/rust-toolchain@nightly
with:
components: rust-src
- run: cargo rustdoc --lib --no-default-features --features full -Zunstable-options --config "build.rustdocflags=[\"--cfg\", \"docsrs\"]"
coverage:
needs: [fmt]
name: coverage-${{ matrix.os }}
strategy:
matrix:
os: ["windows", "macos", "ubuntu"]
runs-on: ${{ matrix.os }}-latest
steps:
2022-11-21 02:52:31 +00:00
- if: ${{ github.event_name == 'pull_request' && matrix.os != 'ubuntu' }}
id: should-skip
shell: bash
run: echo 'skip=true' >> $GITHUB_OUTPUT
- uses: actions/checkout@v4
2022-11-21 02:52:31 +00:00
if: steps.should-skip.outputs.skip != 'true'
- uses: actions/setup-python@v5
2022-11-21 02:52:31 +00:00
if: steps.should-skip.outputs.skip != 'true'
2022-11-02 01:42:55 +00:00
- uses: Swatinem/rust-cache@v2
2022-11-21 02:52:31 +00:00
if: steps.should-skip.outputs.skip != 'true'
2021-04-04 07:49:27 +00:00
with:
2021-12-18 09:03:34 +00:00
key: coverage-cargo-${{ matrix.os }}
2021-04-19 08:50:25 +00:00
continue-on-error: true
- uses: dtolnay/rust-toolchain@stable
2022-11-21 02:52:31 +00:00
if: steps.should-skip.outputs.skip != 'true'
with:
components: llvm-tools-preview,rust-src
2022-01-24 22:58:36 +00:00
- name: Install cargo-llvm-cov
2022-11-21 02:52:31 +00:00
if: steps.should-skip.outputs.skip != 'true'
2022-01-24 22:58:36 +00:00
uses: taiki-e/install-action@cargo-llvm-cov
- run: python -m pip install --upgrade pip && pip install nox
2022-11-21 02:52:31 +00:00
if: steps.should-skip.outputs.skip != 'true'
- run: nox -s coverage
2022-11-21 02:52:31 +00:00
if: steps.should-skip.outputs.skip != 'true'
- uses: codecov/codecov-action@v4
2022-11-21 02:52:31 +00:00
if: steps.should-skip.outputs.skip != 'true'
with:
2023-04-12 06:35:16 +00:00
file: coverage.json
name: ${{ matrix.os }}
token: ${{ secrets.CODECOV_TOKEN }}
emscripten:
name: emscripten
if: ${{ contains(github.event.pull_request.labels.*.name, 'CI-build-full') || (github.event_name != 'pull_request' && github.ref != 'refs/heads/main') }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
2023-10-13 06:25:36 +00:00
with:
# TODO bump emscripten builds to test on 3.12
python-version: 3.11
2022-06-08 07:09:42 +00:00
id: setup-python
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-emscripten
components: rust-src
- uses: actions/setup-node@v4
with:
node-version: 14
- run: python -m pip install --upgrade pip && pip install nox
- uses: actions/cache@v4
id: cache
with:
path: |
.nox/emscripten
2022-06-08 07:09:42 +00:00
key: ${{ hashFiles('emscripten/*') }} - ${{ hashFiles('noxfile.py') }} - ${{ steps.setup-python.outputs.python-path }}
2022-11-02 01:42:55 +00:00
- uses: Swatinem/rust-cache@v2
with:
key: cargo-emscripten-wasm32
- name: Build
if: steps.cache.outputs.cache-hit != 'true'
2022-06-08 07:09:42 +00:00
run: nox -s build-emscripten
- name: Test
2022-06-08 07:09:42 +00:00
run: nox -s test-emscripten
2022-12-14 21:30:55 +00:00
2023-09-04 18:46:29 +00:00
test-debug:
needs: [fmt]
if: github.ref != 'refs/heads/main'
2023-09-04 18:46:29 +00:00
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
2023-09-04 18:46:29 +00:00
- uses: Swatinem/rust-cache@v2
with:
key: cargo-test-debug
continue-on-error: true
- uses: dtolnay/rust-toolchain@stable
with:
components: rust-src
- name: Install python3 standalone debug build with nox
run: |
2023-10-04 18:43:23 +00:00
PBS_RELEASE="20231002"
PBS_PYTHON_VERSION="3.12.0"
PBS_ARCHIVE="cpython-${PBS_PYTHON_VERSION}+${PBS_RELEASE}-x86_64-unknown-linux-gnu-debug-full.tar.zst"
wget "https://github.com/indygreg/python-build-standalone/releases/download/${PBS_RELEASE}/${PBS_ARCHIVE}"
tar -I zstd -xf "${PBS_ARCHIVE}"
2023-09-04 18:46:29 +00:00
ls -l $(pwd)/python/install/bin
ls -l $(pwd)/python/install/lib
echo PATH=$(pwd)/python/install/bin:$PATH >> $GITHUB_ENV
echo LD_LIBRARY_PATH=$(pwd)/python/install/lib:$LD_LIBRARY_PATH >> $GITHUB_ENV
echo PYTHONHOME=$(pwd)/python/install >> $GITHUB_ENV
echo PYO3_PYTHON=$(pwd)/python/install/bin/python3 >> $GITHUB_ENV
- run: python3 -m sysconfig
- run: python3 -m pip install --upgrade pip && pip install nox
- run: |
PYO3_CONFIG_FILE=$(mktemp)
cat > $PYO3_CONFIG_FILE << EOF
implementation=CPython
2023-10-04 18:43:23 +00:00
version=3.12
2023-09-04 18:46:29 +00:00
shared=true
abi3=false
2023-10-04 18:43:23 +00:00
lib_name=python3.12d
2023-09-04 18:46:29 +00:00
lib_dir=${{ github.workspace }}/python/install/lib
executable=${{ github.workspace }}/python/install/bin/python3
pointer_width=64
build_flags=Py_DEBUG,Py_REF_DEBUG
suppress_build_script_link_lines=false
EOF
echo PYO3_CONFIG_FILE=$PYO3_CONFIG_FILE >> $GITHUB_ENV
- run: python3 -m nox -s test
test-version-limits:
needs: [fmt]
if: ${{ contains(github.event.pull_request.labels.*.name, 'CI-build-full') || (github.event_name != 'pull_request' && github.ref != 'refs/heads/main') }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: Swatinem/rust-cache@v2
continue-on-error: true
- uses: dtolnay/rust-toolchain@stable
- run: python3 -m pip install --upgrade pip && pip install nox
- run: python3 -m nox -s test-version-limits
2022-11-20 13:23:05 +00:00
conclusion:
needs:
- fmt
- check-msrv
2022-11-20 13:23:05 +00:00
- clippy
2022-11-21 02:52:31 +00:00
- build-pr
- build-full
2022-11-20 13:23:05 +00:00
- valgrind
- careful
- docsrs
2022-11-20 13:23:05 +00:00
- coverage
- emscripten
- test-debug
- test-version-limits
2022-11-20 13:23:05 +00:00
if: always()
runs-on: ubuntu-latest
steps:
- name: Result
run: |
jq -C <<< "${needs}"
# Check if all needs were successful or skipped.
"$(jq -r 'all(.result as $result | (["success", "skipped"] | contains([$result])))' <<< "${needs}")"
env:
needs: ${{ toJson(needs) }}