團隊建置串接指南

照著這份指南串接 Runner

整台 Apple Silicon M4 Mac mini 專供你的團隊執行任務。先確認執行個體與連線,再註冊 Runner,最後固定 Xcode 工具鏈;遇到問題就從對應環節排查,不必重跑整條流水線。

已有訂單請至控制台確認狀態;請勿將註冊權杖、SSH 密碼或簽署資料放進公開紀錄。

從訂單到連線

依照四個檢查點接手節點

付款確認後,取得並核對連線憑證通常約需 4 分鐘。以下時間僅供流程參考,不含付款閘道確認、網路重試、安裝相依套件或 Runner 註冊;實際進度以控制台回覆為準。

  1. 確認已付款訂單

    約 30 秒

    在控制台確認訂單已付款,並檢查機型、週期與節點是否符合購買內容。Merge M4 S 配備 16GB RAM / 256GB SSD;Merge M4 L 配備 24GB RAM / 512GB SSD,兩種規格皆採用 Apple Silicon M4。

    遇到問題:先查看帳單狀態,頁面尚未更新時請勿重複付款;記下訂單編號,再到本頁的帳單區核對付款紀錄。

  2. 查看實體節點分配

    約 2 分鐘

    開啟訂單所連結的執行個體詳細資料,等待系統顯示執行個體狀態與連線資訊。每台機器僅分配給一位客戶,並非虛擬機;同一團隊的任務排程由你設定的 Runner 管理。

    遇到問題:記下執行個體 ID、訂單編號與目前狀態,透過控制台提交工單。請勿將「帳單已付款」直接視為「執行個體憑證已產生」。

  3. 取得連線憑證

    約 1 分鐘

    從執行個體詳細資料取得 SSH 位址、連接埠、使用者名稱及 VNC 連線資訊。請依欄位提供的資料連線,不要猜測預設連接埠,也不要沿用舊執行個體的位址或密碼。

    遇到問題:確認目前登入的帳號擁有該筆訂單,再確認是否開啟正確的執行個體。提交工單時只需提供執行個體 ID 與缺少的欄位名稱,請勿傳送完整密碼。

  4. 測試遠端連線

    約 30 秒

    SSH 適用於命令列建置、註冊 Runner 與同步檔案;VNC 可用於 Xcode 圖形介面、模擬器及互動式設定。macOS 圖形介面與命令列都能使用,也可以搭配作業。

    ssh -p "$SSH_PORT" "$SSH_USER@$SSH_HOST"
    uname -m
    sw_vers

    首次連線時,請先確認主機指紋;連線成功後,檢查架構輸出是否為 arm64。連線逾時時,先檢查位址、連接埠與本機網路;驗證失敗時,先檢查使用者名稱與憑證。若主機指紋異常,請勿關閉主機身分驗證來繞過檢查。

    VNC 用戶端請使用執行個體詳細資料提供的對應欄位,不要直接沿用 SSH 連接埠。連線成功但畫面反應遲緩時,先降低解析度;自動化建置仍可透過 SSH 執行。

沿用團隊現有的 CI

將任務明確派送至這台 M4

先從 CI 平台的新增 Runner 或 Agent 頁面取得安裝套件與註冊指令,再於節點上執行。以下僅列出註冊要點;權杖、組織網址與工作目錄由你的平台產生,範例變數不可直接照抄。安裝後先執行一個不含簽署資料的測試任務。

GitHub Actions

在儲存庫或組織設定中新增 self-hosted runner,選擇 macOS 與 ARM64 套件。解壓縮後,在 Runner 目錄執行平台提供的設定指令,再啟動程序。

./config.sh \
  --url "$RUNNER_URL" \
  --token "$RUNNER_TOKEN" \
  --labels macos-m4
./run.sh

在工作流程中指定 runs-on: [self-hosted, macOS, ARM64, macos-m4],並確認標籤與註冊結果一致。標籤用於派送任務,不代表機器會自動隔離不同任務。

檢查項目:平台顯示 Runner 在線,測試任務的 uname -m 輸出為 arm64。若需要持續運作,請依安裝套件提供的服務說明進行設定,並以相同的建置使用者執行。

建議標籤:macos-m4

GitLab Runner

在專案或群組中建立 Runner,取得目前版本使用的驗證權杖。安裝 ARM64 版本後進行註冊,選擇 shell executor,讓任務在該建置使用者的 macOS 環境中執行。

gitlab-runner register
gitlab-runner verify
gitlab-runner run

在平台中為 Runner 設定 macos-m4 標籤,並在作業的 tags 欄位填入相同值。互動式註冊時,輸入平台提供的網址與權杖;請勿將權杖寫入儲存庫。

檢查項目:Runner 已連結至正確的專案,作業也能進入執行狀態。若作業持續等待,請檢查標籤、受保護分支設定與 Runner 的專案權限,再查看機器負載。

執行方式:shell

Jenkins Agent

建立專用節點,設定遠端工作目錄與 macos-m4 標籤。依控制器提示安裝相容的 Java,下載控制器提供的 Agent 檔案,並使用控制器產生的啟動參數。

java -jar agent.jar \
  -url "$JENKINS_URL" \
  -secret "$AGENT_SECRET" \
  -name "$AGENT_NAME" \
  -webSocket \
  -workDir "$AGENT_WORKDIR"

在流水線中指定 agent { label 'macos-m4' }。工作目錄必須可供建置使用者寫入;Java 版本也應符合控制器要求,不能只確認本機終端機能否啟動 Java。

檢查項目:控制器顯示節點在線,工作區位於預期目錄。先以單一 executor 建立基準,再依據記憶體、磁碟與測試負載評估並行數。

先以單一任務建立基準

專用整機可避免與其他客戶爭用 CPU,但無法替你管理團隊內部的任務佇列。同一個 Runner 若同時承接多項任務,仍需自行安排並行作業、工作區與簽署資料的隔離。

固定可重現的環境

讓本機與 CI 使用相同的 Xcode

「終端機可以編譯,Runner 卻失敗」通常是工具鏈路徑或執行使用者不同所致。先記錄目前版本,再選擇工具鏈,最後補齊所需的模擬器執行環境;不要一開始就重裝 Xcode。

切換前先記錄版本

不同版本的 Xcode 可以分別安裝在不同的應用程式路徑。先執行以下指令,記錄系統、目前開發目錄與建置工具版本,再與專案需求比對。

sw_vers
xcode-select -p
xcodebuild -version
xcrun --find swift

若要變更整台機器的預設值,請使用 xcode-select。切換前確認沒有其他建置正在執行,並以 CI 執行使用者身分再次檢查結果。

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

依作業選擇工具鏈,依專案下載

團隊需要使用不同 Xcode 版本時,建議優先為各項作業設定 DEVELOPER_DIR,減少全域切換造成的影響。請將範例路徑替換成節點上實際存在的版本目錄。

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
xcodebuild -version
xcrun simctl list runtimes
xcrun simctl list devices available
df -h

在 Xcode 設定中,依專案需求下載模擬器執行環境。執行環境、模擬器資料與 DerivedData 都會占用磁碟空間;安裝前先檢查可用空間,只保留團隊實際使用的版本。

指令能執行,不代表專案相依套件都已備妥。請以相同使用者檢查 Ruby、CocoaPods、套件管理工具與專案鎖定檔;首次安裝提示應先在互動式環境中確認。

提交第一個建置任務前,請在 Runner 執行環境中完成三項檢查
檢查項目檢查指令或位置通過條件
工具鏈路徑xcode-select -p 與作業環境變數指向專案指定的 Xcode,且版本輸出符合預期
執行身分whoami、printf '%s\n' "$HOME"建置使用者、主目錄與鑰匙圈的擁有者一致
工作區與磁碟pwd、df -h工作區可寫入,且相依套件、暫存檔與封存檔有足夠空間

統一團隊用語

八個術語,釐清八個概念

分清機器、連線方式與任務排程,提交問題時就能準確說明卡在哪個環節。

實體節點
實際執行 macOS 與建置任務的 Mac mini 裝置;執行個體詳細資料中的連線資訊對應你租用的節點。
專用
整台機器僅分配給一位客戶,不會與其他客戶共用 CPU;團隊仍需自行管理任務並行。
非虛擬機
提供的是專用實體 Mac 的使用環境,而非從共用主機切分出的虛擬執行個體。
VNC
遠端檢視與操作 macOS 圖形介面的連線方式,適用於 Xcode、模擬器與互動式設定。
SSH
加密的命令列連線方式,可用來執行建置指令、管理程序,並透過相關工具傳輸檔案。
self-hosted runner
由團隊在自己的節點上註冊與管理的 CI 執行程式,負責從 CI 平台取得並執行任務。
Apple Silicon
Mac 使用的 Apple 晶片架構。本服務的兩種機型皆採用 M4;選擇相依套件與 Runner 安裝套件時,請確認支援 arm64。
Thunderbolt 5 串接
目錄中按台計費的連線加購項目,不會自動將多台機器的 CPU 或記憶體合併成單一機器,工作負載仍須自行編排。

保留紀錄,再調整環境

依錯誤所在環節恢復建置

先保存失敗指令、結束代碼與第一個有效錯誤,再一次只變更一個設定後重跑。不要同時切換 Xcode、刪除快取又重新註冊 Runner,否則無法判斷是哪一步解決問題。

簽署失敗:先檢查執行使用者與鑰匙圈

先區分「編譯失敗」與「簽署失敗」。只有在封存或簽署階段出錯時,才檢查簽署憑證、對應私鑰、佈建描述檔及其有效期限;這些資料需由團隊依專案需求設定。

whoami
security list-keychains -d user
security find-identity -v -p codesigning

若圖形介面可以簽署,但 CI 失敗,請檢查 Runner 是否由相同使用者啟動、目標鑰匙圈是否位於搜尋清單中,以及非互動式程序是否具備所需的存取權限。若需解鎖鑰匙圈,請透過 CI 的受保護密鑰注入憑證;請勿將密碼寫入指令碼、命令歷史紀錄或日誌。

匯入憑證後,也請確認佈建描述檔的團隊、App 識別碼與建置設定相符。提交工單時請保留已遮蔽敏感資訊的錯誤訊息,勿上傳私鑰、憑證密碼或完整簽署資料。

快取異常:先縮小範圍至單一專案再清除

先重新執行相同的提交並記錄 Xcode 版本。若只有某項相依套件解析失敗,先確認鎖定檔、套件版本與下載錯誤;網路問題不能靠反覆清除所有快取解決。

為專案設定獨立的 DerivedData 路徑,方便只重建該專案的產物。以下指令適用於已建立的獨立工作區;執行前請將變數替換為實際路徑與共用 scheme。

xcodebuild \
  -workspace "$WORKSPACE" \
  -scheme "$SCHEME" \
  -derivedDataPath "$PROJECT_DERIVED_DATA" \
  clean build

clean 會增加下次建置所需的工作量。多項作業請勿共用同一個可寫入的快取目錄;清除或搬移前,先停止正在使用該目錄的任務。

磁碟空間不足:先確認是快取、執行環境還是產物占用

先查看可用空間,再檢查 DerivedData、封存檔與模擬器資料的實際用量。請勿直接遞迴刪除整個使用者目錄,也不要在封存檔上傳期間清除產物。

df -h
du -sh "$HOME/Library/Developer/Xcode/DerivedData"
du -sh "$HOME/Library/Developer/Xcode/Archives"
du -sh "$HOME/Library/Developer/CoreSimulator"

停止相關作業後,清除不再使用的專案快取,在 Xcode 中移除不需要的執行環境,並依團隊保留規範處理已備份的歷史封存檔。專案、簽署資料與發佈產物必須分開備份。

若長期需要更多空間,可在下單設定中加購 +1TB SSD 或 +2TB SSD。增加儲存空間不等於增加記憶體;請先確認瓶頸來自磁碟,而非任務並行數。

Runner 離線:依序檢查連線、程序與授權

先透過 SSH 確認節點可連線,再檢查 Runner 程序與日誌。節點在線但 CI 平台顯示離線時,通常還需確認程序是否已結束、是否能連上 CI 控制器,以及權杖或節點授權是否已變更。

在前景啟動 Runner 進行一次測試,並保留第一筆連線錯誤;若前景執行正常,但關閉終端機後就中斷,表示需要依該 Runner 的說明設定常駐服務。服務的執行使用者必須與工具鏈、工作目錄及鑰匙圈設定一致。

重新啟動前,請確認沒有正在執行的封存或上傳任務,以免產物不完整。若平台顯示在線但作業仍在佇列中,請檢查標籤、分支權限與並行限制,不要反覆刪除並重新註冊 Runner。

若使用多組執行個體池,可為節點加上容易辨識的標籤,例如 macos-m4-build 與 macos-m4-release,讓發佈任務只派送至已設定相應簽署環境的節點。

先核對交易,再重新嘗試

逐筆核對付款紀錄與訂單

計費週期可選每日、每週、每月或每季,統一以美元(USD)結算。僅支援 USDT-TRC20,以及透過 Stripe 處理的 Visa / Mastercard / Amex;實際可用的付款閘道以後端回傳為準。

已轉出 USDT-TRC20,訂單仍待確認

逐項核對訂單付款頁面提供的網路、收款地址與金額。轉帳紀錄不代表訂單已確認;請同時查看鏈上交易狀態與控制台帳單狀態。

請勿為了催促確認而重複轉帳,也不要將其他訂單的付款資訊用於目前訂單。請保留訂單編號、交易雜湊、金額與轉出時間,並透過控制台工單提交;請勿提供錢包私鑰或助記詞。

若已離開付款頁面,請先返回同一筆訂單查看目前狀態,再決定是否繼續付款,避免同一項服務重複付款。

信用卡付款未完成:先確認驗證與發卡銀行結果

請確認卡片資料與帳單資訊正確、額度足夠,且已完成發卡銀行驗證。若跳轉頁面遭封鎖,請允許目前付款流程所需的頁面開啟,再核對訂單。

若看到拒絕訊息,請保存錯誤摘要並聯絡發卡銀行確認交易限制。請勿短時間內連續提交;若銀行顯示已扣款但訂單尚未確認,請先透過工單核對,不要立即再次付款。

提交工單時附上訂單編號、發生時間與已遮蔽敏感資訊的錯誤畫面即可。本網站不需要你的完整卡號、安全碼或銀行驗證碼。

續約前先確認執行個體、週期與到期時間

從控制台進入現有執行個體對應的訂閱或帳單,確認執行個體 ID、到期時間與應付週期後再付款。建立新訂單與續約現有執行個體是兩回事,請勿只憑機型名稱判斷。

續約是否完成,以帳單與執行個體狀態為準,請勿假設系統會自動續約。到期前請備份專案、快取設定與發佈產物;執行個體釋出後的磁碟清除,不能視為可還原的備份。

節點全年 365 天持續運作。若問題與服務可用性有關,請提交執行個體 ID、受影響時段及連線錯誤,以便查核;請勿將使用者自行停止程序與節點無法使用混為一談。

提供可重現問題的資訊

將問題狀況提供給支援團隊

現有執行個體遇到問題,請從控制台提交工單,附上執行個體 ID、發生時間與時區、失敗步驟、預期結果及已遮蔽敏感資訊的日誌。大量開機或 Runner 池規劃,請透過聯絡頁整理需求,或寄信至 support@vpsmerge.com。

請勿傳送密碼、註冊權杖、私鑰或完整付款資料。保留第一筆有效錯誤,比提供整頁重複日誌更有助於排查。