Files
python-kasa/RELEASING.md
Teemu R. c60f48df23 Generate the changelog with git-cliff and draft releases in CI (#1809)
Replaces `github_changelog_generator` and the manual release steps with a script and a workflow.
2026-10-24 16:24:08 +02:00

62 lines
3.0 KiB
Markdown

# Releasing
- `devtools/release.py prepare` opens a release PR with the version bump and the changelog section generated by [git-cliff](https://git-cliff.org) (`cliff.toml`).
- Merging the PR runs the `Draft Release` workflow, which creates a draft GitHub release from `CHANGELOG.md`.
- Publishing the draft creates the tag and runs `Publish Packages`, which uploads to PyPI.
- Tests for the script: `uv run pytest devtools/release.py`.
## Requirements
- `git`, `uv` and the [github client](https://github.com/cli/cli#installation) (`gh auth login`).
- Push access to the `upstream` remote, set `REMOTE` to use another name.
- The `release-prep` label exists, PRs with it are left out of the changelog.
## Changelog entries
- Every PR merged since the previous release is an entry, titled like the PR.
- The label selects the section, first match wins: `breaking change`, `enhancement`, `bug`, `new device`, `documentation`, `maintenance`/`dependencies`.
- Other PRs go to `Other changes`, so fix the labels first.
- Left out: `duplicate`, `question`, `invalid`, `wontfix`, `release-prep`, `stale`.
- To fix an entry, relabel or retitle the PR and [prepare again](#preparing-again), or edit `CHANGELOG.md` in the release PR.
## Normal releases
```bash
devtools/release.py prepare x.y.z # preview, nothing is pushed
devtools/release.py prepare --push x.y.z # push release/x.y.z and open the PR
```
- Optional, in a separate PR before releasing: `uv lock --upgrade` and `pre-commit autoupdate`.
- Add the release summary at the top of the new section in `CHANGELOG.md` on the PR branch.
- Squash-merge the PR once CI passes, promptly: PRs merged later are not in the section.
- Open the draft release linked in the `Draft Release` run, check it and click `Publish release`.
- If the workflow fails, re-run it from the `Actions` tab.
## Preparing again
- Close the release PR and delete the `release/x.y.z` branch on `upstream`.
- Run `prepare` again, then rewrite the summary.
## Patch releases
- Made from the `patch` branch, git commit signing must be enabled.
- Only the given commits are included, they are cherry-picked with `-x` and signed.
```bash
# First patch after a release only, the release must contain cliff.toml and the workflows
git fetch upstream --tags
git push upstream x.y.z:refs/heads/patch
devtools/release.py prepare --base patch x.y.z.n commitSHA1 commitSHA2 # preview
devtools/release.py prepare --base patch --push x.y.z.n commitSHA1 commitSHA2
```
- If a commit conflicts, cherry-pick it on your own branch, resolve it and pass that commit.
- The entries have no PR information and all land in `Other changes`, sort them in the PR.
- Merge the PR with a **merge** commit, not a squash.
- Publish the draft as above.
- Patches are not merged back, so add the new section to `CHANGELOG.md` on master by hand:
- paste it above the release the patch is based on,
- open a PR labelled `release-prep`,
- skipping this only leaves the patch out of the changelog on master.