跳到內容

儲存庫指令碼

儲存庫指令碼是你依每個儲存庫設定的 shell 指令碼(設定 → 存放庫 → 儲存庫資料列上的終端機圖示), Control Center 的伺服器會對該儲存庫的某個空間的工作樹執行它們——也就是代理工作所在的隔離簽出, 位於 <dataDir>/<workspaceId>/spaces/<spaceId>/repos/<repo>/。

這些指令碼有兩種:

指令碼 執行時機 用途
設定 為某個空間佈建工作樹後立即執行 安裝相依套件、產生檔案、複製 .env
封存 工作樹即將被銷毀或垃圾回收之前 清理工作樹之外的資源(docker 網路、通道、外部狀態)

兩種指令碼都透過 bash -lc 執行(登入 shell,因此以 Homebrew 或 nvm 安裝的工具會在 PATH 上),並以工作樹做為工作目錄,且會設定下列環境變數:

變數 值
CC_WORKSPACE_PATH 工作樹(指令碼的 cwd)
CC_ROOT_PATH 已註冊的來源儲存庫——你自己的簽出
CC_SPACE_ID 工作樹所屬的空間
CC_SPACE_NAME 空間的顯示名稱
CC_REPO_NAME 儲存庫的顯示名稱

例如,一個會安裝相依套件並帶入儲存庫中被 git 忽略的 .env 的設定指令碼:

終端機視窗
pnpm install
cp "$CC_ROOT_PATH/.env" .env
pnpm run build
  • 設定指令碼若以非零狀態結束(或超過 5 分鐘逾時),會使該空間的佈建失敗:該空間會 顯示失敗狀態並提供重試,且該次執行的輸出尾端會被記錄下來。重試會從乾淨的工作樹佈 建,並再次執行指令碼——請把設定指令碼寫成在部分安裝後重新執行仍能運作(套件管理器 本來就是這種行為)。
  • 封存指令碼是盡力而為:失敗(或其 2 分鐘逾時)會被記錄,但絕不會阻擋刪除。封存 會在無人能回應提示的 GC 路徑上執行(空間已刪除、PR 已合併、排程清理)。

設定只會在全新的工作樹上執行:把代理重新派送到已預熱的空間會重用既有的簽出,不會 再次付出安裝成本。

每一次執行都會記錄其狀態、持續時間、結束代碼,以及有長度上限的輸出尾端,並顯示在 同一個設定對話框的「最近的執行」之下(repos.watchScriptRuns 訂閱會即時串流這些資料)。

指令碼是伺服器執行的 shell,因此只有工作區管理員能撰寫,並受到 processSpawn 動作類別 把關——這道護欄網與所有其他會產生處理序的作業所受到的把關完全相同。