① 兩條佇列、同一台機器
合併佇列管「誰能合併、在最新預設分支上是否仍綠燈」,降低主幹邏輯衝突。Runner 標籤管「job 派到哪台遠端 Mac」,只是篩選器,不做跨庫公平配額。
兩者並行時,延遲多半由 Runner 主宰(Xcode、archive、模擬器、簽章)。佇列深度健康卻長期 Queued,先查標籤與硬體,勿只調 GitHub 端旋鈕。wiki 請同頁畫出佇列名稱/平行度/必要檢查與標籤圖。
② 決策矩陣:合併佇列 vs 標籤路由
下表用來選主要控制平面。成熟團隊通常兩者並用:合併佇列顧主幹,標籤顧構建機與 Xcode 釘選;每週釋出或更高頻時,「並用」列可視為預設建議。
| 取向 | 最適合 | 主要風險 | 在共享 Mac 上的緩解 |
|---|---|---|---|
| 合併佇列優先 | 合併頻率高、主幹完整性要求嚴、多人共用單一預設分支。 | 佇列項目帶來額外 CI 回合;Runner 飽和時像「雙重等待」。 | 限制併列平行構建數、對齊必要檢查,並讓佇列 workflow 打到 ci-merge 等有容量背書的標籤。 |
| 標籤路由優先 | 合併頻率低、工具鏈變體多、須嚴格釘選 Xcode/SDK。 | 主幹仍可能因邏輯衝突而斷在合併佇列能攔下的情境。 | 預設分支啟用合併佇列;標籤專責工具鏈隔離。 |
| 兩者並用(規模化建議) | 共享遠端 Mac 池同時服務 PR 與主幹檢查;發版需要可預約槽位。 | 政策發散:逾時或併發鍵重複、難以稽核。 | 統一命名 concurrency: 群組、文件化搶佔規則,並把閾值鏡射到下節參數表。 |
| 僅主機 flock、無佇列紀律 | 單一重度互斥(例如簽章)在同一台機器。 | 遮蔽 GitHub 端可觀測的平行度;卡鎖會拖住不相關 workflow。 | flock 必配牆鐘逾時與告警;優先加節點再拉長關鍵區。細節見flock 構建佇列 FAQ。 |
③ 參數清單(可抄)
下列數字為起點基線,請依實測等待時間、磁碟餘裕與簽章約束調整;重點是可維運:每個參數都應有負責人、文件與儀表板可見度。
| 參數 | 建議起點 | 備註 |
|---|---|---|
| 合併佇列深度/平行度 | 重度 Xcode 每池 1~2 個平行構建;僅在 CPU/磁碟指標有餘裕時試 3 | 深平行會放大完整重編成本;留意檢查項意外扇出。 |
| Runner 池待處理深度(告警) | 同一組標籤 pending 約 15~25 筆警告;約 40 筆以上升級為 paging 級別 | 標籤不做公平排程;應監控「建立→指派」等待分位數。 |
| Runner 標籤(示例) | self-hosted、macOS、arm64、xcode-16-2、ci-pr/ci-merge/ci-release |
將 ci-merge 與雜訊型 PR 檢查分開,避免合併佇列餓死在可選 workflow 後面。 |
Workflow concurrency(併發鎖) |
PR:group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true;發版 archive:false |
多 workflow 互碰同一資源時,可再加共享 org/repo+trunk 互斥群組。 |
flock 關鍵區 |
每條鑰匙圈路徑上簽章/公證同時僅一車道;鎖檔放在文件化的 CI 卷或 /var/tmp |
必與下列逾時同開;記錄鎖持有者 id。模式見佇列與鎖 FAQ。 |
Job timeout-minutes |
PR 編譯:30~60;archive/匯出:90~120;佇列重驗與 PR 同級,除非差異極小可縮短 | 用 p95 而非最佳案例調整;較短逾時可回收卡死 worker。 |
Shell timeout(GNU/BSD) |
網路呼叫包一層:120~300 秒;上傳步驟:300~600 秒 | 避免 curl 懸掛直到整個 job 逾時。 |
| 搶佔規則(優先序) | PR 檢查 < 可選夜間 < 合併佇列 < 發版;不搶佔簽章互斥持有者 | 以標籤與併發群組編碼優先權;政治上難分時搭配負載與故障轉移拆池。 |
④ 在池化 Mac 上組合政策
⑤ FAQ
合併佇列 job 要跟 PR 用同一組標籤嗎?
可共用工具鏈標籤(例如 xcode-16-2),但不要與高雜訊可選檢查共用容量標籤。為佇列與發版保留 ci-merge/ci-release 後綴,路由語意才清楚。
兩個儲存庫搶同一台 Mac,第一顆旋鈕轉哪?
先依產品線或 SKU 拆 Runner,再收緊 concurrency。路由誠實之前,調高併列平行度只會把延遲推回審查節奏,治標不治本。
下一步:擴節點與升級套餐
在佇列變深之前擴池:節點與套餐一次看清
Meshmac 支援多區遠端 Mac;當 mutex 與 Runner pending 反覆觸線,以加節點或升級套餐分流 ci-merge/ci-release 比再縮逾時更有效。