fix(cli): 更新完還看得到版本號——CLI 重部署不再把版本標籤(和你的設定)洗掉 #107
Reference in New Issue
Block a user
Delete Branch "fix/version-label-106"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
修
Leo/Arcrun#106:更新完 Portal 設定頁顯示「無法讀取目前版本(知識庫服務可能正在啟動)」。① 我選了哪個解法、為什麼
兩件事一起修,而且它們的規則剛好相反——這是本題的核心判斷:
PORTAL_MAIL_RELAY_BASE/CONSOLE_TENANT/…)#97「已部署的 worker 上綁著什麼就是事實」那句話,原封不動套用到 plain_text var 上——#97保住了櫃子,這次補上櫃子上的標籤。ARCRUN_BUNDLE_VERSION實作位置就在
#97已經在做的地方:planResources()讀GET /workers/scripts/{name}/settings時,同一份回應裡本來就有
plain_textbinding,舊版只挑資源類、把 var 整批丟掉。現在順手帶回來——不多打一次 API,也不新增一種「查不到」的失敗模式(讀不到綁定已經在
#97那道門擋掉了)。排除清單
CLI_MANAGED_VARS(WORKER_SUBDOMAIN/CF_ACCOUNT_ID/MULTI_TENANT/KBDB_BASE_URL/ 版本標籤)不沿用——那些是 CLI 這趟自己算出來的,沿用等於拿舊值蓋掉正解。刻意沒有做「toml 有宣告就以 toml 為準」:repo toml 裡的
CONSOLE_TENANT = "leo"是官方 prod 的值,拿它蓋掉使用者實例上的值,就是同一種病的另一面(更新一次把人家的設定洗成官方預設)。
② 更新後那個值該是什麼、依據是什麼
「變成新版本」,不是「沿用舊的」——你的直覺是對的。
沿用舊值會得到一個永遠停在安裝當天的假標籤:程式碼換了、標籤沒換。這比沒有標籤更糟,
因為它會讓你以為驗收過了(正是紅線裡「拿安裝時的舊值充數」那條)。
那新值取哪裡?依據是**「誰在定義『最新版』」:Portal 設定頁與 daemon
cloudVersionStale()都是拿
install.arcrun.dev/api/latest的release當最新版來比。所以標籤必須是同一把尺量得出來的東西**,否則就算有值也永遠顯示「較舊版本 → 有新版可以更新」(同一個自我維持迴圈,只是換個字)。
⇒
ARCRUN_BUNDLE_VERSION= 部署當下該頻道公告的release(純 semver)。誠實邊界(要講清楚):CLI 部的是
Leo/Arcrun@main的原始碼,semver 是安裝器頻道在發的,兩者不是同一套編號。語義是「我跟這個頻道的最新發行同源」。所以我另外把真正部署的 commit 一起烙上去:
ARCRUN_BUNDLE_COMMIT,/health多吐bundle_commitcommit f87d0e9)查不到 release(離線/頻道掛了)→ 不猜、不掰,退成
YYYY-MM-DD+<commit7>(老實例本來就是這個格式)。Portal 對非 semver 一律顯示「較舊版本」——那正是我們要的:寧可說不準,也不要假裝已是最新。
③ 用安裝器裝的那條路有沒有被影響
沒有。 安裝器(
arcrun-raginstaller/oauth-prototype/worker.js)一行都沒動,它照舊注入自己的版號。/health只是多一個「有才吐」的欄位(bundle_commit),安裝器不注入 → 該欄省略,回應與現在一字不差(有回歸測試看守,見下)。用安裝器裝的實例之後如果跑
acr update,標籤會被換成同一套編號的新版號——這正是要的行為。
實測輸出
A. Portal 設定頁的版本行——跑的是
console-ui/public/portal/index.html裡那 79 行原文B. 對真實已部署 worker 的唯讀 dry-run(只有 GET,沒有部署、沒有任何寫入)
註:這台實例「要沿用的 var」清單是空的——因為它那 11 個 var 不是 CLI 自己算的(4 個),
就是與 repo toml 同值(其餘)。沿用那一半是用單元測試驗的(下面 ⑦,含
PORTAL_MAIL_RELAY_BASE這種「安裝器有、repo toml 沒有」的真實情境)。C. 兩個必要前提是實查的,不是假設
D. 測試
E. 附帶修好的東西(都在同一條路上)
acr update現在用 commit sha 下載 archive:先問 Giteamain的 sha,再抓那個 sha 的 tarball。不可變 ⇒ 順手把
#13 P2「branch tarball 被中間層快取成舊的,deploy 回 ✓ 但 ship 的是舊碼」整個病根拿掉,而且「這趟到底部了哪個 commit」現在會印在畫面上、也烙進標籤裡。
src/內部 import 寫.js、outDir是dist,型別剝離不會把
.js對回.ts;加上 parameter property 需要--experimental-transform-types)。補了一個只在「預設解析失敗時」才動作的 resolve hook。
#97那份「使用者的東西還在不在」的迴歸守衛也在裡面——跑不起來的守衛等於沒有守衛。
🔴 沒做到的部分(誠實標,不算通)
沒有在真實實例上跑過
acr update,也沒有真實 Portal 的截圖。 原因是環境的硬限制,不是省略:~/.arcrun/config.yaml指的是 leo21c(account51a01bfa…)——紅線禁碰。GET /accounts實查:leo21c + 另一個無 workers subdomain 的帳號)。youlin 這台沒有任何憑證可用,指定的測試靶場我進不去。
wrangler一律需要人工核准(連wrangler --version都是),瀏覽器 MCP 同樣未授權。⇒ CP 狀態:◐ 半通。前端這一半(給定 payload 畫什麼)與後端這一半(會寫進去什麼)
都各自有實跑證據,但**「在一台真的實例上按下更新、再打開設定頁看」這一步沒有人做過**。
接手的人只要有 youlin 憑證,驗收是三行:
其他待人確認的:
cloudVersionStale()沒被讀過(它住在arcrun-rag,本 repo 看不到)。推論是「純 semver 就會判對」,因為 Portal 用的是同一支
/api/latest——但這是推論,不是實證。.worker-builds/沒有重編(出貨路徑 A 的成品)。本次修法不需要它:CLI 是從原始碼部署的,而
bundle_commit只有 CLI 那條路會注入,安裝器不注入。要不要順手重編是另一個 chore。console-ui的 Portal 改動走 arcrun-rag 的 UI bundle 出貨,不隨這個 PR 到使用者手上。主修法不依賴它(烙的是純 semver,現行 Portal 本來就看得懂)。