Retry the registry checks before giving up on them

Review pushed back on two things in the publish checks. The crates.io User-Agent spelled out getsigit/sigit twice, which goes stale the moment the repo moves. GITHUB_REPOSITORY is already in the environment and says the same thing. Failing the job on an unexpected status also turned a blip at the registry into a failed release. All three curl checks now retry three times with a short delay, so a timeout or a 5xx costs a few seconds. A status that survives the retries is a real answer and still stops the job.

paydii committed Sep 4, 2026 at 16:08 UTC ee28e6ade4c84f16d53260f9953b81d05053d480
3 files changed +7 -2
.github/workflows/release-crates.yml
+4 -1
@@ -70,8 +70,11 @@ jobs:
70 # Branch on the status code rather than on curl's exit status, so an
71 # answer we do not understand stops the job instead of quietly
72 # degrading into that same failure.
73 + # Retry first, so a timeout or a 5xx costs a few seconds instead of
74 + # the whole release.
75 STATUS=$(curl -sS -o /dev/null -w '%{http_code}' \
74 - -H "User-Agent: getsigit/sigit release workflow (github.com/getsigit/sigit)" \
76 + --retry 3 --retry-delay 2 --retry-all-errors \
77 + -H "User-Agent: ${GITHUB_REPOSITORY} release workflow (https://github.com/${GITHUB_REPOSITORY})" \
78 "https://crates.io/api/v1/crates/sigit/${VERSION}")
79
80 case "$STATUS" in
.github/workflows/release-nuget.yml
+2 -1
@@ -304,7 +304,8 @@ jobs:
304 # means the package itself is not on NuGet, which is the first
305 # release and a real "not published".
306 index=$(mktemp)
307 - STATUS=$(curl -sS -o "${index}" -w '%{http_code}' "${package_index_url}")
307 + STATUS=$(curl -sS -o "${index}" -w '%{http_code}' \
308 + --retry 3 --retry-delay 2 --retry-all-errors "${package_index_url}")
309
310 case "$STATUS" in
311 200)
.github/workflows/release-pypi.yml
+1
@@ -186,6 +186,7 @@ jobs:
186 # blocked request would read as "not published yet" and send the
187 # publish below into a version that is already there.
188 STATUS=$(curl -sS -o /dev/null -w '%{http_code}' \
189 + --retry 3 --retry-delay 2 --retry-all-errors \
190 "https://pypi.org/pypi/sigit-code/${RELEASE_VERSION}/json")
191
192 case "$STATUS" in