接続できても環境の準備完了とは限りません
SSH接続後は、Ruby、Bundler、プロジェクトの依存関係も確認してください。リポジトリで固定されているバージョンを優先し、チーム全体のビルド環境を変えてしまう一括アップグレードコマンドは避けましょう。
確認ポイント:同じユーザーでリポジトリにアクセスし、依存関係のインストールコマンドを実行できること。
専有物理Macをチームで利用できます。まず接続を確認し、ツールチェーンを固定してからRunnerを登録しましょう。このチェックリストで最初の30分の作業を進められます。プロジェクトの依存関係のダウンロードやビルド全体にかかる時間は、プロジェクトによって異なります。
まだノードをレンタルしていませんか?Apple Silicon M4 / M4 Pro搭載の専有物理Macを、1日$20.1からご利用いただけます。仮想マシンではありません。
自動化タスクを登録する前に、グラフィカル接続が使える状態を保ったうえでSSH接続を確認してください。唯一の接続方法を検証する前に、パスワードログインを無効にしないでください。
コンソールにログインし、該当インスタンスの詳細を開いて、ノードID、アドレス、ユーザー名、接続手順を確認します。認証情報はアカウント内で確認し、サポートチケットの本文、パイプライン設定、コードリポジトリにコピーしないでください。
インスタンスの詳細からブラウザーリモートデスクトップを開き、接続先が対象インスタンスのmacOS環境であることを確認します。初回ログイン後にシステムユーザーのパスワードを変更し、チームのパスワード管理ツールに保存してください。更新手続きと認証情報のローテーションを誰が担当するかも明確にしておきましょう。
macOSの「システム設定」で「共有」を開き、「リモートログイン」を確認して、必要なユーザーだけに許可します。コンソールに表示されたアドレスとポートを使って接続してください。ポートが標準値でない場合は、sshコマンドで明示的に指定します。
作業用PCで専用のSSHキーを生成し、ノードのauthorized_keysには公開鍵だけを追加します。現在の接続を維持したまま別のターミナルを開き、キーでログインできることを確認してから、ほかの認証設定を変更してください。
ノード側の権限を確認
mkdir -p ~/.ssh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
whoami
sw_vers
uname -m
確認結果:ユーザー名がインスタンスの認証情報と一致し、OSバージョンがプロジェクトの要件を満たしていることを確認します。Apple Silicon環境では、アーキテクチャの出力が arm64である必要があります。初回SSH接続時にフィンガープリントの確認が表示されたら、まずホストの正当性を確認してください。接続のためにホストキーの検証を無効にしないでください。
以下は出力形式の例であり、実際のノードでの実行結果ではありません。サンプルプロジェクト名はTeamAppです。リポジトリのworkspace、scheme、署名設定に置き換えてください。
$ ssh "$NODE_USER@$NODE_ADDRESS"
Authenticated using "publickey".
$ uname -m
arm64
$ xcodebuild -workspace TeamApp.xcworkspace \
-scheme TeamApp -configuration Release \
-destination 'generic/platform=iOS' \
-archivePath build/TeamApp.xcarchive archive
** ARCHIVE SUCCEEDED **
$ bundle exec fastlane gym --scheme TeamApp
Successfully exported and compressed dSYM file
Successfully exported and compressed ipa file
Successfully generated ipa file:
build/TeamApp.ipa
SSH接続後は、Ruby、Bundler、プロジェクトの依存関係も確認してください。リポジトリで固定されているバージョンを優先し、チーム全体のビルド環境を変えてしまう一括アップグレードコマンドは避けましょう。
確認ポイント:同じユーザーでリポジトリにアクセスし、依存関係のインストールコマンドを実行できること。
Archiveは成功したのにIPAのエクスポートに失敗する場合は、まずエクスポート方法、署名証明書、プロビジョニングプロファイルを確認してください。最初に発生したエラーと前後のログを保存し、最後の失敗メッセージだけを切り取らないでください。
確認ポイント:後続のタスクで使用できるビルド成果物が、指定したパスに出力されていること。
ノードは専有物理マシンですが、プロジェクトを並列実行できるかどうかは、メモリ、ディスク、タスクの分離方法にも左右されます。まずビルドを1件実行して全体の流れを確認し、その後で並列数を増やしてください。
リポジトリまたは組織のActions設定でself-hosted runnerを追加し、macOSとARM64を選択します。該当ページに表示されている最新のダウンロード、検証、登録コマンドを実行し、出所不明の古いインストーラーは使わないでください。
登録には専用のシステムユーザーを使い、用途を示すラベルとして vmfly、ios-build などを追加します。ワークフローの runs-on を該当ラベルに設定し、タスクが共有実行環境に割り当てられないようにします。
runs-on: [self-hosted, macOS, ARM64, vmfly, ios-build]
確認ポイント:管理画面でRunnerがオンラインと表示され、手動で起動したタスクをこのノードが受け取ること。
GitLab環境と互換性のあるRunnerバージョンを使い、プロジェクトまたはグループのRunner作成手順に従って認証トークンを取得します。macOSではshell executorを使い、ノードに macos-arm64 と用途を示すラベルを設定します。
パイプラインのタスクには同じtagsを指定します。Runnerの作業ディレクトリが実行ユーザーの所有であることを確認してください。証明書、依存関係のキャッシュ、アーカイブ出力も同じユーザーからアクセスできる必要があります。対話型ターミナルでは成功しても、自動タスクで失敗する事態を防げます。
ios_archive:
tags:
- macos-arm64
- ios-build
script:
- bundle exec fastlane gym
確認ポイント:テストタスクでシステムアーキテクチャを出力でき、プロジェクトに必要なツールチェーンを読み込めること。
GitHub Runnerは、登録ディレクトリでサービススクリプトを実行して ./svc.sh install と ./svc.sh startを実行できます。GitLab Runnerでは、インストール方法に応じて gitlab-runner install と gitlab-runner startを実行します。同じRunnerに2種類の自動起動設定を重複してインストールしないでください。
macOSでユーザーのLaunchAgentとして動作するサービスは、通常そのユーザーのログインセッションに依存します。サービスが実際に生成した設定と実行ユーザーを確認し、「起動時に動く」ことと「ビルドユーザーがログイン済み」であることを混同しないでください。リリース作業がない時間に一度再起動し、再起動後の稼働状況、パス、キーチェーンへのアクセス、成果物のエクスポートを確認しましょう。
チームで承認された安全な方法を使って、ビルド証明書とプロビジョニングプロファイルを渡してください。証明書には対応する秘密鍵が必要です。公開証明書だけをインポートしても署名できません。キーチェーンの解除パスワードと自動化トークンはCIの保護された変数に保存し、利用できるブランチとタスクを制限してください。
fastlane matchを使っているチームは、既存の保存先とアクセス方針を引き継いでください。CIから既存の署名用データを読み込む場合は、読み取り専用モードを優先します。bundle identifier、チーム、エクスポート方法、プロビジョニングプロファイルの有効期限に齟齬がないことを確認してから、アーカイブコマンド自体を調べてください。
無人実行タスクから指定したキーチェーンにアクセスできる必要があります。長期間使う平文パスワードをスクリプトに書き込まず、環境変数をすべてログに出力しないでください。ログを共有する前に、秘密鍵、トークン、パスワード、署名用データを削除してください。
まずノードの現在の環境を確認し、プロジェクトに必要なバージョンをインストールするか判断してください。デスクトップで選択されているXcodeがRunnerプロセスでも使われているとは限りません。
現在の選択を確認。切り替える場合は、実際のインストール先に置き換えてください
xcodebuild -version
xcode-select -p
xcrun simctl list runtimes
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
xcodebuild -checkFirstLaunchStatus
Xcodeのバージョンごとに、見分けやすい名前を付けてください。共有ノード上の複数プロジェクトで異なるバージョンを使う場合は、各タスク内で DEVELOPER_DIRを設定する方法を優先し、ビルドのたびにシステム全体の選択を変更するのは避けましょう。
確認ポイント:Runnerの実際のタスクログに xcodebuild -versionが出力され、プロジェクトの要件と一致すること。
Xcodeの設定でプロジェクトに必要なランタイムをインストールし、インストール後に xcrun simctl list を実行して利用可能なデバイスを確認します。UIテストではdestinationを明示し、存在しないOSバージョンやデバイスを待ち続けないようにしてください。
確認ポイント:まず対象のシミュレーターを単独で起動し、その後、最小限のUIテストを実行すること。
プロジェクトごとに専用のDerivedDataパスを指定し、必要なキャッシュを残したうえで成果物の保管方針を設定します。削除前に関連するビルドを停止し、ディレクトリの内容と使用量を確認してください。共有の作業ディレクトリに対して再帰的な削除を実行しないでください。
確認ポイント:依存関係、キャッシュ、IPAの保存先が明確で、次回のアーカイブに必要な空き容量があること。
自動化に接続する前に、Xcodeの初回起動時に必要なコンポーネントをインストールしてください。対話型ターミナルではコマンドが見つかるのにCIでは見つからない場合、実行ユーザー、PATH、作業ディレクトリ、シェルの初期化方法を比較しましょう。最初から依存関係をすべて再インストールする必要はありません。
初回設定にはブラウザーデスクトップ、継続的なGUI操作にはクライアント接続、無人ビルドにはSSHとRunnerが適しています。コードや成果物の保存先として、いずれのグラフィカル接続も唯一の手段にしないでください。
| 接続方法 | 適した操作 | 初期設定 | 遅延時にまず確認すること |
|---|---|---|---|
| ブラウザーリモートデスクトップ | 初回ログイン、システム設定、ビルド状況の一時確認 | コンソールでインスタンスの詳細を開き、まずはシングルディスプレイと中程度の解像度を選択 | ローカルネットワーク、ブラウザーのズーム、デスクトップセッションを複数同時に開いていないか |
| VNCクライアント | GUIを長時間操作する場合。クライアントのエンコード方式と画質を調整 | インスタンスの接続手順に従い、まずは自動エンコードまたは画質バランスを選択 | 画質または色深度を段階的に下げ、一度に複数の設定を変更しない |
| macOSの画面共有 | ローカルMacからのデスクトップデバッグや補助操作 | インスタンスで利用できる接続方法を使い、まずはシングルディスプレイの1920 × 1080から開始 | 高解像度、動きの多い画面、ネットワークをまたぐ接続。まず解像度を下げて比較 |
デスクトップ画面の残像が、コンパイルの遅さを意味するとは限りません。SSHでタスクの出力とリソース使用量を確認し、ビルドが進行しているか確かめてください。反対に、画面の動きが滑らかでも、署名、依存関係のダウンロード、リモートリポジトリへのアクセスが正常とは限りません。
接続に問題が起きたら、利用方法、発生日時とタイムゾーン、ローカルネットワークの種類、SSH接続がまだ可能かを記録してください。リモートログインや画面共有の設定を変更する場合は、現在使える接続を維持し、変更後にすべての接続手段を失わないようにしましょう。
アカウント、インスタンス、請求はコンソールで管理できます。更新や構成変更の前に注文番号とインスタンス番号を確認し、契約期間が確定する前にリリースタスクを予定しないようにしてください。
コンソールで現在のサブスクリプション、有効期限、未払いの請求書を確認し、支払い後にサブスクリプションの状態を再確認してください。有効期限が切れる前に、コード、証明書のバックアップ、ビルド成果物をチームの管理下にある保存先へ同期します。有効期限を長期バックアップとして当てにしないでください。
更新されていないノードは有効期限後にサービスが停止し、ディスク全体が消去されます。必要なデータは事前に移行してください。
Glide M4はApple Silicon M4、メモリ16GB、SSD 256GBを搭載。Cruise M4 ProはApple Silicon M4 Pro、メモリ64GB、SSD 2TBを搭載しています。プラン変更の前にチケットで手順を確認してください。既存マシンのメモリをすぐに増設するものではありません。
+1TB SSD、+2TB SSD、Thunderbolt 5接続のオプションは、注文時の構成画面で確認してください。レンタル中のノードを変更する場合は、先にチケットで確認が必要です。
お支払い方法はUSDT-TRC20、Visa / Mastercard / Amex(Stripe)のみです。すべて米ドルで決済されます。利用可能な決済ゲートウェイはAPIの応答に基づきます。お支払いの確認後に物理マシンの割り当てを開始します。
支払い状況が更新されない場合は、注文番号と支払い証明を添えてお問い合わせください。USDTで支払った場合はトランザクションハッシュも添付してください。重複して支払わず、カード番号全体を送らないでください。
アカウントをお持ちの場合は、コンソールからチケットを送信して状況を確認できます。ノード番号、発生時刻とタイムゾーン、再現手順、機密情報を伏せたログを添えてください。購入前の相談やログインできない場合は、お問い合わせページからsupport@vmfly.comへご連絡ください。
「期待する結果」と「実際の結果」を説明し、SSH、デスクトップ、Runnerのうち利用可能なものを記載してください。パスワード、秘密鍵、カード情報全体は添付しないでください。