從本機打包到雲端交付

安排夜間建置,
讓工作電腦準時下班。

使用多台獨享實體 Mac 建置 iOS 打包環境。將不同 scheme 分派至 macOS runner,分別完成封存、簽署與 TestFlight 上傳,不必再讓所有工作擠在同一台工作電腦上。

ArmRDP 提供整台 Mac mini,並非虛擬機。三種規格、5 個節點,每天 $21.1 起;先遷移一條流水線,再依實際佇列擴充。

夜間交付前須先完成 runner、簽署與上傳設定;交付時間取決於專案、相依套件與工作佇列。

夜間交付 · 工作分派示意

一條發布流水線,分成三路建置。

依 scheme 隔離工作,集中各節點的產出物。

  1. A
    主 App · Releaserunner-app → archive → codesign
    .ipa
  2. B
    擴充功能與相關目標runner-extension → build → test
    .xcresult
  3. C
    候選版本驗證runner-check → simulator → report
    測試報告
排程原則
先用一台跑通
擴充方式
新增獨立 runner
流程僅供示意,非即時資料。各路工作的先後順序須依專案相依性設定;檢查通過後再上傳 TestFlight。
CI/CD 團隊

固定工具鏈,比反覆排查環境更有效。

將雲端 Mac 註冊為 GitLab 或 GitHub Actions 的 macOS self-hosted runner。程式碼庫維持團隊原有的管理方式,只將需要 macOS 的 job 指派至這台實體節點。

先讓建置結果可重現

記錄 Xcode 完整版本、SDK、命令列工具路徑與相依套件鎖定檔。使用 xcodes 管理多個 Xcode 版本,再為每個 job 指定 DEVELOPER_DIR,避免不同專案共用同一個全域設定。

runner 標籤至少應標示系統、工具鏈與用途,例如 macos、xcode-pinned、ios-release。發布工作只指派給受信任的 runner;未經審查的分支不得進入存放簽署資料的執行環境。

剛開始時,每台機器一次只執行一個大型建置工作。觀察冷建置、快取命中率、記憶體壓力與磁碟使用量,再決定要提高並行數或新增節點。機器數量並非唯一因素,快取與工作拆分同樣會影響佇列。

先確認環境,再執行封存
xcodebuild -version
xcode-select -p
xcrun --sdk iphoneos --show-sdk-version

xcodebuild \
  -workspace App.xcworkspace \
  -scheme App \
  -configuration Release \
  -archivePath artifacts/App.xcarchive \
  archive

將 App 工作區與 scheme 替換為專案實際使用的名稱。封存產物、建置記錄與測試結果應依 job 分別保存;不要讓兩個工作寫入同一個輸出目錄。

App 發布

封存、簽署與上傳,全程留在同一條可追溯的流程中。

為 App Store 上架準備好將建置產物與對應的提交、工具鏈及簽署設定連結起來。雲端 Mac 負責執行環境,發布權限與審核資料仍由團隊管理。

封存與匯出

保留 .xcarchive、匯出設定與 dSYM。先確認 Release 設定、版本號與建置號,再執行匯出;不要只留最終的 .ipa,卻遺失排查當機問題所需的符號檔。

驗收標準:產物可對應至唯一的提交與建置號。

簽署與憑證

以受控方式匯入發佈憑證與描述檔,並為建置工作使用獨立的 Keychain。若使用 fastlane match,請限制程式碼庫的存取權限,並將解密資料存放於 CI 密鑰儲存區,而非寫入腳本。

驗收標準:非互動式工作可順利完成 codesign。

上傳與審核素材

使用團隊授權的上傳憑證提交產物。透過圖形介面檢查模擬器畫面並製作審核素材,確認目標裝置、語言與版本;完成上傳不代表已通過審核。

驗收標準:上傳結果、素材與記錄一併封存。

發布 job 應限制可觸發的分支與操作者。憑證到期、描述檔不相符或上傳權限不足,須分別依記錄排查;升級機器規格無法解決這些問題。

macOS App 開發

用命令列執行工作,用圖形介面檢查細節。

獨享實體節點原生執行 macOS,Metal 與模擬器可用於相應的開發工作。SSH 適合執行腳本與查看記錄;VNC 螢幕共享則用於檢查 Xcode、模擬器與介面,兩種連線方式各有用途。

適合移至遠端執行的工作

固定版本編譯、自動化測試、模擬器截圖與相依套件安裝,都能脫離本機工作電腦執行。需要互動式排查時,先在圖形介面重現問題,再將可重複的步驟寫入腳本。

先確認目標系統、模擬器 runtime 與 Xcode 版本相容。

需另外驗證的限制

遠端畫面的反應速度取決於網路路徑、解析度與編碼設定,無法等同本機螢幕。若工作涉及外接設備、特定周邊或頻繁互動,請先按天租用並執行實際工作,再決定是否遷移。

AI 實驗

以 64GB 統一記憶體,驗證模型能否納入工作流程。

ArmRDP M4 Pro 配備 M4 Pro、64GB 統一記憶體與 2TB SSD。適合在獨享環境中載入本機模型、比較量化版本並驗證推論介面,再評估是否值得繼續投入。

先測記憶體容量,再測速度

模型檔案大小不等於執行時所需記憶體。除了權重,還須計入 KV cache、上下文長度、執行框架與其他處理程序;先以目標模型的短上下文開始,記錄記憶體峰值與壓力,再逐步增加請求量。

使用支援 Apple Silicon 的推論框架,並確認特定運算子與模型格式的相容性。統一記憶體不代表任何模型都能執行,也不能直接推算生成速度;請使用自己的提示詞、上下文與輸出長度進行驗收。

每次實驗至少記錄四項資訊

  • 模型名稱、版本與量化格式。
  • 上下文長度、批次大小與記憶體峰值。
  • 首次載入所需時間與穩定執行後的回應狀況。
  • 請求範例、輸出品質與失敗記錄。

推論實驗與正式發布建置盡量分開排程,避免記憶體競用影響結果。遠端介面應設定驗證並限制存取,不要直接公開監聽連接埠。

從一條流水線開始遷移

先搬移資料,再對齊環境,最後切換排程。

不要一開始就搬遷整套發布系統。選擇一個相依性明確、可在本機穩定產生建置產物的 scheme,以本機結果作為基準,依序通過以下三項驗收。

  1. 01 · 資料

    遷移程式碼庫,也要遷移簽署所需資料

    使用唯讀或最小權限憑證下載程式碼庫,確認子模組、私有相依套件與大型檔案。憑證、描述檔與解密金鑰應分開管理,切勿將敏感檔案提交至程式碼庫。

    • 確認指定提交可完整取出。
    • 確認建置所需的密鑰可由受控方式讀取。
    • 將產物與備份儲存在節點之外。

    通過條件:同一提交所需的資料與相依套件皆已備妥。

  2. 02 · 工具鏈

    把「我的電腦可以跑」整理成清單

    使用 xcodes 安裝並固定專案所需的 Xcode 版本。保存 Homebrew 相依套件清單與套件管理器鎖定檔,安裝所需的模擬器 runtime,並記錄環境變數與執行路徑。

    • 比對 Xcode 與 SDK 版本。
    • 先執行一次不使用快取的建置。
    • 依專案隔離 DerivedData 與快取。

    通過條件:手動執行可產生預期的產物。

  3. 03 · CI 整合

    註冊 runner,只切換一條發布流水線

    註冊 runner、設定標籤與程式碼庫權限,將第一條流水線指定至雲端 Mac。確認成功後再加入簽署與上傳階段,最後擴展至其他 scheme 與獨立節點。

    • 初期一次只執行一項工作。
    • 保留記錄、測試報告與符號檔。
    • 失敗時仍可切回原有執行環境。

    通過條件:無人值守工作可重複完成。

遷移期間保留原有 runner,直到冷建置、簽署、上傳與失敗重試都驗證完成。租期結束前請匯出需要保留的資料,不要把節點磁碟當成唯一的封存位置。

三種機型選購指南

依建置次數初步分類,實際規格仍須以專案需求為準。

以下依每日工作量提供入門建議,不代表效能測試結果或出包保證。一次大型完整編譯可能比多次增量建置更耗資源;請同時記錄單次耗時、快取命中率與記憶體峰值,再決定升級單台機器或增加節點。

每日工作量僅供規劃分類;三種機型皆為獨享實體機,建議先驗證單一工作。
每日工作量參考 入門機型與規格 優先驗證項目 按天租用
1–5 次
臨時驗證、單一專案入門
ArmRDP M4 Base
M4 / 16GB / 256GB
先跑通封存與簽署流程;留意相依套件安裝、DerivedData 與產物占用的磁碟空間。 $21.1/天租用 M4 Base
6–20 次
持續整合、頻繁迭代
ArmRDP M4 Plus
M4 / 24GB / 512GB
確認編譯與測試同時執行時的記憶體壓力;先最佳化快取,再評估是否需要多台 runner。 $41.4/天租用 M4 Plus
21 次以上
多目標、大型工作評估
ArmRDP M4 Pro
M4 Pro / 64GB / 2TB
評估大型專案或模型實驗的資源需求;若瓶頸在於排隊,將獨立工作分配至多台節點。 $59.5/天租用 M4 Pro

將節點與租期一併納入考量

5 個節點分別位於新加坡、日本(東京)、韓國(首爾)、香港與美國西部,三種機型皆有提供。圖形介面操作建議優先比較團隊與節點之間的連線體驗;無人值守建置則須一併檢查程式碼庫、相依套件下載與產物上傳的連線路徑。實際供應狀態以控制台即時資訊為準。

驗證階段可先按天租用;固定發布節奏後,再比較週租、月租與季租價格。支援 USDT-TRC20 與 Visa / Mastercard / Amex(透過 Stripe),一律以美元結算;實際可用的付款閘道以後端回傳為準。

先租用一天,驗收一條實際的流水線。

準備一個 scheme、一組簽署設定與明確的驗收標準。跑通封存、簽署與交付後,再為更多工作安排節點。