Skip to content

Merge pull request #477 from PyO3/dependabot/cargo/examples/hello-wor… #1167

Merge pull request #477 from PyO3/dependabot/cargo/examples/hello-wor…

Merge pull request #477 from PyO3/dependabot/cargo/examples/hello-wor… #1167

Workflow file for this run

name: CI
on:
push:
branches:
- main
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
jobs:
ruff:
runs-on: "ubuntu-latest"
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.x"
- run: pip install nox
- run: nox -s ruff
mypy:
runs-on: "ubuntu-latest"
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.x"
- run: pip install nox
- run: nox -s mypy
pytest:
runs-on: "ubuntu-latest"
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- run: pip install nox
- run: nox -s test
build:
name: ${{ matrix.python-version }} ${{ matrix.platform.os }}-${{ matrix.platform.python-architecture }}
runs-on: ${{ matrix.platform.os }}
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:
python-version:
["3.9", "3.10", "3.11", "3.12", "3.13", pypy-3.9, pypy-3.10]
platform:
[
{
os: "macos-latest",
python-architecture: "arm64",
rust-target: "aarch64-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",
},
]
include:
# Just test one x86 Windows Python for simplicity
- python-version: 3.12
platform:
{
os: "windows-latest",
python-architecture: "x86",
rust-target: "i686-pc-windows-msvc",
}
# Just test one x64 macOS Python for simplicity
- python-version: 3.12
platform:
{
os: "macos-13",
python-architecture: "x64",
rust-target: "x86_64-apple-darwin",
}
# Just test one x64 macOS Python for simplicity
exclude:
# macOS arm doesn't have Python builds before 3.10
- python-version: 3.9
platform:
{
os: "macos-latest",
python-architecture: "arm64",
rust-target: "aarch64-apple-darwin",
}
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
architecture: ${{ matrix.platform.python-architecture }}
allow-prereleases: true
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.platform.rust-target }}
- name: Install test dependencies
run: pip install --upgrade nox
- name: Build package
run: pip install -e .
- name: Test examples
shell: bash
env:
PYTHON: ${{ matrix.python-version }}
run: nox -s test-examples
- name: Test macOS universal2
if: ${{ startsWith(matrix.platform.os, 'macos') && !startsWith(matrix.python-version, 'pypy') }}
shell: bash
env:
MACOSX_DEPLOYMENT_TARGET: "10.9"
ARCHFLAGS: -arch x86_64 -arch arm64
run: |
rustup target add aarch64-apple-darwin
rustup target add x86_64-apple-darwin
cd examples/namespace_package
pip install build 'setuptools>=70.1'
python -m build --no-isolation
ls -l dist/
pip install --force-reinstall dist/namespace_package*_universal2.whl
cd -
python -c "from namespace_package import rust; assert rust.rust_func() == 14"
python -c "from namespace_package import python; assert python.python_func() == 15"
- name: Test sdist vendor Rust crates
shell: bash
run: nox -s test-sdist-vendor
env:
CARGO_BUILD_TARGET: ${{ matrix.platform.rust-target }}
test-abi3:
runs-on: ${{ matrix.os }}
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:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v4
- name: Setup python
uses: actions/setup-python@v5
with:
python-version: 3.9
- uses: dtolnay/rust-toolchain@stable
- name: Build package
run: pip install -e .
- name: Build an abi3 wheel
shell: bash
env:
# https://github.com/actions/setup-python/issues/26
MACOSX_DEPLOYMENT_TARGET: 10.9
DIST_EXTRA_CONFIG: /tmp/build-opts.cfg
run: |
set -e
cd examples/rust_with_cffi/
python --version
pip install -U build cffi 'setuptools>=70.1'
echo -e "[bdist_wheel]\npy_limited_api=cp39" > $DIST_EXTRA_CONFIG
python -m build --no-isolation
ls -la dist/
# Now we switch to a differnet Python version and ensure we can install
# the wheel we just built.
- name: Setup python
uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Install abi3 wheel and run tests
shell: bash
run: |
set -e
cd examples/
python --version
pip install rust_with_cffi/dist/rust_with_cffi*.whl
python -c "from rust_with_cffi import rust; assert rust.rust_func() == 14"
python -c "from rust_with_cffi.cffi import lib; assert lib.cffi_func() == 15"
- name: Run abi3audit
shell: bash
run: |
set -e
pip install abi3audit
cd examples/
abi3audit rust_with_cffi/dist/rust_with_cffi*.whl
test-crossenv:
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') }}
matrix:
platform: [{ arch: "aarch64" }, { arch: "armv7" }]
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.x"
- uses: docker/setup-qemu-action@v3
- run: pip install nox
- run: nox -s test-crossenv -- ${{ matrix.platform.arch }}
test-cross:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup python
uses: actions/setup-python@v5
with:
python-version: "3.10" # must match the ubuntu version in the install, and also the STANDALONE_PYTHON_VERSION below
- uses: dtolnay/rust-toolchain@stable
- name: Install cross
uses: taiki-e/install-action@v2
with:
tool: cross
- name: Build package
run: pip install -e .
- name: Build wheel using cross
shell: bash
env:
CARGO: cross
CARGO_BUILD_TARGET: aarch64-unknown-linux-gnu
PYO3_CROSS_LIB_DIR: /opt/python/cp310-cp310/lib
DIST_EXTRA_CONFIG: /tmp/build-opts.cfg
run: |
cd examples/namespace_package
docker build \
--build-arg STANDALONE_PYTHON_VERSION=3.10.15 \
--build-arg STANDALONE_PYTHON_RELEASE=20241016 \
-t cross-pyo3:aarch64-unknown-linux-gnu \
.
python -m pip install build wheel
echo -e "[bdist_wheel]\nplat_name=manylinux2014_aarch64" > $DIST_EXTRA_CONFIG
python -m build --no-isolation
ls -la dist/
unzip -l dist/*.whl # debug all files inside wheel file
- uses: uraimo/[email protected]
name: Install built wheel
with:
arch: aarch64
distro: ubuntu22.04
dockerRunArgs: |
--volume "${PWD}/examples/namespace_package:/io"
install: |
apt-get update
apt-get install -y --no-install-recommends python3 python3-venv python3-pip
pip3 install -U pip
run: |
python3 -m venv .venv
source .venv/bin/activate
pip install namespace_package --no-index --find-links /io/dist/ --force-reinstall
python -c "from namespace_package import rust; assert rust.rust_func() == 14"
python -c "from namespace_package import python; assert python.python_func() == 15"
test-zigbuild:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup python
uses: actions/setup-python@v5
with:
python-version: "3.10" # must match the ubuntu version in the install, and also the version copied out of the docker image below
- uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-unknown-linux-gnu
- name: Install cargo-zigbuild
run: |
python3 -m pip install cargo-zigbuild
- name: Build package
run: pip install -e .
- name: Build wheel using cargo-zigbuild
shell: bash
env:
CARGO: cargo-zigbuild
CARGO_BUILD_TARGET: aarch64-unknown-linux-gnu
PYO3_CROSS_LIB_DIR: /opt/python/cp310-cp310/lib
DIST_EXTRA_CONFIG: /tmp/build-opts.cfg
run: |
mkdir -p $PYO3_CROSS_LIB_DIR
docker cp -L $(docker create --rm quay.io/pypa/manylinux2014_aarch64:latest):/opt/python/cp310-cp310 /opt/python
cd examples/namespace_package
python -m pip install build wheel
echo -e "[bdist_wheel]\nplat_name=manylinux2014_aarch64" > $DIST_EXTRA_CONFIG
python -m build --no-isolation
ls -la dist/
unzip -l dist/*.whl # debug all files inside wheel file
- uses: uraimo/[email protected]
name: Install built wheel
with:
arch: aarch64
distro: ubuntu22.04
dockerRunArgs: |
--volume "${PWD}/examples/namespace_package:/io"
install: |
apt-get update
apt-get install -y --no-install-recommends python3 python3-venv python3-pip
run: |
python3 -m venv .venv
source .venv/bin/activate
pip install namespace_package --no-index --find-links /io/dist/ --force-reinstall
python -c "from namespace_package import rust; assert rust.rust_func() == 14"
python -c "from namespace_package import python; assert python.python_func() == 15"
test-cibuildwheel:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-apple-darwin,x86_64-apple-darwin
- uses: pypa/[email protected]
env:
CIBW_BUILD: cp39-*
CIBW_BEFORE_BUILD: >
pip install -U 'pip>=23.2.1' 'setuptools>=70.1.0' 'auditwheel>=5.4.0'
&& pip install -e .
&& pip list
CIBW_ARCHS_MACOS: "x86_64 universal2 arm64"
CIBW_BUILD_VERBOSITY: 3
CIBW_BUILD_FRONTEND: "build; args: --no-isolation"
with:
package-dir: examples/namespace_package
test-mingw:
runs-on: windows-latest
name: ${{ matrix.python-version }} mingw-${{ matrix.arch }}
strategy:
fail-fast: false
matrix:
include:
[
{
msystem: MINGW64,
arch: x86_64,
path: mingw64,
rust_target: x86_64-pc-windows-gnu,
},
{
msystem: MINGW32,
arch: i686,
path: mingw32,
rust_target: i686-pc-windows-gnu,
},
]
steps:
- uses: actions/checkout@v4
- name: Install MSys2 and dependencies
uses: msys2/setup-msys2@v2
with:
update: true
msystem: ${{ matrix.msystem }}
install: >-
git
mingw-w64-${{ matrix.arch }}-python
mingw-w64-${{ matrix.arch }}-python-pip
mingw-w64-${{ matrix.arch }}-openssl
mingw-w64-${{ matrix.arch }}-toolchain
- uses: dtolnay/rust-toolchain@master
with:
toolchain: stable-${{ matrix.rust_target }}
- name: Install test dependencies
shell: msys2 {0}
run: python -m pip install --upgrade nox pip
- name: Create libpython symlink
shell: msys2 {0}
run: ln -s /${{ matrix.path }}/lib/libpython3.11.dll.a /${{ matrix.path }}/lib/libpython311.dll.a
- name: Test examples
shell: msys2 {0}
run: |
PATH="$PATH:/c/Users/runneradmin/.cargo/bin" nox -s test-mingw
test-emscripten:
name: Test Emscripten
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18
- run: |
PYODIDE_VERSION=0.21.0
cd emscripten
npm i [email protected]
cd node_modules/pyodide/
npx -y prettier -w pyodide.asm.js
EMSCRIPTEN_VERSION=$(node -p "require('./repodata.json').info.platform.split('_').slice(1).join('.')")
PYTHON_VERSION=3.10
echo "PYODIDE_VERSION=$PYODIDE_VERSION" >> $GITHUB_ENV
echo "EMSCRIPTEN_VERSION=$EMSCRIPTEN_VERSION" >> $GITHUB_ENV
echo "PYTHON_VERSION=$PYTHON_VERSION" >> $GITHUB_ENV
echo "ORIG_PATH=$PATH" >> $GITHUB_ENV
- uses: dtolnay/rust-toolchain@nightly
with:
components: rust-src
targets: wasm32-unknown-emscripten
- uses: mymindstorm/setup-emsdk@v14
with:
version: ${{env.EMSCRIPTEN_VERSION}}
actions-cache-folder: emsdk-cache
- uses: actions/setup-python@v5
id: setup-python
with:
python-version: ${{env.PYTHON_VERSION}}
- run: pip install nox
- uses: actions/cache@v4
with:
path: |
tests/pyodide
key: ${{ hashFiles('tests/*.js') }} - ${{ hashFiles('noxfile.py') }} - ${{ steps.setup-python.outputs.python-path }}
- uses: Swatinem/rust-cache@v2
- name: Test
run: |
export PATH=$ORIG_PATH:$PATH
nox -s test-examples-emscripten