02
制品準備與 Developer ID 簽名
從原始碼開始的建置
如果輸入是 Xcode 工程,建置階段通常要處理 macOS SDK、Apple 工具鏈、簽名設定,以及工程內可能存在的腳本或原生相依套件。此時,遠端 Mac 不只是「把檔案上傳給 Apple」的跳板,而是產生可重複制品的建置節點。
驗收時不要只看 CI 工作是否顯示成功,而要保存一份可重新取得的待簽名或待提交制品,並記下其雜湊值、建置提交版本與產出格式。Apple 對 Mac 軟體封裝格式及分發準備有獨立說明,團隊應按照實際 App、安裝包或磁碟映像類型逐項核對。Apple Mac 軟體封裝文件
若制品已由其他可信任的 Mac 建立,Linux CI 可以負責保存、傳遞及觸發後續流程;但這是「已有合格輸入」的例外,不是 Linux 能自行取代 Xcode 建置環境的證明。
簽名先於公證
公證不會替制品補上 Developer ID 簽名。流水線必須先確認主程式、嵌套框架、Helper、外掛及其他巢狀程式碼的簽名狀態,並檢查權限設定是否與實際分發方式一致。Apple 的分發簽名說明可作為簽名責任的基準。Apple 分發簽名程式碼說明
建議把簽名節點分成三種方案比較:
- 專用遠端 Mac: 權限邊界最容易固定,適合需要穩定鑰匙圈狀態、頻繁發布或需要人工接管的團隊。
- 共享 Mac 節點: 成本與資源利用可能較靈活,但執行帳戶、暫存檔、鑰匙圈解鎖和並行任務必須隔離,否則重試時很難判斷簽名結果是否可信。
- 外部簽名步驟: 可把敏感身份放在獨立系統,但會增加制品交換、權限委派與失敗回滾的複雜度,不應只用「可以簽名」作為選型理由。
最低驗收證據應包含簽名驗證結果、實際執行帳戶,以及鑰匙圈存取狀態。帳戶名稱、Team ID、密鑰、憑證名稱與路徑都應使用 CI 的秘密變數或占位符保存,避免把可識別憑據寫入日誌。
提醒: 公證提交成功只代表服務端接受了某個制品的處理請求,不代表簽名層級、分發封裝、票據裝訂或使用者端啟動條件已全部通過。