跳到內容

執行機群工作程序

在備用機器上執行 cc_worker,即可為你的機群增添執行容量。它是一個純 Dart 二進位檔——不含 Flutter 引擎——會與一個 cc_server 配對、宣告主機的能力、 傳送心跳、拉取租約作業、執行這些作業,並把處理程序事件串流回傳。它不保存任何 持久狀態:監督程式將它重新啟動後,它會重新註冊。

你需要先有一個執行中的 cc_server——請參閱執行無介面伺服器。

已配對的工作程序會註冊、傳送心跳,並等待租約作業。請以 fleet.submitJob 提交工作。這台伺服器上的代理派送不會經過機群;本指南的成功訊號,是工作程序 帶著最新的心跳出現在機群面板中。開機時註冊的行程內工作程序,其執行器對應表 是空的,因此放到它上面的作業會傳回 No local runner for job kind …。

  • Dart SDK。這個儲存庫以 fvm 固定其 SDK 版本,因此指令請加上 fvm 前綴。
  • 在工作程序機器上檢出這個儲存庫。
  • 一個可觸及的 cc_server(開發時用回送,正式環境用區域網路或遠端)。
  • PATH 中有 git——工作程序會具體化儲存庫並執行 git 探測。
終端機視窗
cd apps/cc_worker
fvm dart build cli

這會在 ./build/cli/<os_arch>/bundle/bin/cc_worker 產生一個自足的套件組合。

cc_server 只接受出示已配對裝置 ID 與預先共用金鑰的工作程序——回送伺服器也 不例外。請在伺服器機器上簽發它們(伺服器運作時也能執行 pair;新的裝置 不必重新啟動就會被納入):

終端機視窗
cc_server pair --data-dir <dir> --device my-worker --label "Build box"

它會印出 Device id 與 Pairing key——這些就是 --device-id 以及 --psk / --psk-file / CC_WORKER_PSK 所接受的值。

對已配對的伺服器:

終端機視窗
./build/cli/<os_arch>/bundle/bin/cc_worker \
--server wss://host:9030 --device-id my-worker --psk-file /path/to/worker.psk

對回送伺服器(仍然需要配對——cc_server 一律執行 PSK 交握):

終端機視窗
fvm dart run cc_worker --server ws://localhost:9030 \
--device-id my-worker --psk-file /path/to/worker.psk
旗標 說明 預設值
--server <url> cc_server URL(ws:///wss://;http(s) 與缺少的 /rpc 路徑會被強制轉換)。必填。 —
--name <name> 操作人員看到的工作程序名稱。 主機名稱
--device-id <id> 穩定的已配對裝置 ID,同時用作工作程序 ID。 cc-worker
--psk-file <path> 其第一個非空白行即為配對金鑰的檔案。優先於 --psk。 —
--psk <key> 直接寫在命令列上的配對金鑰。會出現在 ps 與 shell 歷史紀錄中——二進位檔會提出警告。 —
--max-jobs <n> 此處理程序可同時執行的作業數上限(正整數)。 4

金鑰的解析順序為 --psk-file → CC_WORKER_PSK → --psk。若省略所有來源, 就會跳過工作程序的驗證交握;如此一來,真正的 cc_server 會拒絕該工作階段 (auth_denied),而不是接受未經驗證的工作程序。未知旗標會造成用法錯誤 (exit 64)——與 cc_server 不同,這個二進位檔使用 package:args,不會 忽略打錯的旗標。

CC_WORKER_CACHE 會覆寫工作樹具體化快取目錄(預設:系統暫存目錄下的 cc_worker_cache 目錄)。

工作程序會以 fleet.registerWorker 註冊,接著每 20 秒傳送一次心跳,並每 2 秒 輪詢一次租約。它會一直執行到收到 SIGINT/SIGTERM;請將它置於 systemd 或 launchd 之下,讓它在當機或重新開機後重新啟動並重新註冊。

在桌面版或網頁版應用程式中開啟 可觀測性,切換到 即時 分頁並捲動到 底部。工作節點 會列出每一個已註冊的工作程序,以及其平台、核心、能力鍵與 最後一次心跳;作業 則列出分散到這些節點上的作業。

你的工作程序帶著最新的心跳出現在其中,就是配對與註冊成功的確認。

在工作程序的磚上,你可以清空它(完成目前的作業、不接受新的租約)、 恢復正在清空的工作程序、撤銷其憑證,或移除該列。

工作程序與作業的資料列位於伺服器的 global.db 中——工作程序本身除了具體化 快取之外,不會寫入任何內容到磁碟。

註冊時,工作程序會自動偵測自身能力,排程器則依這些能力來媒合作業。你不需要 手動設定它們:

  • 作業系統與架構(macos/linux/windows、arm64/x64)——精確探測,並退回 uname -m / PROCESSOR_ARCHITECTURE
  • 核心與 RAM——精確的核心數;RAM 無法探測時會退化為 0
  • flutter——當可觸及 Flutter SDK 時會設定(先找單純的 flutter,再找 fvm flutter);golden 渲染作業需要它
  • sandbox——macOS 上為 native-macos,Linux 上為 native-linux。這是配置提示,不是承諾:工作程序宣告的是其平台_確實具備_的後端,但它不會把自己執行的作業包在其中。與 cc_server 不同,cc_worker 會直接啟動租約作業
  • always-on 與 parallel——專用的 cc_worker 一律會宣告這兩者,因此符合評測批次與其他用完即丟的平行運算容量

偵測採盡力而為:任何無法探測到的項目都會退化為安全的預設值,而不會讓啟動失敗。

租約通訊協定帶有六種作業類型:

類型 內容
agentRun 單次代理執行(派送)
pipelineStep 管線步驟的執行
codeIndex 儲存庫程式碼索引的建置
goldenRender UI 視覺 golden 渲染(需要 flutter)
benchmark 效能基準測試的執行
evalBatch 評測批次(偏好 parallel 容量)

執行是真正的子處理程序串流實作,而不是完整的內嵌代理執行環境。當租約帶有 repoRemote 時,工作程序會把 git clone --depth 1 執行到以遠端與 SHA 為鍵的 快取目錄,然後執行 git fetch 與 git checkout。對於 agentRun,它會在工作 目錄中執行租約環境之 CC_JOB_COMMAND 所指的命令,並把 stdout 與 stderr 以 事件形式串流回傳;若沒有 CC_JOB_COMMAND,它會回顯提示詞,讓傳輸路徑仍能被 端到端演練。其他類型則執行小型但真實的命令(git rev-parse HEAD、 git --version)作為誠實的探測。租約環境中屬於作業範圍的憑證會注入每個子 處理程序,且永遠不會寫入日誌。

事件會分批處理,每 250 毫秒或每 32 個事件沖刷一次;每個作業都以一個完成事件 與一份完成報告作結。這個模型是心跳加上短 TTL 的租約:如果工作程序失去聯繫, 其租約就會過期,伺服器便會回收該作業以進行重試。工作程序上沒有持久狀態, 工作程序之間也沒有共識或工作竊取。