From a70bd4eaf4ccee410a1df4423ecb275520d1ae4f Mon Sep 17 00:00:00 2001 From: Jarry Shaw Date: Fri, 18 Sep 2026 22:10:08 -0400 Subject: [PATCH] ci: stop a TestPyPI outage from costing the release its wheels The 1.5.0b2 release reached PyPI with all 8 files, but its GitHub Release is missing three wheels -- cp312, pp310 and pp311 -- and the cause is ordering, not the upload. In the pypi job, `Publish package to TestPyPI` sits between `Publish to PyPI` and `Upload package to GitHub Release`. On the Python 3.12 leg the step log reads: [Publish to PyPI] outcome=success [Publish package to TestPyPI] outcome=failure urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool( host='test.pypi.org', port=443): Read timed out. (read timeout=5) PyPI had already accepted the upload. A transient timeout against a secondary index then failed the job, so the GitHub Release step never ran and that leg's wheel was never attached. With no `fail-fast: false` on the matrix, the failure also cancelled the pypy3.10 and pypy3.11 legs, which lost their wheels the same way. Two changes: - `continue-on-error: true` on the TestPyPI step. It is a secondary target; its availability must not gate the real release. - `fail-fast: false` on the pypi matrix. Each leg has its own wheel to attach, and a cancelled leg never attaches it. Note `skip-existing: true` was already set on both publish steps, so this was never a duplicate-upload conflict -- that was my first hypothesis and the log refuted it. Verified the file still parses and both changes landed where intended: pypi.strategy.fail-fast=False, 7 matrix legs, TestPyPI continue-on-error=True, PyPI and GitHub Release steps untouched at continue-on-error=False, step order unchanged. Does not backfill the three wheels already missing from the v1.5.0b2 release; that is a published artefact and the maintainer's call. --- .github/workflows/create-release.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 4dcd42194..0414f60a1 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -186,6 +186,9 @@ jobs: needs: [ github, version_check ] if: ${{ startsWith(github.ref_name, 'v') || needs.version_check.outputs.PCAPKIT_TAG_EXISTS == 'false' }} strategy: + ## one leg failing must not cancel its siblings: each leg still has its own + ## wheel to attach to the GitHub Release, and a cancelled leg never does + fail-fast: false matrix: python-version: - "3.10" @@ -234,7 +237,12 @@ jobs: skip-existing: true attestations: false + ## TestPyPI is a secondary target and its availability must not gate the + ## real release. A transient ``test.pypi.org`` read timeout failed the + ## 1.5.0b2 Python 3.12 leg *after* PyPI had already accepted the upload, + ## which skipped the GitHub Release step below and lost that wheel. - name: Publish package to TestPyPI + continue-on-error: true uses: pypa/gh-action-pypi-publish@release/v1 with: # password: ${{ secrets.TEST_PYPI_API_TOKEN }}