/** * 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 }; const build = spawnSync('node', [join(ROOT, 'scripts', 'build.mjs')], { stdio: 'inherit', env }); if (build.status !== 0) process.exit(build.status ?? 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);