Merge pull request #482 from PyO3/dependabot/cargo/examples/hello-wor… #1184
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 | |
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/run-on-arch-action@v2.8.1 | |
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/run-on-arch-action@v2.8.1 | |
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/cibuildwheel@v2.21.3 | |
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 pyodide@0.21.0 | |
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 |