Xcode 26 Compilation Caching 值得開嗎?2026 CI 判斷

Xcode 26 Compilation Caching 值得開嗎?2026 CI 判斷

截至 2026 年 9 月 3 日,Apple 官方資料列出 Xcode 26.6 為穩定版本,並確認 Xcode 26 提供可選的 Compilation Caching。Xcode 系統要求Xcode 26 Release Notes 是本文的版本依據。

症狀:你的 CI 經常切換分支、執行 Clean Build,但整條 Pipeline 沒有穩定變快。
最快解法:先用診斷資訊確認快取命中,再以同一專案做開啟與關閉對照;只有在快取可長期保留時,才把 Xcode 26 Compilation Caching 灰度放到持久化遠端 Mac CI。

誰適合採用這個判斷

這篇文章適合頻繁切換分支或執行 Clean Build、希望確認編譯快取是否有效的 Apple 平台開發者。

如果你維護自託管遠端 Mac Runner,需要控制建置時間、硬碟佔用與快取生命週期,本文的取證方式可以直接放進 CI 驗收流程。

負責共享節點穩定性、發布重現和容量規劃的研發平台負責人,也應把「快取是否存在」改成「每次成功建置是否值得保留」。

最後更新於 2026 年 9 月 3 日。版本與設定資訊核對自 Apple 的 Xcode 26 Release Notes、Xcode 系統要求及 Build Settings Reference;本文沒有把 Xcode 27 beta 4 的行為套用到 Xcode 26。

工作負載與啟用分數

Compilation Caching 是可選的編譯能力,不代表所有專案開啟後都會加速。Apple 對建置設定與編譯效能的說明,應以 Build Settings Reference增量建置計時文件 為準。

你可以先用以下三個條件打分,每項符合就得 1 分:

  • 輸入重複:相同提交會被重跑,或不同分支共享大量相同的原始檔與模組輸入。
  • 建置重複:團隊常做 Clean Build、重試失敗工作,或同一提交會在不同驗證階段再次建置。
  • 快取可保留:Runner 不會在每次工作結束後重建磁碟,工作目錄與相關快取路徑有清楚的清理政策。

判斷方式如下:

  • 3 分:進入灰度測試,優先放在持久化遠端 Mac CI,不要立即覆蓋發布工作。
  • 1 至 2 分:暫緩全面啟用,先找出是編譯階段還是測試、簽名、腳本佔用主要時間。
  • 0 分:維持關閉。一次性 Runner、參數頻繁變動或硬碟容量受限時,快取很可能只增加管理負擔。

這個分數不是效能承諾,而是決定是否值得投入測試的篩選器。多分支專案尤其要小心:分支數量本身不等於高命中,真正重要的是切換後的編譯輸入是否重複。

快取命中與建置時間證據

三類建置的對照

你需要把以下三類工作分開記錄,而不是只比較流水線總時長:

  1. 首次建置:清除既有快取後,以固定提交和固定參數執行一次。這是冷啟動基線,不是 Compilation Caching 的收益證明。
  2. 相同輸入重跑:不改變提交、Scheme、SDK、建置參數與節點環境,重跑相同工作。這是最直接的命中觀察窗口。
  3. 歷史分支切換:切回曾經建置過的分支,觀察哪些編譯工作可以重用,並確認切換分支沒有引入不同的工具鏈或腳本參數。

在 CI 中,xcodebuild 的退出狀態只能說明工作成功或失敗,不能單獨證明快取命中。你應保存建置記錄、診斷輸出和 Xcode 的 Build Timing Summary,將編譯階段與其餘階段分開。

Apple 的效能測試文件要求測試環境與測試方法保持一致;可參考 Apple 的效能測試說明。對 CI 而言,這意味著不能拿開發者筆電的一次建置,去對比遠端 Mac 上另一個提交的結果。

四種機制不可混為一談

  • Compilation Caching:針對可重用的編譯工作提供快取。你要用相關診斷設定和建置記錄確認它是否參與。
  • DerivedData:保存 Xcode 工作區產物與中間檔案。它可能影響增量建置,但不等同於 Compilation Caching。
  • 依賴下載快取:例如套件或外部依賴已經存在本機,省下的是下載和解析時間,不是編譯時間。
  • 增量建置:只重建受變更影響的部分。即使沒有 Compilation Caching,增量建置也可能讓第二次工作較快。

若你只看到網路下載時間下降,不能寫成編譯快取命中;若 DerivedData 沒有被刪除,也不能直接把較短的建置時間歸因於新功能。

停止條件:相同輸入重跑三次的記錄中,沒有穩定的編譯階段證據,或診斷輸出顯示工作仍完整執行,就先停止灰度,不要用總時長變化硬推結論。

有效收益與隱性成本

編譯時間和總時間分開算

對照測試至少要固定以下項目:

  • 相同專案提交;
  • 相同 Scheme;
  • 相同建置參數;
  • 相同 Xcode 與 SDK;
  • 相同遠端 Mac 節點;
  • 相同依賴狀態與簽名設定。

接著分別記錄編譯、連結、測試、程式碼簽名、封裝、依賴下載及自訂腳本的時間。你不必先假定 Compilation Caching 會改善哪一項,先確認瓶頸在哪裡。

例如,若編譯只佔整條 Pipeline 的一小部分,即使命中,簽名或測試仍可能主導總時間。這時候「編譯階段變短」和「開發者等待時間變短」是兩個不同結論,不能用同一個百分比描述。

建議把每次成功建置的成本寫成四個欄位:

  • 編譯階段耗時;
  • 整條工作耗時;
  • 快取保留與清理所需的維護時間;
  • 失敗後進行無快取重測的額外時間。

沒有本站實測或可靠公開測試來源時,不要填寫提升比例、節省分鐘數或固定效能結論。本文只提供判斷方法,不把任何專案的結果冒充普遍規律。

儲存生命週期和節點類型

持久化遠端 Mac、每次重建的臨時 Runner,以及多人共享節點,對快取的價值完全不同:

  • 持久化節點:快取有機會跨工作保留,但必須監控硬碟增長、工作區污染與帳戶隔離。
  • 臨時 Runner:每次工作完成後若磁碟映像被捨棄,快取收益會被生命週期抵銷。
  • 共享節點:多個專案可能互相增加清理壓力,也可能把不同工具鏈的產物混在同一環境。

自託管 Mac Runner 重新啟動後,快取是否存在要看硬碟和啟動流程:持久化硬碟未被重建,不代表工作區一定沒有被清理;反過來,系統重新啟動也不必然代表所有快取都消失。

清理時先記錄目錄大小、最後使用時間、目前執行中的工作及清理後的冷啟動結果。不要把 Compilation Caching、DerivedData 和依賴快取當成一個目錄,用單一刪除指令處理所有問題。若硬碟壓力來自多人共用,帳戶隔離和專案級保留政策通常比單純增加清理頻率更容易維護。

發布風險與灰度邊界

開發分支加速,不等於發布流程可以直接放量。你至少要保留三條驗證路徑:

  • 全新 Clone:從乾淨工作目錄開始,確認專案不依賴某個開發者帳戶或殘留產物。
  • 無快取建置:關閉相關快取後重新建置,確認腳本、依賴宣告和簽名流程沒有被快取掩蓋。
  • 發布 Archive:以正式 Scheme 執行歸檔、簽名與後續驗證,不能只用開發 Scheme 的成功結果代替。

共享 CI 節點可以採取以下灰度方式:

  • 先讓開發分支或非阻塞驗證工作使用快取;
  • 發布歸檔保留獨立的無快取基線;
  • 發現產物不一致、無法重現或硬碟接近容量上限時,立即切回無快取;
  • 將快取關閉入口寫入 CI 參數,而不是只依賴人工修改節點設定;
  • 每次 Xcode、SDK、建置參數或依賴管理方式變更後,重新做冷啟動與熱啟動對照。

這種安排的重點不是讓每個工作都追求最快,而是讓加速路徑失效時,發布仍有可驗證的退路。

可執行驗收清單

在把設定推到共享節點前,逐項完成:

  • [ ] 固定同一個提交、Scheme、Xcode、SDK 和建置參數。
  • [ ] 先完成一次乾淨環境建置,保存完整建置記錄。
  • [ ] 使用 xcodebuild 重跑相同工作,保存診斷輸出與 Build Timing Summary。
  • [ ] 確認縮短的是編譯階段,而不是依賴下載、測試或腳本階段。
  • [ ] 切換到歷史分支,檢查快取命中是否仍有可觀察證據。
  • [ ] 記錄快取與 DerivedData 的硬碟變化,分別制定清理方式。
  • [ ] 重啟 Runner 後確認快取路徑、工作目錄和帳戶權限。
  • [ ] 完成全新 Clone、無快取建置與發布 Archive。
  • [ ] 為異常情況保留關閉快取和無快取重測入口。
  • [ ] 只有在收益高於儲存與維護成本時,才擴大到更多工作。

若你需要長期保留工作目錄,可以先閱讀 遠端 Mac 建置節點方案,再按照實際重啟機制和儲存交付方式驗收;不要因為看到快取目錄存在,就假設它能跨任務提供價值。

FAQ:部署前的五個判斷

FAQ 以常見維運問題回答,並將 Compilation Caching、xcodebuild、Clean Build、分支切換與自託管 Runner 的判斷分開處理。若測試資料不足,應保留「尚未證明」而不是填入推測效能。

現有 Runner 與遠端 Mac 的取捨

如果你目前使用的是每次工作後即銷毀的臨時 Runner,主要缺點是快取無法穩定保留、每次工作都要重新準備依賴,而且磁碟生命週期難以用建置記錄解釋。共享節點則還會遇到帳戶隔離、清理互相影響和發布基線不一致的問題。

在這種條件下,MacDate 的持久化遠端 Mac 可以作為另一條驗證路徑:你能先以固定專案做開啟與關閉對照,再根據節點重啟、硬碟保留和無快取回退結果決定是否遷移。若你只是偶爾建置、需要物理介面,或長期執行固定且高負載的工作,自購 Mac 或其他架構可能更合適;若目標是臨時測試、跨分支重複建置或需要可持續運作的遠端 Mac CI,持久化環境通常更值得先驗證。你也可以參考 Mac 遠端裸機方案與價格說明,把租賃週期與維護成本一起納入計算。

CTA

先在現有專案完成一次快取開啟與關閉的灰度對照;若 Runner 每次都會銷毀環境、無法保留快取,再評估 MacDate 的持久化遠端 Mac,並以建置命中、硬碟變化、重啟後狀態和發布重現結果作為遷移依據。