name: Publish Python package
on:
release:
types: [published]
permissions:
contents: read
jobs:
build-wheels:
name: Build wheels (${{ matrix.target.label }})
runs-on: ${{ matrix.target.runner }}
strategy:
fail-fast: false
matrix:
target:
- label: linux-x86_64
os: linux
runner: ubuntu-latest
triple: x86_64-unknown-linux-gnu
- label: linux-aarch64
os: linux
runner: ubuntu-24.04-arm
triple: aarch64-unknown-linux-gnu
- label: macos-arm64
os: macos
runner: macos-latest
triple: aarch64-apple-darwin
- label: macos-x86_64
os: macos
runner: macos-13
triple: x86_64-apple-darwin
- label: windows-x86_64
os: windows
runner: windows-latest
triple: x86_64-pc-windows-msvc
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Build wheels (linux)
if: matrix.target.os == 'linux'
uses: PyO3/maturin-action@v1
with:
args: --release --out dist --features python
manylinux: 2_28
before-script-linux: dnf install -y fontconfig-devel freetype-devel clang
target: ${{ matrix.target.triple }}
- name: Build wheels (macos)
if: matrix.target.os == 'macos'
uses: PyO3/maturin-action@v1
with:
args: --release --out dist --features python
target: ${{ matrix.target.triple }}
- name: Build wheels (windows)
if: matrix.target.os == 'windows'
uses: PyO3/maturin-action@v1
with:
args: --release --out dist --features python
target: ${{ matrix.target.triple }}
- uses: actions/upload-artifact@v4
with:
name: wheels-${{ matrix.target.label }}
path: dist
build-sdist:
name: Build source distribution
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build sdist
uses: PyO3/maturin-action@v1
with:
command: sdist
args: --out dist
- uses: actions/upload-artifact@v4
with:
name: sdist
path: dist
publish:
name: Publish to PyPI
runs-on: ubuntu-latest
needs: [build-wheels, build-sdist]
environment: pypi
permissions:
id-token: write
steps:
- uses: actions/download-artifact@v4
with:
path: dist
merge-multiple: true
- name: Publish to PyPI
uses: PyO3/maturin-action@v1
with:
command: upload
args: --non-interactive --skip-existing dist/*
env:
MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}