為亞太與北美研發團隊

從連線到產出建置檔的操作指南

主機開通後,從目前卡住的步驟開始排查。分別檢查連線、工具鏈、簽署與工作流程,讓成功的建置成為可重複的交付流程。

主機位址、連接埠、使用者名稱與交付狀態,請以控制台中的主機詳細資料為準。本文指令中的環境變數須先換成自己的設定,並未包含實際連線憑證。

01 · 連線至主機

先確認連線入口,再檢查網路

SSH 用於命令列與自動化,VNC 用於圖形介面。兩者連線至同一台專屬實體主機,但連線參數須分別確認。

SSH:逐項確認主機資訊

在控制台開啟對應主機,查看主機位址、SSH 連接埠與使用者名稱。先確認本機私密金鑰的路徑,再執行連線;請勿將 VNC 連接埠填入 SSH 指令。

chmod 600 "$SSH_KEY"
ssh -i "$SSH_KEY" -p "$SSH_PORT" "$NODE_USER@$NODE_HOST"

首次連線時請確認主機指紋;若無法確認,先提交支援單,請勿直接停用主機驗證。若連線逾時,先檢查本機網路與連接埠是否可連通;若遭拒絕,請確認使用者名稱、金鑰及主機上的公開金鑰設定。

重新安裝系統或更換主機後,指紋可能會改變。確認主機確實已變更後,再更新本機記錄。

VNC:用於桌面互動操作

使用控制台提供的遠端桌面資訊連線,並確認位址、連接埠與密碼。首次登入後請設定自己的存取密碼,避免多人長期共用同一組憑證。

桌面適合設定 Xcode、檢查鑰匙圈與查看模擬器;持續建置則交由 SSH 或 runner 執行。若 SSH 正常但桌面異常,記下用戶端錯誤訊息與主機狀態,從遠端桌面這一層開始排查,不要先反覆重新啟動主機。

若要透過 SSH 通道存取,請依實際 VNC 連接埠設定轉送,並連線至用戶端的本機連接埠:

ssh -N -L 5901:127.0.0.1:"$VNC_PORT" \
  -p "$SSH_PORT" "$NODE_USER@$NODE_HOST"

通道必須保持連線。是否啟用及使用的連接埠,請依主機設定與團隊存取政策決定。

主機位置:依操作地點選擇,不要只看專案歸屬

5 個主機位置為新加坡、東京、首爾、香港與美國東部。互動式桌面優先選擇靠近主要操作者的位置;自動化建置也須考量程式碼與相依套件的下載路徑。跨區團隊可各自設定鄰近的建置主機,並以明確的 runner 標籤分派工作,不必讓所有成員遠端操作同一個桌面。

比較主機位置時,請使用相同的用戶端、網路與時段,記錄連線往返時間、儲存庫下載時間及一次完整建置所需時間。網路延遲不等於編譯時間,請勿直接比較不同網路條件下的結果。

02 · 固定工具鏈

為各分支指定明確的 Xcode 環境

先記錄版本,再移轉簽署設定。桌面上能完成編譯,不代表 runner 的使用者工作階段也已準備就緒。

保留多個版本,避免工作互相切換

將不同版本的 Xcode 使用不同名稱,並放入「應用程式」資料夾。Stable 與 Next 是自訂的應用程式名稱,執行前請換成主機上的實際名稱。完成首次啟動、授權確認及所需平台元件安裝後,再接入工作流程。

xcode-select -p
xcodebuild -version
xcrun --sdk iphoneos --show-sdk-version

sudo xcode-select --switch \
  /Applications/Xcode-Stable.app/Contents/Developer

切換全域版本會影響未明確指定工具鏈的工作。多個分支同時建置時,建議在個別工作中設定環境變數,避免另一條工作流程改動正在使用的預設版本。

export DEVELOPER_DIR=/Applications/Xcode-Next.app/Contents/Developer
xcodebuild -version

一併檢查憑證、私密金鑰與描述檔

請在實際執行建置的 macOS 使用者帳戶下匯入簽署憑證及其對應的私密金鑰,再依目前 Xcode 版本的簽署設定安裝描述檔。只有憑證而沒有私密金鑰,無法完成程式碼簽署。

security find-identity -v -p codesigning
xcodebuild -list -workspace App.xcworkspace

確認專案的團隊識別碼、Bundle Identifier、簽署方式與描述檔適用範圍。先以相同使用者手動完成一次 archive,再讓 CI 執行相同指令,以判斷問題來自專案設定還是 runner 工作階段權限。

自動化建議使用專用鑰匙圈與受控的金鑰注入流程。確認非互動式工作階段能存取簽署身分;請勿將鑰匙圈密碼、憑證匯出密碼或私密金鑰提交至儲存庫,也不要輸出至建置記錄。

先留下可重現的建置紀錄

以下以工作區和共用 scheme 為例。請替換專案名稱、scheme 與匯出設定;匯出設定須符合專案的簽署與發佈需求。請一併記錄結束代碼、工具鏈版本與產出檔案路徑,不要只截取成功訊息。

xcodebuild archive \
  -workspace App.xcworkspace \
  -scheme App \
  -configuration Release \
  -destination 'generic/platform=iOS' \
  -archivePath "$HOME/builds/App.xcarchive"

xcodebuild -exportArchive \
  -archivePath "$HOME/builds/App.xcarchive" \
  -exportPath "$HOME/builds/export" \
  -exportOptionsPlist ExportOptions.plist
03 · 設定持續建置

讓工作由固定的 macOS 使用者執行

一台主機只租給一位客戶,不代表工作之間自然不會互相影響。團隊仍須明確約定建置使用者、目錄與佇列規則。

GitHub Actions:註冊後再設為服務

在儲存庫或組織的 runner 設定中,取得適用於 Apple Silicon 的安裝套件與註冊指令,並解壓縮至專用目錄。使用該頁面提供的臨時權杖,依所屬儲存庫或組織完成註冊;請勿將權杖儲存在指令碼中。

./config.sh \
  --url "$RUNNER_URL" \
  --token "$RUNNER_TOKEN" \
  --labels pushmac,macos,arm64

./svc.sh install
./svc.sh start
./svc.sh status

工作流程中的 runs-on 須與註冊時設定的標籤相符。先派送不含簽署資產的測試工作,確認工具鏈、工作目錄與權限,再加入發佈工作。只有可信任的程式碼才能使用含有簽署資產的 runner。

服務指令須在 runner 安裝目錄中執行;操作使用者與服務使用者應保持一致。

GitLab Runner:明確指定執行器與工作目錄

依團隊使用的 GitLab 執行個體說明,安裝相容的 runner,再使用該執行個體提供的驗證資訊註冊。macOS 原生建置可選擇 shell 執行器;這表示工作會以本機使用者的權限執行,因此應限制可觸發工作的專案與分支。

mkdir -p "$HOME/ci"
gitlab-runner register
gitlab-runner install --working-directory "$HOME/ci"
gitlab-runner start
gitlab-runner status

依提示輸入團隊執行個體位址、權杖、標籤與執行器。設定檔可能包含驗證資訊,請限制存取權限;記錄中保留工作編號與錯誤堆疊,但不要輸出環境中的機密變數。

安裝參數須符合已安裝的 runner 版本,請先查看本機說明再執行。

開機啟動檢查:包含「重新啟動後的第一項工作」

macOS 使用者層級服務通常依賴使用者登入工作階段;安裝服務不代表未登入時也能執行簽署工作。請確認 runner 使用的 launchd 服務類型、登入條件與鑰匙圈可用性;切勿為了開機啟動而繞過團隊的存取控管政策。

在可控時段確認重新啟動後的服務狀態,並完成一次完整建置。Fastlane 請使用專案鎖定的相依套件執行,例如 bundle exec fastlane ios build其中 lane 名稱以專案定義為準。跨時區交接工作時,請明確訂定併行數量與佇列規則,避免兩個 archive 同時寫入相同的產出目錄。

04 · 保留可重複使用的工作成果

先找出耗時項目,再決定是否擴充儲存空間

分別記錄相依套件解析、編譯、簽署與匯出的耗時。在相同提交與工具鏈下比較冷建置和熱建置,才能判斷快取是否生效。

依專案與工具鏈區分快取

租用期間,專屬主機可保留 DerivedData、SPM 下載內容與 CocoaPods 快取。請勿讓所有分支不加區分地寫入同一目錄;依專案、工具鏈與工作類型區分路徑,並保留相依套件鎖定檔。

xcodebuild archive \
  -workspace App.xcworkspace \
  -scheme App \
  -destination 'generic/platform=iOS' \
  -derivedDataPath "$HOME/ci-cache/App/stable/DerivedData" \
  -clonedSourcePackagesDirPath "$HOME/ci-cache/App/stable/SPM" \
  -archivePath "$HOME/builds/App.xcarchive"

Flutter 與 React Native 專案也須確認各自的工具版本及 iOS 相依套件鎖定狀態。若發生異常,先保留失敗記錄,再針對相關快取進行清理;每次建置都刪除所有快取,通常會失去熱建置的效益。

分別處理儲存空間與記憶體需求

Push M4 S 規格為 M4 / 16GB / 256GB,適合單一 App 的日常 CI;Push M4 L 規格為 M4 / 24GB / 512GB,適合記憶體需求較高及多 target 建置。是否適合平行建置,仍須依專案實測的尖峰用量判斷。

+1TB SSD 適合相依套件快取、多個工具鏈與歷史產出逐漸占滿系統磁碟的情況;+2TB SSD 適合需要保留更多專案快取與 archive 的工作流程。加購儲存空間不會增加統一記憶體,也不保證編譯速度會隨容量提升。

df -h
du -sh "$HOME/ci-cache" "$HOME/builds"

先確認掛載路徑,再移轉快取並修改工作流程變數。加購儲存空間不等於備份;封存檔、符號檔與重要設定仍應依團隊政策另存副本。

05 · 帳戶與租期

配合發佈時程安排續約

計費週期、主機位置與付款狀態,請以控制台顯示為準。提交支援單時請附上訂單編號,勿提供密碼、私密金鑰或完整信用卡資訊。

按日租用與續約週期

支援按日、週、月、季計費。Push M4 S 每日 $19.2、每週 $51.8、每月 $95.9、每季 $260.8;Push M4 L 每日 $39.7、每週 $107.2、每月 $198.5、每季 $539.9。請在控制台查看主機到期時間、續約入口與可選週期;每日價格乘算結果不等同其他週期的標價。

發佈前先確認租期涵蓋建置與驗收時間。若要調整週期,請查看控制台的相關操作與實際帳單;不要假設已付款項會自動轉為其他週期。

更換主機位置前的移轉準備

變更主機位置會涉及新的網路入口與整機環境,並非只修改地區標籤。請先透過控制台支援單確認處理方式,再備份程式碼、簽署資產、runner 設定與必要產出。請勿假設本機檔案、快取或登入資訊會自動移轉。

移轉完成後,重新確認主機指紋、runner 標籤與簽署權限,並完成一次建置驗證,再停止舊環境的工作派送。

付款方式與美元計價

僅支援 USDT-TRC20,以及透過 Stripe 處理的 Visa / Mastercard / Amex 信用卡,所有款項均以美元(USD)結算。實際可使用的付款方式以後端回傳為準。以區塊鏈付款時,請依該筆訂單的網路、收款資訊與金額操作,避免重複使用舊訂單資訊。

付款後請先查看訂單狀態。如需核對,請透過支援單提供訂單編號、付款時間,以及交易雜湊或付款參考編號;請勿再次付款來嘗試更新狀態。

全年運作與專案備份

實體主機全年 365 天持續運作,資料中心負責供電、網路與散熱。持續運作不代表專案已備份,也不保證用戶端網路不會中斷。遠端工作階段中斷時,先確認主機狀態並嘗試另一種連線方式,再判斷是否為主機異常。

租期結束後,整台主機會先清除資料,再交付下一位客戶。退租前請匯出所需程式碼、產出與設定,移除 runner 註冊並撤銷相關存取權杖;請勿將主機作為唯一的資料存放位置。

繼續整理建置流程

操作問題查指南,方案設計看技術文章

本頁提供即時操作說明。移轉、快取設計與跨時區分工,請前往文章列表閱讀完整內容。

前往 PushMac 技術文章列表

從已發佈的文章中選擇主題,查看完整步驟與適用條件。移轉工具鏈或變更快取目錄前,先記錄現有設定並預留回復方式,再逐項驗證。

本指南中的指令用於說明操作;文章中的實務做法也須依儲存庫結構、簽署政策與團隊權限調整。

提交支援單時附上可供核對的建置記錄

亞太與北美團隊成員接力處理同一問題時,清楚註明時間與主機位置,比只寫「連不上」更容易接續排查。

  1. 01

    確認主機資訊

    填寫訂單或主機編號、主機位置、發生時間與時區。若不同成員使用不同網路,請分別註明連線地點。

  2. 02

    提供錯誤資訊

    附上用戶端錯誤訊息、建置指令、結束代碼、Xcode 版本及最後一段相關記錄。提交截圖或文字前,請先移除機密資訊。

  3. 03

    列出已檢查項目

    說明 SSH 與 VNC 是否各自可用、問題能否重現,以及最近變更過哪些設定,避免後續處理人員重複檢查。

將檢查記錄提供給支援團隊

登入控制台提交支援單,處理主機與訂單問題。若無法登入,請寄信至 support@pushmac.com,並註明帳戶電子郵件與問題範圍。