fix(ci): CD migration apply 邏輯 hotfix — 改跑全 v5.0 範圍(024-099)
All checks were successful
CD Pipeline / deploy (push) Successful in 3m42s

統帥 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) <noreply@anthropic.com>
This commit is contained in:
OoO
2026-05-03 23:59:04 +08:00
parent c7d6db31f2
commit 47fe375952

View File

@@ -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 戰役所有 migrations024-099 編號範圍)。
# 安全保證:所有 v5.0 migration 都是 IF NOT EXISTS / WHERE NOT EXISTS / CREATE EXTENSION IF NOT EXISTS
# 重跑 100% 冪等無害critic-A11 修補保證)。
- name: 套用 v5.0 戰役 migration024-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 模式)