From 021c680bb6b40a0997cb8fab9f007755a28b5b65 Mon Sep 17 00:00:00 2001 From: modusensus Date: Thu, 12 Nov 2026 22:19:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=8F=91=E7=89=88=E5=9B=9E=E6=9F=A5?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E4=BB=8E=2030=20=E7=A7=92=E6=94=BE=E5=88=B0?= =?UTF-8?q?=204=20=E5=88=86=E9=92=9F=EF=BC=8C=E5=88=AB=E5=86=8D=E8=AF=AF?= =?UTF-8?q?=E5=88=A4=20CDN=20=E5=BB=B6=E8=BF=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 第一次实跑 v0.9.0 就翻车了:npm publish 明明成功(日志里 "+ dsh-cura@0.9.0"、 provenance 也发到了 sigstore),紧接着的回查只等了 30 秒就判定失败, release job 被跳过,整个 run 红着。 npm 自己在输出里写了 "Your package is being processed and may take a few minutes to become available"——30 秒窗口比它自己声明的延迟还短。 改法: - 窗口 10 × 3s → 24 × 10s(4 分钟) - 查询加 --prefer-online,绕过本地 CDN 缓存,否则查到的是旧缓存 - 每次未命中打印第几次重试,失败时能看出是"一直没上去"还是"最后才上去" 补三条断言盯着这件事:窗口是分钟级且带 --prefer-online、超时才失败而不是 首次没查到就失败、回查只在真上传过的那次跑(跳过 publish 时不该卡在回查)。 三条变异全部 EXIT=1:窗口退回 30 秒 / 去掉 --prefer-online / 去掉 if 守卫。 --- .github/workflows/release.yml | 16 ++++++++++------ tests/test-release-body.mjs | 9 +++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d1e1083..2eacd80 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -125,15 +125,19 @@ jobs: run: | ver="$(node -p "require('./package.json').version")" name="$(node -p "require('./package.json').name")" - # registry 有缓存延迟,给它 30 秒 - for i in $(seq 1 10); do - if npm view "$name@$ver" version >/dev/null 2>&1; then - echo "$name@$ver 已在 registry 上" + # registry 有 CDN 延迟,npm 自己会说 "may take a few minutes to become + # available"。第一次发 0.9.0 时只等 30 秒就判失败,其实包是发成功的 + # ——等太短会把 CDN 抖动当成发版失败,等太久又把真失败拖成十分钟。 + # 现在给 4 分钟(24 × 10s),超过这个数就是真没上去。 + for i in $(seq 1 24); do + if npm view "$name@$ver" version --prefer-online >/dev/null 2>&1; then + echo "$name@$ver 已在 registry 上(第 $i 次查询命中)" exit 0 fi - sleep 3 + echo "第 $i/24 次没查到,10 秒后重试" + sleep 10 done - echo "::error::npm publish 报告成功,但 registry 上查不到 $name@$ver" + echo "::error::npm publish 报告成功,但 4 分钟后 registry 上仍查不到 $name@$ver" exit 1 release: diff --git a/tests/test-release-body.mjs b/tests/test-release-body.mjs index a93e797..57a8ab0 100644 --- a/tests/test-release-body.mjs +++ b/tests/test-release-body.mjs @@ -151,5 +151,14 @@ ok('release.yml 先测试后发版', /needs:\s*\[test\]/.test(yml)); ok('Release 等 publish 完成才建', /needs:\s*\[test, publish\]/.test(yml)); ok('重复打同一个 tag 不会重复建 Release', /gh release view/.test(yml) && /已存在/.test(yml)); +// 回查窗口:npm 官方会说 "may take a few minutes to become available", +// 等 30 秒就把 CDN 抖动误判成发版失败(0.9.0 真踩过)。 +ok('发完回查给了分钟级窗口,且查询绕过 CDN 缓存', + /seq 1 24/.test(yml) && /--prefer-online/.test(yml) && /sleep 10/.test(yml)); +ok('回查超时才算失败,不是首次没查到就失败', + /for i in \$\(seq 1 24\); do/.test(yml) && /exit 1/.test(yml)); +ok('回查只在上传过的那次跑(跳过 publish 时不该卡在回查)', + /- name: 发完回查一次\s*\n\s*if: steps\.check\.outputs\.published == 'true'/.test(yml)); + console.log('\n' + (fail === 0 ? 'all release body tests passed ✓' : fail + ' 项失败')); if (fail) process.exitCode = 1;