From 20273fb5be65d4bd0fb3cde43fa8b8adeec02440 Mon Sep 17 00:00:00 2001 From: mole404 <248403041+mole404@users.noreply.github.com> Date: Mon, 28 Sep 2026 19:28:57 +0800 Subject: [PATCH] =?UTF-8?q?test(ci):=20=E8=87=AA=E8=AF=81=E6=AD=A5?= =?UTF-8?q?=E9=AA=A4=E7=9A=84=E7=AD=89=E5=BE=85=E4=BF=A1=E5=8F=B7=E6=94=B9?= =?UTF-8?q?=E6=88=90=E3=80=8C=E5=88=86=E6=94=AF=E6=9C=80=E5=90=8E=E5=86=99?= =?UTF-8?q?=E7=9A=84=E4=B8=9C=E8=A5=BF=E3=80=8D=EF=BC=88=E4=BF=AE=E7=AB=9E?= =?UTF-8?q?=E6=80=81=E5=81=87=E5=A4=B1=E8=B4=A5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上一轮 CI(36414664596)挂在「空卷里没有版本标记」—— 又是断言/等待逻辑的问题, 不是应用问题:播种分支要拷 115MB 应用树,其中 index.php 在字母序里很早就拷完, 而我拿它当「播种完成」信号,于是 cp 还在跑的时候就去查版本标记(标记是分支最后 才拷的),必然查不到。 - 场景 A:完成信号改成盯 `.code-revision`(播种分支最后一个写入),轮询放宽到 120s - 场景 B:完成信号改成盯日志行 `已同步进卷`(sync 的 tar 写完之后才 echo), 避免在 tar 还在写卷时断言读到中间状态;JS md5 断言保留为同步后的硬校验 --- .github/workflows/build-image.yaml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-image.yaml b/.github/workflows/build-image.yaml index 5e9956a..b51fcb1 100644 --- a/.github/workflows/build-image.yaml +++ b/.github/workflows/build-image.yaml @@ -195,8 +195,11 @@ jobs: # 关键:Lsky 的安装向导自己会创建 .env,所以必须在**发任何 HTTP 请求之前** # 检查 .env 是否已经存在,否则分不清"镜像泄漏"和"向导生成"。 docker run -d --name lsky-a -v "$VOL":/var/www/html -e WEB_PORT=8089 "$IMAGE_REF" - for i in $(seq 1 30); do - if docker exec lsky-a test -f /var/www/html/public/index.php; then break; fi + # 完成信号必须用「该分支最后写的东西」:播种分支的顺序是 cp 整个应用树(115MB, + # 其中 index.php 在字母序里很早就拷完)→ 再拷 .env.example → 最后拷版本标记。 + # 拿 index.php 当完成信号会假失败(实测踩过),所以盯标记。 + for i in $(seq 1 60); do + if docker exec lsky-a test -f /var/www/html/.code-revision; then break; fi sleep 2 done docker exec lsky-a test -f /var/www/html/public/index.php || { echo "::error::空卷没被播种"; exit 1; } @@ -248,12 +251,15 @@ jobs: ' docker run -d --name lsky-b -v "$VOL":/var/www/html -e WEB_PORT=8089 "$IMAGE_REF" - for i in $(seq 1 30); do - if docker exec lsky-b md5sum /var/www/html/public/js/context-js/context-js.js 2>/dev/null | grep -q "$CONTEXT_JS_MD5"; then break; fi + # 同样:同步分支的日志行是在 tar 写完之后才 echo 的,拿它当完成信号, + # 避免在 tar 还在写卷的时候就去断言(会读到中间状态)。 + for i in $(seq 1 60); do + if docker logs lsky-b 2>&1 | grep -q '已同步进卷'; then break; fi sleep 2 done docker logs lsky-b 2>&1 | grep '\[lsky\]' || true docker logs lsky-b 2>&1 | grep -q '已同步进卷' || { echo "::error::旧标记时没有走同步分支"; exit 1; } + docker exec lsky-b md5sum /var/www/html/public/js/context-js/context-js.js | grep -q "$CONTEXT_JS_MD5" || { echo "::error::同步后卷里的 JS 不是镜像版本"; exit 1; } B=$(docker exec lsky-b sh -c ' echo "JS_MD5=$(md5sum /var/www/html/public/js/context-js/context-js.js | cut -d" " -f1)"