先讓 Bazel 在遠端 Mac 上可重現地完成 iOS 建置,再接入遠端快取並驗證跨機命中;快取只重用符合條件的建置結果,不等於遠端執行,也不能取代 Xcode 工具鏈與程式碼簽署驗收。
適合:維護 iOS Bazel 建置規則、希望讓團隊共用建置結果的開發者與 DevOps 工程師。
不適合:尚未能在單一 Mac 上穩定重現建置,或期待只設定快取便能自動把工作移到遠端執行的團隊。
本文會依實際部署順序,從本機基線走到遠端 Mac、跨機驗證與 CI 上線。
00建立可重現的 Bazel iOS 建置基線
不要先從快取設定開始。若本機建置本身會因工作目錄、建置參數或依賴狀態不同而失敗,之後看到的未命中、重建或產物差異,便難以判斷是快取設定還是原始建置問題。
先選定專案中代表性的 iOS 建置目標,在目前可用的 Mac 上執行建置與測試,並保留成功輸出、失敗日誌及產物。以下指令中的目標名稱需替換成專案實際目標:
bazel build //path/to:ios_target
bazel test //path/to:ios_test_target
每次測試要使用一致的程式碼版本、Bazel 啟動方式、建置參數與環境變數。建議把下列項目記入版本庫中的建置說明或 CI 設定,方便另一台 Mac 逐項比對:
- Bazel 版本,以及專案鎖定或模組設定中使用的 rules_apple、rules_swift 版本。
- Xcode 版本、目前選用的開發者目錄與 iOS SDK 路徑。
- 實際建置與測試目標、相關
.bazelrc設定及必要環境變數。 - 建置日誌、測試結果,以及產物的檔案名稱與校驗方式。
Bazel 的 Apple 平台規則與 Xcode 工具鏈有各自的設定要求;請以專案鎖定的規則版本對照 rules_apple 官方倉庫 的說明,不要將其他專案的設定直接複製過來。基線的重點不是追求某個建置時間,而是讓同一個目標可以在已記錄的條件下再次建置。
01對齊遠端 Mac 的 Apple 工具鏈
將專案放到遠端 Mac 後,先獨立重現基線,不要立即開啟快取。透過 SSH 登入後,可記錄目前選用的 Xcode 路徑、Xcode 版本與 SDK 位置:
xcode-select -p
xcodebuild -version
xcrun --sdk iphoneos --show-sdk-path
這些命令分別協助核對目前的開發者目錄、Xcode 版本輸出與指定 SDK 路徑;相關用法可對照 Apple 的 Xcode 命令列工具參考。若遠端 Mac 尚未有可用的命令列工具,則依照 Apple 安裝命令列工具的說明處理,再回頭確認實際選用的 Xcode,而不是假設已安裝工具便代表選取狀態正確。
逐項比較本機與遠端 Mac 的工具鏈、Bazel 設定、建置目標、參數與環境變數。若遠端建置未通過,先依照錯誤日誌定位缺失的工具、路徑或設定;此時還沒有足夠證據把問題歸因於快取。
遠端 Mac 上的建置失敗,是否代表快取配置有問題?
不一定。先關閉快取相關變因,讓遠端 Mac 獨立執行同一個 Bazel 目標;若基線仍失敗,先修正工具鏈或專案環境,待建置與測試結果可重現後,再進入快取設定。
遠端環境的差異也可能來自登入方式與工作階段:SSH、互動式終端與 CI 執行的環境變數未必相同。可將必要環境明確寫入受控的建置設定,並在日誌中確認實際值;不要把含憑據的完整環境輸出到一般工作日誌。
02設定遠端快取讀寫與權限
在 Bazel 設定中指定快取端點與讀寫行為,再依團隊的認證機制處理存取。Bazel 官方文件列出遠端快取的設定方式,包含 --remote_cache 與控制本機建置結果是否上傳的 --remote_upload_local_results;應依照 Bazel 遠端快取文件及實際使用的後端確認完整設定。
設定時把「讀取」和「寫入」當成不同權限管理。可先讓一般開發者及驗證工作讀取快取,再只授予受控的建置任務寫入權限;快取端點的存取控制、憑據存放位置與 CI 身分權限,應在設定審查中逐一核對。若後端支援不同憑據或權限範圍,應採用符合團隊安全政策的最低必要權限。
尤其要檢查:
- 快取端點、認證方式與 Bazel 實際載入的設定檔是否一致。
- 憑據是否放在適合的秘密管理位置,而不是提交進版本庫。
- CI 工作日誌是否可能輸出 token、認證標頭或其他敏感資料。
- 哪些建置目標允許上傳,哪些含有不應共用內容的目標需排除或另行處理。
- 快取不可用時,建置是明確失敗、略過快取,還是依現有流程回退;需符合團隊預期並留下可查證日誌。
Bazel iOS 專案怎麼接入遠端快取?
先確認同一建置目標能在單一遠端 Mac 上重現,再設定 --remote_cache 與所需的讀寫行為,並在後端配置對應身分權限。完成後要用另一台 Mac 驗證是否真的讀取快取,不能只以命令成功結束作為驗收依據。
03驗證跨 Mac 命中並定位差異
跨機測試要固定程式碼版本、目標、工具鏈與建置參數。先在第一台 Mac 執行目標並確認建置結果已依設定上傳;再讓第二台 Mac 使用同一份程式碼及等效環境執行相同目標,查看 Bazel 輸出與日誌中的遠端快取讀取或命中資訊。
成功建置不代表命中。建置可能在第二台 Mac 上重新執行,只是最後產物仍然成功產生;驗收紀錄必須同時保存第一台 Mac 的寫入證據、第二台 Mac 的讀取或命中證據,以及兩邊的建置結果。若沒有看到預期記錄,按下列方向逐項排查:
- 比對兩台 Mac 的 Xcode、SDK、Bazel 與規則版本。
- 確認程式碼版本、建置目標、命令列參數與環境變數一致。
- 核對遠端 Mac 與 CI 是否載入同一組 Bazel 設定。
- 檢查讀取憑據、網路連線、快取端點與後端存取紀錄。
- 依 Bazel 快取命中排查文件檢視未命中的原因,修正後重跑相同測試。
Bazel 會依 action 及其輸入判斷能否重用結果;因此,即使兩台機器表面上執行相同目標,工具鏈或建置輸入有差異時,也不能預設會命中。測試時不要為了得到理想輸出而任意刪除差異資訊,否則會失去定位線索。
不同 Mac 上的快取命中不一致,應先查什麼?
先比對會影響建置輸入的工具鏈、參數與環境,再查設定載入狀態、憑據、網路及快取端點。Bazel 的命中記錄與後端存取紀錄應一起檢視;只有確認第二台 Mac 讀到遠端結果,才能把該次測試記為跨機命中。
04區分快取、遠端執行與簽署
遠端快取是重用符合條件的建置結果;遠端執行則是把符合條件的 action 派送到遠端執行環境。這是兩種不同能力,設定快取不會自動讓建置 action 移到快取伺服器。可對照 Bazel 遠端執行概覽,再依專案使用的 Apple 平台規則核對相關 action 的要求;不要把「讀到快取」寫成「遠端執行成功」。
| 驗收項目 | 實際代表的事 | 應保留的證據 |
|---|---|---|
| 遠端快取命中 | Bazel 重用快取中符合條件的建置結果 | 執行輸出、遠端讀取或命中記錄 |
| 遠端執行 | 建置 action 在遠端執行環境執行 | 執行器設定、action 執行結果與相關日誌 |
| Mac 本機執行 | action 在目前的 Mac 上執行 | 本機建置日誌及工具鏈環境 |
| 打包與簽署 | 產生交付產物並完成專案要求的簽署 | 產物檢查、簽署狀態與發佈流程記錄 |
程式碼簽署及最終交付應獨立驗收。即使某些建置 action 可重用,仍要在專案預定的 Mac 環境中檢查實際產物及簽署結果;快取命中或遠端 action 成功,都不能代替發佈檢查。Apple 對簽署與分發流程亦有獨立說明,例如已簽署 Mac 程式碼的分發文件;iOS 專案則應以自身採用的 Apple 簽署與交付流程作為驗收依據。
05接入 CI 並決定上線範圍
把開發者與 CI 使用的 Bazel 設定納入可檢視、可追溯的管理流程,避免 CI 透過未記錄的參數改變快取行為。接入後,使用實際 iOS 專案逐一執行建置、測試與最終產物驗收,同時確認 CI 身分具備預期的讀取或寫入權限。
上线前可使用下列勾選清單;未完成的項目應先保留在試運行範圍,不要宣稱已達到效能改善:
- [ ] 遠端 Mac 可在記錄的 Xcode、SDK 與 Bazel 條件下重現基線。
- [ ] 第二台 Mac 使用同一目標與建置條件,留下可核對的遠端快取讀取證據。
- [ ] CI 使用的設定與權限已審查,憑據沒有暴露在版本庫或一般日誌。
- [ ] 快取服務不可用時的日誌、失敗處理與回退流程符合團隊要求。
- [ ] 建置、測試、最終產物及簽署結果分別完成驗收。
| 驗收結果 | 建議處置 | 放行條件 |
|---|---|---|
| 遠端基線未通過 | 暫不接入快取,先修正工具鏈或建置設定 | 同一目標可重現建置與測試 |
| 建置成功但沒有命中證據 | 保持試運行並排查跨機差異 | 日誌能證明第二台 Mac 讀取遠端結果 |
| 命中與權限檢查均通過 | 逐步擴大 CI 或開發者使用範圍 | 建置結果、產物與簽署各自驗收 |
| 快取不可用時無法安全回退 | 暫緩擴大接入 | 已確認錯誤處理及回退方式 |
簽署與應用打包應放到遠端執行,還是由 Mac 負責?
先依專案的簽署憑據、金鑰管理與交付政策決定執行位置;不應把快取命中當成簽署驗收。若團隊尚未驗證遠端執行環境能安全取得必要憑據,就讓簽署與最終交付留在已受控的 Mac 流程中,並分別檢查產物和簽署狀態。
若團隊只偶爾需要 Apple 工具鏈,現有 Linux CI 或本機開發環境通常不必為了 Bazel 快取而整體替換;但它們無法自行提供 Xcode 與 macOS 專屬工具鏈,還可能增加跨環境維護及簽署交接成本。當真實專案已證明需要持續運行 Mac 建置節點,可先評估遠端 Mac 是否符合團隊的工具鏈與存取需求,再依NUKCLOUD 的服務說明及訂購資訊確認可用安排;若只是短期測試或試行,租用遠端 Mac 可避免先購置專用硬體,但是否合適仍取決於持續負載、實體介面需求與團隊的安全政策。