Skip to content

👷 ci(release): adopt github-workflows 6.0.1 - #43

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

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

Conversation

@gaborbernat

@gaborbernat gaborbernat commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

Cutting a release of the Action meant typing an exact version into Prepare release and relying on a hand-written bash script to stitch news fragments into the changelog. This PR moves the release pipeline onto tox-dev/github-workflows 6.0.1 and release-creator 4.1.0. 🏷️ Maintainers pick auto, major, minor or patch, and each release gets a categorized changelog with pull request links and credits for the commit authors and Co-authored-by co-authors.

Contributors no longer put a PR number or a credit line in their fragment: +topic.feature.md works, and the fragment categories grow from three to ten. CONTRIBUTING.md documents those rules and the release flow. The existing CHANGELOG.md history is rewritten into the same sectioned format, with PR links and authors on each past entry.

Architecture

The shared prepare-towncrier-release workflow owns release preparation. It computes the v-prefixed version from the pending fragments, builds the changelog with Towncrier, runs prek, and has the repository-scoped GitHub App push the release commit and an annotated tag.

The tag push starts this repo's own pipeline: one job resolves the tag to its commit, the shared render-release-notes and publish-github-release actions turn that version's changelog section into the GitHub Release, and a local job moves v1 and v1.0 with the App token. The notes job skips prereleases, and a floating tag moves only when the release is the newest in its series.

The release path trusts people with write access and stops re-checking their work outside a PR. The tag-format check and the main-only guard on Prepare release are gone. Pull requests remain the validation point: the news check moves to its own workflow on the shared validate-news action and reruns when the skip news label changes.

The release tools (release-creator, towncrier, prek) install from a pylock.toml that nab writes from a [tool.nab] table in a new tool-only pyproject.toml. The lock takes packages uploaded at least seven days ago, targets Python 3.15 on linux_x86_64, and carries a temporary exception for release-creator 4.1.0 that expires on 2026-11-02. A build group locks Cython and setuptools because PyYAML 6.0.3 ships no CPython 3.15 wheel. A weekly run of the shared upgrade-release-tools workflow refreshes the lock.

Impact

⚠️ Action users see a behaviour change: the Action no longer passes --python 3.15, so uv run and uvx pick the interpreter, and UV_PYTHON is unset for the pre-commit process. The Action also moves to setup-uv 10.3.2 with version: latest-known, its steps get emoji names (the two unnamed ones get names), so the step names in users' logs change, and the README examples pin actions by commit SHA. The PR carries no news fragment for this change.

Hook revisions are frozen to commit SHAs. Dependabot's pre-commit ecosystem updates them weekly with a seven-day cooldown, next to pre-commit.ci's quarterly autoupdate. New hooks run mdformat, shfmt, shellcheck and yamlfmt. Each workflow, job and step name now starts with one emoji, which renames two required checks.

🛡️ CodeQL

CodeQL moves from default setup to a committed workflow on ubuntu-26.04 that scans actions with the security-extended suite, which adds checks such as untrusted checkouts and unpinned action tags that matter for a published Action. Moving off default setup also removes its ubuntu-latest migration notice.

@gaborbernat gaborbernat added the skip news No user-facing changelog entry needed label Oct 20, 2026
@gaborbernat gaborbernat changed the title 🔧 build(release): lock Python helpers 👷 ci(release): use shared release actions Oct 21, 2026
@gaborbernat gaborbernat changed the title 👷 ci(release): use shared release actions 👷 ci(release): adopt github-workflows 5.0.0 Oct 25, 2026
@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 changed the title 👷 ci(release): adopt github-workflows 5.0.1 👷 ci(release): adopt github-workflows 5.0.2 Oct 26, 2026
@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-contract branch 4 times, most recently from 6f16ffa to 46ef72f Compare October 26, 2026 20:58
@gaborbernat gaborbernat changed the title 👷 ci(release): adopt github-workflows 6.0.0 👷 ci(release): adopt github-workflows 6.0.1 Oct 26, 2026
@gaborbernat
gaborbernat force-pushed the fix/release-contract branch 3 times, most recently from 2f1aeaf to 5e35356 Compare October 26, 2026 23:40
Comment on lines +51 to +57
- name: 📥 Check out code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ needs.verify-tag.outputs.commit }}
fetch-depth: 0
persist-credentials: false
- name: 🐍 Install uv
Use the shared release workflows from github-workflows 6.0.1 for news
checks, release preparation and the weekly lock refresh. Prepare picks a
v-prefixed version from the fragments and runs release-creator
contributors to add a New Contributors section from the commit authors
and co-authors before the release App pushes the annotated tag.
CONTRIBUTING now says credits come from the commit, not from the
fragment.

Writers are trusted, so the release path no longer re-checks what they
did. The check-tagged-source step, the tag format, main ancestry and
release-creator tags checks in verify-tag, the re-check that the tag
still names the release commit, and the floating-tag job's main
ancestry, moved-tag and published-release checks are gone. So are the
main-only condition on Prepare release, the redundant pull_request
condition on the news job, and test_release_workflow.py with its CI job,
which only covered those checks. verify-tag now just resolves the tag to
its commit from a shallow checkout, without installing uv or the release
tools, and is named for that. The notes job still skips prereleases, and
the floating tags still move only when the release is the newest in its
series.

Nab writes pylock.toml from a [tool.nab] table, with a temporary upload
cutoff exception for release-creator 4.1.0. A build group holds Cython
and setuptools, since PyYAML has no CPython 3.15 wheel. The release,
release-check and release-validate groups are gone.

Every workflow, job and step gets an emoji name, including the steps of
the action itself, whose two unnamed steps now have names. The required
checks become "🚦 Required checks pass" and "📝 News fragment".

The hook cooldown check and its scheduled rerun are gone. Dependabot's
pre-commit ecosystem and pre-commit.ci's quarterly autoupdate update the
hooks, so the release-creator managed hook pins are dropped. setup-uv is
pinned to 10.3.2 in CI and in the action.

CodeQL moves from default setup to a committed advanced workflow on
ubuntu-26.04 with the same languages and query suite.
@gaborbernat
gaborbernat marked this pull request as ready for review October 27, 2026 05:39
@gaborbernat
gaborbernat merged commit 9677ccf into tox-dev:main Oct 27, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip news No user-facing changelog entry needed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants