ターミナル接続
リポジトリの取得、依存関係のインストール、ビルド、常駐タスクの管理に適しています。不安定な接続ではクライアントのキープアライブを有効にし、詳細ログで切断箇所がハンドシェイク、認証、セッションのどこかを確認します。
ssh -vvv -o ServerAliveInterval=30 -o ServerAliveCountMax=4 "$MAC_USER@$MAC_HOST"
SSH、GUI、ファイル転送から Xcode、Runner、fastlane、拠点ネットワークまで、再現可能なコマンドで範囲を絞り、設定修正か問い合わせかを判断します。
$ ssh -v "$MAC_USER@$MAC_HOST"
debug1: Authentication succeeded
$ xcodebuild -version
Xcode toolchain ready
$ scutil --dns | grep nameserver
Resolver path verified
コンソールで対象インスタンスを開き、ホストアドレス、ログインユーザー名、初期認証情報を確認します。初回接続では、対象ホストの検証、システムへのログイン、その後の鍵認証への切り替えの3点を行います。
まずインスタンスが正常に稼働していることを確認し、コンソールに表示されたホストアドレスとユーザー名をローカル環境変数に設定します。パスワード、秘密鍵、完全な認証情報をリポジトリ、チャット、CIログに保存しないでください。
export MAC_HOST="コンソールに表示されたホストアドレス"
export MAC_USER="コンソールに表示されたユーザー名"
test -n "$MAC_HOST" && test -n "$MAC_USER" && echo "connection variables ready"
接続後、ターミナルに表示されたフィンガープリントをコンソールの情報と照合します。ホストアドレスの変更、再インストール後のフィンガープリント変更、またはローカルに古い記録がある場合は、警告を無視せず、同じインスタンスか確認してください。
ssh -v "$MAC_USER@$MAC_HOST"
ssh-keygen -F "$MAC_HOST"
クラウド Mac 専用に Ed25519 鍵を生成すると、ローテーションや失効が容易になります。公開鍵を登録したら現在のセッションを残し、別のターミナルで鍵認証を検証してから元のセッションを終了してください。
ssh-keygen -t ed25519 -a 64 -f "$HOME/.ssh/macrents_build"
cat "$HOME/.ssh/macrents_build.pub" | ssh "$MAC_USER@$MAC_HOST" 'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys'
ssh -i "$HOME/.ssh/macrents_build" "$MAC_USER@$MAC_HOST"
対象インスタンス専用のエイリアス、鍵のパス、キープアライブ設定を用意します。ログイン後に macOS のバージョン、ディスク空き容量、現在のユーザー、システム時刻を記録すると、後のビルド失敗時に環境変化を素早く判断できます。
sw_vers
whoami
date
df -h /
uptime
タイムアウトでは、まずローカルネットワーク、ポート、拠点への経路、送信元アドレス制限を確認します。 Permission denied と表示された場合は、ユーザー名、鍵ファイル、ファイル権限、サーバー側の認証記録を確認します。認証エラー時に DNS を繰り返し変更したり、ネットワーク未接続時に認証情報を何度もリセットしたりしないでください。
ビルドや自動化には SSH を優先します。UIデバッグ、シミュレーター、デスクトップツールには GUI リモートデスクトップを使い、プロジェクトや成果物の一括同期には再開可能なファイル転送を利用します。
リポジトリの取得、依存関係のインストール、ビルド、常駐タスクの管理に適しています。不安定な接続ではクライアントのキープアライブを有効にし、詳細ログで切断箇所がハンドシェイク、認証、セッションのどこかを確認します。
ssh -vvv -o ServerAliveInterval=30 -o ServerAliveCountMax=4 "$MAC_USER@$MAC_HOST"
コンソールから GUI アクセスを開き、Xcode の UI デバッグ、シミュレーターの確認、デスクトップ操作が必要なツールに使用します。遅延時はまず解像度とリフレッシュレートを下げ、ターミナルの遅延と比較して、画面エンコードの問題かネットワーク全体の問題かを切り分けます。
少量のファイルには scp、大きなディレクトリやビルドキャッシュには rsyncがおすすめです。転送前に Derived Data、一時アーカイブ、依存キャッシュを除外し、再生成可能なデータを何度も転送しないようにします。
rsync -azP --partial --exclude DerivedData/ ./project/ "$MAC_USER@$MAC_HOST:~/workspace/project/"
長時間のビルドを1つのフォアグラウンドターミナルだけに依存しないでください。セッションマネージャーや macOS のサービス機構でタスクを維持し、ログを管理対象ディレクトリへ定期的に保存します。プロジェクトを離れる際は、不要になった公開鍵とアクセストークンを失効させます。
tmux new -s build
tmux attach -t build
tail -n 200 "$HOME/logs/build.log"
GUI で表示される Xcode と、コマンドラインで選択されたデベロッパーディレクトリが異なる場合があります。パス、バージョン、SDK、シミュレーター、署名環境を記録してから、最小構成のビルドを再実行します。
xcode-select -p
xcodebuild -version
xcodebuild -showsdks
xcrun simctl list devices available
xcrun --find swift
swift --version
security list-keychains -d user
security find-identity -v -p codesigning
xcode-select -p は今回のビルドで必要な Xcode を指している必要があります。パスが異なる場合は、まず Runner を停止し、ディレクトリを切り替えてから再起動してください。実行中のタスクが古い環境を引き継ぐのを防げます。
対象 SDK が -showsdks の出力にない場合、プロジェクトパラメーターを変更してもツールチェーンは補完されません。シミュレータータスクでは、デバイスの状態、ランタイムバージョン、ディスク容量も確認してください。
署名 ID が存在しても、自動化プロセスが秘密鍵を読み取れるとは限りません。対話型ターミナルと Runner サービスについて、ユーザー、キーチェーン検索リスト、ロック解除状態を比較します。
ワークスペース、scheme、configuration、destination を固定してから、無関係なスクリプトを無効にします。完全な終了コードと末尾ログを保存し、最後の1行だけを抜き出さないでください。
set -o pipefail
xcodebuild -workspace Project.xcworkspace -scheme Project -configuration Release -destination 'generic/platform=macOS' clean build | tee "$HOME/logs/xcode-build.log"
printf 'exit_code=%s\n' "$?"
セルフホスト Runner と常駐エージェントでは、実行ユーザー、作業ディレクトリ、ツールチェーンのパス、キャッシュ範囲、鍵の読み取り方法を固定します。まず最小タスクを安定して完了させ、その後に並列実行、キャッシュ、配布手順を段階的に戻します。
プロジェクトまたは組織の設定で一度限りの登録情報を生成し、クラウド Mac 上で専用システムユーザーとして登録します。ラベルでは少なくとも OS、チップクラス、用途を区別し、ワークフローから macOS タスクを対応ノードへルーティングします。
whoami
xcode-select -p
printenv | sort
df -h "$HOME"
登録時に macOS に適した実行方式を選び、保護されたラベルでタスクの送信元を制限します。サービスユーザーにはプロジェクトディレクトリと必要なキーチェーンへのアクセス権を与えますが、ビルドに無関係なシステム権限は付与しないでください。
git status --short
git rev-parse HEAD
shasum -a 256 "$HOME/artifacts/app.zip"
du -sh "$HOME/build-cache"
自社開発エージェントやその他のビルドエージェントは macOS のサービス機構で管理し、起動ユーザー、環境変数ファイル、標準出力、終了後の再起動方針を明確にします。リモートデスクトップのセッションが接続を維持し続けることを前提にしないでください。
launchctl list | grep build
ps aux | grep '[b]uild-agent'
lsof -nP -iTCP -sTCP:ESTABLISHED
tail -n 200 "$HOME/logs/agent.log"
最初からすべての依存関係を再インストールしないでください。署名準備、アーカイブ、エクスポート、アップロードのどの段階で失敗したかを確認し、その段階の入力、終了コード、マスキング済みログを収集します。
| 確認レイヤー | よくある症状 | 最初に確認すること | 対処方針 |
|---|---|---|---|
| 証明書 | 署名 ID が見つからない、ID 数がゼロ | security find-identity -v -p codesigning | 対象キーチェーンへのインポート、証明書の有効性、秘密鍵との組み合わせを確認する |
| プロビジョニングプロファイル | 識別子が一致しない、機能が一致しない | 対象識別子、チーム情報、必要な機能、ファイル内容 | 異なるプロジェクトや環境のプロビジョニングプロファイルを混在させない |
| キーチェーン権限 | ターミナルではビルドできるが、Runner では署名できない | 実行ユーザー、検索リスト、ロック解除状態、秘密鍵のアクセス制御 | 自動化プロセスが今回のタスクに必要な署名素材だけへアクセスできるようにする |
| 環境変数 | 対話型実行は成功するが、サービス実行ではパラメーターが不足する | printenv のマスキング差分とサービス起動設定 | 変数を明示的に注入し、対話型 Shell の設定ファイルに依存しない |
| アップロードログ | アーカイブは成功するが、アップロードが中断する、またはゼロ以外の状態を返す | 完全な終了コード、再試行回数、ファイルサイズ、ネットワークのタイムライン | まず成果物の有効性を確認し、アップロード問題とビルド問題を分ける |
最も多い原因は実行ユーザーが異なるか、サービスプロセスが対話型セッションのキーチェーン検索リストを引き継いでいないことです。 whoami、security list-keychains -d user と署名 ID の出力をそれぞれ記録し、2つの実行環境を比較します。すべての秘密鍵の権限を緩めて、ユーザー境界の問題を隠さないでください。
同じコミット、同じ Xcode パス、同じ作業ディレクトリで、対話型ターミナルと Runner からマスキング済みの変数名一覧をそれぞれ出力します。変数の存在だけを比較し、トークン値は表示しません。変数が揃っている場合は、作業ディレクトリ、Shell の種類、依存関係のバージョン、実行ユーザーを確認します。
lane 名、失敗段階、完全な終了コード、Xcode と fastlane のバージョン、タスクの開始・終了時刻、末尾のコンテキスト、再現コマンドを残します。アクセストークン、証明書パスワード、秘密鍵、セッション情報、個人データを削除してから送信してください。最後のエラー1行だけのスクリーンショットでは、通常問題を特定できません。
拠点は、チームの所在地、コードと依存関係の取得元、成果物の送付先、実際の回線に基づいて選びます。1回の遅延測定だけで判断せず、往復遅延、パケットロス、DNS 解決、経路変化を比較し、測定時間帯も記録してください。
東南アジア向けのチームや依存関係の取得経路に適しています。遅延が急に増えた場合は、オフィスネットワーク、モバイルネットワーク、別の出口回線を比較し、現地通信事業者の経路変化かどうかを判断します。
日本および北東アジアのプロジェクトに適しています。国境をまたぐ接続を調査する際は、直接接続の遅延、経由ホップ数、ファイル転送速度を同時に記録し、GUI の見た目の滑らかさだけで判断しないでください。
韓国および周辺地域からの接続に適しています。SSH は使えるのに大容量ファイルの速度が不安定な場合は、パケットロス、パス MTU、ローカルプロキシ、並列転送数を確認します。
アジア間の協業や複数地域のチームに適しています。特定のネットワークでは接続でき、別のネットワークではタイムアウトする場合は、2つの経路結果を保存し、送信元ネットワークの種類を記載します。
短時間のテストは到達性の確認に、継続テストは揺らぎや断続的なパケットロスの発見に使います。 $MAC_HOST を現在のインスタンスアドレスに設定して実行します。
ping -c 20 "$MAC_HOST"
nc -vz -w 5 "$MAC_HOST" 22
traceroute "$MAC_HOST"
ホスト名で接続している場合は、まず解決結果が安定しているか確認します。アドレスを直接指定しても失敗する場合、通常は DNS が原因ではありません。現在のローカルリゾルバーとクエリ結果を記録します。
scutil --dns
dscacheutil -q host -a name "$MAC_HOST"
dig "$MAC_HOST"
トラフィックが想定したインターフェースから送信されていることを確認し、ローカル VPN、プロキシ、複数 NIC によるデフォルトルートの変更を確認します。テスト後は元のネットワーク設定に戻し、複数の変数を同時に変更しないでください。
route -n get "$MAC_HOST"
netstat -rn
ifconfig
networkQuality
SSH のハンドシェイクは正常でも転送が遅い場合は、固定ファイルで繰り返しテストし、ファイルサイズ、所要時間、クライアントネットワークを記録します。異なるプロジェクトディレクトリや圧縮方式の結果を直接比較しないでください。
time scp "$HOME/test-transfer.bin" "$MAC_USER@$MAC_HOST:~/"
shasum -a 256 "$HOME/test-transfer.bin"
ssh "$MAC_USER@$MAC_HOST" 'shasum -a 256 ~/test-transfer.bin'
接続に異常がある場合は、送信元ネットワーク、対象拠点、プロトコル、時間帯の証拠を収集します。1回の速度測定は長期的な回線品質を示しません。同じテストを問題のあるネットワークと比較用ネットワークで少なくとも1回ずつ実行し、問題がローカル出口、国際経路、対象接続層のどこにあるか判断します。
既存ユーザーは、注文とインスタンスを関連付けやすいコンソールから優先的に問い合わせてください。コンソールに入れない場合は、 support@macrents.comへメールを送信できます。どちらの方法でも同じサポートフローに入ります。
ログ内のホストアドレスは必要な部分を残せますが、トークン、パスワード、リクエストヘッダー、署名素材、個人データは削除してください。サポート担当者が追加情報を必要とする場合は、必要最小限の範囲を問い合わせ内で案内します。
接続切断、インスタンスへのアクセス不能、ビルドタスクの継続的な失敗が発生した場合は、業務への影響範囲を記載してください。導入前の構成相談はメールで直接お問い合わせいただけます。既存の注文、ホスト状態、ログに関する技術的な問題は、コンソールからの問い合わせを優先してください。
3つのプランはいずれも専有 Mac mini 物理ノードで、仮想マシンではありません。ビルドの同時実行数、ユニファイドメモリの要件、レンタル期間に応じてプランを選択してください。既存インスタンスに問題がある場合は、コンソールから直接お問い合わせいただけます。