先連線,再建置

從第一條 SSH
到第一次 archive

適合剛取得節點的開發者:先確認連線與工具鏈,再接入工作流程。本文命令僅供操作參考,不代表您的節點即時狀態。

已有節點請從第 1 步開始;憑證、到期時間與實際可用狀態,請以控制台即時顯示為準。

01 / 連線

先確認連線的是您的獨享實體節點

在控制台開啟對應的執行個體,核對節點、IP、SSH 連接埠與使用者名稱。請勿從舊工單複製憑證,也不要將登入密碼寫入儲存庫。

  1. 01

    核對執行個體資訊

    前往控制台的執行個體詳細資料,記下 IP、連接埠與目前的憑證。下文以 NODE_IP、SSH_PORT 與 NODE_USER 代表這些值;執行前請在本機終端機中設定變數,不要直接將變數名稱當成位址使用。

  2. 02

    驗證主機指紋

    首次連線時,系統會詢問是否信任此主機。請先將畫面顯示的指紋與可信管道提供的資訊核對,再確認;若無法核對,請先提交工單。不要使用停用主機驗證的參數略過提示。

  3. 03

    變更密碼並設定公鑰

    首次登入後,執行 passwd 變更目前使用者的密碼。公鑰可以傳到節點,私鑰則務必留在本機。保留目前的連線,並在第二個終端機確認公鑰登入成功後,再調整驗證方式。

將連線資訊存成別名

在本機的 ~/.ssh/config 加入以下設定,並將三個大寫欄位替換成執行個體詳細資料中的實際值。IdentityFile 請指向本機已有的私鑰檔案;如果尚未建立金鑰,可先執行右側的產生指令。

Host armshell-dev
  HostName NODE_IP
  User NODE_USER
  Port SSH_PORT
  IdentityFile ~/.ssh/armshell_ed25519
  IdentitiesOnly yes
  ServerAliveInterval 30
  ServerAliveCountMax 3

儲存後,使用 ssh armshell-dev 連線。若主機指紋有所變更,請先確認執行個體是否重新交付,不要直接刪除記錄後繼續登入。

上傳公鑰,不要上傳私鑰

以下公鑰寫入指令請在本機執行,並確認已設定別名且可使用密碼登入。請為金鑰設定密碼,並在本機安全備份。

ssh-keygen -t ed25519 -f ~/.ssh/armshell_ed25519
cat ~/.ssh/armshell_ed25519.pub | ssh armshell-dev \
'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys'
ssh -o PreferredAuthentications=publickey armshell-dev

登入後執行 whoami、sw_vers 與 df -h,確認使用者、系統版本與可用磁碟空間。若權限不符預期,請先處理權限問題,再安裝開發工具。

02 / 工具鏈

先完成互動式建置,再交由 CI 執行

確認已安裝目標版本的 Xcode,並完成首次啟動設定。以下示範指令與輸出格式;版本、SDK 與憑證名稱請以您的節點和專案為準,不代表預先安裝項目。

dev@armshell-tokyo
$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
$ xcode-select -p
/Applications/Xcode.app/Contents/Developer

$ sudo xcodebuild -runFirstLaunch
$ xcodebuild -showsdks
iOS SDKs:
    iOS 18.0                       -sdk iphoneos18.0
iOS Simulator SDKs:
    Simulator - iOS 18.0           -sdk iphonesimulator18.0

$ bundle exec fastlane match development --readonly
[09:12:01]: Successfully decrypted certificates repo
[09:12:03]: Installing certificate...
[09:12:05]: Installing provisioning profile...
[09:12:06]: All required keys, certificates and provisioning profiles are installed

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

版本選擇會影響整個節點

xcode-select 會變更預設開發者目錄,影響同一台機器上的其他工作。若要並行使用多個版本,建議在單次工作中設定 DEVELOPER_DIR,並在記錄開頭輸出 xcodebuild -version,避免交接後誤用工具鏈。

確保目前工作階段可解鎖簽章金鑰

範例假設專案已設定 fastlane、Gemfile,並具備憑證儲存庫的存取權限。請先以唯讀模式同步現有憑證;建置使用者必須能讀取並解鎖自己的鑰匙圈。若簽章失敗,請先檢查權限與描述檔,不要反覆建立新憑證。

archive 不代表已完成發布

先確認工作區與 scheme 名稱,再檢查 archive 產物。匯出安裝套件還需要符合發佈方式的匯出設定。首次建置成功後,請記錄 Xcode 版本、依賴鎖定檔與完整指令,再移入工作流程。

03 / 圖形介面

需要操作介面時,再開啟桌面工作階段

命令列適合傳輸、建置與檢查記錄。初次設定工具、查看鑰匙圈提示或除錯介面時,再使用 macOS 圖形介面。登入後可在執行個體詳細資料中找到桌面連線入口。

啟用與權限

透過執行個體提供的桌面入口登入系統,並在「系統設定 → 一般 → 共享」中確認「螢幕共享」。僅允許指定使用者存取,請勿開放所有使用者。若螢幕共享與遠端管理互斥,請先確認目前設定,不要同時修改兩者。

首次無法進入桌面時,請透過控制台提交工單申請檢查。若不熟悉系統遠端存取服務,請勿一次修改多項設定。

登入控制台提交工單

用戶端與連線方式

若本機使用 macOS,可使用內建的「螢幕共享」用戶端;其他系統可使用相容 VNC 協定且支援安全連線的用戶端。請優先採用執行個體提供的安全存取方式,不要將桌面服務直接暴露於不受信任的網路。

確認節點上的 VNC 服務正在本機 5900 連接埠監聽後,可使用下方 SSH 通道,將用戶端連線至本機 127.0.0.1:5901。

ssh -N -L 5901:127.0.0.1:5900 armshell-dev

先降低畫面負載

首次連線建議從 1440 × 900 解析度和單一螢幕開始,並關閉不必要的動畫。頻寬有限時,先降低畫質或影格率;提高解析度不會加快建置,只會增加畫面傳輸量。

頻寬使用量會因編碼方式與畫面變化而異,無法為所有工作提供固定頻寬保證。連線卡頓時,請先暫停大型檔案上傳,再比較 SSH 是否也有延遲。

桌面操作與命令列共用同一台獨享實體機。
04 / 持續整合

讓 Runner 使用剛才驗證過的環境

請使用專用的 macOS 建置使用者註冊 Runner。先以單一工作並行度驗證依賴、簽章與產物回傳,再依記憶體和磁碟用量提高並行度;不要讓持有發布憑證的執行器處理不受信任的合併請求。

GitLab:註冊 shell executor

先安裝適用於 Apple Silicon 的 GitLab Runner。以下指令假設執行檔已位於目前使用者的 PATH 中,且已在 CI 管理介面建立 Runner,取得伺服器位址與驗證權杖。

read -r CI_SERVER_URL
read -rs RUNNER_TOKEN
gitlab-runner register --non-interactive \
  --url "$CI_SERVER_URL" \
  --token "$RUNNER_TOKEN" \
  --executor shell
unset RUNNER_TOKEN
gitlab-runner verify
gitlab-runner install
gitlab-runner start
gitlab-runner status

在 CI 管理介面設定明確標籤,例如 macos-arm64 以及專案要求的 Xcode 版本。工作標籤必須與 Runner 相符。先執行 whoami、xcodebuild -version,再執行正式建置。

GitHub Actions:註冊自架節點

在儲存庫或組織的 Runner 設定中,取得 macOS ARM64 安裝套件與該次註冊指令。先完成下載、驗證與解壓縮,再進入解壓縮目錄執行以下指令;兩個變數可在設定頁取得。

read -r REPOSITORY_URL
read -rs RUNNER_TOKEN
./config.sh --url "$REPOSITORY_URL" \
  --token "$RUNNER_TOKEN" \
  --labels macos-arm64 --unattended
unset RUNNER_TOKEN
./svc.sh install
./svc.sh start
./svc.sh status

工作流程使用 runs-on: [self-hosted, macOS, ARM64];如有自訂標籤,也請一併指定。註冊權杖不等於 Runner 服務已啟動;設定完成後,仍須檢查服務狀態並執行實際測試工作。

launchd 常駐服務:安裝後檢查實際載入項目

上方的服務安裝指令會依各 Runner 的實作建立 macOS 服務設定。請優先使用其提供的管理指令,不要另外手動建立第二份服務,重複啟動同一個 Runner。

使用者層級的 LaunchAgent 通常會在該使用者登入時載入。若要在重新啟動後無人值守執行,請先確認 Runner 支援的服務方式、登入狀態與鑰匙圈政策;目前在線不代表重新啟動後一定可用。

ls "$HOME/Library/LaunchAgents"
launchctl print "gui/$(id -u)"
gitlab-runner status
./svc.sh status

請在實際的 Runner 目錄中執行適用的檢查指令。CI 非互動環境可能沒有終端機中的 PATH;請將 Homebrew、Ruby 與 Xcode 路徑寫入版本控管的建置指令碼,並避免將權杖輸出到記錄中。

05 / 資料

只同步變更,備份另存於節點之外

原始碼建議從儲存庫複製。大型目錄、建置產物與不適合放進儲存庫的檔案,可透過 SSH 使用 rsync 增量同步。租用節點是工作環境,不應作為唯一的資料副本。

先預覽,再上傳

先檢查兩端的 rsync --version。以下使用常見的基本選項:保留結尾的斜線代表同步目錄內容,排除項目可依專案調整。請先查看預覽結果,再移除 -n。

rsync -avzn --exclude '.git/' --exclude 'build/' \
  ./project/ armshell-dev:~/work/project/

rsync -avz --exclude '.git/' --exclude 'build/' \
  ./project/ armshell-dev:~/work/project/

rsync -avz armshell-dev:~/build/ ./artifacts/

未經確認請勿加入 --delete,否則會刪除目標端多餘的檔案。金鑰、憑證與含有敏感資料的記錄應另行管理存取權限,不要放在整個工作目錄中公開傳送。

多節點並聯不等於網路加速

Thunderbolt 5 並聯適用於需要多台節點協同處理大型檔案的情境。它無法取代本機網路至節點的網際網路連線,也不會自動加速所有 rsync 工作。下單前請說明參與節點、資料規模與工作流程,確認適用的連線方式。

需要更多工作空間時,可評估加購 +1TB SSD 或 +2TB SSD。擴充磁碟不等於備份:程式碼、產物與憑證仍應保留節點以外的副本。

每次發布後請確認回傳的檔案可以讀取;重要產物應記錄校驗碼。到期前至少進行一次獨立還原測試,而不只是確認同步指令執行成功。

06 / 帳戶與週期

將到期檢查列入發布前清單

在控制台查看訂單、執行個體到期時間、帳單與續租操作。節點全年 365 天正常運作;您仍須依控制台記錄管理租用週期與訂單狀態。

確認週期與時間

服務提供按日、週、月、季計費。請核對控制台顯示的起訖時間與時區,並為建置、回傳和備份預留時間。不要等長時間工作執行到一半才處理續租,也不要假設系統一定會自動扣款。

請以訂單明細與到期時間為核對依據。

先確認變更內容,再進行移轉

升級機型、增加儲存空間或調整週期前,請先查看目前訂單可用的操作、報價與生效方式。不要假設所有變更都能立即在原執行個體上完成。若涉及環境移轉,請先保存依賴清單、簽章設定與資料副本。

未明確的換算與生效規則,請透過工單確認。

確認付款與入帳狀態

僅支援 USDT-TRC20 與 Visa / Mastercard / Amex(透過 Stripe),一律以美元(USD)結算;實際可用的付款閘道以後端介面回傳為準。鏈上付款請核對網路、金額與收款資訊;卡片付款請依帳單頁面完成驗證。

狀態尚未更新時,請附上訂單編號與交易記錄提交工單。
發生問題時,分層排查

先判斷是連線問題,還是工作問題

提交問題時,請附上訂單編號、節點、發生時間與時區、執行指令及完整錯誤內容。您可以提供截圖或已遮蔽敏感資訊的終端輸出,但請勿傳送密碼、私鑰、權杖或完整付款卡資料。

SSH 逾時,該從哪裡開始查?
  1. 回到執行個體詳細資料,核對 IP、連接埠、訂單與運作狀態,確認不是連到舊位址。
  2. 在本機執行 ssh -vvv armshell-dev,區分逾時、連線遭拒與驗證失敗;這三種是不同問題。
  3. 檢查本機網路與對外連線規則,並改用另一個可信網路測試。ICMP 無回應本身不能證明 SSH 服務無法使用。
  4. 若卡在驗證階段,請檢查使用者名稱、私鑰權限與公鑰歸屬;若持續逾時,請附上已遮蔽敏感資訊的記錄提交工單,不要不斷重設密碼。
Xcode 下載或依賴套件拉取很慢,如何判斷原因?
  1. 先使用 df -h 檢查磁碟空間,確認足以容納安裝套件、解壓縮檔案及舊版本。
  2. 分別確認是 Xcode 安裝套件傳輸、依賴儲存庫下載,還是首次編譯;編譯記錄停頓不一定是下載造成的。
  3. 請使用可信來源提供的完整安裝套件,並核對檔案完整性。傳輸大型檔案時,避免與備份工作同時搶用頻寬。
  4. 記錄來源類型、檔案大小、開始時間與錯誤內容;不要傳送含有存取權杖的下載網址。若需檢查節點網路,請將這些資訊提供給工單支援。
遠端桌面已連線,畫面卻全黑?
  1. 先確認 SSH 是否正常,判斷是整台節點無法連線,還是只有桌面工作階段異常。
  2. 檢查連線使用者是否具備螢幕共享權限,以及是否已有有效的圖形工作階段;降低解析度後重新連線。
  3. 若使用 SSH 通道,請確認通道終端機仍在執行,而且用戶端連線至本機映射的連接埠,而非節點上的其他連接埠。
  4. 請勿直接強制重新啟動正在建置的節點。先保存可取得的記錄,並說明是否看得到登入畫面,再提交工單檢查。
Runner 離線,或在線卻不執行工作?
  1. 先檢查服務狀態與程序記錄,再查看 CI 管理介面。可以透過 SSH 登入節點,不代表 Runner 服務正在執行。
  2. 在線卻不執行工作時,請檢查專案權限、Runner 標籤、工作流程選擇條件與受保護分支設定。
  3. 重新啟動後離線時,請檢查 launchd 載入網域與建置使用者的登入狀態;在終端機手動啟動不能取代常駐服務。
  4. 工作啟動後失敗時,請輸出使用者、PATH、Xcode 版本與工作目錄,並檢查鑰匙圈及目錄權限。不要一開始就反覆註銷並重建 Runner。

SSH 已連線,問題仍未解決?

提供錯誤訊息,也請附上相關背景

產品選擇與購買前問題可透過電子郵件聯絡;已有訂單的技術與帳務問題,請登入控制台提交工單,以便關聯執行個體與處理記錄。