症狀: fastlane match 無法取得簽名材料。最快解法:先確認私有倉庫能否讀取,再檢查 match 加密口令、Apple 開發者帳戶授權與簽名身份;CI 或無人值守建置優先設為唯讀,不要因拉取失敗就重建或撤銷證書。
這篇適合首次在遠端 Mac 部署 fastlane match、遇到簽名資料無法讀取的獨立開發者。
如果你管理多人共用的簽名倉庫,會看到如何劃分讀寫權限。
若問題發生在新 Mac 或 CI 遷移後,也可按對應情境定位實際提供憑據的帳戶。
先辨認失敗所在層
fastlane match 涉及不同用途的憑據,不要把它們混為一談:Git 身份驗證用來存取倉庫;MATCH_PASSWORD 用來解密 match 管理的材料;Apple 開發者帳戶授權涉及 Apple 端操作;證書、私鑰和 Provisioning Profile 則構成本機簽名環境的一部分。fastlane match 文件說明其簽名資產可透過設定的儲存方式同步,Apple 也分別說明程式碼簽名證書與Provisioning Profile 的關聯條件。
先從錯誤發生的位置判斷,而非重跑整條發布流程:
- 出現 repository、permission denied、authentication 等 Git 錯誤:先查倉庫 URL、SSH 身份或 HTTPS 憑據。
- 倉庫已讀取,但解密或口令檢查失敗:查 match 加密口令是否注入到目前的執行環境。
- match 完成,Xcode 仍找不到簽名身份:查 Keychain、證書私鑰與 Provisioning Profile。
- 只有 Apple 端操作失敗:另查 Apple 開發者帳戶授權,不要直接把它當成 Git 或 Keychain 問題。
診斷時保留錯誤類型及發生階段即可。倉庫名稱、主機位址、帳戶、令牌、證書識別碼、檔案路徑和日誌中的敏感欄位都要先遮蔽;不要把可用憑據貼進工單或公開討論區。
新遠端 Mac:Git 認證與口令錯誤的區別
新主機不會自動沿用你開發電腦上的 SSH 金鑰、HTTPS 憑據或環境變數。先確認遠端 Mac 正在使用哪個作業系統帳戶、哪個 SSH 身份,以及建置程序實際從哪裡取得秘密值。
可以在同一個建置帳戶下執行:
git ls-remote <已遮蔽的倉庫 URL>
這項命令用來檢查遠端倉庫可見的 refs;Git 文件說明了它的用途。若命令回報認證或權限錯誤,優先排查 Git 存取;若能列出 refs,代表目前這條連線可以讀取遠端 refs,但不代表 match 加密口令正確,也不等於簽名環境已準備好。
使用 SSH 時,應在執行建置的帳戶下測試連線,並對照SSH 連線測試說明。若倉庫採用 deploy key,確認該金鑰已授權目標倉庫,並核對其讀寫範圍;deploy key 管理文件可作為設定依據。
接著才檢查 match 加密口令。倉庫讀取成功,只能排除部分 Git 連線問題,無法證明口令已正確注入。核對環境變數名稱、秘密管理範圍,以及執行工作是否真的取得該變數。不要將口令寫進倉庫、命令歷史、腳本輸出或可公開的 CI 日誌。
開發者本機可用:核對遠端建置身份
常見情境是本機建置成功,新遠端 Mac 卻無法讀取同一個簽名倉庫。此時不要只比對倉庫 URL;應逐項確認遠端工作使用的 Git 帳戶、金鑰或 HTTPS 憑據,以及儲存後端所需的授權範圍。
- SSH 金鑰:確認私鑰由正確的建置帳戶讀取,且對應公鑰已獲倉庫授權。不要把個人電腦的私鑰複製到多人共用或權限不明的主機。
- HTTPS 憑據:確認目前執行工作的憑據仍有效,授權範圍足以讀取指定倉庫。不要以公開倉庫替代私有簽名材料,也不要共用個人密碼來繞過權限管理。
- 建置秘密:確認秘密注入的是執行 match 的工作,而非只設定在另一個工作、使用者或環境中。若採用 GitHub Actions,需按Actions 秘密的可用範圍與限制核對工作流程的存取條件。
用同一個建置身份重現問題,並記錄「Git 能否讀取」「match 能否解密」「簽名身份是否可用」三項證據。每項都要以遮蔽後的錯誤類型或檢查結果記錄,避免留下秘密值。
多人倉庫與 CI:依責任限制寫入權限
在小團隊中,倉庫讀取權限不應自動等同寫入權限。開發者需要的是完成日常建置所需的存取;倉庫管理者負責授權、輪替憑據與核准簽名材料變更;CI 維護者負責讓建置工作取得必要秘密,並保護輸出日誌。
fastlane 文件建議 CI 使用 readonly 模式。你可以在 CI 設定中採用 readonly: true,讓一般建置讀取已管理的簽名資產;需要新增或更新材料時,再由獲授權的維護者依團隊流程執行寫入。這可避免每次自動建置都擁有不必要的修改能力,但仍須搭配適當的金鑰保管和秘密管理。
決策條件如下:
- 若工作只需使用現有證書與描述檔完成建置,選擇唯讀模式;若無法讀取,檢查授權與秘密注入,不要先提高寫入權限。
- 若確實要建立或更新簽名材料,改由獲授權的維護者執行寫入工作;完成後將一般 CI 工作恢復為唯讀。
- 若目前無法確認誰管理倉庫或誰能接觸私鑰,先暫停擴大存取範圍,確定負責人和回退方式再繼續。
材料已同步:從 Keychain 驗收到 Archive
match 拉取成功,不代表 Xcode 一定能簽名。程式碼簽名身份需要證書及其對應私鑰;Apple 的證書說明可協助核對身份結構。Provisioning Profile 則須符合目標、簽名身份與所需能力;若要重新下載或更新,按 Apple 的描述檔管理流程確認操作。
按以下順序驗收:
- 檢查 Keychain 身份:確認預期的簽名證書出現在建置所用的 Keychain,並能找到與其配對的私鑰。只有證書、沒有對應私鑰時,不能視為簽名身份已備妥。
- 核對 Profile:檢查 Provisioning Profile 是否對應目前的 App、簽名身份與所需能力。若 Profile 過期或條件不符,先確認應更新哪一份,不要把 Git 拉取成功當作 Profile 有效。
- 分辨 Apple 帳戶錯誤:若倉庫及本機簽名資產檢查通過,但 Apple 端驗證或操作被拒,才轉查帳戶授權、團隊存取與相關設定。這與本機缺少私鑰是不同問題。
- 執行實際建置:先以專案目前的設定完成建置,再執行 Archive;記錄倉庫讀取、簽名身份檢查、建置與 Archive 各自的結果。只有全鏈路通過,才算驗收發布環境。
- 變更前保留回退:撤銷、替換證書或清理 Keychain 前,先確認受影響的應用程式、建置工作與團隊成員,並備妥可用的回復方式。不要把一次 match 拉取成功當作撤銷或清理安全的證明。
選擇修復方式並恢復發布鏈路
|(本文不使用表格)|
如果你目前仍卡在定位,可按症狀回退到最可能的一層:Git 命令不能讀取 refs,先修倉庫授權;倉庫可讀但材料不能解密,核對 MATCH_PASSWORD 注入;材料已同步卻簽名失敗,檢查 Keychain 的證書與私鑰,再核對 Profile;只有 Apple 端操作失敗,檢查帳戶授權。這些檢查彼此獨立,逐層確認比重新建立所有簽名材料更容易保留故障證據。
若你已經有可用的 Mac,先修復現有建置身份通常最直接;但把個人開發機長期當打包伺服器,可能遇到主機離線、磁碟空間被開發工具佔用、多人共用帳戶難以追蹤等問題。若團隊已有穩定、受控的 Mac 環境,不必為了這次故障另租主機;若你暫時沒有可用的 macOS 建置環境,或需要獨立的遠端環境完成 Xcode 簽名驗收,可先查看 MACCOME 的遠端 Mac 方案,再依實際建置頻率評估是否需要租用常駐環境。你也可以從 MACCOME 繁體中文網站了解服務資訊;簽名秘密仍應由你按團隊權限規範管理。