From 73c7ddcee0cccc0fc0eb5bfd7ff8b641dd1de6c7 Mon Sep 17 00:00:00 2001 From: OoO Date: Thu, 30 Apr 2026 23:32:59 +0800 Subject: [PATCH] =?UTF-8?q?fix(cd):=20=E4=BD=BF=E7=94=A8=20inplace=20rsync?= =?UTF-8?q?=20=E4=BF=9D=E7=95=99=20bind=20mount=20inode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/cd.yaml | 3 +++ docs/memory/history_logs.md | 1 + tests/test_cd_health_check.py | 1 + 3 files changed, 5 insertions(+) diff --git a/.gitea/workflows/cd.yaml b/.gitea/workflows/cd.yaml index 82e8780..a0f84b6 100644 --- a/.gitea/workflows/cd.yaml +++ b/.gitea/workflows/cd.yaml @@ -135,6 +135,7 @@ jobs: # ── 安裝部署工具 ──────────────────────────────────────────────────── # rsync --ignore-errors 防止單一不可寫 attr 中斷整個部署 + # rsync --inplace 避免 app.py/config.py 單檔 bind mount 因 inode replacement 卡住舊版本 - name: 安裝 rsync / ssh run: | apt-get update -qq && apt-get install -y -qq rsync openssh-client @@ -144,6 +145,7 @@ jobs: if: steps.deploy_type.outputs.type == 'sync' run: | rsync -avz --ignore-errors \ + --inplace \ -e "ssh -i ~/.ssh/id_deploy" \ --exclude='.git/' \ --exclude='.gitea/' \ @@ -203,6 +205,7 @@ REMOTE_SYNC (echo 'ABORT: momo-db not running' && exit 1)" # H1: 與 Sync 模式對齊的完整 excludes(含 .gitea/ .claude/ docs/ *.md) rsync -avz --ignore-errors \ + --inplace \ -e "ssh -i ~/.ssh/id_deploy" \ --exclude='.git/' \ --exclude='.gitea/' \ diff --git a/docs/memory/history_logs.md b/docs/memory/history_logs.md index b94f5f1..3d9b6e2 100644 --- a/docs/memory/history_logs.md +++ b/docs/memory/history_logs.md @@ -53,6 +53,7 @@ - **CD sync hot reload**: 一般 Python/模板同步不再 `restart momo-app`,改為 `docker kill -s HUP momo-pro-system` 讓 Gunicorn 熱重載 workers,只重啟 scheduler / telegram-bot;Gunicorn 關閉 `preload_app`,確保 HUP 後 workers 會 import 新版 app code。 - **OpenClaw Bot 第二刀拆分**: Inline Keyboard builders 移到 `services/openclaw_bot/menu_keyboards.py`,透過 `configure_menu_keyboards()` 注入 `latest_date/_GOALS/TAIPEI_TZ`,route 檔下降到 5,240 行並補選單回歸測試。 - **CD sync mount drift guard**: 發現舊 app 容器未掛載 `app.py/config.py` 時,rsync 後服務檔已更新但 `/health` 版本仍卡 image 內舊檔;CD sync 會檢查 mount,僅 drift 時一次性 recreate momo-app,其餘維持 HUP 熱重載。 +- **CD 單檔 bind mount inode 修復**: `app.py/config.py` 單檔 bind mount 會被 rsync/tar 的 inode replacement 卡住舊檔,CD rsync 改用 `--inplace`,避免 HUP reload 後仍讀到舊版本。 ### 2026-04-28~29:Phase 3e 重構大戰 + daily_sales cache 隱形 bug 根除 - **app.py 縮減 -10.8%**: 7,386 → 6,590 行,11 commits 全綠零 502。 diff --git a/tests/test_cd_health_check.py b/tests/test_cd_health_check.py index c593538..a8734c2 100644 --- a/tests/test_cd_health_check.py +++ b/tests/test_cd_health_check.py @@ -36,6 +36,7 @@ def test_cd_sync_mode_hot_reloads_app_without_container_restart(): def test_cd_sync_mode_repairs_app_mount_drift_once(): workflow = CD_WORKFLOW.read_text(encoding="utf-8") + assert "--inplace" in workflow assert "momo-app mount drift detected" in workflow assert "grep -qx '/app/app.py'" in workflow assert "grep -qx '/app/config.py'" in workflow