公證證明 Apple 已掃描你的二進位;裝訂(stapling)把票據嵌入其中,使 Gatekeeper 能在離線條件下驗證。不做決策就「一律裝訂」會在每次建置多花數分鐘;「從不裝訂」則在隔離實驗室裡吃苦頭。在Mac mini M4 CI Runner 上——尤其是 NodeMac 在香港、日本、韓國、新加坡或美國提供的獨佔主機——應發布一張矩陣,把裝訂策略與分發管道、網路假設與產物類型綁定。本文給出兩張矩陣、八步上線與與安全審閱閱讀流水線方式一致的 FAQ 結構化資料。
儲存與保留背景:磁碟與產物保留、鎖檔雜湊快取。工程師若需 GUI 比對兩棵已簽章目錄樹,可在同一 NodeMac 主機使用 VNC。定價;說明。
Gatekeeper:線上查票 vs 裝訂票據
macOS 可以公證成功,但若未裝訂且機器在首次啟動時無法存取 Apple 服務,仍會讓使用者意外。相反,裝訂會改變外層容器(例如 .dmg),若過早計算雜湊會破壞樸素的校驗門。CI 策略必須寫明哪份校驗和是稽核產物(裝訂前)以及哪份二進位交付給客戶(裝訂後)。
- 僅票據:實驗室 Mac 出口穩定且你控制複檢策略時迭代最快。
- 已裝訂:面向客戶的磁碟映像、離線安裝套件與現場筆電的預設做法。
- 混合:僅對發布管道裝訂;夜間建置保持僅票據並加顯式橫幅說明。
矩陣 A:依分發路徑選擇裝訂或票據
| 產物與路徑 | 裝訂? | 理由 |
|---|---|---|
| 開發者隨身碟展台 .dmg | 是 | 離線 Gatekeeper;避免首次啟動依賴 CDN |
| 有線實驗室內 CI 冒煙安裝 | 可選 | 若出口受監控且可接受失敗,僅票據加快循環 |
| MDM 遞送 pkg 且安裝後裝訂 | 皆可 | 記錄由流水線還是 MDM 裝訂,避免重複勞動 |
| App Store 上傳流水線 | 遵循 Apple 傳輸文件 | 消費者路徑不同;勿照搬桌面 DMG 規則 |
矩陣 B:CI 階段順序與驗證
| 階段 | 命令族 | 通過標準 |
|---|---|---|
| 簽章 | codesign 強化執行時期旗標依權利矩陣 |
codesign --verify --deep --strict 乾淨 |
| 公證 | notarytool submit + 輪詢 |
日誌顯示 Accepted;提交 ID 已歸檔 |
| 裝訂 | xcrun stapler staple |
乾淨虛擬機上 stapler validate 通過 |
| 冒煙 | 從已掛載映像啟動 App | 無「已損毀」對話框;遙測版本符合預期 |
數值護欄
- 逾時預算:發布列車為 notary 輪詢至少預留 25 分鐘牆鐘;功能分支可更短,若接受偶發失敗。
- 平行提交:每台主機並行公證作業上限 2,避免與 Xcode 峰值疊加觸發 Apple 側限流。
- 產物不可變:將裝訂後物件上傳到新的物件鍵;切勿原地覆寫。
稽核提示:在變更單上同時附上公證提交 ID 與裝訂前產物的 SHA-256。裝訂不能替代簽章日誌。
八步上線
- 清點管道:各建置類型送往何處(實驗室、客戶、MDM)。
- 編碼矩陣:寫入流水線模板——而非 Slack 部落知識。
- 拆分作業:建置/簽章、公證、裝訂、發布為獨立步驟並配不同快取。
- 增加 VM 冒煙:可選停用出站 Apple 端點以偵測缺失裝訂。
- 儲存日誌:notarytool 日誌與其他簽章證據同一保留桶。
- 輪換簽章憑證:按日曆執行;每次輪換後重跑矩陣驗證。
- 培訓值班:區分 stapler 與 notarytool 錯誤——責任人不同。
- 按區域獨佔 M4:佇列時間迫使走捷徑時——NodeMac 用硬體獨佔把政策爭論從風險裡拿掉。
常見問題
CI 何時必須裝訂?
當使用者離線安裝或來自網路不受控的環境時。若內部循環網路良好且已文件化,可保持僅票據。
裝訂會破壞校驗和快取嗎?
會——裝訂前雜湊用於稽核;將裝訂後 blob 視為交付物並單獨記錄校驗和。
stapler 過早執行會怎樣?
Gatekeeper 拒絕損毀應用程式。強制執行 簽章 → 公證 → 驗證 → 裝訂 → 校驗 順序。