1台の専有Mac · 2つの接続方法

SSHでビルド、
VNCでXcode

コマンドラインとGUIから、同じ物理Mac miniに接続できます。runnerでタスクを継続実行し、Xcodeやシミュレータ、証明書の設定を確認するときだけ画面共有を開きます。

Apple Silicon M4 · 2つの構成 · $20/日から。1台を1人のお客様に専有で割り当てます。仮想マシンではありません。

チーム専用の作業レーン

タスクは継続実行、デスクトップは必要なときだけ

SSH自動化の接続方法
  1. プロジェクトを同期
  2. テストを実行
  3. 成果物をアーカイブ
VNC対話操作の接続方法
  1. Xcodeを開く
  2. シミュレータを確認
  3. 署名を確認

プロジェクト、ディスク、ツールチェーンを共有する1台のマシンです。個別に設定が必要な2台ではありません。デスクトップ操作もマシン全体のリソースを使用します。

役割を決めてから接続

自動化はコマンドライン、対話操作はデスクトップで

2つの方法は併用できます。接続方法は、誰かがPCの前にいるかではなく、タスクにGUIが必要かどうかで選びます。

SSH:繰り返し実行するタスクに

xcodebuildによるビルドとテスト、runnerの登録、ログの確認、scpやrsyncでのファイル同期に使います。ビルドログはテキストなので、デスクトップ画面を常時転送する必要はありません。

  • 依存関係のインストール、テスト、アーカイブをパイプラインに組み込み、手作業を減らします。
  • runnerのプロセス、作業ディレクトリ、空き容量、失敗ログを確認します。
  • サービスとしてrunnerを管理し、長時間のタスクを単一のSSHセッションに依存させないようにします。

利用例:PRチェック、nightlyビルド、一括パッケージ作成、成果物の同期。

VNC:画面を見ながら操作するタスクに

XcodeのGUI、シミュレータの操作、キーチェーンや証明書の設定に使います。接続にはmacOS標準の画面共有、または互換性のあるVNCクライアントを利用できます。

  • プロジェクトのターゲット、ビルド設定、署名設定を実際に確認します。
  • シミュレータでUIの問題を再現し、ランタイムとデバイスの種類を確認します。
  • 対話操作が必要な設定を行い、再現できる手順はスクリプトに反映します。

利用例:環境の初期設定、GUIでのトラブルシューティング、リリース前の手動確認。

初回接続

認証情報を確認し、2つの接続方法を個別にテスト

コンソールにログインし、該当インスタンスの詳細を開きます。アドレス、ユーザー名、ポート、認証方法には、インスタンスに表示された値を使います。SSHのポートをVNCのポートとして使わないでください。

  1. 01

    インスタンスの認証情報を確認

    インスタンスIDとノードを確認し、SSHとVNCそれぞれの接続情報を記録します。初回接続の前にインスタンスが利用可能か確認してください。コンソールに認証情報が表示されない場合は、注文情報を控えてコンソールのチケットから問い合わせ、アドレスやパスワードを推測して何度も試さないでください。

  2. 02

    コマンドライン接続を確認

    インスタンスに表示されたポートとユーザー名で接続します。初回にホストのフィンガープリントが表示されたら、接続先を確認してください。同じアドレスのフィンガープリントが突然変わった場合は接続を中止し、インスタンスが再割り当てされたか確認します。

    ssh -p "$SSH_PORT" "$MAC_USER@$MAC_HOST"
    sw_vers
    uname -m
    xcode-select -p
    df -h

    ローカルのターミナルで、コンソールに表示された実際の値を変数に設定します。接続後、macOS、アーキテクチャ、開発者ディレクトリ、ディスク容量を確認してください。

  3. 03

    画面共有を開く

    ローカルのmacOSで「画面共有」を開き、インスタンスに表示されたVNCアドレスとポートを入力します。ほかのOSでは互換性のあるクライアントを使用してください。インスタンスの認証方法でログインし、デスクトップが表示され、マウスを操作できることを確認してからXcodeを開きます。接続できない場合は、アドレス、ポート、認証情報、ローカルネットワークの制限を順に確認してください。

  4. 04

    アクセス権を適切に設定

    初回ログイン後、インスタンスでサポートされている方法で初期認証情報を変更します。チームメンバーごとにSSH鍵を管理し、パスワードをリポジトリに保存しないでください。runnerには最小権限の登録トークンを使用し、認証情報、証明書、秘密鍵は管理されたシークレット管理フローで保管します。まず最小限のビルドを実行してから、本番のパイプラインを有効にしてください。

5拠点 · ネットワークの目安

デスクトップ操作は往復遅延、ビルドはデータ経路を確認

VNCのクリック応答は往復遅延の影響を受けます。継続的なビルドでは、リポジトリ、依存関係の取得元、成果物の保存先がどこにあるかも重要です。以下は各ノードの参考値であり、現在地からの測定結果でも接続遅延の保証でもありません。

ノード、主な対象地域、往復遅延の目安。主な作業内容に合わせて接続先を選んでください
ノード 主な対象地域 往復遅延の目安 適した作業
シンガポール 東南アジア 20~50ms 東南アジアのチームによる対話型の開発。リポジトリと依存関係の取得経路も確認してください。
日本(東京) 東アジア 30~60ms 東アジアのメンバーによるXcode操作。runnerと成果物の保存先はできるだけ近くに配置してください。
韓国(ソウル) 北東アジア 30~50ms 北東アジアのチームによるシミュレータ確認、リモートでのトラブルシューティング、プロジェクト同期。
香港 華南・東南アジア 20~40ms 華南・東南アジアのメンバーによる画面共有や日常的なビルド操作。
米国東部 北米東部・西ヨーロッパ 25~35ms 対象地域のチームでの共同作業。コードと成果物の保存場所に合わせてノードを選んでください。

あくまで目安です。実際の値は接続元のネットワークによって異なります。

普段使うオフィスネットワークから、デスクトップ操作、依存関係の取得、成果物のアップロードをそれぞれ一度試してください。操作感、転送時間、ビルド時間を個別に記録し、すべてを「マシンの速さ」という1つの評価にまとめないようにしましょう。

まず画面の負荷を下げ、次に通信経路を確認

帯域幅を作業に合わせて使う

画面設定は必要十分なところから始めましょう。リモート画面の解像度が高く、変化が多いほど、エンコードと転送の負荷が増えます。デスクトップの設定でコンパイラの処理が減るわけではありませんが、操作時の待ち時間は短縮できます。

作業領域に合わせて解像度を設定

まずは1440 × 900または1600 × 900に設定し、エディタとログを無理なく読める状態にします。パネルをもっと表示する必要がある場合だけ解像度を上げ、高解像度の全画面転送を初期設定にしないでください。

一度に変更するのは1項目だけにし、文字の読みやすさとウィンドウ移動時の応答を比較します。

色深度と画質はクライアントで調整

クライアントに色深度、画質、圧縮の設定がある場合、帯域幅が限られているときは画質を下げてください。コードの文字は読み取れる状態を保ち、動画の再生や関係のないウィンドウの継続的な更新は避けましょう。

設定名はクライアントによって異なります。実際に利用できる項目に合わせてください。

操作しないときは画面共有を閉じる

大容量ファイルの同期中やネットワークが不安定なときは、SSHでテキストログを確認し、サービスとして設定したrunnerでビルドを実行します。長時間のタスクをGUIのターミナルウィンドウに依存させず、対話セッションを終了しても動作することを先に確認してください。

確認が終わったらデスクトップ接続を切断します。システムからログアウトしたり、シャットダウンしたりしないでください。

Xcodeリモート開発でできること・できないこと

デスクトップで確認し、パイプラインで再現

手動確認を追跡可能な環境変更にしましょう。Xcodeのバージョン、シミュレータのランタイム、署名設定を記録し、同じプロジェクトをコマンドラインで検証します。デスクトップで一度クリックしただけの設定を残さないでください。

ローカルの作業環境からクラウド上のXcodeにアクセスする様子を示す、リモート開発環境のコンピューターとデスクトップ機器
リモート開発環境のイメージ。画面共有で転送されるのはクラウド上のデスクトップです。ローカルの周辺機器が自動的にリモートマシンへ接続されることはありません。

クラウド上で実行できる作業

Xcodeプロジェクトの確認、ビルドとアーカイブ、シミュレータテスト、証明書の設定は、すべてリモートのmacOS環境で実行できます。SSHとVNCでは同じファイルを参照するため、runnerが使用中の作業ディレクトリを手動で変更しないよう注意してください。

実機デバッグは別途準備

ローカルに接続したiPhoneは、VNCを有効にしてもクラウド上のXcodeには表示されません。実機テストには、デバイスへの接続方法とテスト手順を別途用意する必要があります。まずクラウドで署名済みビルドを作成し、チームで既に運用している配布手順に沿ってテスト端末に渡す方法もあります。

プロジェクト、キャッシュ、成果物を分けて管理

小さなファイルは直接転送し、繰り返しの同期には差分転送

リポジトリはバージョン履歴を管理し、ファイル同期は作業用コピーや成果物の転送に使います。証明書、秘密鍵、トークンを通常のプロジェクトディレクトリに混ぜて転送しないでください。アップロード前に除外ルールと保存先を確認します。

scp:ビルド成果物を1回転送

特定のアーカイブやリソース一式を転送する場合に適しています。以下は生成済みの圧縮ファイルをリモートからダウンロードする例です。リモート側のディレクトリとファイル名は実際のパスに置き換えてください。

scp -P "$SSH_PORT" \
  "$MAC_USER@$MAC_HOST:build/ios-build.zip" \
  ./ios-build.zip

scpのポート指定は大文字の -Pです。転送後にファイルサイズを確認し、内容の一致を確かめる必要があれば、両端のチェックサムを比較してください。

rsync:作業用プロジェクトを同期

同じディレクトリを繰り返し同期する場合に適しています。まずは実行内容を確認し、保存先と除外項目をチェックしてください。末尾のスラッシュはディレクトリの中身を同期する指定です。

rsync -avn \
  -e "ssh -p $SSH_PORT" \
  --exclude '.git/' \
  --exclude 'DerivedData/' \
  ./project/ "$MAC_USER@$MAC_HOST:project/"

実行内容を確認したら、 -avn を -av に変更して実行します。削除オプションは指定していないため、ローカルにないファイルがリモートからそのまま削除されることはありません。

接続先を決めて、最初のタスクを実行

最寄りのノードを選ぶ

対話型の開発ではオフィスのネットワーク、継続的なビルドではリポジトリと成果物の保存場所を基準に選びます。注文時にノードを選択し、実際の利用可能状況はコンソールの最新情報で確認してください。