Releases: pypa/gh-action-pypi-publish
Release list
v1.14.2
This one probably won't touch you visibly so just bookmark @webknjaz's EuroPython 2026 “AI” slop rant for when it's published on YouTube or encourage him to come back with more to share next year!
🛠️ Urgh… Another release!? Again? Explain yourself!
Looking at the diff, you'll only witness updates across the dependency tree. That's it! It's not a security fix or anything like that even, no. But you'll want this update.
Tip
So what most people will find useful is @takluyver💰's update of Twine to v7 that we use internally (#416). This version will let them upload their sdists and wheels containing core packaging metadata v2.5 to (Test)PyPI.
🧐 Tell me why..
The rest of the updates bump things related to pypi-attestations and sigstore, which has the most interesting backstory here. @facutuesca💰 sent a patch in #417 but a bunch more helped out.
TL;DR non-pure-python projects with C-extensions tend to have dozens (sometimes hundreds) wheels to upload to PyPI per release. They are often quite big and take time to transfer over the network. People started noticing problems and coming up with DIY sharding workarounds like aio-libs/aiohttp#13226 around July 23.
On this date, projects with a good amount of bytes to publish would start getting timeouts 5 minutes after the PyPI publishing job begun. The same job that worked just fine before.
I had to start pinging upstream library and ecosystem people, on GitHub and privately, to start making sense of what was happening. Eventually, we collectively concluded that GitHub must've shortened the lifetime of their OIDC identity — it seems to have used to be 10 minutes long (at some point in the past) and is now 5 minutes, apparently. It's not documented clearly, and we have not been able to get any clarity by attempting to contact GitHub through private channels, using personal connections.
Over the course of investigation, @facutuesca💰 found and fixed a related underlying cache invalidation bug in sigstore/sigstore-python#1838, which he then coordinated propagation through the dependency chain updates in sigstore-python, pypi-attestations, gh-action-pypi-publish and gh-action-sigstore-python.
Mike's also discovered that Sigstore's Rekor slowdown seems to have become the main contributing cause of the last week's incident. He's collected some data to support this claim: https://publishing-five-minute-timeout.tiiny.site.
🫶 New Contributors
- @davidbrochart made their first contribution in #415
- @takluyver made their first contribution in #416
🪞 Full Diff: v1.14.1...v1.14.2
🧔♂️ Release Manager: @webknjaz 🇺🇦
🙏 Special Thanks to @davidbrochart💰 and @Dreamsorcerer💰 for turning my attention (in #415 and in private) to the newly surfaced corner case in GitHub's behavior that only affected a narrow category of projects while many others remained blissfully unaware. @bdraco💰 came up with a DIY sharding workaround for aiohttp that served as a demo for other projects. @miketheman💰 confirmed the Warehouse-side details. Also, @jku💰 and @woodruffw💰 helped work through, review and release the Sigstore ecosystem upstream libs.
💬 Discuss on Bluesky 🦋, on Mastodon 🐘 and on GitHub.
v1.14.1
This release was cut at EuroPython 2026 Sprints
🛠️ Internal Dependencies
@adisivaprasad💰 helped get rid of the GitHub Actions runner warning about the old Node 20 runtime being used by updating actions/setup-python from v5.6.0 to v6.2.0 in #408.
💪 New Contributors
- @adisivaprasad made their first contribution in #408
- @jylenhof💰 followed up and reminded us to actually cut this release in #413
🪞 Full Diff: v1.14.0...v1.14.1
🧔♂️ Release Manager: @webknjaz 🇺🇦
🙏 Special Thanks to @jylenhof💰 for reminding me to work on this release!
💬 Discuss on Bluesky 🦋, on Mastodon 🐘 and on GitHub.
v1.14.0
Audit your supply chain regularly!
✨ What's Changed
The main change in this release is that verbose and print-hash inputs are now on by default. This was contributed by @whitequark💰 in #397.
📝 Docs
@woodruffw💰 updated the mentions of PEP 740 to stop implying that it might be experimental (it hasn't been for quite a while!) in #388 and @him2him2💰 brushed up some grammar in the README and SECURITY docs via #395.
🛠️ Internal Updates
@woodruffw💰 bumped sigstore and pypi-attestations in the lock file (#391) and @webknjaz💰 added infra for using type annotations in the project (#381).
💪 New Contributors
- @him2him2 made their first contribution in #395
- @whitequark made their first contribution in #397
🪞 Full Diff: v1.13.0...v1.14.0
🧔♂️ Release Manager: @webknjaz 🇺🇦
🙏 Special Thanks to @facutuesca💰 and @woodruffw💰 for helping maintain this project when I can't!
💬 Discuss on Bluesky 🦋, on Mastodon 🐘 and on GitHub.
v1.13.0
Take the 2025 Python Packaging Survey if you still haven't!
Important
🚨 This release includes fixes for GHSA-vxmw-7h4f-hqxh discovered by @woodruffw💰.
We've also integrated Zizmor to catch similar issues in the future and you should too.
✨ New Stuff
@woodruffw💰 updated the README to no longer mention the attestations feature being experimental in #347: it's been rather stable for a year already 🎉
He also added more diagnostic output which includes printing out the GitHub Environment claim via #371 and warning about the unsupported reusable workflows configurations #306, when using Trusted Publishing.
Tip
The official support for reusable workflows is currently blocked on changes to PyPI. To get updates about progress on the action side, you may want to subscribe to #166.
At PyCon US 2025 Sprints, @facutuesca💰, @miketheman💰, @woodruffw💰 and I💰 spent several hours IRL brainstorming how to fix this and migrate projects that happen to rely on an obscure corner case with reusable workflows that temporarily allows them to function by accident.
The result of that discussion is posted @ pypi/warehouse#11096 (comment).
Note that this is a volunteer-led effort and there is no ETA. If you need this soon, make your employer sponsor the PSF and maybe they'll be able to hire somebody for this work on Warehouse.
In addition to that, @konstin💰 sent #378 to pin actions/setup-python to a SHA hash. This makes pypi-publish compatible with new GitHub policies that allow organizations to mandate hash-pinning actions used in workflows.
🛠️ Internal Dependencies
@webknjaz💰 made a bunch of updates to the action runtime which includes bumping it to Python 3.13 in #331 and updating the dependency tree across the board. pip-with-requires-python is no longer being installed (#332). Some related bumps were contributed by @woodruffw💰 (#359) and @kurtmckee💰 sent a contributor-facing PR, bumping the linting configuration via #335.
💪 New Contributors
- @kurtmckee made their first contribution in #335
- @konstin made their first contribution in #378
🪞 Full Diff: v1.12.4...v1.13.0
🧔♂️ Release Manager: @webknjaz 🇺🇦
💬 Discuss on Bluesky 🦋, on Mastodon 🐘 and on GitHub.
v1.12.4
Be nice to FOSS maintainers.
✨ What's Changed
The main theme of this patch release that the support for uploading PEP 639 licensing metadata to PyPI has been fixed in #327.
🛠️ Internal Updates
A few smaller updates include the attestation existence being checked earlier in the process now, listing all the violating files together, not just one (PR #315).
And the lock file with the software available in runtime has been re-pinned in #329.
Additionally, the CI now runs the smoke-tests against both Ubuntu 22.04 and 24.04 explicitly via da900af.
🪞 Full Diff: v1.12.3...v1.12.4
🧔♂️ Release Manager: @webknjaz 🇺🇦
🙏 Special Thanks to @dnicolodi💰 and @woodruffw💰 for releasing the license metadata support fix in Twine!
💬 Discuss on Bluesky 🦋, on Mastodon 🐘 and on GitHub.
v1.12.3
✨ What's Improved
With the updates by @woodruffw💰 and @webknjaz💰 via #309 and #313, it is now possible to publish distribution packages that include core metadata v2.4, like those built using maturin. This is done by bumping Twine to v6.0.1 and pkginfo to v1.12.0.
📝 Docs
We've made an attempt to clarify the runtime and workflow shape that are expected to be supported for calling this action in: https://github.com/marketplace/actions/pypi-publish#Non-goals.
Tip
Please, let us know in the release discussion if anything still remains unclear.
TL;DR always call pypi-publish once per job; don't invoke it in reusable workflows; physically move building the dists into separate jobs having restricted permissions and storing the dists as GitHub Actions artifacts; when using self-hosted runners, make sure to still use pypi-publish on a GitHub-provided infra with runs-on: ubuntu-latest, while building and testing may remain self-hosted; don't perform any other actions in the publishing job; don't call pypi-publish from composite actions.
🛠️ Internal Updates
@br3ndonland💰 improved the container image generation automation to include Git SHA in #301. And @woodruffw💰 added the workflow_ref context to Trusted Publishing debug logging in #305, helping us diagnose misconfigurations faster. #313 also extends the smoke test in the CI to check against the maturin-made dists. Additionally, jeepney and secretstorage transitive deps have been added to the pip constraint-based lock file, as Dependabot seems to have missed those earlier.
🪞 Full Diff: v1.12.2...v1.12.3
🧔♂️ Release Manager: @webknjaz 🇺🇦
🙏 Special Thanks to @samuelcolvin💰 for nudging me to cut this release sooner and for sponsoring me via @pydantic💰!
🔌 Shameless Plug: The other day I've made this 🦋 Bluesky 🇺🇦 FOSS Maintainers Starter Pack subscribe to read news from people like me :)
💬 Discuss on Bluesky 🦋, on Mastodon 🐘 and on GitHub.
v1.12.2
🐛 What's Fixed
The fix for signing legacy zip sdists turned out to be incomplete, so @woodruffw💰 promptly produced another follow-up that updated pypi-attestations from v0.0.13 to v0.0.15 in #297. This is the only change since the previous release.
🪞 Full Diff: v1.12.1...v1.12.2
v1.12.1
🐛 What's Fixed
Version v1.12.0 hit several rare corner cases we never considered fully supported, and this release fixes a few of those.
In #294, @webknjaz💰 improved the self-hosted runner experience by pre-installing Python if it's not there, and with #293 the ability to use the action on GitHub Enterprise instances has been restored. The latter should've also fixed the ability to invoke pypi-publish from nested in-repo composite actions — another exotic use-case that was never tested in our CI.
@woodruffw💰 also managed to squeeze in a last-minute fix for detecting legacy .zip sdists while producing attestations via #295.
🪞 Full Diff: v1.12.0...v1.12.1
🧔♂️ Release Manager: @webknjaz 🇺🇦
🙏 Huge Thanks to all the bug reporters for posting the logs, helping inspect the problems and verify the regression fixes!
v1.12.0
⚡️ Why Should You Update?
This is a minor version bump, but it does not add any new user-facing interfaces. Still, I felt like it should not be a patch-release: this update brings significant changes to the action invocation and internal release process.
Previously, each invocation of pypi-publish required building a container image in the invoking CI job. This was inefficient and added about 30 seconds to the publishing jobs at their startup just to build the container.
I wanted to improve this for over three years (#58) and a little over half a year ago @br3ndonland💰 stepped up and offered a very comprehensive solution to the limitation I was hoping to overcome: #230.
Going forward, I'm going to pre-build per-version containers prior to cutting each release. And the action invocations will just pull the image from GitHub Container registry.
Caution
Known quirks:
- This seems to not work on self-hosted runners without a
pythonexecutable: #289. The workaround could be installing it prior to running the action. Pinning to commit hashes does not work: #290. Workaround: postpone updating until it's fixed or switch to Git tags for now. Subscribe to that issue to follow the progress.UPD: This was an issue during the first 12 hours post release and it has been addressed upstream by publishing a commit SHA-tagged image for the release on Nov 12, 2024 at 10:27 UTC+1.- Calling
pypi-publishfrom another nested repo-local composite action might be breaking file paths: #291. Workaround: postpone updating until it's fixed. Subscribe to that issue to follow the progress. - Running within GitHub Enterprise fails on the action repo clone: #292. Workaround: postpone updating until it's fixed. Subscribe to that issue to follow the progress.
🪞 Full Diff: v1.11.0...v1.12.0
🧔♂️ Release Manager: @webknjaz 🇺🇦
v1.11.0
🔏 Helping you become a trusted supply chain link 🔗
Two months ago, in v1.10.0, @woodruffw💰 integrated support for generating and uploading PEP 740 digital attestations that can be used as provenance objects when analyzing dependency chains for the integrity.
To make sure it works well, it was implemented as an opt-in, so a relatively small subset of projects was able to try it out, and a few issues have been determined and fixed during this time.
That changes today! This version changes the feature toggle to “on by default”. This means that from now on, every project making use of Trusted Publishing will start producing and publishing digital attestations without having to do any modifications to how they use this action.
@woodruffw💰 flipped the respective toggle in #277 with the possibility to opt-out.
🛠️ Internal Dependencies
@woodruffw💰 bumped sigstore to v3.5.1 and pypi-attestations to v0.0.13 in lock files via #276.
🪞 Full Diff: v1.10.3...v1.11.0
🧔♂️ Release Manager: @webknjaz 🇺🇦
🙏 Special Thanks to William for working on improving the supply chain provenance in the ecosystem! The overall effort is tracked @ pypi/warehouse#15871.