從憑證到工作環境

三種方式連上 M4

命令列用 SSH、互動操作用圖形桌面、自動建置用 CI runner。三種入口都連到同一台獨享實體節點,不是三個不同環境。

已租用的使用者:在主控台開啟訂單所屬的執行個體詳細資料,查看主機位址、SSH 連接埠、使用者名稱與交付說明。本文中的主機變數都必須替換成該執行個體的實際值。

SSH驗證主機、同步檔案、執行建置指令
圖形桌面操作 Xcode、模擬器與 macOS 介面
CI runner將專案工作排程到自己的實體節點
先建立可驗證的連線

SSH:產生金鑰,再設定節點別名

先連上命令列,再設定桌面與建置流程。SSH 也是檢查節點是否可連線、找出驗證問題最快的方式。

  1. 01

    在本機產生金鑰

    請在自己的電腦上執行,不是在雲端節點上。為金鑰設定密碼;若已有專用金鑰,可重複使用,但不要覆寫仍在使用的檔案。私密金鑰必須留在本機,提供給節點的只有以 .pub 結尾的公開金鑰。

    ssh-keygen -t ed25519 -f ~/.ssh/xcnode_ed25519 -C "xcnode-workstation"
    ssh-add ~/.ssh/xcnode_ed25519

    如果 ssh-add 提示未連上驗證代理程式,請先確認本機的 SSH agent 已啟動。金鑰密碼和遠端使用者密碼並不相同。

  2. 02

    安裝公開金鑰並驗證主機

    依照執行個體說明設定三個變數。只有交付說明允許首次使用密碼驗證時,才使用 ssh-copy-id;若已登記公開金鑰,直接測試登入。首次連線時請核對主機指紋,不要只因看到確認提示就接受未知主機。

    read -r -p "Host: " NODE_HOST
    read -r -p "SSH port: " NODE_PORT
    read -r -p "User: " NODE_USER
    ssh-copy-id -i ~/.ssh/xcnode_ed25519.pub -p "$NODE_PORT" "$NODE_USER@$NODE_HOST"
    ssh -i ~/.ssh/xcnode_ed25519 -p "$NODE_PORT" "$NODE_USER@$NODE_HOST"

    以上變數輸入指令適用於 Bash。macOS 使用 zsh 時,可先執行 bash 再繼續。若首次安裝公開金鑰受阻,請使用主控台提供的憑證管理方式或提交工單,不要反覆嘗試密碼。

  3. 03

    儲存別名並檢查環境

    在本機的 ~/.ssh/config 中設定別名。請將下方尖括號中的欄位替換成執行個體的值,並移除尖括號。Windows OpenSSH 也會讀取使用者目錄下的 .ssh/config。

    Host xcnode-work
      HostName <INSTANCE_HOST>
      Port <SSH_PORT>
      User <INSTANCE_USER>
      IdentityFile ~/.ssh/xcnode_ed25519
      IdentitiesOnly yes
      ServerAliveInterval 30
      ServerAliveCountMax 3
    ssh xcnode-work
    uname -m
    sysctl -n machdep.cpu.brand_string
    xcode-select -p
    xcodebuild -version

    uname -m 應回傳 arm64。晶片名稱應與訂單中的機型一致;Xcode 版本以節點實際安裝的版本為準。保持連線參數不代表工作會自動續跑,長時間建置應交由 runner 或持續工作階段管理工具處理。

三種用戶端系統,各有不同注意事項

先確認本機可以執行 ssh -V。缺少某個輔助指令,不代表節點不支援 SSH。

本機用戶端準備與公開金鑰安裝方式
本機系統SSH 用戶端公開金鑰安裝注意事項
macOS終端機內建 OpenSSHssh-copy-id 通常需另外安裝,也可依照交付說明登記公開金鑰。預設 shell 通常是 zsh;不要直接照搬 Bash 專用的輸入語法。
Windows在 PowerShell 中使用 OpenSSH Client可在 WSL 中使用 ssh-copy-id,或在主控台登記公開金鑰。PowerShell 和 WSL 的使用者目錄與金鑰檔案各自獨立。
Linux發行版提供的 OpenSSH 用戶端套件通常會提供 ssh-copy-id;若沒有,請先安裝用戶端工具。私密金鑰權限設為 600,~/.ssh 目錄權限設為 700。
需要操作介面時

圖形桌面:優先使用 SSH 通道

SSH 連線正常後,再檢查螢幕共享服務與圖形工作階段。不要把「連得上連接埠」當成「桌面已準備就緒」。

macOS 螢幕共享

本機 Mac 可使用內建的「螢幕共享」用戶端。VNC 常用的服務連接埠為 TCP 5900;實際連接埠、驗證方式及服務是否已啟用,請以執行個體交付說明為準。

確認遠端使用 5900 後,在本機終端機建立通道,並保持終端機開啟。這裡使用本機連接埠 15900,以免與本機服務衝突。

ssh -N -L 127.0.0.1:15900:127.0.0.1:5900 \
  -o ExitOnForwardFailure=yes xcnode-work

接著在另一個終端機開啟用戶端:

open "vnc://127.0.0.1:15900"
通道只監聽本機回送位址

Windows / Linux VNC 用戶端

請選擇支援執行個體驗證方式的 VNC 用戶端,例如 TigerVNC。先建立相同的 SSH 通道,再將用戶端目標設為 127.0.0.1,連接埠設為 15900。

不同用戶端指定連接埠的方式不一:有些有獨立的連接埠欄位,有些則用雙冒號表示完整連接埠。請依照用戶端說明輸入,不要把連接埠誤當成顯示器編號。

macOS 螢幕共享的驗證方式不一定與一般 VNC 相容。驗證失敗時,請先確認用戶端功能是否相符,並查閱交付說明;不要為了配合用戶端而任意降低節點的存取防護。

桌面憑證與 SSH 金鑰分開管理

先降低畫質,讓操作更順暢

首次連線時先選擇自動或較低的畫質,只使用一台顯示器,並避免同時傳輸大型檔案與全螢幕動態畫面。文字清晰、點擊穩定後,再逐步提高解析度與色彩品質。SSH 檔案傳輸速度快,不代表圖形桌面的往返延遲也低。

畫面全黑時,請依序檢查:通道是否仍在執行、目標連接埠是否正確、螢幕共享是否已啟用,以及遠端是否有可用的圖形工作階段。若遇到工作階段衝突,請先協調團隊使用時間,不要直接強制登出正在建置的使用者。

讓工作自動送達節點

CI 整合:註冊一次,驗證自動啟動

runner 在雲端 Mac 上執行,不是在你的本機電腦上。先用互動式工作驗證工具鏈,再將 runner 設定為服務。

GitHub Actions self-hosted runner

前往專案或組織的 runner 設定,選擇 macOS ARM64。依照頁面目前提供的下載與驗證指令準備程式;註冊 URL 與短效權杖都可從該設定頁取得。

cd ~/actions-runner
read -r -p "Registration URL: " RUNNER_URL
read -r -s -p "Registration token: " RUNNER_TOKEN
printf '\n'
./config.sh --url "$RUNNER_URL" --token "$RUNNER_TOKEN" \
  --name xcnode-work --labels xcnode,arm64
unset RUNNER_TOKEN
./run.sh

以上輸入指令請在 Bash 中執行。提交測試工作,確認 runner 已上線並完成建置後,停止前景程序並安裝服務:

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

工作流程請指定明確標籤,避免派送到不同架構的機器:

runs-on: [self-hosted, macOS, ARM64, xcnode]
steps:
  - run: xcodebuild -version

註冊權杖不是可長期使用的專案金鑰。不要將它寫入儲存庫、建置輸出或工單附件。

GitLab Runner

在專案或群組中建立 runner,依照目前平台的說明取得 runner 驗證權杖。安裝 macOS ARM64 版本後,請在目標執行使用者的圖形工作階段終端機中註冊;不要以 root 身分執行專案建置。

gitlab-runner register

依提示輸入執行個體 URL 與驗證權杖,並選擇 shell 執行器。為 runner 設定 xcnode 與 arm64 標籤,並限制僅供可信任的專案使用。

gitlab-runner install
gitlab-runner start
gitlab-runner status

先用最精簡的測試工作檢查環境,再加入簽署與封存步驟:

build-check:
  tags: [xcnode, arm64]
  script:
    - uname -m
    - xcode-select -p
    - xcodebuild -version

Shell 執行器可以存取執行使用者的檔案。使用獨享機器,不代表同一個帳戶下的不可信工作也會自動隔離。

分別驗證自動啟動與互動功能

macOS 上的使用者層級服務通常由 launchd 管理,且可能依賴使用者工作階段。安裝服務後,請檢查程序、記錄檔與佇列狀態;並在團隊允許的時段測試重新啟動後能否恢復。若工作需要模擬器或圖形操作,也要確認登入工作階段符合需求,不能只看 runner 顯示為上線。

先從單一工作開始,記錄專案實際的記憶體使用峰值,再增加平行工作數。快取應依專案和 Xcode 版本區分,建置產物則另外封存。若使用系統鑰匙圈中的簽署資料,還要另外確認服務使用者的存取權限;不要以為終端機建置成功,就代表背景建置也一定成功。

依實際網路選擇節點位置

四個節點,先測試常用辦公網路

新加坡、東京、首爾、香港皆提供兩種機型。供應情況以主控台即時顯示為準;地理距離只是參考,電信業者路由與團隊工作時段也同樣重要。

新加坡

東南亞團隊可優先評估。請使用實際辦公網路測試桌面操作,再檢查專案拉取與產物上傳的路徑。

sg · UTC+8

東京

日本與東亞團隊可優先評估。時區接近不代表網路一定更快,仍應比較尖峰與離峰時段的連線表現。

jp · UTC+9

首爾

韓國與東北亞團隊可優先評估。若 runner 長時間執行,應特別留意連線程式碼儲存庫與相依套件來源是否穩定。

kr · UTC+9

香港

華南與東南亞團隊可優先評估。跨時區共用桌面時,請事先約定圖形工作階段的使用與登出時間。

hk · UTC+8

自測記錄三項:往返時間、波動、實際工作

請對已分配執行個體的實際主機位址進行測試,不要用網站網域測速來代替節點測試。以下指令請在已設定節點變數的本機 Bash 終端機中執行。

ping -c 20 "$NODE_HOST"
ssh -p "$NODE_PORT" "$NODE_USER@$NODE_HOST" 'uptime'

Windows PowerShell 請使用 ping -n 20 <INSTANCE_HOST>。記錄封包遺失率與往返時間範圍,再實際執行一次 Git 拉取或建置產物傳輸。ICMP 可能遭網路政策過濾:若 ping 沒有回應,仍須另外測試實際 SSH 連接埠。

請在團隊常用的網路與工作時段重複測試。本文不保證固定延遲;測試結果僅反映測試當下的網路路徑狀況。尚未租用時,可透過支援信箱詢問測試方式,請勿使用猜測的節點位址。

把相關概念整理在同一張表

八個連線術語,一次說明白

先釐清資源範圍、連線協定與工作排程,排查問題時才不會混淆不同層級。

實體節點
實際執行 macOS 的 Apple Silicon 電腦;訂單分配的是整台裝置,不是共用主機中的虛擬機器。
獨享
租用期間,該實體機器只分配給一位租戶;CPU、GPU 與統一記憶體不會與其他租戶共用。
VNC
傳輸遠端螢幕畫面與鍵盤、滑鼠輸入的協定;服務狀態、連接埠與驗證方式都需要個別確認。
螢幕共享
macOS 提供的螢幕共享功能與用戶端,可用來連線至遠端圖形工作階段,不能取代 SSH 命令列連線。
SSH 金鑰
由公開金鑰和私密金鑰組成的身分憑證;公開金鑰可登記至節點,私密金鑰應留在受保護的用戶端。
self-hosted runner
在自有節點上執行 CI 工作的代理程式,使用節點本身的工具鏈、權限與快取。
Thunderbolt 5 並聯
可為個別節點選購的連線項目,不會自動將多台裝置合併成單一共用記憶體系統,軟體仍須支援分散式工作。
統一記憶體
Apple Silicon 的 CPU 與 GPU 使用同一記憶體池,因此建置、模擬器與模型工作都須一併估算記憶體用量。
連得上,也要做好防護

確認金鑰可用,再強化存取控管

在唯一的連線尚未驗證前,請勿變更驗證設定。保留目前的工作階段,並在另一個終端機確認新金鑰可以成功登入後,再調整節點政策。

停用密碼驗證

請依照目前 macOS 版本檢查 sshd 設定及其包含的檔案。目標是啟用公開金鑰驗證,並停用密碼與鍵盤互動驗證;不要只修改一個可能被其他檔案覆寫的欄位。

PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no

套用設定前,請使用 sudo /usr/sbin/sshd -t 檢查語法,並依照執行個體說明套用設定。

只開放必要的連接埠

SSH 請使用交付說明中的連接埠。圖形桌面優先透過本機通道存取,不要將 5900 直接暴露於公用網路。臨時測試服務使用完畢後應立即關閉,並一併檢查監聽位址與防火牆規則。

lsof -nP -iTCP -sTCP:LISTEN

runner 通常會主動連線至 CI 服務,因此不要因此額外開放管理用的入站連接埠。

依人員與工作管理憑證

每位成員都應使用獨立的公開金鑰,人員離開時請移除對應的授權。runner 只接受可信任儲存庫的工作;專案金鑰應存放在 CI 平台的受保護變數中,不要寫入指令碼或專案檔案。

主機指紋變更時,請先確認執行個體是否重新安裝,不要直接刪除本機記錄後繼續連線。

工單只附上已去識別的記錄檔、訂單編號與失敗步驟,切勿提供私密金鑰、密碼或註冊權杖。

把本機步驟,化為可重複使用的遠端工作環境

先選擇機型與租期,再取得執行個體憑證。從 SSH 驗證開始,逐步連接圖形桌面與建置佇列;若已租用的執行個體遇到問題,請在主控台提交已去識別的排查紀錄。