場景邊界
cron 扇出適合:單一維運帳號、腳本短且冪等、每行 flock+牆鐘上限、接受分鐘級抖動。多小隊、CI 與真人同車道,或要優先權/公平性時,cron 常不敷用。
Nomad 式排程適合把「每機一條 codesign」「解析 2 並行、archive 1」等max concurrent寫死,並宣告化重啟/重排。兩工作可能寫同一可變目錄卻無鎖域=已進佇列+鎖。占座、VNC 等協作失敗見共享 Mac 佇列與占座 FAQ。
隊列模型對比表
欄位即維運契約:能否不靠翻多份 crontab 判讀狀態。
| 維度 | cron 扇出+包裝腳本 | Nomad 式輕量隊列 |
|---|---|---|
| 首次開跑延遲 | 多為 60s 週期;縮週期易羊群化。 | 佇列驅動;暖機時 p50 常 <1 分鐘。 |
| 併發控制 | flock/計數/Redis,易漂移。 |
task group、count、spread;上限單點可讀。 |
| 搶佔/隔離 | 多無;砍長任務靠口傳。 | 重啟/重排/優先級+稽核軌跡。 |
| 可觀測性 | 日誌散、關聯弱。 | 集中歷史、標準標籤。 |
| 維運負擔 | 裝快、長期漂移高。 | 前期重、人變多時較穩。 |
| 典型故障 | 靜默重疊、快取壞。 | 約束錯→飢餓,HCL 可修。 |
可執行設定要點
收緊的 cron(單車道):明確鎖檔、拒絕堆疊。
# /etc/crontab 片段 — 僅 buildlane 使用者
*/1 * * * * buildlane /usr/bin/flock -n /var/run/meshmac/build.lane.lock \
timeout 45m /usr/local/bin/run-ci-dequeue.sh >>/var/log/meshmac/dequeue.log 2>&1
出隊前檢查 pending:長度 >20 則 exit 77 並告警。細節見flock 構建佇列 FAQ。
Nomad 週期 batch(示意 HCL;控制面執行,任務內再 SSH/agent 連 Mac):
job "meshmac-mac-build" {
datacenters = ["dc1"]
type = "batch"
periodic {
cron = "*/2 * * * *"
prohibit_overlap = true
}
group "lane" {
count = 1
task "dequeue" {
driver = "exec"
config { command = "/usr/local/bin/run-ci-dequeue.sh" }
resources { cpu = 500 memory = 512 }
restart {
attempts = 3
interval = "30m"
delay = "30s"
mode = "delay"
}
}
}
}
單一 archive 車道請開 prohibit_overlap。實際 Mac 工作留在 run-ci-dequeue.sh(SSH/runner),政策集中於 job。
權限與鎖
排程歸排程,macOS 強制權限:buildlane 專帳、簽章僅授權該帳;LaunchDaemon 用 sudo -u buildlane,勿 root 跑 Xcode。
- 鎖粒度:每共享資源(Pods、cache、模擬器)各一
.lock。 - 中繼資料:鎖旁 JSON 記
job_id/commit/runner_name。 - 清理:
trap釋放鎖並刪半成品.xcarchive。
構建衝突驗收清單
- ☐ 同路徑雙 dry-run 無寫入交錯(或僅於 flock 短區內)。
- ☐ CI/手動共用同一出隊入口。
- ☐ 鎖等待 p95 勿常態 >15 分鐘。
- ☐ 強殺後無僵死 flock。
- ☐ 五晚 archive 後磁碟仍 >15%。
超時退避參數
抄入 runbook,依 p95 構建微調。
| 參數 | cron+shell 基線 | Nomad 式基線 |
|---|---|---|
| 單任務牆鐘 | 輕量 timeout 45m;重 archive 90m。 |
task kill_timeout 對齊同值;勿沿用預設 30s 跑 Xcode。 |
| 鎖等待 | 套件管理建議 flock -w 180;逾時失敗並打點。 |
等待寫在 worker;排程器重啟勿忙迴圈,delay 至少 30s。 |
| 重試退避 | 指數:30s、60s、120s 封頂;乘 0.8~1.2 抖動。 |
reschedule:max_delay = "5m"、delay_function = "exponential"。 |
| 全域 pending 上限 | 每車道 pending 20;拒絕時回可判讀 HTTP/exit code。 | 提交端+佇列雙重強制;Nomad 不替你猜業務 SLA。 |
重試前可 sleep $((30 + RANDOM % 30));日誌帶 attempt/reason。
FAQ
Mac 上要跑 Nomad? 不必;Linux 控制面+Mac 執行即可,重點是宣告式契約。
cron 簡單為何仍爆? 無 pending 上限→隱性積壓;縮週期只擠鎖。
搶佔寫哪? 配置歸排程器;VNC/協作歸 runbook/占座。
小結與下一步
多節點與專用共享構建資源
成長中團隊:發版與夜構分節點、互動另機,佇列才可測。免登入下單。