From 425d4e8fc6aae3a6ebb280aa9c6f2d5155db7f1c Mon Sep 17 00:00:00 2001 From: Wayland Yang Date: Thu, 11 Jun 2026 09:49:28 +0800 Subject: [PATCH] fix(ci): pypi-publish skip-existing=true so re-pushed tags don't go red MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit publish-pypi.yml was failing with HTTP 400 'File already exists' when a v* tag got force-pushed (e.g. when fixing release.yml's Docker job for v0.5.2 — see #235). The publish step has nothing to do, but the action defaults to skip-existing=false, so the no-op surfaces as a failure. Set skip-existing=true: PyPI immutability means re-publish is a logical no-op anyway, and treating it as a hard error means every tag-fix dance leaves a red X behind that's actually a non-event. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/publish-pypi.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml index 9f47212..efb9773 100644 --- a/.github/workflows/publish-pypi.yml +++ b/.github/workflows/publish-pypi.yml @@ -59,3 +59,8 @@ jobs: with: packages-dir: sdk/python/dist print-hash: true + # Idempotent under force-pushed / re-run tags: a 400 "File + # already exists" on PyPI is a no-op, not a release failure. + # PyPI immutability means we never overwrite an existing + # version — re-pushing a tag just becomes a green skip. + skip-existing: true