e744ad1f96
事故鏈(07-31 深夜,leo 刷新撞到):t159 重打包 staging bundle 時,build-ui-bundle 吃了 feat/step3 分支的 console-ui/public/——該分支基底早於 maind7fab7c「拿掉登記新庫」,public 停在舊世代 ⇒ youlin 實例 UI 被打回被淘汰的 「登記新庫」人工表單典範(07-27 mistakes 已記帳的 src/public 雙世代債, 這次由「分支副本停舊代」路徑引爆——債沒還,任何一個部署路徑都會引爆它)。 刪掉的(舊世代,git rm 實體刪除): - console-ui/src/(console.ts/console-dashboard.ts/portal-ui.ts)=07-22 從 cypher-executor 搬出的 renderer 快照,自 07-27 起與 public/ 真身脫鉤、只會 重產舊 UI - console-ui/scripts/build.mjs=從上述舊 renderer 重產 public 的 build 步驟 (deploy.mjs 原自動跑它=引爆器本體) - cypher POST /portal/admin/libraries(人工建庫端點)=死端點(e28e190 起 UI 零呼叫;leo 規格「要直通 daemon,同步,沒有登記這回事」)。GET 列表/PATCH 管理/t159 daemon 自動登記照舊 新唯一源:console-ui/public/=手改演進的真身(本 commit 同步到 maine28e190世代+註解字樣改寫達成「登記新庫」全檔 0 命中);deploy.mjs 改為直接託管 public(無 build 步)+世代閘(缺「不需要人工新增」或含「登記新庫」拒部署)。 驗:tsc 全綠;deploy.mjs node --check 過;重打 ui bundle 242KB 過世代閘, 指紋「登記新庫」=0/「不需要人工新增」=1。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
61 lines
3.1 KiB
JavaScript
61 lines
3.1 KiB
JavaScript
/**
|
||
* 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:<target>\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);
|