跨區研發 · 建置接力

同一台 Mac,
跟著時區接力

亞太同事提交程式碼,北美同事接手打包。建置環境留在機房,不會隨著某位同事的電腦一起下班。

整台主機只租給一位客戶,並非虛擬機。提供兩款 Apple M4、5 個節點,全年 365 天持續運作。

每日 $19.2 起。電源、網路與散熱由機房代管;專案流水線、建置佇列和發布權限由團隊自行設定。

持續整合

提交後進入佇列,夜間持續建置

把 Xcode 建置機從辦公室搬到機房。每次 push 都會觸發任務,不再依賴同事留下電腦並接上電源。

從可重現的流水線開始

在主機上註冊自架 macOS runner,依照儲存庫的設定觸發分支、測試目標與產出路徑。首次執行時,先確認命令列建置成功,再啟用自動觸發,避免把環境問題和 CI 設定問題混在一起排查。

單一 App 的順序建置可從 Push M4 S 開始:M4 / 16GB / 256GB SSD。保留依賴項與 DerivedData 快取,讓後續任務沿用相同目錄;避免多個任務同時寫入相同的建置輸出。

全年持續運作可避免依賴辦公室供電與設備代管,但不代表失敗的任務會自動恢復。runner 自動啟動、失敗重試、磁碟清理和日誌通知,仍需在團隊流水線中設定。

先驗證 archive,再交由 runner 執行

以下以專案目錄中的 App.xcworkspace 和 App scheme 為例,執行前請換成實際名稱。

xcodebuild -version

xcodebuild \
  -workspace App.xcworkspace \
  -scheme App \
  -configuration Release \
  -destination 'generic/platform=iOS' \
  -derivedDataPath build/DerivedData \
  -archivePath build/App.xcarchive \
  archive

請事先準備簽名設定。此命令會產生 archive,不代表已完成匯出或上傳。

跨時區協作

依時區輪班,交接資訊不中斷

亞太白天提交,美國東部節點可接手北美白天的打包與發布。依主要操作者選擇節點,建置任務則透過佇列交接。

提交時留下必要資訊

記錄分支、commit、scheme、Xcode 版本與建置參數。接手者可從同一筆提交繼續,不必翻聊天紀錄猜「剛才跑的是哪個版本」。

交接資訊:提交雜湊 + 任務編號。

執行時控管並行數

獨享不等於可以無限並行。為同一台 Mac 設定佇列或互斥鎖,簽名與匯出階段依序執行;不同專案則使用各自的工作目錄與快取鍵。

交接資訊:佇列狀態 + 日誌路徑。

接手時檢查輸出

北美同事先確認測試結果、archive 和匯出日誌,再進行發布審批。若任務失敗,先保留現場與錯誤日誌,不要直接清除快取後重跑。

交接資訊:產出位置 + 審批結果。

分別考量就近連線與任務執行

可選節點包括新加坡、東京、首爾、香港與美國東部。VNC 操作優先考量操作者所在位置;自動建置也要考量儲存庫與依賴來源的網路路徑。時區可作為排班依據,但不保證連線延遲;若經常跨洲操作,可依兩地團隊分別配置主機,並統一 runner 標籤。

簽名與交付

在同一台主機完成發布流程

用於上架 App Store 的 archive、簽名與上傳,都在固定的建置環境中完成。減少環境遷移,也不必把簽名資產複製到每位同事的電腦。

  1. 01

    固定工具鏈

    為發布分支指定 Xcode 路徑,並記錄 SDK 與依賴鎖定檔。不要依賴互動桌面上一次選取的版本;在建置日誌中記錄實際使用的工具鏈。

  2. 02

    集中管理簽名資產

    憑證與描述檔集中保存在發布主機,並以最小權限原則設定鑰匙圈。密碼透過 CI 的受保護變數傳入,不要寫入儲存庫、命令輸出或公開日誌。

  3. 03

    分開封存與匯出

    先保留 xcarchive,再使用經團隊審核的 ExportOptions 設定匯出。上傳步驟另行設定授權與審批,方便區分編譯、簽名和上傳失敗。

  4. 04

    保留交付紀錄

    將版本號、提交雜湊、建置日誌與產出相互關聯。簽名資產只在必要位置使用,並在團隊控管的安全位置保留加密備份,避免單點遺失。

跨平台專案

多個 target 建置,先預留足夠記憶體

Flutter 和 React Native 的 iOS 建置階段仍需要 macOS 工具鏈。將原生依賴、Pods 與 Xcode 快取留在主機上,減少每次臨時設定環境的重複工作。

Push M4 S · 順序執行

M4 / 16GB / 256GB SSD

適合單一 App 的日常 CI、單一發布佇列,以及先確認跨平台專案能否穩定打包。建置、模擬器和其他程序會共用主機記憶體,建議先依序執行,觀察記憶體峰值後再增加任務。

保留依賴鎖定檔,為不同分支設定快取鍵;將舊產出移至團隊自己的產物儲存空間,避免封存檔持續占滿本機磁碟。

Push M4 L · 多目標任務

M4 / 24GB / 512GB SSD

適合多個 target 的 archive、Flutter / React Native 混合建置,以及需要同時保留更多依賴項與工具鏈的專案。24GB 可為並行任務提供更多記憶體空間,但仍需依實際專案測試並行數。

分別記錄建置時間、記憶體壓力與磁碟用量。如果瓶頸來自跨區下載或簽名鎖定等待,增加記憶體無法直接解決,應先調整快取與佇列。

若多個 Xcode 版本、依賴快取和 archive 持續增加,可考慮加購 +1TB SSD 或 +2TB SSD。擴充儲存空間只增加容量,不會增加統一記憶體;先確認用量來源,再決定是否擴充。

Apple Silicon 實驗

將小規模推論安排在閒置時段

同一台雲端 Mac 也可執行本機模型推論、腳本驗證與小規模測試。先確認模型能否載入統一記憶體,再安排與發布任務錯開執行。

預估資源時別只看模型檔案

統一記憶體還要容納 macOS、推論框架、上下文快取和其他程序。模型檔案大小不等於執行所需記憶體;先用短輸入測試,再逐步增加上下文與批次大小。

記錄項目:模型版本、量化方式、記憶體峰值。

將測試條件納入結果

固定框架版本、輸入樣本與生成參數,再比較耗時與輸出。選擇 16GB 或 24GB,應以能否穩定執行目標任務為準,不預設適用所有情況的模型規模或速度。

記錄項目:輸入長度、執行參數、執行時間。

實驗與簽名發布分開進行

推論和 Xcode 編譯會競用運算與記憶體資源。發布時暫停實驗佇列;實驗腳本使用獨立目錄與權限,不讀取發布用鑰匙圈;長時間任務請及時儲存結果。

記錄項目:任務優先順序、停止條件、結果路徑。

適合需要 macOS 與 Apple Silicon 環境的驗證任務,但小規模實驗不等於大規模訓練。可先按日租用,確認自己的工作負載能順利執行後,再決定後續安排。

團隊交接規範

把使用需求化為可執行的規範

以下以兩種角色的情境說明任務安排,不代表已驗證的客戶評價或實測連線效能。

「我們把 Fastlane 放在固定主機上。誰值班都先查看同一份建置紀錄,不必再等某個人開電腦。」
執行規範:將發布腳本納入版本控制,並以任務編號連結 archive 與匯出日誌。
行動應用負責人 · 情境範例
「我會先用測試同事的網路測試遠端桌面,再選定節點。自動化測試走佇列,需要人工確認時再接手桌面操作。」
執行規範:依實際操作網路測試連線,並將互動確認與批次測試分開。
QA 主管 · 情境範例

依使用情境選擇方案

單一 App 順序建置可從 16GB 開始,多個 target 與混合建置則評估 24GB。選好主要工作節點,再跑通第一條自己的流水線。

獨享實體 Mac mini,每日 $19.2 起。實際可用狀態以控制台即時回報為準。