本地可解析、遠端卻在私有 Swift 套件處中止:先核對建置實際使用的倉庫網址、macOS 執行帳戶與憑據來源,再確認 Package.resolved 是否納入版本控制;不要把令牌寫進倉庫或網址。 Xcode Cloud 與自託管 Mac 的授權方式不同,先辨認建置環境,再選對處理流程。
本地建置正常、遠端 Mac 解析私有 Swift Package 失敗的獨立開發者:沿著證據鏈比對本機憑據與 CI 身分。 維護 Xcode 命令列建置或自託管 Runner 的開發者:檢查 SSH 憑據、主機驗證設定與實際執行工作的 macOS 使用者。 剛把私有依賴接入 Xcode Cloud 的小團隊:確認平台授權流程,不要照搬自託管 Mac 的 SSH 設定。
先定位 Xcode 27 私有 Swift 套件遠端建置失敗的階段
先從建置報告或完整命令列記錄找到首次失敗的位置,不要只看最後顯示的建置失敗狀態。使用 xcodebuild 時,保存實際執行的命令、工作目錄,以及執行工作的帳戶;Apple 的 Xcode 命令列工具參考可用來核對命令列工具的使用方式。
接著將首個錯誤歸入以下一類,因為每類需要不同證據:
- 倉庫不可達:DNS、網路路由或主機連線未通。先查連線與名稱解析,再判斷倉庫位址。
- 倉庫拒絕存取:連線到預期主機,但目前憑據無權讀取套件,或該建置帳戶沒有可用憑據。
- 版本解析不一致:倉庫可讀,但依賴版本、分支或標籤與專案預期不同。
- Swift 編譯錯誤:依賴已取得並解析,失敗發生在編譯階段;此時應查程式碼與編譯設定,不要繼續輪換憑據。
核對倉庫位址與連線證據
先比對 Package.swift、Xcode 專案所記錄的套件來源,以及 Package.resolved 中對應的來源資訊,確認遠端任務實際存取的 SSH 或 HTTPS 位址符合預期。Swift 套件依賴的宣告方式可參考 Apple 的套件依賴說明。
在可安全執行的建置環境中,使用與正式任務相同的帳戶檢查倉庫是否可讀,例如對已脫敏的倉庫位址執行 git ls-remote "$PRIVATE_PACKAGE_URL" HEAD。這項檢查只能幫你判斷該工作階段能否讀取指定倉庫;若正式建置使用不同帳戶或執行環境,單獨在管理者帳戶測試成功並不能證明 CI 已取得存取權。
分開確認三件事:主機是否可連線、倉庫路徑是否正確、所需分支或標籤是否存在。錯誤訊息若只表示倉庫讀取失敗,先不要把 SSH 改成 HTTPS,或反過來;改網址不會自動補上授權,也可能讓你測試到另一個路徑。
比對執行帳戶、憑據與授權方式
在自託管 Mac 上,從啟動建置的 Runner 或排程工作記錄確認實際 macOS 使用者,再以同一身分檢查 Git 設定、SSH 金鑰是否可用,以及主機驗證是否完成。互動式登入帳戶能連線,不代表背景工作帳戶也能讀取私有倉庫。檢查時只記錄結果與金鑰識別資訊,不要輸出私鑰內容。
要確認 SSH 工作階段是否取得預期身分,可在安全的工作階段檢查已載入的金鑰;再驗證首次連線所需的主機資訊是否已按你們的安全流程確認。若是 HTTPS,則確認憑據是由該建置環境安全提供,而非靠某位開發者本機儲存的設定。Apple 的 Swift 套件持續整合指南指出,CI 使用需要認證的私有套件時,必須為建置設定相應憑據。
自託管 Mac 上的 xcodebuild 要怎樣取得 SSH 憑據?
先讓執行建置的 macOS 帳戶取得必要金鑰與主機驗證設定,再使用正式建置入口驗證該帳戶能否讀取倉庫。不要只在自己的終端機成功後就判定修復完成;若 Runner 使用獨立帳戶,應在該帳戶與該工作流程下重做檢查。
Xcode Cloud 則應使用平台提供的來源控制管理授權流程,不要照抄自託管 Mac 的 ssh-agent 或本機 Git 設定。依 Apple 的 Xcode Cloud 私有依賴說明及來源控制管理設定文件,確認該工作流程已獲授權存取所需的套件來源;若採用對應的程式碼代管整合,另依連接 Xcode Cloud 的授權步驟核對設定。
Xcode Cloud 的私有套件授權應在哪裡處理? 在 Xcode Cloud 對應的來源控制管理授權流程中檢查,而不是在開發者的本機金鑰設定中找答案。介面與步驟可能隨所用環境調整,請以 Apple 文件及目前工作流程顯示的授權狀態為準。
注意:不要把權杖或私鑰放進
Package.swift、建置指令、倉庫網址或會輸出的腳本。若憑據曾出現在倉庫或建置記錄,先按組織的撤換流程處理,再檢查存取範圍與記錄保存情況;單純刪除檔案不會撤銷已暴露的憑據。
檢查 Package.resolved 與依賴可重現性
先確認專案所需位置的 Package.resolved 是否存在、是否已提交,以及遠端工作區取得的檔案是否與預期一致。接著比對建置實際解析出的套件版本或來源狀態,與團隊預期是否相符。Apple 的 CI 建置 Swift 套件說明說明 CI 可透過鎖定資訊固定依賴;鎖定檔有助重現解析結果,但不能替代私有倉庫授權。
Package.resolved 沒有提交,遠端可能因此使用不同版本嗎? 可能失去團隊預期的依賴鎖定,令解析結果與其他工作區不同;但這不等於每次都會選到不同版本,也不能單憑鎖定檔缺漏判定遠端失敗原因。先檢查遠端實際解析結果與套件來源,再按 Apple 的 Swift 套件依賴說明確認專案依賴宣告和鎖定資訊是否符合目前專案設定。
不要以強制重新解析來掩蓋憑據問題,也不要一開始就清除快取。若需要改用 macOS Git 設定,先確認你目前 Xcode 與建置工作流程適用的設定方式;Apple 的 常見設定與建置問題說明可作為排查入口。改動共用 Git 設定或清理快取前,先記錄影響範圍與回退方式,避免讓其他專案也改變解析行為。
依環境選修復路徑:對照與適配度
以下適配度是排查路徑判斷,不是服務效能評分。先選與實際建置入口一致的路徑:
- 自託管 Mac/命令列 Runner|高:適合能確認 macOS 執行帳戶、Git 設定及 SSH 工作階段的情況。從同一帳戶驗證倉庫存取,再核對鎖定檔。
- Xcode Cloud|高:適合建置確實由 Xcode Cloud 執行的情況。檢查平台來源控制授權與私有依賴可用性,不套用自託管 SSH 修復。
- 只在本機終端機驗證|低:若正式工作由其他帳戶或平台執行,本機成功只證明本機工作階段可存取;需回到正式建置入口取得證據。
用清單驗收修復,避免只看最後的綠燈
- [ ] 記錄正式建置入口、工作目錄與實際 macOS 執行帳戶。
- [ ] 核對專案宣告與鎖定資訊中的私有倉庫來源,確認路徑及分支或標籤符合預期。
- [ ] 在正式執行帳戶下驗證網路可達與倉庫讀取;分開記錄連線失敗和授權拒絕。
- [ ] 依建置環境設定憑據:自託管 Mac 檢查帳戶可用的 Git/SSH 設定;Xcode Cloud 檢查平台授權狀態。
- [ ] 確認
Package.resolved的版本控制狀態與遠端實際解析結果一致。 - [ ] 在乾淨工作區、相同建置入口下重新執行依賴解析與完整建置,保存倉庫可讀、鎖定版本一致及建置通過的證據。
- [ ] 搜尋倉庫、指令與建置記錄中是否有令牌或私鑰;如有暴露,先撤換,再驗證新憑據。
Package.resolved 驗收仍須由你按上述流程完成。