痛點拆解
- 並發拉取:兩車道同時
match development,加密 git 倉 mid-push 損壞,憑證「隨機消失」。 - 鑰匙串串味:分發憑證記進 GUI login,SSH 無頭任務卻讀 lane 檔,
codesign報 identity 找不到。 - 佇列假死:
flock -w大於作業逾時,無人記錄鎖持有者,歸檔掛一整夜。
收斂目標:讀可並行、寫必串行;lane 鑰匙圈與互動工作階段分離;鎖等待小於作業逾時。
車道佈局 vs 爆炸半徑(決策矩陣)
| 模式 | Match + lane 鑰匙圈 | 僅共用 login |
|---|---|---|
| 並發拉取 | shallow + 讀鎖;寫入 flock 串行 | push 競態;憑證回滾難查 |
| Codesign 佇列 | 單機一歸檔;CI 車道排隊 | 雙 archive 搶 USB 授權 |
| MeshMac 2–8 席 | 池化 M4 構建機預設 | 僅實驗室;勿上生產 |
① Match git 並發與 shallow 策略
🚀 把憑證倉當生產資料:讀可重疊,寫不可。
- Shallow:CI 用
git clone --depth 1;Match 前git fetch --depth 1 origin $BRANCH。 - 讀並發:無寫鎖時允許多路
match readonly/development fetch。 - 寫串行:
match development、appstore、nuke共用一個match-repo.lock。
MATCH_GIT_URL=git@github.com:org/certificates.git
export GIT_SSH_COMMAND="ssh -o ControlMaster=auto -o ControlPath=/tmp/ssh-%r@%h:%p"
flock -w 180 /var/run/meshmac/match-repo.lock \
fastlane match development --readonly false
② login keychain 分區
SSH 分帳戶不能替代簽名分區;圖形 VNC 與無頭 CI 須分鑰匙圈(見共享構建權限隔離)。
- Lane 檔案:
/srv/keychains/team-a-ci.keychain-db每應用或租戶一份。 - 解鎖視窗:僅在 Codesign 包裝器內
security unlock-keychain。 - 環境變數:
MATCH_KEYCHAIN_NAME/MATCH_KEYCHAIN_PASSWORD寫入 lane,勿寫共用 login。
security list-keychains -s "$LANE_KEYCHAIN" login.keychain-db
security set-keychain-settings -lut 21600 "$LANE_KEYCHAIN"
security find-identity -v -p codesigning "$LANE_KEYCHAIN"
③ 構建鎖與逾時(flock/佇列參數清單)
| 資源 | flock/佇列 | 作業逾時 |
|---|---|---|
| Match git 寫入 | flock -w 180 match-repo.lock |
lane 步 15 分鐘封頂 |
| Codesign/archive | flock -w 600 codesign.queue |
歸檔 45–90 分鐘 |
| DerivedData 熱路徑 | flock -w 60 dd-sync.lock |
整合 35–60 分鐘 |
| 佇列深度 | 每 lane 最多 12 作業 | 磁碟餘量低於 15% 即 fail-fast |
flock -w 600 /var/run/meshmac/codesign.queue \
xcodebuild -workspace App.xcworkspace -scheme Release archive
④ 失敗重試與稽核
- 重試:git fetch 瞬時錯誤最多 2 次;鑰匙圈 unlock 失敗零重試。
- 稽核 JSON:每作業輸出
lane、match_git_sha、keychain_path、lock_wait_ms。 - 告警:連續三次歸檔 lock_wait p95 超過 120 秒即值班。
五步落地(MeshMac 池化 Mac)
- 凍結寫入:排空 archive;共享機構建機禁止
match nuke。 - Shallow 基線:釘選
MATCH_GIT_BRANCH;在/var/run/meshmac/安裝 repo 鎖。 - Provision 鑰匙圈:按 lane 建
.keychain-db;每 lane 僅匯入一次分發身份。 - 接佇列:archive 外包
flock codesign.queue;逾時取自上表。 - 開稽核:JSON 日誌接 Webhook;重放一次 unlock 失敗演練再開池。
可引用參數(評審可直接摘)
- 並發 Match 唯讀 + shallow 可把池化 M4 冷啟動 git 時間壓到分鐘級且不放大寫競態。
- Lane 鑰匙圈 讓分發憑證遠離 GUI login,與SSH/VNC 分車道一致。
- 雙車道共機時 Codesign flock -w 600 配 45–90 分鐘歸檔逾時是合理預設起點。
⑤ FAQ
兩人能同時跑 match development 嗎?
僅當 shallow fetch、讀並發且寫入經 match-repo.lock 串行;禁止並行 nuke 或改密。
CI 該解鎖 login.keychain 嗎?
否。用 lane 檔並在 Codesign 包裝器內 unlock;VNC 圖形簽名用獨立帳戶。
何時加第二台 MeshMac 節點?
調參後 lock_wait p95 仍超過 2 分鐘,或需並行多歸檔;按 lane 拆節點而非無限拉長 flock(見多節點負載與故障轉移)。