/** * deploy.mjs — 依具名目標部署 console-ui 到 Cloudflare Pages * * 用法:npm run deploy:personal / npm run deploy:enterprise * * 為什麼不直接用 `wrangler pages deploy`(2026-07-22 leo 立,實際踩到才補): * **兩個帳號都有名為 arcrun-console-ui 的 Pages 專案** * · leo21c → arcrun-console-ui.pages.dev(個人版 console) * · uncle6 → 綁 rag-demo.arcrun.dev(企業版 demo 站) * wrangler 若 OAuth 登入在 uncle6,`--project-name arcrun-console-ui` 會部到 demo 站上。 * 本腳本強制帶目標的 accountId,並在部署前印出目標,避免部錯帳號。 * * 同時把 profile/apiBase 綁進目標(deploy.targets.json),不再靠部署者記得帶環境變數—— * 帶漏過三次:demo 站漏 profile=rag 顯示成個人版、兩站漏 apiBase 導致登入 405。 */ import { readFileSync } from 'node:fs'; import { spawnSync } from 'node:child_process'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..'); const targets = JSON.parse(readFileSync(join(ROOT, 'deploy.targets.json'), 'utf8')); const names = Object.keys(targets).filter((k) => !k.startsWith('_')); const name = process.argv[2]; if (!name || !targets[name]) { console.error(`用法:npm run deploy:\n可用目標:${names.join(' / ')}`); if (name) console.error(`(收到未知目標:"${name}")`); process.exit(1); } const t = targets[name]; console.log(`\n部署目標:${name}`); console.log(` 說明 :${t.description}`); console.log(` 帳號 :${t.accountId}`); console.log(` 專案 :${t.projectName}`); console.log(` profile :${t.profile}`); console.log(` apiBase :${t.apiBase}\n`); const env = { ...process.env, DEPLOY_TARGET: name, CLOUDFLARE_ACCOUNT_ID: t.accountId }; // t160(leo 07-31:「如果你會搞不清楚,就把錯的東西刪掉」):build 步驟已隨舊世代 // src/ 一起 git rm——public/ 是唯一世代真身(手改演進),deploy=直接託管它。 // 病史:src/(舊代 renderer 快照)與 public/(新代真身)並存,deploy 自動跑 build // 從舊 src 重產 public ⇒ 任何一次部署都可能把 UI 打回舊世代(07-27 記帳、07-31 引爆: // t159 重打包用了舊 public 的分支副本,leo 刷新看到被淘汰的「登記新庫」表單)。 // 世代閘:部署前驗 public 指紋,舊世代(缺新文案/含人工建庫表單)直接拒部。 const portalHtml = readFileSync(join(ROOT, 'public', 'portal', 'index.html'), 'utf8'); if (!portalHtml.includes('不需要人工新增') || portalHtml.includes('登記新庫')) { console.error('✘ 世代閘:public/portal/index.html 不是現行世代(缺「不需要人工新增」或含「登記新庫」)——拒絕部署舊 UI。'); process.exit(1); } // --commit-dirty:本地部署常有未提交變更,不因此中斷 const deploy = spawnSync( 'npx', ['wrangler', 'pages', 'deploy', 'public', '--project-name', t.projectName, '--commit-dirty=true'], { stdio: 'inherit', cwd: ROOT, env }, ); process.exit(deploy.status ?? 1);