Skip to content

馃懛 ci(release): move release tooling to github-workflows 6.0.1 - #3458

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

gaborbernat merged 1 commit into
mainfrom
fix/release-contract

Conversation

@gaborbernat

@gaborbernat gaborbernat commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

virtualenv kept its own copy of the release steps that the other tox-dev projects share, with a hand-compiled tasks/release-requirements.txt and tag-time checks that re-validated what maintainers had already merged. 馃殌 This PR moves release preparation, news fragment validation and the weekly release-tool relock onto tox-dev/github-workflows 6.0.1, so a fix to those steps reaches virtualenv through one pin bump. The tag pipeline stays virtualenv's own: it still builds the wheel, sdist and zipapp, attaches the SBOMs, attests every artifact and makes the signed get-virtualenv commit.

Release managers see three changes. The changelog uses the shared categories (Added, Fixed, Security, Packaging and so on) with stable anchors per release and section. Credits come from the human commit authors and co-authors of each fragment's pull request, never from the fragment text or a bot account. Fragments are named +short-description.<type>.rst, and the squash merge supplies the PR number.

Architecture

github-workflows owns the generic parts: the prepare workflow that builds the changelog, commits and tags, the relock workflow, and actions for news validation, notes rendering, PyPI reconciliation and GitHub Release publishing. virtualenv's tag workflow calls those actions as steps and keeps the zipapp, SBOM and get-virtualenv jobs. Each job downloads artifacts by the ID its upstream job returned. The local tox r -e release path calls the release-creator 4.1.0 library for the version bump, PR links and New Contributors section, so a local run produces the same changelog as the shared prepare.

flowchart LR
    Tag[Tag push] --> Build[Build wheel, sdist, zipapp]
    Tag --> Notes[Render notes]
    Build --> Attest[Attest]
    Attest --> PyPI[Publish to PyPI]
    Notes --> PyPI
    PyPI --> Reconcile[Verify PyPI files]
    Reconcile --> GHR[GitHub Release]
    Notes --> GHR
    GHR --> Boot[Update get-virtualenv]
    Boot --> Verify[Verify installs and bootstrap.pypa.io]
    classDef shared fill:#cfe4ff,stroke:#1f6feb,color:#0b1f3a;
    classDef own fill:#ffe3a3,stroke:#d29200,color:#3a2c00;
    class Notes,Reconcile,GHR shared;
    class Tag,Build,Attest,PyPI,Boot,Verify own;
Loading

The release path now trusts people with write access: the PR merge is where their changes get checked. The tag run drops the source check, the changelog-section and tag-format checks, the lock re-verification and the post-publish SPDX run, and tasks/release.py no longer refuses a dirty checkout. The supply-chain guards stay: sealed artifact hashes, attestations, PyPI reconciliation, the byte comparison of published files and the get-virtualenv mismatch errors.

nab locks every dependency group into pylock.toml for CPython 3.15 on linux x86_64, where the release jobs run, and on windows amd64, where CI builds the zipapp. A build group holds the build backend plus cython and setuptools, since PyYAML has no cp315 wheel. pylock.zipapp.toml stays the zipapp lock, and the shared news check and weekly relock cover it too.

The embedded wheel upgrade now validates its patch in a read-only job. The write job checks that patch's SHA-256 and applies it with git apply, without running project Python code.

Hook revisions are frozen to commit SHAs. Dependabot's pre-commit ecosystem bumps them weekly after a seven-day cooldown, and pre-commit.ci autoupdates quarterly.

@gaborbernat gaborbernat added the skip news No user-facing changelog entry required label Oct 20, 2026
@gaborbernat gaborbernat changed the title 馃敡 build(release): lock all project groups 馃懛 ci(release): share release preparation Oct 21, 2026
Comment thread tasks/locked_uv.py Fixed
@gaborbernat gaborbernat added documentation enhancement and removed skip news No user-facing changelog entry required documentation labels Oct 21, 2026
@gaborbernat gaborbernat changed the title 馃懛 ci(release): share release preparation 馃懛 ci(release): share release preparation through github-workflows 5.0.0 Oct 25, 2026
@gaborbernat
gaborbernat force-pushed the fix/release-contract branch 2 times, most recently from 2db06e7 to 1b049bb Compare October 26, 2026 00:02
@gaborbernat gaborbernat changed the title 馃懛 ci(release): share release preparation through github-workflows 5.0.0 馃懛 ci(release): share release preparation through github-workflows 5.0.1 Oct 26, 2026
@gaborbernat gaborbernat changed the title 馃懛 ci(release): share release preparation through github-workflows 5.0.1 馃懛 ci(release): share release preparation through github-workflows 5.0.2 Oct 26, 2026
@gaborbernat
gaborbernat force-pushed the fix/release-contract branch 3 times, most recently from ae731a7 to 3645c7d Compare October 26, 2026 17:01
@gaborbernat gaborbernat changed the title 馃懛 ci(release): share release preparation through github-workflows 5.0.2 馃懛 ci(release): share release preparation through github-workflows 6.0.0 Oct 26, 2026
@gaborbernat
gaborbernat force-pushed the fix/release-contract branch 5 times, most recently from 0a73d32 to cfc7bdc Compare October 26, 2026 20:58
@gaborbernat gaborbernat changed the title 馃懛 ci(release): share release preparation through github-workflows 6.0.0 馃懛 ci(release): move release tooling to github-workflows 6.0.1 Oct 26, 2026
@gaborbernat
gaborbernat force-pushed the fix/release-contract branch 2 times, most recently from 96f375f to 09dd5b9 Compare October 27, 2026 01:57
Prepare releases through the github-workflows 6.0.1 reusable workflow
and keep virtualenv's own tag pipeline for the wheel, sdist, zipapp,
SBOMs, attestations and the signed get-virtualenv update.

Trust writers: checks that re-validate a writer's work outside a pull
request go. That drops the source-check job, the changelog-section and
tag-format check, the lock group verification, the tag re-check before
the GitHub Release, the get-virtualenv missing-file error, the
post-publish pyspdxtools run, the secondary lock inputs to prepare, the
release-validate group, the main-branch conditions on the upgrade jobs,
the always-true news condition, the one-uv lock guard and the
dirty-checkout refusal in tasks/release.py. Supply-chain checks stay.

tasks/release.py follows the release-creator 4.0.0 API, passing commit
SHAs to fragment_pull_requests and the commits to
add_pull_request_links. Every workflow, job and step gets an emoji
name, and the shell and package install steps switch to the install
emoji; the development docs list the new required check names.

Nab locks every group and extra into pylock.toml for CPython 3.15 on
linux x86_64 and windows amd64, with a declared build group and
temporary cutoff exceptions for release-creator 4.1.0 and uv 0.13.5.
uv needs at least 0.13.5 for GHSA-hq85-5cpj-mr62. Hook revisions stay
frozen; Dependabot updates them weekly after a seven-day cooldown and
pre-commit.ci autoupdates quarterly, so the hook cooldown check and its
recheck workflow go.

The local release task adds the New Contributors subsection through
release-creator, and next_tag no longer receives the date, which
release-creator reads as the tag prefix.
@gaborbernat
gaborbernat marked this pull request as ready for review October 27, 2026 05:39
@gaborbernat
gaborbernat merged commit dd4ce2c into main Oct 27, 2026
77 checks passed
@gaborbernat
gaborbernat deleted the fix/release-contract branch October 27, 2026 05:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants