Apple 說明,程式碼簽署身分由憑證及其對應私鑰組成;只看到憑證,不代表簽署所需的私鑰也能使用。Apple 的簽署憑證說明因此,遇到 fastlane match 證書同步失敗,先保留首次失敗的完整日誌,判斷問題在倉庫認證、解密、Keychain,還是 Provisioning Profile,再修復對應環節;不要一開始就撤銷或重建全部憑證。
現在先記下實際執行的命令、使用者與錯誤位置;本週在同一個遠端 Mac 任務環境重跑同步及建置,逐項確認簽署材料。不要只在遠端桌面登入的工作階段測試。
適合沒有本地 Mac、要在遠端 Mac 首次執行 fastlane match 的 iOS 獨立開發者。
也適合遷移建置環境後遇到私鑰不可用或描述檔不匹配的小團隊,以及維護常駐打包流程、想避免誤撤銷簽署材料的人。
先依錯誤位置判斷 fastlane match 的責任環節
第一個失敗訊息通常比末尾的建置錯誤更有診斷價值。保存從執行命令開始的完整輸出,不要只截取最後一行;接著按錯誤發生階段分類。fastlane 的程式碼簽署排障文件也建議從實際錯誤及簽署狀態查起。
| 日誌線索 | 優先檢查 | 暫時不要做的事 |
|---|---|---|
| Git 無法存取、拒絕認證或找不到倉庫 | 遠端 Mac 使用的 Git URL、SSH 身分及倉庫權限 | 不要先重建憑證 |
| 倉庫可讀取,但解密失敗 | 執行環境是否取得正確的 match 密碼,以及儲存設定是否一致 | 不要將密碼寫入日誌或命令紀錄 |
| 同步結束,簽署時找不到身分或私鑰 | 實際執行任務的使用者、Keychain 與匯入結果 | 不要只確認憑證檔案存在 |
| 簽署身分可用,但建置報描述檔錯誤 | Bundle ID、target、簽署類型及 profile 對應 | 不要把強制刷新當通用解法 |
還要分清楚 match 與後續建置的界線:如果 match 已完成,而錯誤是在 xcodebuild 簽署階段才出現,問題可能在專案設定或建置所選的簽署項目,不一定是倉庫同步失敗。先找日誌中第一個失敗點,再決定要查哪一段。
倉庫能不能讀取?解密密碼有沒有進入任務?
無法拉取與拉取成功但無法解密,是兩種不同故障。前者通常要核對遠端 Mac 所使用的倉庫位址、SSH 身分及存取權限;後者則應確認工作流程實際使用的儲存方式、match 設定與解密密碼。fastlane 文件說明了 match 的儲存設定及密碼用途;本機終端可用的憑證,不代表 SSH 或 CI 任務也能取得。
在新 Mac 上無法解密時,不要先刪除倉庫或重新產生材料。先確認任務啟動時,密碼是否由安全的環境變數或秘密管理機制提供;再確認執行的是預期的 lane 與儲存設定。檢查時不要把真實密碼貼進終端截圖、提交紀錄或除錯輸出。
若要在輸出中核對設定,只展示變數名稱或遮蔽後的值,不要列出私密內容。整理存取方式時,也可參考 MangoVM 的資料保護說明,把倉庫權限和簽署秘密分開管理。
| 觀察結果 | 檢查方向 | 下一步 |
|---|---|---|
| 無法連線或讀取倉庫 | Git URL、SSH 身分、倉庫授權 | 用同一任務使用者確認讀取權限 |
| 倉庫讀取成功、解密失敗 | 密碼來源、環境變數、match 儲存設定 | 核對任務執行環境與預期設定 |
| 解密成功、匯入或簽署失敗 | Keychain、使用者工作階段、私鑰 | 轉查簽署身分是否可用 |
只有「倉庫無法讀取」才優先處理 Git 權限;若日誌已進入解密階段,反覆更換 SSH 金鑰通常不會修復密碼問題。
同步已完成,為什麼遠端 Mac 仍找不到私鑰?
在 SSH 或 CI 任務中執行 fastlane 時,Keychain 存取失敗,先核對任務實際使用的帳號與登入狀態。遠端桌面登入的使用者、SSH 工作階段及背景任務可能不是同一個執行上下文;在其中一處看到憑證,不能證明另一處也能使用。
| 驗證狀態 | 能證明什麼 | 尚不能證明什麼 |
|---|---|---|
| 倉庫內有憑證檔 | 簽署材料曾被儲存 | 憑證已匯入目前使用者的 Keychain |
| Keychain 顯示簽署身分 | 憑證存在於該檢查環境 | 對應私鑰可由實際建置任務使用 |
| 實際建置使用者可用簽署身分 | 該上下文具備簽署條件 | 所選 profile 與目前 target 相符 |
照以下順序檢查:
- 確認 SSH、CI 或排程任務使用的 macOS 帳號;不要只依遠端桌面登入帳號推斷。
- 在該使用者的任務中確認 match 是否完成憑證匯入,而不是只確認倉庫下載成功。
- 依 fastlane 的簽署排障說明檢查簽署身分與私鑰;不要公開憑證以外的私密資料。
- 在同一任務環境執行目標建置。若互動式測試成功、背景任務失敗,優先比較兩者的使用者與 Keychain 上下文。
- 若仍無法判定,先保存最小必要日誌,再調整匯入或存取設定;不要一邊排查一邊撤銷仍被其他建置使用的憑證。
這個差異是遠端 Mac iOS 簽名常見的排查盲點:同步材料的操作與實際建置可能分別由不同使用者或任務啟動。若沒有在真正的建置工作階段驗證,互動式終端的成功不足以結案。
Provisioning Profile 不匹配時,逐項對照 App 與 target
憑證有效,不代表 Provisioning Profile 一定適用於目前建置。先核對專案中每個 target 使用的 Bundle ID、簽署類型,以及所選 profile 是否包含可用的簽署憑證。Apple 提供了編輯、下載或刪除描述檔的管理說明;如果確認需要新建,再依照建立 App Store profile 的步驟處理。
| 對照項目 | 要核實的內容 | 不一致時先查 |
|---|---|---|
| Bundle ID | App 與 profile 指向相同識別碼 | target 的建置設定及實際識別碼 |
| Target | 主 App、通知或其他擴充功能各自使用的設定 | 各 target 的簽署映射 |
| 簽署類型 | profile 的用途符合目前建置目的 | 本次任務採用的簽署設定 |
| 憑證關聯 | profile 所含憑證與可用簽署身分相符 | profile 內容與 Keychain 身分 |
如果主 App 成功、擴充功能失敗,不要只憑主 App 的簽署設定推定其他 target 也正確。逐一查看 target 的 Bundle ID 與 profile 對應,再決定是否需要更新或重新產生描述檔。強制刷新可能改變材料狀態,卻無法修正錯誤的 target 映射。
用條件分支決定是否刷新材料
先按症狀走對分支,再進行修復;這能降低不必要地重建或撤銷仍在使用的簽署材料的風險。
- 若日誌顯示無法讀取倉庫,則先修正 Git URL、SSH 身分或倉庫權限;否則回退到查解密設定。
- 若倉庫可讀取但解密失敗,則核對任務實際取得的密碼與儲存設定;否則不要為了解密問題重新產生憑證。
- 若憑證已同步但實際建置使用者找不到私鑰,則檢查同一使用者的 Keychain 與匯入結果;不要用遠端桌面的狀態代替 CI 驗證。
- 若簽署身分可用但 profile 不匹配,則先逐項核對 Bundle ID、target、簽署類型與憑證;只有確認描述檔內容或有效狀態確實需要變更時,才更新或重新建立。
- 若 match 成功、只有特定 target 的
xcodebuild失敗,則檢查該 target 的簽署設定與建置所選的 Xcode,不要將後續錯誤直接歸咎於同步。
修復後,在同一建置路徑完成驗收
不要以「命令沒有報錯」作為唯一驗收標準。按順序重新同步、驗證簽署身分與私鑰、檢查各 target 的 Provisioning Profile,最後執行實際發布所需的目標建置並檢查歸檔結果。
- 記錄使用者、任務啟動方式、執行的 lane 與所選 Xcode。可用 Apple 的Xcode 命令列工具參考確認命令列工具選擇及相關操作。
- 在實際建置任務中重跑同步,確認倉庫讀取、解密及匯入都通過。
- 檢查該執行環境可用的簽署身分,再逐個核對 App 與擴充功能的 profile。
- 使用預期的建置命令完成目標建置,並確認歸檔採用預期的簽署設定。
- 留存不含密碼、私鑰或其他秘密的復核紀錄;下次遷移時,便能分辨是環境差異還是設定變動。
若本機建置正常,但遠端任務反覆受帳號、Keychain 或環境設定影響,先把遠端 Mac 的使用者與建置路徑固定下來,再判斷是否需要常駐的遠端建置環境。相較於臨時拼接其他執行環境,這類方案若缺少一致的 Keychain 管理、任務權限不清楚,或材料需在多處重複維護,故障排查成本會持續累積;租用 MangoVM 的遠端 Mac,可讓你在實際的 macOS 建置環境中驗證簽署流程。若建置需求長期穩定且負載固定,自購 Mac 也值得比較;若只需短期遷移測試或按發布週期使用,則可先查看 MangoVM Mac mini 方案,再依你的建置頻率決定。
讓簽署問題在穩定的遠端 Mac 環境中逐步排查
MangoVM 提供獨享 Apple Silicon 實體節點,讓您在實際建置環境中檢查憑證、Keychain 與設定。
