#!/bin/bash # check-deploy-drift.sh — 線上/Gitea/本機三方版本對帳(2026-07-30 立) # # 為什麼存在:07-30 雲端總管看 Gitea 判「線上 919ed39 的程式碼失蹤」,實情是 # t143-t150 十筆 commit 只在本機沒 push——雲端缺「本機領先 Gitea 幾筆」的視野就會誤報。 # 本腳本讓任何 session(含雲端)一條命令看清三方是否一致;有落差 exit 1。 # # 用法:scripts/check-deploy-drift.sh # 需要 GITEA_TOKEN(環境變數,或頂層 .env 有就自動吸)。 # 雲端 checkout 沒有 products/(gitignore)→ 本機欄自動降級成「—」,只比前兩欄。 set -euo pipefail cd "$(dirname "$0")/.." TOP="$(pwd)" GITEA="https://git.uncle6.me/api/v1/repos/Leo/arcrun-rag/raw" INSTALLER_REF="${INSTALLER_REF:-fix/t75-remove-config-card}" LANDING_REF="${LANDING_REF:-feat/daemon}" LOCAL_REPO="$TOP/products/arcrun-rag" if [ -z "${GITEA_TOKEN:-}" ] && [ -f "$TOP/.env" ]; then set -a; source "$TOP/.env" 2>/dev/null || true; set +a fi [ -n "${GITEA_TOKEN:-}" ] || { echo "❌ 缺 GITEA_TOKEN(環境變數或頂層 .env)"; exit 2; } VER_PAT='20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]+[0-9a-f]\{7\}' # 從 worker.js 內容推導安裝器版本號(BUNDLE_BUILT + '+' + 釘碼前 7 碼,同 worker.js 顯示邏輯) derive_installer_ver() { local built pin built="$(printf '%s' "$1" | grep -o "BUNDLE_BUILT = '[^']*'" | head -1 | sed "s/.*'\(.*\)'/\1/" || true)" pin="$(printf '%s' "$1" | grep -o 'arcrun-rag-bundles@[0-9a-f]*' | head -1 | cut -d@ -f2 | cut -c1-7 || true)" { [ -n "$built" ] && [ -n "$pin" ]; } && printf '%s+%s' "$built" "$pin" || printf '?' } # ── 線上 ── LIVE_INSTALLER="$(curl -s -m 25 "https://install.arcrun.dev/?cb=$RANDOM" | grep -o "$VER_PAT" | head -1 || true)" LIVE_LANDING="$(curl -s -m 25 "https://rag.arcrun.dev/?cb=$RANDOM" | grep -o "$VER_PAT" | head -1 || true)" # ── Gitea ── G_WORKER="$(curl -s -m 25 "$GITEA/installer/oauth-prototype/worker.js?ref=$INSTALLER_REF" -H "Authorization: token $GITEA_TOKEN" || true)" GITEA_INSTALLER="$(derive_installer_ver "$G_WORKER")" GITEA_LANDING="$(curl -s -m 25 "$GITEA/landing/wrangler.toml?ref=$LANDING_REF" -H "Authorization: token $GITEA_TOKEN" \ | grep -o 'SITE_BUNDLE_VERSION = "[^"]*"' | sed 's/.*"\(.*\)"/\1/' || true)" # ── 本機(沒有 products/ 就降級)── if [ -d "$LOCAL_REPO/.git" ]; then L_WORKER="$(git -C "$LOCAL_REPO" show "$INSTALLER_REF:installer/oauth-prototype/worker.js" 2>/dev/null || true)" LOCAL_INSTALLER="$(derive_installer_ver "$L_WORKER")" LOCAL_LANDING="$(git -C "$LOCAL_REPO" show "$LANDING_REF:landing/wrangler.toml" 2>/dev/null \ | grep -o 'SITE_BUNDLE_VERSION = "[^"]*"' | sed 's/.*"\(.*\)"/\1/' || true)" # 本機另一種漂移:commit 了沒推(07-30 事故本尊) UNPUSHED_I="$(git -C "$LOCAL_REPO" log --oneline "gitea/$INSTALLER_REF..$INSTALLER_REF" 2>/dev/null | wc -l | tr -d ' ' || true)" UNPUSHED_L="$(git -C "$LOCAL_REPO" log --oneline "gitea/$LANDING_REF..$LANDING_REF" 2>/dev/null | wc -l | tr -d ' ' || true)" HAS_LOCAL=1 else LOCAL_INSTALLER="—"; LOCAL_LANDING="—"; UNPUSHED_I=""; UNPUSHED_L="" HAS_LOCAL=0 echo "(本機沒有 products/arcrun-rag——雲端模式,只比線上 vs Gitea)" fi printf '%-10s %-20s %-20s %-20s\n' "" "線上" "Gitea" "本機" printf '%-10s %-20s %-20s %-20s\n' "installer" "${LIVE_INSTALLER:-?}" "${GITEA_INSTALLER:-?}" "${LOCAL_INSTALLER:-?}" printf '%-10s %-20s %-20s %-20s\n' "landing" "${LIVE_LANDING:-?}" "${GITEA_LANDING:-?}" "${LOCAL_LANDING:-?}" DRIFT=0 chk() { # chk 名稱 線上 gitea 本機 local name="$1" live="$2" gitea="$3" local_="$4" [ -n "$live" ] && [ "$gitea" != "?" ] && [ "$live" != "$gitea" ] && { echo "❌ $name:線上($live) ≠ Gitea($gitea)"; DRIFT=1; } if [ "$HAS_LOCAL" = "1" ]; then [ "$local_" != "?" ] && [ "$gitea" != "?" ] && [ "$local_" != "$gitea" ] && { echo "❌ $name:本機($local_) ≠ Gitea($gitea)——改了沒推?"; DRIFT=1; } fi true } chk installer "${LIVE_INSTALLER:-}" "${GITEA_INSTALLER:-?}" "${LOCAL_INSTALLER:-?}" chk landing "${LIVE_LANDING:-}" "${GITEA_LANDING:-?}" "${LOCAL_LANDING:-?}" [ -n "$UNPUSHED_I" ] && [ "$UNPUSHED_I" != "0" ] && { echo "❌ installer 分支有 $UNPUSHED_I 筆 commit 未推上 Gitea"; DRIFT=1; } [ -n "$UNPUSHED_L" ] && [ "$UNPUSHED_L" != "0" ] && { echo "❌ landing 分支有 $UNPUSHED_L 筆 commit 未推上 Gitea"; DRIFT=1; } [ "$DRIFT" = "1" ] && { echo "⚠️ 有漂移(見上)"; exit 1; } # 抓不到 ≠ 驗證通過(假綠禁令):任何欄位是 ? 就不准報 ✅ if [ -z "${LIVE_INSTALLER:-}" ] || [ -z "${LIVE_LANDING:-}" ] || [ "$GITEA_INSTALLER" = "?" ] || [ -z "${GITEA_LANDING:-}" ]; then echo "⚠️ 有欄位抓不到(網路/權限問題)=無法驗證,不算通過;重跑一次試試"; exit 2 fi echo "✅ 無漂移"