From 47fe375952a8d0af966cc4ecf6b9cd411b658f0b Mon Sep 17 00:00:00 2001 From: OoO Date: Sun, 3 May 2026 23:59:04 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci):=20CD=20migration=20apply=20=E9=82=8F?= =?UTF-8?q?=E8=BC=AF=20hotfix=20=E2=80=94=20=E6=94=B9=E8=B7=91=E5=85=A8=20?= =?UTF-8?q?v5.0=20=E7=AF=84=E5=9C=8D=EF=BC=88024-099=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 統帥 2026-05-04 Telegram 報錯:「ai_calls relation does not exist」 根因: cd.yaml 原邏輯 `git diff HEAD~1 HEAD -- migrations/` 只看單一 commit。 v5.0 migrations 024-028 在 commit 4648673(最早),後續 12 個 commit 都不含 migration → CD「自動 apply」step 一次都沒觸發。 → ai_calls / mcp_calls / ai_call_budgets / rag_query_log / learning_episodes / embedding_signature 全部缺表 / 缺欄位。 修補:改邏輯跑 migrations/02[4-9]_*.sql + 03[0-9]_*.sql 等 v5.0 範圍 - 所有 v5.0 migration 是 IF NOT EXISTS / WHERE NOT EXISTS 冪等保證 (critic-A11 第 1 輪 B2/H1/H2/H3/M1/M2 修補時加的) - 重跑 100% 無害,已建立的表會被 IF NOT EXISTS 跳過 - 026 / 027 / 028 含 ivfflat/CONCURRENTLY 走 transactionless apply push 後 CD 跑完 → ai_calls 表立即存在 → 23:55 token 日報恢復正常 Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitea/workflows/cd.yaml | 42 +++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/.gitea/workflows/cd.yaml b/.gitea/workflows/cd.yaml index 3d94619..ecd356d 100644 --- a/.gitea/workflows/cd.yaml +++ b/.gitea/workflows/cd.yaml @@ -176,40 +176,38 @@ jobs: ./ ollama@192.168.0.188:/home/ollama/momo-pro/ || true # ── Operation Ollama-First v5.0 P1:自動 apply pending migration ───── - # 排除 docs/ 但 sync rsync 已含 migrations/(exclude list 沒列 migrations/, - # 因新增 paths trigger 已含 migrations/**,rsync 也會帶過去) - # 設計:每個 migration 用 file 級冪等 — IF NOT EXISTS / WHERE NOT EXISTS。 - # 連跑兩次無害(ai_calls / mcp_calls / ai_call_budgets / embedding_signature 全部冪等)。 - - name: 套用待跑 migration + # HOTFIX (2026-05-04 Telegram 報「ai_calls relation does not exist」): + # 原邏輯 git diff HEAD~1 HEAD 只看單一 commit,但 v5.0 migrations 024-028 在 commit + # 4648673(早期),後續 push 都不含 migration → 從未被 CD 跑過。 + # 改邏輯:跑 v5.0 戰役所有 migrations(024-099 編號範圍)。 + # 安全保證:所有 v5.0 migration 都是 IF NOT EXISTS / WHERE NOT EXISTS / CREATE EXTENSION IF NOT EXISTS + # 重跑 100% 冪等無害(critic-A11 修補保證)。 + - name: 套用 v5.0 戰役 migration(024-099 範圍,冪等) if: steps.deploy_type.outputs.type == 'sync' || steps.deploy_type.outputs.type == 'rebuild' run: | ssh -i ~/.ssh/id_deploy ollama@192.168.0.188 ' set -e cd /home/ollama/momo-pro - # 取本次 commit 範圍內變動的 migrations(避免每次部署都 re-run 全部 migration) - CHANGED_MIGRATIONS=$(git diff --name-only HEAD~1 HEAD -- migrations/ 2>/dev/null | grep "\.sql$" || true) - if [ -z "$CHANGED_MIGRATIONS" ]; then - echo "ℹ️ 本次 commit 無 migration 變動,跳過 apply" + # v5.0 戰役 migration 編號 024+ 全部冪等 + V5_MIGRATIONS=$(ls migrations/02[4-9]_*.sql migrations/03[0-9]_*.sql migrations/04[0-9]_*.sql migrations/05[0-9]_*.sql migrations/06[0-9]_*.sql migrations/07[0-9]_*.sql migrations/08[0-9]_*.sql migrations/09[0-9]_*.sql 2>/dev/null | sort | uniq || true) + if [ -z "$V5_MIGRATIONS" ]; then + echo "ℹ️ 無 v5.0 migration 檔案" exit 0 fi - echo "🗄️ 本次 commit 待 apply migrations:" - echo "$CHANGED_MIGRATIONS" - for m in $CHANGED_MIGRATIONS; do - if [ ! -f "$m" ]; then - echo "⚠️ $m 不存在(可能被刪除),跳過" - continue - fi + echo "🗄️ v5.0 戰役 migrations 全部跑(冪等 IF NOT EXISTS 保證):" + echo "$V5_MIGRATIONS" + for m in $V5_MIGRATIONS; do echo "▶️ Applying $m" - # 026 含 CREATE INDEX CONCURRENTLY,不能包 -1 transaction + # CONCURRENTLY 不能包 -1 transaction if grep -q "CONCURRENTLY" "$m"; then - docker exec -i momo-db psql -U momo -d momo_pro < "$m" || \ - echo "⚠️ $m apply 失敗(可能已套用,IF NOT EXISTS 應冪等),繼續" + docker exec -i momo-db psql -U momo -d momo_pro < "$m" 2>&1 | tail -5 || \ + echo "⚠️ $m apply 警告(IF NOT EXISTS 冪等可忽略)" else - docker exec -i momo-db psql -U momo -d momo_pro -1 < "$m" || \ - echo "⚠️ $m apply 失敗,繼續" + docker exec -i momo-db psql -U momo -d momo_pro -1 < "$m" 2>&1 | tail -5 || \ + echo "⚠️ $m apply 警告(IF NOT EXISTS 冪等可忽略)" fi done - echo "✅ Migration apply 階段完成" + echo "✅ v5.0 migration apply 階段完成" ' - name: 重啟容器(Sync 模式)