Skip to content

chore(ci): ship PGO wheels #1357

chore(ci): ship PGO wheels

chore(ci): ship PGO wheels #1357

Workflow file for this run

name: Publish Python Packages
on:
pull_request:
branches:
- main
push:
branches:
- main
tags:
- '*'
workflow_dispatch:
inputs:
dry-run:
type: boolean
description: Dry run
publish-differt:
type: boolean
description: Publish differt
publish-differt-core:
type: boolean
description: Publish differt-core
permissions:
contents: read
jobs:
build-differt-core-wheels:
name: Build wheels on ${{ matrix.os }} (${{ matrix.target }} - ${{ matrix.interpreter || 'all' }}${{ matrix.os == 'linux' && format(' - {0}', matrix.manylinux == 'auto' && 'manylinux' || matrix.manylinux) || '' }})
if: startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main' || github.event.inputs.publish-differt-core || github.event.inputs.dry-run
strategy:
fail-fast: false
matrix:
os: [linux, macos, windows]
target: [x86_64, aarch64]
manylinux: [auto]
include:
# manylinux for various platforms, plus x86_64 pypy
- os: linux
manylinux: auto
target: i686
- os: linux
manylinux: auto
target: aarch64
- os: linux
manylinux: auto
target: armv7
interpreter: 3.10 3.11 3.12 3.13
- os: linux
manylinux: auto
target: ppc64le
interpreter: 3.10 3.11 3.12 3.13
- os: linux
manylinux: auto
target: s390x
interpreter: 3.10 3.11 3.12 3.13
- os: linux
manylinux: auto
target: x86_64
interpreter: pypy pypy3.10 pypy3.11
# musllinux
- os: linux
manylinux: musllinux_1_1
target: x86_64
- os: linux
manylinux: musllinux_1_1
target: aarch64
- os: linux
manylinux: musllinux_1_1
target: armv7
# macos;
# all versions x86_64
# arm pypy and older pythons which can't be run on the arm hardware for PGO
- os: macos
target: x86_64
- os: macos
target: aarch64
interpreter: pypy3.10 pypy3.11
# windows;
# x86_64 pypy builds are not PGO optimized
# i686 not supported by pypy
# aarch64 only 3.11 and up, also not PGO optimized
- os: windows
target: x86_64
interpreter: pypy3.10 pypy3.11
- os: windows
target: i686
python-architecture: x86
interpreter: 3.10 3.11 3.12 3.13
- os: windows
target: aarch64
interpreter: 3.11 3.12 3.13
exclude:
# See above; disabled for now.
- os: windows
target: aarch64
runs-on: ${{ (matrix.os == 'linux' && 'ubuntu') || matrix.os }}-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Python
uses: actions/setup-python@v5
with:
python-version: '3.13'
architecture: ${{ matrix.python-architecture || 'x64' }}
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
args: --release --out dist --interpreter ${{ matrix.interpreter || '3.10 3.11 3.12 3.13 pypy3.10 pypy3.11' }}
docker-options: -e CI
manylinux: ${{ matrix.manylinux }}
rust-toolchain: stable
target: ${{ matrix.target }}
working-directory: differt-core
- name: List dist directory
run: ${{ (matrix.os == 'windows' && 'dir') || 'ls -lh' }} differt-core/dist/
- name: Install Twine and check long description
run: |
pip install -U twine
twine check --strict differt-core/dist/*
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: differt-core-wheels-${{ matrix.os }}-${{ matrix.target }}-${{ matrix.interpreter || 'all' }}-${{ matrix.manylinux }}
path: differt-core/dist
build-differt-core-pgo-wheels:
name: Build PGO wheels on ${{ matrix.os }} (${{ matrix.interpreter }})
if: startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main' || github.event.inputs.publish-differt-core || github.event.inputs.dry-run
strategy:
fail-fast: false
matrix:
os: [linux, windows, macos]
interpreter: ['3.10', '3.11', '3.12', '3.13', 3.13t]
include:
# standard runners with override for macos arm
- os: linux
runs-on: ubuntu-latest
- os: windows
ls: dir
runs-on: windows-latest
- os: macos
runs-on: macos-latest
exclude:
- interpreter: 3.13t # Needs rust-numpy 0.24
runs-on: ${{ matrix.runs-on }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup uv
uses: astral-sh/setup-uv@v5
with:
python-version: ${{ matrix.interpreter }}
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
id: rust-toolchain
with:
components: llvm-tools
- name: Build PGO wheel
id: pgo-wheel
uses: ./.github/actions/build-pgo-wheel
with:
interpreter: ${{ matrix.interpreter }}
rust-toolchain: ${{ steps.rust-toolchain.outputs.name }}
- name: List dist directory
run: ${{ (matrix.os == 'windows' && 'dir') || 'ls -lh' }} differt-core/dist/
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: differt-core-wheels-${{ matrix.os }}-${{ matrix.interpreter }}
path: differt-core/dist
build-differt-core-sdist:
name: Build sdist for differt-core
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Build sdist
uses: PyO3/maturin-action@v1
with:
command: sdist
args: --out dist
working-directory: differt-core
- name: Upload sdist
uses: actions/upload-artifact@v4
with:
name: differt-core-wheels-sdist
path: differt-core/dist
release-differt-core:
if: success() && (startsWith(github.ref, 'refs/tags/v') || github.event.inputs.publish-differt-core)
name: Release differt-core
runs-on: ubuntu-latest
needs: [build-differt-core-sdist, build-differt-core-wheels, build-differt-core-pgo-wheels]
environment: release
permissions:
id-token: write
contents: write
attestations: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download build wheels
uses: actions/download-artifact@v4
with:
path: differt-core/dist
pattern: differt-core-wheels-*
- name: Generate artifact attestation
uses: actions/attest-build-provenance@v2
with:
subject-path: differt-core/dist/differt-core-wheels-*
- name: Publish to PyPI
uses: PyO3/maturin-action@v1
with:
command: upload
args: --non-interactive --skip-existing dist/differt-core-wheels-*/*
working-directory: differt-core
build-differt:
name: Build differt wheels and sdist
runs-on: ubuntu-latest
environment: release
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup uv
uses: astral-sh/setup-uv@v5
with:
enable-cache: true
- name: Build package
run: uv build --package differt -o differt/dist
- name: Upload sdist
uses: actions/upload-artifact@v4
with:
name: differt-wheels-sdist
path: differt/dist/differt-*.tar.gz
- name: Upload wheels any
uses: actions/upload-artifact@v4
with:
name: differt-wheels-any
path: differt/dist/differt-*.whl
release-differt:
if: success() && (startsWith(github.ref, 'refs/tags/v') || github.event.inputs.publish-differt)
name: Release differt
runs-on: ubuntu-latest
needs: [build-differt]
environment: release
permissions:
id-token: write
contents: write
attestations: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download build wheels
uses: actions/download-artifact@v4
with:
path: differt/dist
pattern: differt-wheels-*
merge-multiple: true
- name: Generate artifact attestation
uses: actions/attest-build-provenance@v2
with:
subject-path: differt/dist/*
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: differt/dist/
skip-existing: true