痛点拆解
- 并发拉取:两车道同时
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 须分钥匙串(见权限 FAQ)。
- 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。