Publishing releases
Releases use the manually dispatched .github/workflows/publish.yml workflow on main. It requires successful CI for the same commit, verifies the requested version against pyproject.toml, builds distributions, and runs the AF3 example from isolated wheel and source-distribution installs. A separate job downloads those exact artifacts and publishes them through PyPI Trusted Publishing.
One-time setup
In the project’s PyPI publishing settings, register a GitHub publisher with these exact values:
Field |
Value |
|---|---|
Owner |
|
Repository |
|
Workflow filename |
|
Environment |
|
The GitHub pypi environment allows deployments from the main branch. Only the upload job has id-token: write; no long-lived PyPI token is stored in GitHub. The workflow filename and environment must match the registration on PyPI. See PyPI’s setup documentation.
Release procedure
Commit the intended package version and lockfile, review the PR, and merge it to
main.Wait for the main-branch CI run to pass. Local release validation remains available through
./scripts/publish.sh --dry-run --trusted-publishing never.Dispatch the workflow with the exact version:
gh workflow run publish.yml --repo nimashoghi/nshconfig --ref main -f version=3.0.0a0
Check the workflow result and verify the release on PyPI. The
distworkflow artifact contains the distributions that were uploaded.Create the corresponding version tag/GitHub release at that workflow’s source commit, using the uploaded distributions as release assets. Mark alpha/beta/rc versions as prereleases.
Dispatching from another branch skips publication. A failed CI/version check prevents the upload job from running. The workflow fails explicitly if the PyPI publisher is missing or mismatched. A new release requires a new version; published files cannot be overwritten.