Skip to content

Python 3.12 support #682

Python 3.12 support

Python 3.12 support #682

Workflow file for this run

name: Build
on:
workflow_dispatch:
push:
branches: [ master ]
tags:
- v*
pull_request:
branches: [ master ]
env:
CARGO_TERM_COLOR: always
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: 3.11
- uses: pre-commit/action@v3.0.0
build:
runs-on: ${{ matrix.os }}
needs: [lint]
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v3
- uses: Swatinem/rust-cache@v2
- name: Install Dependencies
run: sudo apt install libunwind-dev
if: runner.os == 'Linux'
- uses: actions/setup-python@v4
with:
python-version: 3.9
- name: Build
run: cargo build --release --verbose --examples
- uses: actions/setup-python@v4
with:
python-version: 3.9
- name: Test
id: test
continue-on-error: true
run: cargo test --release
- name: Test (retry#1)
id: test1
run: cargo test --release
if: steps.test.outcome=='failure'
continue-on-error: true
- name: Test (retry#2)
run: cargo test --release
if: steps.test1.outcome=='failure'
- name: Build Wheel
run: |
pip install --upgrade maturin
maturin build --release -o dist --all-features
if: runner.os == 'Windows'
- name: Build Wheel - universal2
env:
DEVELOPER_DIR: /Applications/Xcode.app/Contents/Developer
SDKROOT: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
MACOSX_DEPLOYMENT_TARGET: 10.9
run: |
rustup target add aarch64-apple-darwin
rustup target add x86_64-apple-darwin
pip install --upgrade maturin
maturin build --release -o dist
maturin build --release -o dist --target universal2-apple-darwin
if: matrix.os == 'macos-latest'
- name: Rename Wheels
run: |
python3 -c "import shutil; import glob; wheels = glob.glob('dist/*.whl'); [shutil.move(wheel, wheel.replace('py3', 'py2.py3')) for wheel in wheels if 'py2' not in wheel]"
if: runner.os != 'Linux'
- name: Upload wheels
uses: actions/upload-artifact@v3
with:
name: wheels
path: dist
if: runner.os != 'Linux'
build-linux-cross:
runs-on: ubuntu-latest
needs: [lint]
strategy:
fail-fast: false
matrix:
target: [i686-musl, armv7-musleabihf, aarch64-musl, x86_64-musl]
container:
image: docker://benfred/rust-musl-cross:${{ matrix.target }}
env:
RUSTUP_HOME: /root/.rustup
CARGO_HOME: /root/.cargo
steps:
- uses: actions/checkout@v3
- uses: Swatinem/rust-cache@v2
- name: Build
run: |
python3 -m pip install --upgrade maturin
maturin build --release -o dist --target $RUST_MUSL_CROSS_TARGET --features unwind
maturin sdist -o dist
if: matrix.target == 'x86_64-musl'
- name: Build
run: |
python3 -m pip install --upgrade maturin
maturin build --release -o dist --target $RUST_MUSL_CROSS_TARGET
maturin sdist -o dist
if: matrix.target != 'x86_64-musl'
- name: Rename Wheels
run: |
python3 -c "import shutil; import glob; wheels = glob.glob('dist/*.whl'); [shutil.move(wheel, wheel.replace('py3', 'py2.py3')) for wheel in wheels if 'py2' not in wheel]"
- name: Upload wheels
uses: actions/upload-artifact@v3
with:
name: wheels
path: dist
build-freebsd:
runs-on: ubuntu-22.04
needs: [lint]
timeout-minutes: 30
strategy:
matrix:
box:
- freebsd-14
steps:
- uses: actions/checkout@v3
- name: Cache Vagrant box
uses: actions/cache@v3.0.4
with:
path: .vagrant.d
key: ${{ matrix.box }}-vagrant-boxes-20231115-${{ hashFiles('ci/Vagrantfile') }}
restore-keys: |
${{ matrix.box }}-vagrant-boxes-20231115-
- name: Cache Cargo and build artifacts
uses: actions/cache@v3.0.4
with:
path: build-artifacts.tar
key: ${{ matrix.box }}-cargo-20231115-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ matrix.box }}-cargo-20231115-
- name: Display CPU info
run: lscpu
- name: Install VM tools
run: |
sudo apt-get update -qq
sudo apt-get install -qq -o=Dpkg::Use-Pty=0 moreutils
sudo chronic apt-get install -qq -o=Dpkg::Use-Pty=0 vagrant virtualbox qemu libvirt-daemon-system
- name: Set up VM
shell: sudo bash {0}
run: |
vagrant plugin install vagrant-libvirt
vagrant plugin install vagrant-scp
ln -sf ci/Vagrantfile Vagrantfile
vagrant status
vagrant up --no-tty --provider libvirt ${{ matrix.box }}
- name: Build and test
shell: sudo bash {0}
run: vagrant ssh ${{ matrix.box }} -- bash /vagrant/ci/test_freebsd.sh
- name: Retrieve build artifacts for caching purposes
shell: sudo bash {0}
run: |
vagrant scp ${{ matrix.box }}:/vagrant/build-artifacts.tar build-artifacts.tar
ls -ahl build-artifacts.tar
- name: Prepare binary for upload
run: |
tar xf build-artifacts.tar target/release/py-spy
mv target/release/py-spy py-spy-x86_64-unknown-freebsd
- name: Upload Binaries
uses: actions/upload-artifact@v3
with:
name: py-spy-x86_64-unknown-freebsd
path: py-spy-x86_64-unknown-freebsd
test-wheels:
name: Test Wheels
needs: [build, build-linux-cross]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
python-version: [3.6.7, 3.6.15, 3.7.1, 3.7.17, 3.8.0, 3.8.18, 3.9.0, 3.9.20, 3.10.0, 3.10.1, 3.10.2, 3.10.3, 3.10.4, 3.10.5, 3.10.6, 3.10.7, 3.10.8, 3.10.9, 3.10.10, 3.10.11, 3.10.12, 3.10.13, 3.10.14, 3.10.15, 3.11.0, 3.11.1, 3.11.2, 3.11.3, 3.11.4, 3.11.5, 3.11.6, 3.11.7, 3.11.8, 3.11.9, 3.11.10, 3.12.0]
# TODO: also test windows
os: [ubuntu-20.04, macos-13]
# some versions of python can't be tested on GHA with osx because of SIP:
exclude:
- os: macos-13
python-version: 3.11.0
- os: macos-13
python-version: 3.11.1
- os: macos-13
python-version: 3.11.2
- os: macos-13
python-version: 3.11.3
- os: macos-13
python-version: 3.11.4
- os: macos-13
python-version: 3.11.5
- os: macos-13
python-version: 3.11.6
- os: macos-13
python-version: 3.11.7
- os: macos-13
python-version: 3.11.8
- os: macos-13
python-version: 3.11.9
- os: macos-13
python-version: 3.11.10
- os: macos-13
python-version: 3.12.0
steps:
- uses: actions/checkout@v2
- uses: actions/download-artifact@v3
with:
name: wheels
- uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install wheel
run: |
pip install --force-reinstall --no-index --find-links . py-spy
- name: Test Wheel
id: test
run: python tests/integration_test.py
if: runner.os != 'macOS'
continue-on-error: true
- name: Test Wheel (Retry#1)
id: test1
run: python tests/integration_test.py
if: steps.test.outcome=='failure'
continue-on-error: true
- name: Test Wheel (Retry#2)
id: test2
run: python tests/integration_test.py
if: steps.test1.outcome=='failure'
- name: Test macOS Wheel
id: osx_test
run: sudo "PATH=$PATH" python tests/integration_test.py
if: runner.os == 'macOS'
continue-on-error: true
- name: Test macOS Wheel (Retry#1)
id: osx_test1
run: sudo "PATH=$PATH" python tests/integration_test.py
if: steps.osx_test.outcome=='failure'
continue-on-error: true
- name: Test macOS Wheel (Retry#2)
id: osx_test2
run: sudo "PATH=$PATH" python tests/integration_test.py
if: steps.osx_test1.outcome=='failure'
release:
name: Release
runs-on: ubuntu-latest
if: "startsWith(github.ref, 'refs/tags/')"
needs: [test-wheels]
steps:
- uses: actions/download-artifact@v3
with:
name: wheels
- name: Create GitHub Release
uses: fnkr/github-action-ghr@v1.3
env:
GHR_PATH: .
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Install Dependencies
run: sudo apt install libunwind-dev
if: runner.os == 'Linux'
- uses: actions/setup-python@v4
with:
python-version: 3.9
- name: Push to PyPi
env:
TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
run: |
pip install --upgrade wheel pip setuptools twine
twine upload *
rm *
- uses: actions/checkout@v3
- name: Push to crates.io
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: cargo publish