Commit 670479ea by luoqi

fix(deploy): 自更新后用新版重跑 —— 光包 main() 不够

实测踩到:服务器上脚本是旧版,运行时 git pull 拉到了新版,但**本次进程跑的仍是内存里
已载入的旧版函数** —— 文件已经是 curl -sL 了,报错文案却还是旧版的,排查了一轮才明白。

包在 main() 里解决的是「bash 边读边执行、pull 后按新文件字节偏移读后半段」的错位问题
(deploy-prod.sh 头部注释记的那个);但它防不了「这一轮跑的是旧逻辑」——
函数在调用前就已整体载入内存,pull 换掉磁盘文件不影响已载入的定义。

修法:pull 前后比对本文件的 blob hash,变了就 exec bash "$0" --no-pull 用新版重跑,
--no-pull 同时防无限递归。
parent 2794eb18
Pipeline #3667 failed in 0 seconds
......@@ -19,6 +19,10 @@
# 线上 API 参考页的 Server URL 一直是 localhost:3101。
# → 本脚本固化两个 env-file,并在构建后**硬校验** servers 地址,写错立刻失败而非静默上线。
#
# 【自更新】脚本会 git pull 更新自己。整个逻辑包在 main() 里防"字节偏移错位"(同 deploy-prod.sh),
# 但那还不够:本次进程跑的是**内存里已载入的旧版函数**,新逻辑这一轮不生效。
# 故 pull 后若本文件有变化,exec 新版重跑一次(带 --no-pull 防递归)。
#
# 用法(服务器上,~/pac):
# bash deploy/deploy-docs.sh # 部署文档站
# COMPOSE_MANAGED=1 bash deploy/deploy-docs.sh # 托管 DB 形态的机器(同 deploy-prod.sh)
......@@ -33,7 +37,18 @@ main() {
if [[ "${1:-}" != "--no-pull" ]]; then
log "git 拉取($(git rev-parse --abbrev-ref HEAD))"
# ⚠️ 脚本会拉取更新**自己**。包在 main() 里能防"字节偏移错位",但防不了另一件事:
# 本次进程跑的仍是**内存里已载入的旧版函数**,拉下来的新逻辑这一轮不生效。
# 2026-09-03 实测:文件已是新版(curl -sL),报错文案却还是旧版的,排查了一轮才明白。
# → pull 后若脚本自身变了,用新版 exec 重跑一次(带 --no-pull 防无限递归)。
local before after
before=$(git rev-parse HEAD:deploy/deploy-docs.sh 2>/dev/null || echo none)
git pull --ff-only
after=$(git rev-parse HEAD:deploy/deploy-docs.sh 2>/dev/null || echo none)
if [[ "$before" != "$after" ]]; then
log "本脚本已更新 → 用新版重跑"
exec bash "$0" --no-pull
fi
fi
# compose 组装与 deploy-prod.sh 保持一致 —— 两个 env-file 缺一不可(见文件头说明)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment