diff --git a/scripts/release.sh b/scripts/release.sh index 5cdf35b..52c6676 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -130,14 +130,30 @@ digest_of() { | python3 -c 'import sys,json;print(json.load(sys.stdin).get("digest","?"))' 2>/dev/null \ || echo "?" } -D_LATEST=$(digest_of latest) -D_V01=$(digest_of v0.1) -D_IMM=$(digest_of "${IMMUTABLE_TAG}") +# Docker Hub 的 tags API 有传播延迟:刚 push 完立刻查,常常还是旧 digest。 +# 实测遇到过 latest 已是新值、v0.1 还停在旧值,如果只查一次就会误判成 +# "并发覆盖"并拒绝部署。所以轮询到三者一致为止(最多 60 秒)。 +DIGEST_ATTEMPTS=12 +DIGEST_SLEEP=5 +for attempt in $(seq 1 ${DIGEST_ATTEMPTS}); do + D_LATEST=$(digest_of latest) + D_V01=$(digest_of v0.1) + D_IMM=$(digest_of "${IMMUTABLE_TAG}") + if [ "${D_LATEST:0:19}" = "${D_V01:0:19}" ] && [ "${D_LATEST:0:19}" = "${D_IMM:0:19}" ] \ + && [ "${D_LATEST:0:19}" != "?" ]; then + break + fi + if [ "${attempt}" -lt "${DIGEST_ATTEMPTS}" ]; then + echo " ⏳ 远端 digest 尚未同步(第 ${attempt}/${DIGEST_ATTEMPTS} 次),${DIGEST_SLEEP}s 后重试…" + sleep ${DIGEST_SLEEP} + fi +done echo " latest : ${D_LATEST:0:19}" echo " v0.1 : ${D_V01:0:19}" echo " ${IMMUTABLE_TAG}: ${D_IMM:0:19}" if [ "${D_LATEST:0:19}" != "${D_V01:0:19}" ] || [ "${D_LATEST:0:19}" != "${D_IMM:0:19}" ]; then - echo "❌ 三个 tag digest 不一致,先别继续部署(可能是并发构建覆盖了 latest)" + echo "❌ 三个 tag digest 不一致(已等待 $((DIGEST_ATTEMPTS * DIGEST_SLEEP)) 秒)" + echo " 若 latest 与 v0.1 不同:可能是并发构建覆盖了 latest(检查 flock 锁是否被绕过)" exit 1 fi echo " → 一致 ✅"