ci: publish a draft github release with assets, add release conventions#99
Merged
Conversation
release.yml only uploaded the wheel to Actions artifacts, so a pushed tag never produced a downloadable Release asset -- install.sh, which resolves the latest Release wheel, silently kept serving the old version. Build a draft Release with the wheel and sdist attached so a release is one review plus a Publish click. - release.yml: on a version tag, create a draft Release with assets, a dated title, notes prefilled from a template; idempotent re-runs; prerelease tags stay out of /releases/latest; tag vs pyproject version guard; concurrency; align action versions with ci/commits. - RELEASING.md + .github/release-notes-template.md: release conventions and the CI notes skeleton. Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
arelchan
approved these changes
Jul 8, 2026
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
release.ymlonly uploaded the built wheel to Actions artifacts, so a pushed tag never produced a downloadable Release asset.install.shresolves the wheel from the latest Release asset, so a tag silently kept serving the old version until someone manually created the Release and attached the wheel. This builds a draft Release with the wheel and sdist attached (cutting a release becomes one review plus a Publish click), and documents the conventions in RELEASING.md.vX.Y.Z-rcN) stay out of/releases/latest; the tag is guarded against the pyproject version; addsconcurrencyand aligns action versions with ci/commits.Publishing stays a deliberate human step -- CI only creates the draft.
Type
Verification
Local (macOS):
actionlint(with shellcheck on the run blocks) clean on release.yml.YAML parses; the version/prerelease shell logic and template substitution run correctly against the real pyproject and tag values.
Idempotency detection verified against the live releases API (published tag -> left alone; missing tag -> create).
Not yet run end to end on a GitHub runner. Before the first stable release, a
vX.Y.Z-rc1tag will dry-run the full draft/attach/idempotency path -- a prerelease never becomes/releases/latest, so users are unaffected.Relevant tests pass locally
Relevant lint / type checks pass locally
User-facing docs or screenshots are updated when needed
Risk
The job gets
contents: write(needed to create the Release). No behavior change until a version tag is pushed; the workflow is dormant otherwise. Rollback: revert the commit.Related Issues
N/A