CI/CD 2026.09.29

Xcode 27 私有 Swift Package 拉取失敗?2026 修復指南

維護 Xcode 專案並在遠端 Mac 執行 CI,若私有 Swift Package 拉取失敗,應先查實際執行帳戶的 SSH 憑證與 known_hosts,再核對 Package.resolved 和依賴 URL。本文依故障來源提供檢查清單、復測步驟與節點隔離判斷。

Apple 的 Swift Package CI 指南指出,CI 使用 SSH 取得私有套件時,憑證和 known_hosts 必須按執行 CI 的 macOS 使用者帳戶配置。這個明確的帳戶要求,決定了 Xcode 27 遠端 Mac 私有 Swift Package 拉取失敗的排查順序:本週先核對實際執行帳戶及其 SSH 憑證、主機金鑰,再檢查 Package.resolved 與依賴 URL;不要先停用主機校驗或盲目清除快取。

本文適合維護 Xcode 27 專案、在遠端 Mac 建置私有 Swift Package 的開發者,協助區分認證、主機校驗與版本解析問題。
也適合管理 Mac CI 節點和 SSH 權限的 DevOps 工程師,將套件讀取權限配置給真正執行任務的帳戶。
若正把本機建置遷移至遠端環境,本文可用來判斷問題出在節點帳戶、依賴鎖定,還是 Xcode 使用的 Git 設定。

01 先用同一提交判定失敗階段

本機可以解析套件,不代表 CI 使用相同帳戶、SSH 設定或 Git URL。先固定提交版本、工作區狀態和建置命令,再對照兩邊的依賴解析輸出;否則即使最後建置失敗,也可能把認證問題誤判成程式碼或套件版本問題。

在遠端 Mac 上,先確認工作目錄和執行帳戶:

id
pwd
git rev-parse HEAD
xcodebuild -version

把同一提交的本機輸出與 CI 紀錄分開檢查,標記錯誤最早出現的位置:套件 URL 解析、SSH 認證、主機金鑰校驗,或鎖定版本解析。不要只收集最後一段建置錯誤,前面的解析日誌往往才指出真正失敗環節。

Xcode 27 的發布狀態及 macOS 系統需求可能隨 Apple 的發布資料更新;執行排查前,請對照 Apple 的 Xcode 系統需求及 Xcode 27 發布說明,確認節點安裝版本和作業系統符合該版本要求,不要假設所有遠端節點都使用相同環境。

如果本機和 CI 的提交、命令或套件來源不同,先消除這些差異再比較;否則兩份日誌不能支持同一個故障結論。

02 核對 CI 執行帳戶能否讀取私有套件

為什麼遠端 Mac 上的 Xcode 讀不到私有套件?

常見原因不是套件不存在,而是 CI 的執行帳戶沒有取得該私有倉庫的讀取憑證。管理員透過互動式終端機成功連線,只能證明管理員帳戶的環境可用,不能證明背景 Runner 或排程工作使用的帳戶也有相同權限。

先確認 CI 工作實際以哪個 macOS 使用者執行,再檢查該帳戶的家目錄、SSH 設定和金鑰可見範圍。可用不顯示機密內容的方式檢視環境:

id
printf '%s\n' "$HOME"
ls -ld "$HOME/.ssh"

不要用 cat 將私密金鑰、存取權杖或環境變數完整輸出到建置日誌。若工作由服務程序啟動,應在工作本身記錄執行帳戶名稱和家目錄位置,而非用管理員登入後的結果代替驗證。

接著以該帳戶測試倉庫存取。私有依賴只需要讀取時,採用限縮到必要倉庫的唯讀憑證,避免讓 CI 金鑰同時擁有不相關專案的寫入權限;可參考這份部署金鑰權限說明。Apple 另有私有依賴憑證配置指引,可供比對 CI 憑證應如何管理。

SSH 憑證應放在哪個帳戶?

SSH 憑證和 SSH 設定應屬於執行 CI 任務的 macOS 使用者,而非僅存在於管理員的登入工作階段。若使用 SSH agent,還需確認 agent 的載入狀態能在 CI 任務環境中取得;Apple 的 SSH agent 技術說明可用來核對相關行為。

若測試指令在互動式終端成功、CI 仍失敗,優先檢查兩種環境的 HOME、SSH_AUTH_SOCK、~/.ssh/config 和金鑰權限是否不同。不要把整個管理員家目錄複製給 Runner 來快速「修好」問題,這會把其他憑證和權限一併暴露。

03 驗證 known_hosts 與 SSH 主機校驗

認證與主機校驗是不同關卡:私密金鑰證明客戶端有存取權;known_hosts 則用來確認連線到的伺服器符合預期。錯誤訊息若是 Host key verification failed,增加或更換私密金鑰通常不會解決問題。

先確認依賴 URL 使用的主機名稱,再以 CI 執行帳戶檢查該主機是否已有紀錄:

ssh-keygen -F <git-host> -f "$HOME/.ssh/known_hosts"

接著確認主機指紋的來源可靠,再比對 CI 使用的主機金鑰。不要因為第一次連線跳出確認提示,就在無核實指紋的情況下直接接受;官方提供的SSH 指紋說明可作為核驗依據,相關錯誤也可對照主機金鑰校驗故障說明。

將 StrictHostKeyChecking 設為 no 會降低主機身分驗證保護,可能讓連線接受非預期的主機金鑰。若因受控測試必須暫時調整,應限定於隔離環境、記錄原設定及變更目的,測試完成後立即還原;不應把它當作共用 CI 節點的預設修復。

04 區分 Package.resolved 鎖定偏差與認證失敗

Package.resolved 已提交,CI 卻解析出不同依賴版本時,先確認 CI 工作目錄讀取的檔案是否正是專案提交中的版本,再檢查檔案內私有依賴的 URL 是否與 SSH 設定相符。若 URL 指向另一種傳輸方式或不同主機別名,鎖定版本本身正確,CI 仍可能無法使用預期憑證取得套件。

Apple 建議將適用的 Package.resolved 納入版本控制;直接使用 xcodebuild 時,也可依 Apple 的 Swift Package CI 指引設定停用自動依賴解析,讓建置遵循鎖定結果。核對時可以先確認檔案是否存在、是否被版本控制,以及私有套件來源是否符合 CI 可存取的 SSH URL:

git status --short
git ls-files '*Package.resolved'
git grep -n '<git-host>' -- '**/Package.resolved'

此處的 <git-host> 應換成實際套件主機名稱。若要透過 xcodebuild 解析依賴,先保存目前日誌,再依專案工作區和 Scheme 執行:

xcodebuild -resolvePackageDependencies \
  -workspace <workspace>.xcworkspace \
  -scheme <scheme> \
  -disableAutomaticPackageResolution

如果錯誤明確指向 SSH 權限,不要先更新套件或刪除鎖定檔;如果認證成功、但解析版本仍不同,才繼續追查工作目錄、鎖定檔是否生效,以及命令是否允許自動解析。把兩種問題分開,才不會以依賴版本變動掩蓋真正的權限故障。

05 比對 xcodebuild 使用的 Git 與 SSH 設定

即使 CI 使用相同 macOS 帳戶,Xcode 的建置流程和工程師手動呼叫系統 Git,也可能因設定來源、URL 重寫或 SSH 規則不同而走向不同路徑。先讀取來源和生效設定,再做單一變更;不要同時改環境變數、SSH 設定和套件 URL,否則無法判斷哪一項真正影響結果。

可以從不揭露憑證的檢查開始:

git config --show-origin --get-regexp 'url\..*\.insteadof'
git config --show-origin --get core.sshCommand
ssh -G <git-user>@<git-host>

對照輸出中的設定來源、主機別名、連接埠和使用者,再查看 CI 日誌是否顯示預期的 Git 呼叫方式。OpenSSH 的用戶端設定手冊可協助核對 Host 規則及設定套用方式。

只有在證據顯示 Xcode 使用的 Git 行為與預期不同時,才在隔離工作區測試系統 Git 或特定 SSH 設定;測試前保存原有解析日誌和套件版本,調整後只重跑相同命令。若症狀沒有改變,還原該項設定,回到帳戶或主機校驗層繼續查,不要留下未驗證的全域設定。

06 用決策條件完成復測並決定是否隔離節點

以下條件用來選擇下一個動作,而非一次套用所有修復:

  • 若 SSH 認證在 CI 執行帳戶下失敗,先修正該帳戶的唯讀憑證授權;若無法安全提供所需權限,改用獨立執行帳戶或隔離節點,不要擴大共用節點的權限。
  • 若認證成功但主機校驗失敗,核對主機指紋並修復該帳戶的 known_hosts;若指紋無法從可信來源確認,暫停連線,不要略過校驗。
  • 若認證及主機校驗均通過,但依賴版本不一致,檢查 Package.resolved 是否被提交、是否由目前工作目錄讀取,以及自動解析選項是否符合建置方式;不要先清除快取或更新套件。
  • 若設定與版本均符合預期,而問題只在共用節點重現,用相同提交及原執行帳戶在乾淨工作區復測;若憑證隔離或穩定存取無法達成,選擇獨立帳戶或隔離節點。
  • 若同一工作區能穩定重現且依賴版本一致,保留命令、執行帳戶、失敗階段和解析日誌,再評估是否需要調整 Xcode/Git 設定或節點,而不是將「清快取後偶然成功」當成已驗證修復。

復測紀錄至少應能回答:使用哪個提交、由哪個帳戶執行、私有依賴解析到哪個版本、失敗或成功發生在哪個階段。這些紀錄能協助團隊區分一次性的環境差異與節點持續性問題,也讓後續調整可以回復,而不是依賴人工登入後的偶然成功。

若目前方案是共用 Mac 帳戶,常見代價是憑證邊界不清、主機金鑰配置難以按任務維護,以及問題重現時無法確定環境差異;若改用通用 Linux 建置節點,則無法代替需要 Xcode 的 macOS 工具鏈。對短期 CI 遷移、故障重現或隔離驗證,按需取得可控的遠端 Mac 執行環境,通常比把權限擴散到既有共用節點更容易管理。您可先查看 JEXCLOUD 的遠端 Mac 環境了解使用方式;若確實需要額外的 macOS 節點,再參考遠端 Mac 租用方案評估。若任務長期持續高負載或需要實體介面,則應一併比較自購設備及其他自管方式,不必為短期需求承擔不合適的長期方案。

JEXCLOUD

為私有 Swift Package CI,備妥專屬遠端 Mac

透過 JEXCLOUD 租用 Apple Silicon 裸金屬 Mac,讓您在原生 macOS 環境中執行建置與復測。

每台節點配備獨立 IPv4 與 1 Gbps 獨享上行,方便您依照團隊流程管理 SSH 憑證及套件存取設定。

立即租用