From 1df5790d2379e6d6560c01aaca4b7f8f607607eb Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Wed, 4 Nov 2026 14:32:04 +0800 Subject: [PATCH] Give the preview process ownership of its Next cache --- .gitea/workflows/preview.yml | 2 +- scripts/preview/compose.yml | 4 ++-- scripts/preview/init.sh | 13 +++++++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.gitea/workflows/preview.yml b/.gitea/workflows/preview.yml index e023852..cc2eaab 100644 --- a/.gitea/workflows/preview.yml +++ b/.gitea/workflows/preview.yml @@ -26,7 +26,7 @@ jobs: SOURCE_SHA: ${{ gitea.sha }} SOURCE_BRANCH: ${{ gitea.ref_name }} run: | - if [ ! -s /opt/prompt-preview/fingerprint ]; then + if [ ! -f /opt/prompt-preview/ready ]; then bash scripts/preview/init.sh "$PWD" waterfall-wiki-tests:6654a1456bdcef77d83ca84373dc36188e15bd12 fi bash scripts/preview/sync.sh "$PWD" "$SOURCE_SHA" "$SOURCE_BRANCH" diff --git a/scripts/preview/compose.yml b/scripts/preview/compose.yml index ca228f5..070fc2c 100644 --- a/scripts/preview/compose.yml +++ b/scripts/preview/compose.yml @@ -71,8 +71,8 @@ services: image: ${PREVIEW_TOOL_IMAGE:?required} profiles: [setup] user: root - volumes: ["tools:/tools"] - command: ["/bin/sh", "-ec", "mkdir -p /tools/corepack && cp -a /root/.cache/node/corepack/. /tools/corepack/ && chown -R 1000:1000 /tools"] + volumes: ["tools:/tools", "next-cache:/preview-next"] + command: ["/bin/sh", "-ec", "mkdir -p /tools/corepack && cp -a /root/.cache/node/corepack/. /tools/corepack/ && chown -R 1000:1000 /tools /preview-next"] migrate: image: ${PREVIEW_TOOL_IMAGE:?required} profiles: [setup] diff --git a/scripts/preview/init.sh b/scripts/preview/init.sh index 109f94d..a1b3ece 100644 --- a/scripts/preview/init.sh +++ b/scripts/preview/init.sh @@ -11,8 +11,11 @@ docker image inspect "$IMAGE" >/dev/null ROOT=/opt/prompt-preview exec 7>/var/lock/prompt-preview-init.lock flock -w 30 7 -if [ -s "$ROOT/fingerprint" ]; then echo 'Already initialized; use sync.sh, or perform an explicit manual refresh' >&2; exit 1; fi -if ss -H -ltn "sport = :$PORT" | grep -q .; then echo "Preview port $PORT is occupied; choose another PREVIEW_PORT" >&2; exit 1; fi +if [ -f "$ROOT/ready" ]; then echo 'Already initialized; use sync.sh, or perform an explicit manual refresh' >&2; exit 1; fi +if ss -H -ltn "sport = :$PORT" | grep -q .; then + project=$(docker inspect --format '{{index .Config.Labels "com.docker.compose.project"}}' prompt-preview-waterfall-wiki-1 2>/dev/null || true) + [[ "$project" == prompt-preview ]] || { echo "Preview port $PORT is occupied" >&2; exit 1; } +fi # The prebuilt tooling image must match dependency, startup and schema inputs. expected=$(node "$SOURCE/scripts/preview/fingerprint.mjs" "$SOURCE") actual=$(docker run --rm --entrypoint node \ @@ -44,14 +47,16 @@ compose run --rm --no-deps prepare-tools compose run --rm --no-deps auth-admin compose run --rm --no-deps migrate # The dependency volume is seeded from the already-verified image, no npm install. -compose up -d --no-build --no-recreate --no-deps waterfall-wiki +compose up -d --no-build --no-deps waterfall-wiki printf '%s\n' "$expected" > "$ROOT/fingerprint" for attempt in {1..90}; do - if curl -fsS --max-time 5 "http://127.0.0.1:$PORT/api/health" >/dev/null; then + if curl -fsS --max-time 5 "http://127.0.0.1:$PORT/api/health" >/dev/null 2>&1; then + touch "$ROOT/ready" echo "Preview initialized on port $PORT; pnpm dev remains running" exit 0 fi sleep 2 done compose logs --tail 60 waterfall-wiki +compose stop waterfall-wiki exit 1