Releases of substrait-python are fully automated using semantic-release and follow the same model as the other Substrait projects (e.g. substrait-java).
The Semantic Release workflow runs on a
weekly schedule (2 AM UTC on Sundays). It inspects the Conventional
Commits merged since the last
release, computes the next version, updates CHANGELOG.md, creates the vX.Y.Z
git tag, and publishes a GitHub Release with auto-generated notes.
Creating the tag triggers the Release and Publish
workflow, which builds the package (the version is derived from the tag via
setuptools_scm) and publishes it to PyPI
using Trusted Publishing.
As a result, there is nothing to do by hand for a normal release — just make sure your PR titles/commit messages follow the Conventional Commits specification (this is enforced by the PR Title Check workflow).
If you need a release before the next scheduled run (and you are a Substrait committer or PMC member with the appropriate permissions):
- Go to https://github.com/substrait-io/substrait-python/actions/workflows/semantic-release.yml
- Click
Run workflowand select themainbranch. - Monitor the workflow run, then the triggered
Release and Publishrun, to confirm the new version reaches PyPI.
If there are no release-worthy commits since the last release (only chore, docs,
ci, etc.), semantic-release will report that no release is necessary and do
nothing.
Version bumps are derived from commit types:
| Commit type | Version bump |
|---|---|
fix: |
patch |
feat: |
minor |
breaking change (feat!:, BREAKING CHANGE) |
minor |
substrait-python follows semantic versioning as described for the Substrait specification here: https://substrait.io/spec/versioning/. Because the project is pre-1.0, breaking changes produce a minor bump rather than a major one (matching substrait-java).
The semantic-release toolchain versions are pinned in
ci/release/run.sh and the release plugin set lives in
.releaserc.mjs. Pinning is deliberate: a floating
conventional-changelog-conventionalcommits once dropped the Features /
Bug Fixes sections from the generated notes. When bumping any of these
versions, the Release Notes Check
workflow runs ci/release/dry_run.sh — a credential-free
dry run against the real history (in a throwaway worktree) that fails if a release
is due but its notes come out with no sections.