まず接続、次にビルド

最初のSSHから
初めてのarchiveまで

ノードを手に入れたばかりの開発者向けに、接続とツールチェーンを確認してからパイプラインに連携する手順を紹介します。コマンドは操作例であり、実際のノード状態を示すものではありません。

既存のノードは手順1から始めてください。認証情報、有効期限、実際の稼働状況はコンソールの最新表示をご確認ください。

01 / 接続

接続先の専有物理ノードを確認

コンソールで該当インスタンスを開き、ノード、IPアドレス、SSHポート、ユーザー名を確認します。古いサポートチケットから認証情報をコピーしたり、ログインパスワードをリポジトリに保存したりしないでください。

  1. 01

    インスタンス情報を確認

    コンソールでインスタンスの詳細を開き、IPアドレス、ポート、現在の認証情報を控えます。以下では、これらの値を NODE_IP、SSH_PORT 、 NODE_USER と表記します。実行前にローカル端末で値を設定し、変数名をそのままアドレスとして入力しないでください。

  2. 02

    ホストフィンガープリントを確認

    初回接続時に、ホストを信頼するか確認されます。表示されたフィンガープリントを信頼できる方法で入手した情報と照合してから承認してください。照合できない場合は、先にサポートチケットを送信してください。ホスト検証を無効にするオプションで警告を回避しないでください。

  3. 03

    パスワード変更と公開鍵設定

    初回ログイン後、 passwd を実行して現在のユーザーのパスワードを変更します。ノードに転送するのは公開鍵だけで、秘密鍵は必ずローカルに保管してください。現在の接続を維持したまま、別の端末で公開鍵ログインを確認してから認証方式を変更します。

接続情報をエイリアスにまとめる

ローカルの ~/.ssh/config に以下の設定を追加し、大文字の3項目をインスタンス詳細に表示された実際の値に置き換えます。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の切り替えはノード単位の設定

xcode-select はデフォルトの開発者ディレクトリを変更するため、同じマシン上のほかのタスクにも影響します。複数のバージョンを並行して使う場合は、タスクごとに DEVELOPER_DIRを設定し、ログの冒頭に xcodebuild -versionの出力を記録してください。引き継ぎ後に誤ったツールチェーンを使うのを防げます。

署名用キーチェーンを現在のセッションで解除

この例では、プロジェクトにfastlane、Gemfile、証明書リポジトリへのアクセス権が設定済みであることを前提としています。まず読み取り専用モードで既存の証明書を同期します。ビルドユーザーが自分のキーチェーンを読み取り、ロック解除できることを確認してください。署名に失敗した場合は、証明書を何度も作り直さず、権限とプロビジョニングプロファイルを確認します。

archiveの作成はリリース完了ではありません

まずワークスペース名とscheme名を確認し、archiveの成果物をチェックします。インストール用パッケージの書き出しには、配布方法に合った書き出し設定も必要です。初回ビルドが成功したら、Xcodeのバージョン、依存関係ロックファイル、実行したコマンド一式を記録してからパイプラインに移行します。

03 / グラフィカルインターフェース

画面操作が必要なときだけデスクトップに接続

転送、ビルド、ログ確認にはコマンドラインが便利です。ツールの初期設定、キーチェーンの確認、画面操作のデバッグが必要なときはmacOSのグラフィカルインターフェースを使います。デスクトップへの接続方法はログイン後、インスタンス詳細に表示されます。

有効化とアクセス権

インスタンスで利用できるデスクトップ接続からシステムに入り、「システム設定 → 一般 → 共有」で「画面共有」を確認します。アクセスを許可するユーザーを指定し、すべてのユーザーに公開しないでください。画面共有とリモート管理を同時に有効にできない場合は、両方を変更せず、現在の設定を確認してください。

初回にデスクトップへ接続できない場合は、コンソールからサポートチケットを送信して確認を依頼してください。内容をよく理解しないまま、システムのリモートアクセスサービスを一括変更しないでください。

コンソールからサポートチケットを送信

クライアントと接続方法

ローカル環境がmacOSなら、標準の「画面共有」アプリを利用できます。ほかのOSでは、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を登録します。まず並列実行数を1にして、依存関係、署名、成果物の転送を確認します。その後、メモリとディスクの使用状況に応じて並列数を増やしてください。リリース認証情報を持つ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を登録

リポジトリまたは組織のRunner設定から、macOS ARM64用パッケージと今回の登録コマンドを取得します。ダウンロード、検証、展開を済ませてから展開先ディレクトリに移動し、以下を実行してください。2つの変数は設定画面で確認できます。

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が提供する管理コマンドを優先し、同じ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のノード接続はインターネットを高速化するものではありません

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. 配布元の種類、ファイルサイズ、開始時刻、エラーを記録してください。アクセストークンを含むダウンロードURLは送信しないでください。ノードのネットワーク確認が必要な場合は、これらの情報をサポートチケットに添えてください。
リモートデスクトップに接続できても、画面が真っ黒?
  1. まずSSHが正常か確認し、ノード全体に接続できないのか、デスクトップセッションだけの問題なのかを切り分けます。
  2. 接続ユーザーに画面共有の権限があるか、有効なグラフィカルセッションが存在するか確認してください。解像度を下げてから再接続します。
  3. SSHトンネルを使っている場合は、トンネルを実行している端末が動作中であることを確認してください。クライアントの接続先はローカルの転送先ポートです。ノード上の別のポートに接続しないでください。
  4. ビルド中のノードを強制的に再起動しないでください。取得可能なログを保存し、ログイン画面が表示されるかを添えてサポートチケットを送信してください。
Runnerが切断される、またはオンラインなのにジョブを実行しない?
  1. まずサービスの状態とプロセスログを確認し、次にCI管理画面を確認します。ノードにSSH接続できても、Runnerサービスが稼働中とは限りません。
  2. オンラインなのにジョブを受け付けない場合は、プロジェクト権限、Runnerのタグ、ワークフローの条件、保護ブランチの設定を確認してください。
  3. 再起動後に切断される場合は、launchdの読み込み先とビルドユーザーのログイン状態を確認してください。端末から手動で起動するだけでは、常時稼働サービスの代わりになりません。
  4. ジョブ開始後に失敗する場合は、ユーザー、PATH、Xcodeのバージョン、作業ディレクトリを出力し、キーチェーンとディレクトリの権限を確認してください。Runnerの登録解除と再作成を繰り返すのは、最初に行う対処ではありません。

SSHで接続できても、問題が解決しない場合は?

エラーだけでなく、発生時の情報も添えてご連絡ください

製品選びや導入前のご相談はメールでお問い合わせください。既存注文の技術・請求に関するお問い合わせは、インスタンスと対応履歴を紐づけられるよう、コンソールからサポートチケットを送信してください。