Releasing persisting¶
Stable releases are built by GitHub Actions from version tags and published to PyPI with Trusted Publishing. The project still ships as a Python wheel, but it does not contain a PyO3 extension and does not use Maturin.
Each platform wheel is tagged py3-none-<platform> and contains:
- the Python
persistingpackage; - native
pvisor,ppilot, andpchroniclescripts; - the bundled pChronicle Web assets;
- the platform libkrun firmware payload required by pVisor.
The release set currently contains Linux x86_64 and Apple Silicon macOS wheels. Source distributions are not part of the published artifact set.
One-time setup¶
- Create a GitHub environment named
pypi. Do not require reviewers; restrict deployments to tags matchingv*. - In the PyPI publishing settings, add a pending Trusted Publisher:
- PyPI project:
persisting - GitHub owner:
DeepLink-org - Repository:
Persisting - Workflow:
release.yml - Environment:
pypi
No PyPI API token is stored in GitHub. The pending publisher can create the project during the first successful upload but does not reserve the name.
Prepare a release¶
- Update the same
X.Y.Zversion inpyproject.toml, the workspace package section ofCargo.toml, andpersisting/__init__.py. - Refresh local workspace versions in the lockfile without upgrading dependencies:
- Commit and merge the version change to
main. The workflow refuses a tag whose commit is not reachable frommain. - Optionally run Publish PyPI manually. A manual run builds and verifies all wheels but does not publish them.
- Create and push the matching stable tag:
Build and verification path¶
The PEP 517 backend is setuptools with the repository-owned
scripts/packaging/build_backend.py. Before wheel assembly it builds the three
Rust CLIs, stages firmware, and ensures the Dioxus bundle exists. setup.py
marks the wheel platform-specific while keeping the Python and ABI tags
py3-none.
Linux CI may fetch the pinned libkrun firmware archive through the packaging
script. macOS CI installs libkrunfw explicitly and passes
PERSISTING_LIBKRUNFW_PATH. Local wheel builds must use one of the supported
firmware paths; a missing payload is a build error rather than an incomplete
wheel.
Every wheel is checked for its component set and install-time CLI smoke tests. The release-set check then requires exactly one supported wheel per platform, matching versions, valid package metadata, and bounded artifact size before publishing.
Re-running a partially completed tagged release skips files PyPI already accepted and repairs missing GitHub Release assets.
Related documents¶
- Installation describes the consumer-facing install path and supported platforms.
- Engineering notes separate contributor status from public product contracts.
- Reproducible examples exercise the installed product workflow.