test(ci): 自证步骤的等待信号改成「分支最后写的东西」(修竞态假失败)

上一轮 CI(36414664596)挂在「空卷里没有版本标记」—— 又是断言/等待逻辑的问题,
不是应用问题:播种分支要拷 115MB 应用树,其中 index.php 在字母序里很早就拷完,
而我拿它当「播种完成」信号,于是 cp 还在跑的时候就去查版本标记(标记是分支最后
才拷的),必然查不到。

- 场景 A:完成信号改成盯 `.code-revision`(播种分支最后一个写入),轮询放宽到 120s
- 场景 B:完成信号改成盯日志行 `已同步进卷`(sync 的 tar 写完之后才 echo),
  避免在 tar 还在写卷时断言读到中间状态;JS md5 断言保留为同步后的硬校验
This commit is contained in:
mole404 committed 2026-09-28 19:28:57 +08:00
1 parent 0a321bf49b
commit 20273fb5be
1 file changed
+10 -4
+10 -4
View File
@@ -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)"