docs: add RELEASING.md#56
Merged
Merged
Conversation
The release workflow already implements the rc-first publish flow (``-rc`` tags route to TestPyPI; plain ``vX.Y.Z`` tags route to PyPI + GitHub Release), but the human-facing process wasn't written down. This is the maintainer-side companion to release.yml. Covers: the two-tag rc-then-real path, the pre-release checklist (CHANGELOG current, docs sweep, version pin, branch state, CI green), how to verify an rc from TestPyPI in a fresh venv (with the ``--extra-index-url`` workaround for transitive deps), how to tag the real release, how to iterate on rcs, and the yank-and-patch rollback path for a broken real release. Lives at repo root alongside CHANGELOG.md and AGENTS.md, matching the existing maintainer-doc convention. Not part of the mkdocs nav.
There was a problem hiding this comment.
Pull request overview
Adds maintainer-facing release documentation (RELEASING.md) describing the tag-driven release flow implemented by .github/workflows/release.yml, including rc verification steps and rollback guidance.
Changes:
- Introduces
RELEASING.mdwith an end-to-end release procedure (rc → verification → final). - Documents tag-name dispatch rules and required environment protections (TestPyPI/PyPI environments).
- Provides concrete verification and rollback checklists for maintainers.
Comments suppressed due to low confidence (2)
RELEASING.md:50
- The pre-release checklist says to set
project.versionto the final target (e.g.0.7.0) even when tagging an rc. The release workflow enforcespackaging.version.Version(pyproject.version) == Version(tag_without_v), so an rc tag likev0.7.0-rc1requiresproject.versionto be the rc form (e.g.0.7.0rc1/0.7.0-rc1). Otherwise the workflow will fail the version check (or worse: you could upload0.7.0to TestPyPI and then be unable to publish0.7.0to PyPI).
- [ ] **`pyproject.toml` version pinned.** Set `project.version` to the
target version, e.g. `0.7.0`. The PEP 440 form (`0.7.0rc1` or
`0.7.0`) and the tag form (`v0.7.0-rc1` or `v0.7.0`) are
normalized to the same value, so either is accepted in the
`pyproject` field; the tag uses the dash form for readability.
RELEASING.md:24
- This section emphasizes PEP 440 equivalence (
0.7.0-rc1≡0.7.0rc1), but tag routing is not equivalent: the workflow sends tags to TestPyPI only when the tag name literally contains-rc, and sends any tag with no-to PyPI + GitHub Release. A tag likev0.7.0rc1(no hyphen) would be treated as a real release and publish to PyPI. Consider adding an explicit warning that rc tags must use thevX.Y.Z-rcN(hyphenated) form to avoid accidental PyPI publishes.
- Tags containing `-rc` route to TestPyPI.
- Tags with no `-` suffix route to PyPI + GitHub Release.
- Any other suffix (`-beta`, `-alpha`, `-dev`, ...) is a no-op by design;
a typo in the rc suffix cannot accidentally hit PyPI.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
The release workflow dispatches by tag name alone; a maintainer can push vX.Y.Z directly and the workflow will publish to PyPI without consulting any prior -rc tag. The intro paragraph read as if the rc-first flow were automation-enforced, which it isn't. Reframed the intro to make clear that rc-first is a maintainer-side convention carried by the pre-release checklist, not a property of the workflow.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Final docs-phase PR. Adds
RELEASING.mdat the repo root, documenting the maintainer-facing release process. The release workflow (.github/workflows/release.yml) already implements the rc-first publish flow (-rctags route to TestPyPI; plainvX.Y.Ztags route to PyPI + GitHub Release), but the human-facing process wasn't written down.RELEASING.mdcovers:-rc*→ TestPyPI, no suffix → PyPI + GitHub Release, other suffixes are no-ops by design).pyproject.toml, branch state, CI green.--extra-index-urlworkaround for transitive deps), 4-item smoke checklist (version string, example runs,[otel]extra installs, docs site builds).pypienvironment's required-reviewers protection rule.rc2,rc3); never move the tag.release.yml,CHANGELOG.md,pyproject.toml, and the GitHub Environments.Lives at repo root alongside
CHANGELOG.mdandAGENTS.md, matching the existing maintainer-doc convention. Not part of the mkdocs nav.Test plan
RELEASING.mdend-to-end; the workflow it describes matches the actual.github/workflows/release.ymlbehavior--extra-index-urlline in the verification snippet is correct (standard workaround for TestPyPI not mirroring dep graphs)uv run --group docs mkdocs build --strictstill succeeds (rootRELEASING.mdis outsidedocs/, so the build is unaffected)