Skip to content

👷 ci(release): move releases to github-workflows 6.0.1 - #292

Merged
gaborbernat merged 1 commit into
tox-dev:mainfrom
gaborbernat:fix/release-changelog-format
Oct 27, 2026
Merged

gaborbernat merged 1 commit into
tox-dev:mainfrom
gaborbernat:fix/release-changelog-format

Conversation

@gaborbernat

@gaborbernat gaborbernat commented Oct 19, 2026 •

Copy link
Copy Markdown
Member

Releasing devpi-process meant typing an exact version into a hand-written prepare workflow, and the tag run built, uploaded and published through inline shell that only this repository maintained. 🚀 This PR moves both workflows onto the reusable ones in tox-dev/github-workflows 6.0.1, with release-creator 4.1.0 writing the changelog and release notes, so this repository keeps only thin callers.

Release flow

A maintainer now starts a release by picking a bump (auto, major, minor or patch) instead of typing a version. The shared prepare workflow asks release-creator tags for the next version from the pending fragments and existing tags (source), builds the changelog, adds a New Contributors subsection with release-creator contributors (source), runs the prek hooks, and pushes the commit and tag with the release App from the release-auth environment.

On the tag, the distribution build and the notes rendering from CHANGELOG.md run side by side. The PyPI upload waits for both; a verification job then compares every built file with PyPI and checks its trusted-publisher attestation (action), and only after that does the GitHub Release get created. Jobs pass distributions and notes to each other by artifact ID, and runs for one tag queue rather than cancel each other. Every workflow, job and step name now starts with an emoji.

flowchart LR
    Tag[Tag push] --> Build[Build distributions]
    Tag --> Prev[Select previous tag] --> Notes[Render notes from CHANGELOG.md]
    Build --> PyPI[Publish to PyPI]
    Notes --> PyPI
    PyPI --> Verify[Verify PyPI files and attestations]
    Verify --> GHR[Publish GitHub Release]
    Notes --> GHR
    classDef step fill:#cfe4ff,stroke:#1f6feb,color:#0b1f3a;
    classDef publish fill:#ffe3a3,stroke:#d29200,color:#3a2c00;
    class Tag,Build,Prev,Notes,Verify step;
    class PyPI,GHR publish;
Loading

The tag run no longer checks that the tag has a matching changelog section: only writers push tags, and the PR checks already validate the fragments. That news check moves to its own 📝 Changelog workflow, which reruns when a label changes, so adding skip news no longer reruns the test matrix.

Changelog and contributors

CHANGELOG.md now uses release-creator's template, with entries grouped under Added, Fixed, Packaging and the other sections, each linked to its PR and credited to its author. Older releases gain entries they lacked, such as Python 3.11 support from #31 and Python 3.15 from #262. A new CONTRIBUTING.md lists the ten fragment types and asks contributors not to write credits, because those come from commit authors and Co-authored-by trailers.

📦 On PyPI, the README's links to the changelog and the contributing guide pointed at relative paths; hatch-fancy-pypi-readme now rewrites them to GitHub URLs. The metadata adds a Changelog URL, drops the Framework :: tox and MIT license classifiers, and replaces the keywords with devpi, process and testing.

Dependencies

nab 0.0.22 writes pylock.toml for CPython 3.15 on linux_x86_64, the only target where CI installs from the lock, with a seven-day upload cutoff. A temporary exception lets release-creator 4.1.0 in until 2026-11-02. Each release job installs only its own group (release-news, release-notes or release-prepare), and a build group locks the hatchling backends with Cython and setuptools because PyYAML has no CPython 3.15 wheel. A weekly 🔒 Upgrade release tools workflow relocks pylock.toml and opens a PR.

The pre-commit config pins each hook to a frozen commit SHA. Dependabot's pre-commit ecosystem updates them weekly with a seven-day cooldown, alongside a quarterly pre-commit.ci autoupdate.

🛡️ CodeQL

CodeQL moves from default setup to a committed workflow on ubuntu-26.04 that scans Python and Actions with the security-extended suite and skips tests, whose alerts nobody would fix. This also removes the ubuntu-latest migration notice default setup produces.

@gaborbernat gaborbernat added bug Something isn't working skip news No user-facing changelog entry is needed labels Oct 19, 2026
@gaborbernat
gaborbernat enabled auto-merge (squash) October 19, 2026 18:18
@gaborbernat
gaborbernat disabled auto-merge October 19, 2026 18:21
@gaborbernat
gaborbernat force-pushed the fix/release-changelog-format branch from f62fedb to c878e06 Compare October 19, 2026 20:32
@gaborbernat gaborbernat changed the title 🐛 fix(release): check generated changelog 🩹 fix(release): validate the full release path Oct 19, 2026
@gaborbernat gaborbernat changed the title 🩹 fix(release): validate the full release path 🐛 fix(release): validate the release path Oct 20, 2026
@gaborbernat gaborbernat added skip news No user-facing changelog entry is needed and removed skip news No user-facing changelog entry is needed labels Oct 20, 2026
@gaborbernat
gaborbernat marked this pull request as draft October 20, 2026 17:51
@gaborbernat gaborbernat changed the title 🐛 fix(release): validate the release path 🐛 fix: check assembled release notes Oct 20, 2026
@gaborbernat gaborbernat changed the title 🐛 fix: check assembled release notes 👷 ci(release): validate notes before PyPI Oct 21, 2026
@gaborbernat gaborbernat removed the skip news No user-facing changelog entry is needed label Oct 21, 2026
@gaborbernat gaborbernat changed the title 👷 ci(release): validate notes before PyPI 👷 ci(release): adopt shared release workflows Oct 25, 2026
@gaborbernat
gaborbernat force-pushed the fix/release-changelog-format branch from 62e3eef to ec016db Compare October 25, 2026 22:19
@gaborbernat gaborbernat changed the title 👷 ci(release): adopt shared release workflows 👷 ci(release): adopt github-workflows 5.0.0 Oct 25, 2026
@gaborbernat
gaborbernat force-pushed the fix/release-changelog-format branch from ec016db to 902ab5f Compare October 26, 2026 00:00
@gaborbernat gaborbernat changed the title 👷 ci(release): adopt github-workflows 5.0.0 👷 ci(release): adopt github-workflows 5.0.1 Oct 26, 2026
@gaborbernat
gaborbernat force-pushed the fix/release-changelog-format branch from 902ab5f to 823a636 Compare October 26, 2026 01:00
@gaborbernat gaborbernat changed the title 👷 ci(release): adopt github-workflows 5.0.1 👷 ci(release): adopt github-workflows 5.0.2 Oct 26, 2026
@gaborbernat
gaborbernat force-pushed the fix/release-changelog-format branch 4 times, most recently from 44cb4c2 to bc8e7bd Compare October 26, 2026 16:58
@gaborbernat gaborbernat changed the title 👷 ci(release): adopt github-workflows 5.0.2 👷 ci(release): adopt github-workflows 6.0.0 Oct 26, 2026
@gaborbernat
gaborbernat force-pushed the fix/release-changelog-format branch from bc8e7bd to 6bbfc16 Compare October 26, 2026 17:12
@gaborbernat
gaborbernat force-pushed the fix/release-changelog-format branch 2 times, most recently from ef1e821 to 29f1333 Compare October 26, 2026 20:58
@gaborbernat gaborbernat changed the title 👷 ci(release): adopt github-workflows 6.0.0 👷 ci(release): move releases to github-workflows 6.0.1 Oct 26, 2026
@gaborbernat
gaborbernat force-pushed the fix/release-changelog-format branch 4 times, most recently from e93abdf to 57f4ceb Compare October 27, 2026 01:58
Move the prepare and tag workflows onto the shared workflows from
github-workflows 6.0.1 and pin setup-uv 10.3.2. Prepare takes a bump
type instead of a typed version. Release tools install from per-job
groups (release-news, release-notes, release-prepare) that require
release-creator 4.1. Nab writes pylock.toml from a [tool.nab] table on
linux_x86_64, with a temporary upload cutoff exception for
release-creator 4.1.0. A build group locks the hatchling backends with
Cython and setuptools, since PyYAML has no CPython 3.15 wheel.

The tag workflow builds through the shared workflow and renders notes
from CHANGELOG.md in parallel, passing distributions and notes between
jobs by artifact ID. After the PyPI upload, a job checks the uploaded
files and their attestations before the GitHub Release is published.
The tag run no longer checks for a matching changelog section, since
only writers can push tags. The news check moves out of check.yaml into
its own Changelog workflow, so label changes no longer rerun the tests.
Every workflow, job and step name now starts with an emoji.

Hooks are pinned to frozen commit SHAs. Dependabot's pre-commit
ecosystem updates them weekly and pre-commit.ci autoupdates quarterly.
A new CONTRIBUTING lists the fragment types and leaves credits to
release-creator contributors, which reads commit authors and
co-authors.

CodeQL moves from default setup to a committed advanced workflow on
ubuntu-26.04 with the same languages and query suite.
@gaborbernat
gaborbernat force-pushed the fix/release-changelog-format branch from 57f4ceb to f72cdd4 Compare October 27, 2026 04:00
@gaborbernat
gaborbernat marked this pull request as ready for review October 27, 2026 05:39
@gaborbernat
gaborbernat merged commit 3d6af85 into tox-dev:main Oct 27, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant