From 36e170ae04f96592e096741fa83103e9a9b45339 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Sat, 29 Aug 2026 14:18:43 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci):=20docker=5Fbuild=5Fonly=20(PR=E6=9E=84?= =?UTF-8?q?=E5=BB=BA)=20=E5=90=8C=E6=AD=A5=E5=A2=9E=E5=8A=A0=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E6=8D=9F=E5=9D=8F=E4=B8=B2=E8=A1=8C=E9=87=8D=E5=BB=BA?= =?UTF-8?q?=E5=AE=B9=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/ci/docker_build_only.sh | 45 ++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/scripts/ci/docker_build_only.sh b/scripts/ci/docker_build_only.sh index db97b681d..aed388ba9 100755 --- a/scripts/ci/docker_build_only.sh +++ b/scripts/ci/docker_build_only.sh @@ -36,13 +36,44 @@ echo "Image tag: ${IMAGE_TAG}" echo "Builder: ${BUILDER_NAME}" echo "" -docker buildx build \ - $NO_CACHE_FLAG \ - $BUILD_ARGS \ - --cache-from "type=registry,ref=${CACHE_REF}" \ - -f "${DOCKERFILE}" \ - -t "${IMAGE_TAG}" \ - . +run_build() { + docker buildx build \ + $NO_CACHE_FLAG \ + $BUILD_ARGS \ + --cache-from "type=registry,ref=${CACHE_REF}" \ + -f "${DOCKERFILE}" \ + -t "${IMAGE_TAG}" \ + . +} + +# PR 构建同样容错:检测到 builder 缓存损坏时,用 flock 串行重建共享 builder 后重试一次 +if ! build_output=$(run_build 2>&1); then + if echo "$build_output" | grep -qE "parent snapshot.*not found|snapshot.*does not exist|cache.*corrupt|failed to compute cache key|no such file or directory.*cache"; then + echo "$build_output" + echo "⚠️ builder 缓存异常,串行重建持久 builder 后重试..." + LOCK_FILE="/tmp/ci-builder-persist-rebuild.lock" + exec 9>"$LOCK_FILE" + flock -w 120 9 || echo "⚠️ 等待重建锁超时,直接重试 build" + if ! docker buildx inspect "$BUILDER_NAME" --bootstrap >/dev/null 2>&1; then + 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 + else + echo "✅ builder 已被其他并发 job 重建/恢复,直接复用" + fi + run_build + else + echo "$build_output" + exit 1 + fi +else + echo "$build_output" +fi echo "" echo "PR build OK (build only, no output): ${IMAGE_TAG}"