chore(ci): ship PGO wheels #1340
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: Publish Python Packages | |
on: | |
pull_request: | |
branches: | |
- main | |
push: | |
branches: | |
- main | |
tags: | |
- '*' | |
workflow_dispatch: | |
inputs: | |
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: (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')) || github.event.inputs.publish-differt-core || github.event_name == 'workflow_dispatch' | |
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: (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')) || github.event.inputs.publish-differt-core || github.event_name == 'workflow_dispatch' | |
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: (github.event_name == 'push' && 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: (github.event_name == 'push' && 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 |