pyo3/.github/workflows/ci.yml

419 lines
15 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:
workflow_dispatch:
2019-11-16 12:39:59 +00:00
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
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:
runs-on: ubuntu-latest
steps:
2022-06-02 06:32:51 +00:00
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
2022-02-12 09:37:46 +00:00
- run: 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
2020-08-08 17:03:16 +00:00
- name: Check python formatting (black)
2022-02-12 09:37:46 +00:00
run: nox -s fmt-py
2020-08-08 17:03:16 +00:00
- name: Check rust formatting (rustfmt)
2022-02-12 09:37:46 +00:00
run: nox -s fmt-rust
2020-08-08 17:03:16 +00:00
clippy:
runs-on: ubuntu-latest
steps:
2022-06-02 06:32:51 +00:00
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
2022-02-12 09:37:46 +00:00
- run: 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: clippy
2022-02-12 09:37:46 +00:00
- run: nox -s clippy
2020-08-08 17:03:16 +00:00
2021-08-30 08:13:43 +00:00
check-target:
needs: [fmt]
runs-on: ubuntu-latest
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:
target: [powerpc64le-unknown-linux-gnu, s390x-unknown-linux-gnu, wasm32-wasi]
name: check-${{ matrix.target }}
steps:
2022-06-02 06:32:51 +00:00
- uses: actions/checkout@v3
2021-08-30 08:13:43 +00:00
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
2021-08-30 08:13:43 +00:00
with:
targets: ${{ matrix.target }}
2021-08-30 08:13:43 +00:00
- name: Run cargo checks
run: |
set -x
VERSIONS=("3.7" "3.8" "3.9" "3.10" "3.11")
2021-08-30 08:13:43 +00:00
for VERSION in ${VERSIONS[@]}; do
echo "version=$VERSION" > config.txt
echo "suppress_build_script_link_lines=true" >> config.txt
PYO3_BUILD_CONFIG=$(pwd)/config.txt cargo check --all-targets --no-default-features
PYO3_BUILD_CONFIG=$(pwd)/config.txt cargo check --all-targets --no-default-features --features "abi3"
2022-07-03 13:38:26 +00:00
PYO3_BUILD_CONFIG=$(pwd)/config.txt cargo check --all-targets --features "full multiple-pymethods"
PYO3_BUILD_CONFIG=$(pwd)/config.txt cargo check --all-targets --features "abi3 full multiple-pymethods"
2021-08-30 08:13:43 +00:00
done
2019-11-16 12:39:59 +00:00
build:
2020-08-08 17:03:16 +00:00
needs: [fmt] # don't wait for clippy as fails rarely and takes longer
2022-02-14 21:47:39 +00:00
name: python${{ matrix.python-version }}-${{ matrix.platform.python-architecture }} ${{ matrix.platform.os }} rust-${{ matrix.rust }}
runs-on: ${{ matrix.platform.os }}
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-07-03 13:38:26 +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",
2022-10-25 17:12:15 +00:00
"3.11",
2022-03-08 20:57:25 +00:00
"pypy-3.7",
2022-02-05 00:22:09 +00:00
"pypy-3.8",
2022-02-23 08:14:52 +00:00
"pypy-3.9"
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
2021-11-18 11:38:47 +00:00
- rust: 1.48.0
python-version: "3.11"
platform:
{
os: "ubuntu-latest",
python-architecture: "x64",
rust-target: "x86_64-unknown-linux-gnu",
}
2020-08-16 13:36:15 +00:00
msrv: "MSRV"
2022-07-03 13:38:26 +00:00
extra_features: ""
# Test the `nightly` feature
- rust: nightly
python-version: "3.11"
platform:
{
os: "ubuntu-latest",
python-architecture: "x64",
rust-target: "x86_64-unknown-linux-gnu",
}
2022-07-03 13:38:26 +00:00
extra_features: "nightly multiple-pymethods"
# Test 32-bit Windows only with the latest Python version
- rust: stable
python-version: "3.11"
platform:
{
os: "windows-latest",
python-architecture: "x86",
rust-target: "i686-pc-windows-msvc",
}
2022-07-03 13:38:26 +00:00
extra_features: "multiple-pymethods"
2019-11-16 12:39:59 +00:00
steps:
2022-06-02 06:32:51 +00:00
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
architecture: ${{ matrix.platform.python-architecture }}
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@master
with:
2020-08-16 13:36:15 +00:00
toolchain: ${{ matrix.rust }}
targets: ${{ matrix.platform.rust-target }}
# needed to correctly format errors, see #1865
components: rust-src
2022-11-02 01:42:55 +00:00
- uses: Swatinem/rust-cache@v2
2021-12-18 09:03:34 +00:00
with:
key: cargo-${{ matrix.platform.python-architecture }}-${{ matrix.platform.os }}-${{ matrix.msrv }}
continue-on-error: true
2020-08-16 13:36:15 +00:00
- if: matrix.platform.os == 'ubuntu-latest'
name: Prepare LD_LIBRARY_PATH (Ubuntu only)
run: echo LD_LIBRARY_PATH=${pythonLocation}/lib >> $GITHUB_ENV
2021-03-24 22:29:00 +00:00
- if: matrix.msrv == 'MSRV'
name: Prepare minimal package versions (MSRV only)
run: |
set -x
cargo update -p indexmap --precise 1.6.2
2022-07-19 18:17:23 +00:00
cargo update -p hashbrown:0.12.3 --precise 0.9.1
PROJECTS=("." "examples/decorator" "examples/maturin-starter" "examples/setuptools-rust-starter" "examples/word-count")
for PROJ in ${PROJECTS[@]}; do
cargo update --manifest-path "$PROJ/Cargo.toml" -p parking_lot --precise 0.11.0
2022-09-21 07:56:14 +00:00
cargo update --manifest-path "$PROJ/Cargo.toml" -p once_cell --precise 1.14.0
done
cargo update --manifest-path "examples/word-count/Cargo.toml" -p rayon --precise 1.5.3
cargo update --manifest-path "examples/word-count/Cargo.toml" -p rayon-core --precise 1.9.3
cargo update -p plotters --precise 0.3.1
cargo update -p plotters-svg --precise 0.3.1
cargo update -p plotters-backend --precise 0.3.2
2022-08-18 06:47:52 +00:00
cargo update -p bumpalo --precise 3.10.0
2022-09-21 07:56:14 +00:00
cargo update -p once_cell --precise 1.14.0
cargo update -p rayon --precise 1.5.3
cargo update -p rayon-core --precise 1.9.3
2021-03-24 22:29:00 +00:00
2020-12-17 03:00:48 +00:00
- name: Build docs
run: cargo doc --no-deps --no-default-features --features "full ${{ matrix.extra_features }}"
2020-12-17 03:00:48 +00:00
- name: Build (no features)
2021-03-02 22:48:43 +00:00
run: cargo build --lib --tests --no-default-features
# --no-default-features when used with `cargo build/test -p` doesn't seem to work!
- name: Build pyo3-build-config (no features)
run: |
cd pyo3-build-config
cargo build --no-default-features
2021-03-02 22:48:43 +00:00
# Run tests (except on PyPy, because no embedding API).
2021-04-02 09:39:47 +00:00
- if: ${{ !startsWith(matrix.python-version, 'pypy') }}
2021-03-02 22:48:43 +00:00
name: Test (no features)
2021-12-03 00:03:32 +00:00
run: cargo test --no-default-features --lib --tests
# --no-default-features when used with `cargo build/test -p` doesn't seem to work!
- name: Test pyo3-build-config (no features)
run: |
cd pyo3-build-config
cargo test --no-default-features
- name: Build (all additive features)
run: cargo build --lib --tests --no-default-features --features "full ${{ matrix.extra_features }}"
2021-11-15 04:11:30 +00:00
- if: ${{ startsWith(matrix.python-version, 'pypy') }}
2021-11-19 10:45:27 +00:00
name: Build PyPy (abi3-py37)
run: cargo build --lib --tests --no-default-features --features "abi3-py37 full ${{ matrix.extra_features }}"
2021-11-15 04:11:30 +00:00
# Run tests (except on PyPy, because no embedding API).
2021-04-02 09:39:47 +00:00
- if: ${{ !startsWith(matrix.python-version, 'pypy') }}
name: Test
run: cargo test --no-default-features --features "full ${{ matrix.extra_features }}"
2020-09-19 15:27:06 +00:00
# Run tests again, but in abi3 mode
2021-04-02 09:39:47 +00:00
- if: ${{ !startsWith(matrix.python-version, 'pypy') }}
name: Test (abi3)
run: cargo test --no-default-features --features "abi3 full ${{ matrix.extra_features }}"
2021-11-19 10:45:27 +00:00
# Run tests again, for abi3-py37 (the minimal Python version)
- if: ${{ (!startsWith(matrix.python-version, 'pypy')) && (matrix.python-version != '3.7') }}
name: Test (abi3-py37)
run: cargo test --no-default-features --features "abi3-py37 full ${{ matrix.extra_features }}"
2020-12-15 13:57:09 +00:00
- name: Test proc-macro code
2021-03-02 22:48:43 +00:00
run: cargo test --manifest-path=pyo3-macros-backend/Cargo.toml
- name: Test build config
run: cargo test --manifest-path=pyo3-build-config/Cargo.toml
- name: Test python examples and tests
shell: bash
run: |
2022-01-16 16:12:40 +00:00
python -m pip install -U pip nox
nox -s test-py
2021-03-02 22:48:43 +00:00
env:
2022-01-15 22:42:20 +00:00
CARGO_TARGET_DIR: ${{ github.workspace }}/target
2021-06-27 07:08:41 +00:00
- name: Test cross compilation
if: ${{ matrix.platform.os == 'ubuntu-latest' && matrix.python-version == '3.9' }}
2022-11-04 06:21:45 +00:00
uses: PyO3/maturin-action@v1
2021-06-27 07:08:41 +00:00
env:
PYO3_CROSS_LIB_DIR: /opt/python/cp39-cp39/lib
with:
target: aarch64-unknown-linux-gnu
manylinux: auto
2022-08-18 06:51:19 +00:00
args: --release -i python3.9 -m examples/maturin-starter/Cargo.toml
2021-06-27 07:08:41 +00:00
2022-03-16 04:01:43 +00:00
- run: sudo rm -rf examples/maturin-starter/target
if: ${{ matrix.platform.os == 'ubuntu-latest' && matrix.python-version == '3.9' }}
- name: Test cross compile to same architecture
if: ${{ matrix.platform.os == 'ubuntu-latest' && matrix.python-version == '3.9' }}
2022-11-04 06:21:45 +00:00
uses: PyO3/maturin-action@v1
2022-03-16 04:01:43 +00:00
env:
PYO3_CROSS_LIB_DIR: /opt/python/cp39-cp39/lib
with:
target: x86_64-unknown-linux-gnu
manylinux: auto
2022-08-18 06:51:19 +00:00
args: --release -i python3.9 -m examples/maturin-starter/Cargo.toml
2022-03-16 04:01:43 +00:00
2022-03-02 03:45:17 +00:00
- name: Test cross compilation
if: ${{ matrix.platform.os == 'macos-latest' && matrix.python-version == '3.9' }}
2022-11-04 06:21:45 +00:00
uses: PyO3/maturin-action@v1
2022-03-02 03:45:17 +00:00
with:
target: aarch64-apple-darwin
2022-08-18 06:51:19 +00:00
args: --release -i python3.9 -m examples/maturin-starter/Cargo.toml
2022-03-02 03:45:17 +00:00
- name: Test cross compile to Windows
if: ${{ matrix.platform.os == 'ubuntu-latest' && matrix.python-version == '3.8' }}
env:
XWIN_ARCH: x86_64
run: |
set -ex
sudo apt-get install -y mingw-w64 llvm
rustup target add x86_64-pc-windows-gnu x86_64-pc-windows-msvc
python -m pip install cargo-xwin
# abi3
cargo build --manifest-path examples/maturin-starter/Cargo.toml --features abi3 --target x86_64-pc-windows-gnu
cargo xwin build --manifest-path examples/maturin-starter/Cargo.toml --features abi3 --target x86_64-pc-windows-msvc
# non-abi3
export PYO3_CROSS_PYTHON_VERSION=3.9
cargo build --manifest-path examples/maturin-starter/Cargo.toml --features generate-import-lib --target x86_64-pc-windows-gnu
cargo xwin build --manifest-path examples/maturin-starter/Cargo.toml --features generate-import-lib --target x86_64-pc-windows-msvc
- name: Test cross compile to Windows with maturin
if: ${{ matrix.platform.os == 'ubuntu-latest' && matrix.python-version == '3.8' }}
2022-11-04 06:21:45 +00:00
uses: PyO3/maturin-action@v1
with:
target: x86_64-pc-windows-gnu
2022-08-18 06:51:19 +00:00
args: -i python3.8 -m examples/maturin-starter/Cargo.toml --features abi3
2020-01-12 14:33:34 +00:00
env:
2021-03-02 22:48:43 +00:00
CARGO_TERM_VERBOSE: true
CARGO_BUILD_TARGET: ${{ matrix.platform.rust-target }}
2020-01-12 14:33:34 +00:00
RUST_BACKTRACE: 1
2020-12-26 08:11:19 +00:00
RUSTFLAGS: "-D warnings"
2021-03-04 19:41:11 +00:00
RUSTDOCFLAGS: "-D warnings"
# TODO: this is a hack to workaround compile_error! warnings about auto-initialize on PyPy
# Once cargo's `resolver = "2"` is stable (~ MSRV Rust 1.52), remove this.
PYO3_CI: 1
2021-12-03 00:03:32 +00:00
# This is a hack to make CARGO_PRIMARY_PACKAGE always set even for the
# msrv job. MSRV is currently 1.48, but CARGO_PRIMARY_PACKAGE only came in
# 1.49.
CARGO_PRIMARY_PACKAGE: 1
valgrind:
needs: [fmt]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: "3.11"
2022-11-02 01:42:55 +00:00
- uses: Swatinem/rust-cache@v2
with:
key: cargo-valgrind
continue-on-error: true
# FIXME(adamreichold): Switch to stable when Valgrind understands DWARF5 as generated by LLVM 14,
# c.f. https://bugs.kde.org/show_bug.cgi?id=452758#c35
- uses: dtolnay/rust-toolchain@1.61.0
- uses: taiki-e/install-action@valgrind
- run: python -m pip install -U pip 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:
needs: [fmt]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: "3.11"
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
- run: cargo install cargo-careful
- run: python -m pip install -U pip nox
- run: nox -s test-rust -- careful skip-full
env:
RUST_BACKTRACE: 1
TRYBUILD: overwrite
coverage:
needs: [fmt]
name: coverage-${{ matrix.os }}
strategy:
matrix:
os: ["windows", "macos", "ubuntu"]
runs-on: ${{ matrix.os }}-latest
steps:
2022-06-02 06:32:51 +00:00
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
2021-10-24 10:25:10 +00:00
with:
python-version: "3.11"
2022-11-02 01:42:55 +00:00
- uses: Swatinem/rust-cache@v2
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
with:
components: llvm-tools-preview
2022-01-24 22:58:36 +00:00
- name: Install cargo-llvm-cov
uses: taiki-e/install-action@cargo-llvm-cov
2022-02-04 08:53:12 +00:00
- run: python -m pip install -U pip nox
- run: nox -s coverage
- uses: codecov/codecov-action@v3
with:
2021-04-04 07:49:27 +00:00
file: coverage.lcov
name: ${{ matrix.os }}
emscripten:
name: emscripten
runs-on: ubuntu-latest
steps:
2022-11-05 10:41:09 +00:00
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
2022-06-08 07:09:42 +00:00
id: setup-python
with:
python-version: "3.11"
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-emscripten
- uses: actions/setup-node@v3
with:
node-version: 14
- run: pip install nox
- uses: actions/cache@v3
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