From acc21ee22fc2b2a7459f85f3dc46558998f248e7 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Sat, 29 Aug 2026 14:18:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci):=20docker=5Fbuild=5Fpush=20=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E6=8D=9F=E5=9D=8F=E9=87=8D=E5=BB=BA=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=20flock=20=E4=B8=B2=E8=A1=8C=20+=20=E5=81=A5=E5=BA=B7=E5=BA=A6?= =?UTF-8?q?=E5=A4=8D=E6=9F=A5=EF=BC=8C=E9=81=BF=E5=85=8D=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E4=BA=92=E5=88=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/ci/docker_build_push.sh | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/scripts/ci/docker_build_push.sh b/scripts/ci/docker_build_push.sh index e2fb79061..26fbc8bb5 100755 --- a/scripts/ci/docker_build_push.sh +++ b/scripts/ci/docker_build_push.sh @@ -85,13 +85,29 @@ build_with_cache_retry() { echo "$build_output" echo "" echo "⚠️ builder 缓存异常,重建持久 builder 后重试 (attempt $attempt/$max_attempts)..." - docker buildx rm "$BUILDER_NAME" >/dev/null 2>&1 || true - docker buildx create --name "$BUILDER_NAME" --driver docker-container \ - --driver-opt network=host \ - --buildkitd-flags "--allow-insecure-entitlement network.host" \ - --platform linux/amd64 - docker buildx use "$BUILDER_NAME" - docker buildx inspect "$BUILDER_NAME" --bootstrap + # 共享 builder 的重建必须串行:ci-builder-persist 被所有 build job 共用, + # 若 job A 正在构建、job B 检测到损坏直接 rm,会把 A 正在用的 buildkit 杀掉。 + # 用 flock 串行化重建;拿到锁后再次检查 builder 健康度,已被别的 job 重建则直接复用。 + LOCK_FILE="/tmp/ci-builder-persist-rebuild.lock" + exec 9>"$LOCK_FILE" + echo "🔒 等待重建锁(最多 120s)..." + if flock -w 120 9; then + if docker buildx inspect "$BUILDER_NAME" --bootstrap >/dev/null 2>&1; then + echo "✅ builder 已被其他并发 job 重建/恢复,直接复用" + else + echo "🔨 锁内重建持久 builder..." + docker buildx rm "$BUILDER_NAME" >/dev/null 2>&1 || true + docker buildx create --name "$BUILDER_NAME" --driver docker-container \ + --driver-opt network=host \ + --buildkitd-flags "--allow-insecure-entitlement network.host" \ + --platform linux/amd64 + docker buildx use "$BUILDER_NAME" + docker buildx inspect "$BUILDER_NAME" --bootstrap + fi + else + echo "⚠️ 等待重建锁超时,直接重试 build(失败将重试/--no-cache)" + docker buildx use "$BUILDER_NAME" 2>/dev/null || true + fi attempt=$((attempt + 1)) else echo "$build_output"