Skip to content

Publish

Publish #88

Workflow file for this run

# This file is autogenerated by maturin and then manually modified
# To update, run
#
# maturin generate-ci --zig github
#
# This file was modified slightly after autogeneration by maturin
# Last updated: 2026-03-15 - modernized action versions and runners
name: Publish
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
workflow_dispatch: null
permissions:
contents: read
id-token: write
jobs:
linux:
runs-on: ${{ matrix.platform.runner }}
strategy:
matrix:
platform:
- runner: ubuntu-latest
target: x86_64
python-architecture: x64
- runner: ubuntu-latest
target: x86
python-architecture: x86
- runner: ubuntu-latest
target: aarch64
python-architecture: arm64
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
architecture: ${{ matrix.python-architecture }}
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.platform.target }}
args: --release --out dist --interpreter python${{ matrix.python-version }} --zig
manylinux: auto
before-script-linux: sudo apt-get install -y capnproto libcapnp-dev
- name: Upload wheels
uses: actions/upload-artifact@v6
with:
name: wheels-linux-${{ matrix.platform.target }}-python${{ matrix.python-version }}
path: dist
windows:
runs-on: ${{ matrix.platform.runner }}
strategy:
matrix:
platform:
- runner: windows-latest
target: x64
- runner: windows-latest
target: x86
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
architecture: ${{ matrix.platform.target }}
- name: capnproto
run: choco install capnproto
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.platform.target }}
args: --release --out dist --interpreter python${{ matrix.python-version }}
- name: Upload wheels
uses: actions/upload-artifact@v6
with:
name: wheels-windows-${{ matrix.platform.target }}-python${{ matrix.python-version }}
path: dist
macos:
runs-on: ${{ matrix.platform.runner }}
strategy:
matrix:
platform:
- runner: macos-15-intel
target: x86_64
python-architecture: x64
- runner: macos-15
target: aarch64
python-architecture: arm64
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
architecture: ${{ matrix.platform.python-architecture }}
- name: capnproto
run: brew install capnp
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.platform.target }}
args: --release --out dist --interpreter python${{ matrix.python-version }}
- name: Upload wheels
uses: actions/upload-artifact@v6
with:
name: wheels-macos-${{ matrix.platform.target }}-python${{ matrix.python-version }}
path: dist
sdist:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Build sdist
uses: PyO3/maturin-action@v1
with:
command: sdist
args: --out dist
- name: Upload sdist
uses: actions/upload-artifact@v6
with:
name: wheels-sdist
path: dist
release:
name: Release
runs-on: ubuntu-latest
needs: [linux, windows, macos, sdist]
steps:
- uses: actions/download-artifact@v7
- name: Publish to PyPI
uses: PyO3/maturin-action@v1
with:
command: upload
args: --non-interactive --skip-existing wheels-*/*
tag-and-release:
name: Tag and GitHub Release
runs-on: ubuntu-latest
# Only after the wheels are published to PyPI.
needs: [release]
permissions:
contents: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Resolve version from Cargo.toml
id: ver
run: |
VERSION=$(grep -m1 '^version = ' Cargo.toml | sed -E 's/^version = "([^"]+)".*/\1/')
if [ -z "$VERSION" ]; then
echo "::error::Could not read version from Cargo.toml"
exit 1
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "tag=v$VERSION" >> "$GITHUB_OUTPUT"
- name: Create git tag and GitHub Release
env:
GH_TOKEN: ${{ github.token }}
run: |
TAG="${{ steps.ver.outputs.tag }}"
VERSION="${{ steps.ver.outputs.version }}"
# Idempotent: skip if this version was already tagged/released (e.g. a
# re-run after `maturin upload --skip-existing` skipped an existing wheel).
if gh release view "$TAG" >/dev/null 2>&1 || git rev-parse -q --verify "refs/tags/$TAG" >/dev/null; then
echo "Release/tag $TAG already exists — nothing to do."
exit 0
fi
# Use this version's CHANGELOG section as release notes, if present.
NOTES=$(awk -v ver="$VERSION" '
$0 ~ ("^## \\[" ver "\\]") {flag=1; next}
flag && /^## \[/ {exit}
flag {print}
' CHANGELOG.md)
if [ -z "$(echo "$NOTES" | tr -d '[:space:]')" ]; then
NOTES="Release $TAG"
fi
# `gh release create` creates the git tag at the current commit and the release.
printf '%s\n' "$NOTES" | gh release create "$TAG" \
--target "$GITHUB_SHA" \
--title "$TAG" \
--notes-file -