症状:手動アップロードは成功するのに、リモートMacの無人Laneが署名や認証で止まる。 最短解決策:Apple siliconのリモートMacでXcode 27、Ruby、Bundler、fastlaneを固定し、テスト、Archive、アップロードを分離してから署名とApp Store Connect認証を接続します。
この順番なら、最初から審査提出まで自動化せず、まずTestFlightへの到達と、断線・再起動・認証失敗からの復旧を確認できます。
この手順は、WindowsまたはLinuxでコードを書き、iOSビルドと公開だけリモートMacで実行したい独立開発者向けです。毎週または毎月TestFlightへ配信する個人開発者や、常駐のiOSビルド環境を用意したい小規模チームにも適しています。
最終更新:2026年9月13日。Xcode 27 RCの提供状況とApp Store提出に関する情報は、AppleのXcodeシステム要件およびApp Store Connectのアップロード説明を基準に確認しています。Xcode 27の正式版公開日と最終的なシステム要件は、実行時に再確認してください。
動かす前に、fastlane自動ビルド・公開の範囲を分ける
fastlaneはテスト、ビルド、Archive、署名処理、アップロードなどを連続したLaneとして編成できます。ただし、macOS、Xcode、Apple Developer Programのアカウント、Bundle ID、証明書やProvisioning Profileそのものを不要にする仕組みではありません。fastlaneのiOS設定手順でも、プロジェクトと署名環境を前提に設定します。
最初に、ローカルまたはリモートMacで成功した手動ArchiveとTestFlightアップロードを1回残してください。これは自動化が壊れたときに、プロジェクトの問題、署名の問題、Laneの問題を切り分ける基準になります。
「アップロード完了」と「TestFlightでテスト可能」は同じではありません。Apple側ではアップロード後にビルド処理があり、その状態はビルドステータスの説明で確認できます。テスターへの割り当て、App Store上の新バージョン作成、App Reviewへの提出も別の操作です。
手元にMacがなくてもfastlaneでiOSアプリをビルドできますか。
できますが、iOS用のArchiveと署名処理を実行するMac環境は必要です。WindowsやLinuxからSSHでLaneを起動する構成は可能ですが、XcodeとmacOSを使う処理自体を別のOSへ移すものではありません。Apple siliconのリモートMacを使う場合も、Xcode 27が要求するmacOSとハードウェア条件を、契約前にAppleの公式要件で照合してください。
第一段階:Xcode 27と実行環境を固定する
Xcode 27は、執筆時点ではAppleがRCを提供している段階です。正式版のリリース時期や最終システム要件を予測で決めず、正式版へ切り替えるときは別の検証Laneを実行してから公開環境へ反映します。
リモートMacへ接続したら、まず次の情報を記録します。
- Xcodeのバージョンと選択中のDeveloper Directory
- macOSのバージョン、Apple siliconの構成、利用可能なディスク領域
- Rubyの導入方法とバージョン
- Bundlerのバージョン、Gemfile、Gemfile.lock
- Workspace、Scheme、Build Configuration、出力先
- UTF-8のLocale、環境変数の読み込み元、ログ保存先
bundle exec fastlaneに統一し、無指定のグローバルインストールが混ざらないようにします。インストール方法の詳細は[fastlane公式のセットアップ文書](https://docs.fastlane.tools/getting-started/ios/setup/)に合わせてください。
リモート接続では、SSHセッションを閉じた瞬間にプロセスが終了する構成もあります。長時間の処理はセッションから独立して実行し、標準出力だけに頼らず、Laneごとのログと生成物を保存する設計にします。
第二段階:テスト、Archive、アップロードを別Laneにする
最初から一つのLaneでテスト、署名、Archive、Export、アップロードを連結すると、失敗位置が分かりません。責任範囲を分けると、手動基準との差を確認しやすくなります。
テストLane
テストLaneの成功条件は、指定したSchemeとTest Planが完了し、テスト結果が保存されることです。ここではApp Store Connectへの接続や配布用署名をまだ扱いません。
Build・Archive Lane
次に、xcarchiveまたはIPAを生成します。fastlaneのbuild_ios_appの仕様に従い、Workspace、Scheme、出力パス、Export方法をプロジェクトの設定から明示します。以下は構造だけを示す脱敏済みの例です。
platform :ios do
desc "Run tests"
lane :test_only do
run_tests(
workspace: "<WORKSPACE_PLACEHOLDER>",
scheme: "<SCHEME_PLACEHOLDER>",
output_directory: "<LOG_DIRECTORY>"
)
end
desc "Create archive"
lane :archive_only do
build_ios_app(
workspace: "<WORKSPACE_PLACEHOLDER>",
scheme: "<SCHEME_PLACEHOLDER>",
output_directory: "<OUTPUT_DIRECTORY>",
clean: true
)
end
desc "Upload build"
lane :upload_only do
pilot(
ipa: "<IPA_PATH>",
skip_waiting_for_build_processing: true
)
end
end
この例のScheme、Workspace、IPAパスは実際の設定値へ置き換えます。FastfileへTeam ID、Bundle ID、秘密鍵、パスワード、API Token、ホストアドレスを直接書かないでください。
各Laneには、成功したと判断する生成物と停止条件を定義します。たとえばテストLaneは結果ファイルがない場合、Archive Laneは期待するアーカイブがない場合、アップロードLaneは送信ログがない場合に成功扱いにしません。コマンドの終了コードだけでは、Apple側の処理完了まで確認できないためです。
第三段階:署名資産とApp Store Connect認証を分離する
コード署名に必要な証明書の秘密鍵とProvisioning Profile、App Store Connectへ接続する認証情報は別の権限領域です。App Store Connect API Keyを設定しても、端末側の署名資産や秘密鍵が自動的に揃うわけではありません。
既存の証明書とProfileを安全にインポートできるなら、まずはその構成で手動Archiveとの差を確認します。自動署名はプロジェクトとチーム設定が安定している場合に適しますが、CI環境で意図せずProfileが変わると、同じコミットでも結果が変わる可能性があります。署名資産の同期方法は、別途保管ポリシーと失効手順まで決めてください。
App Store Connectの操作には、Apple IDを使う方法とAPI Keyを使う方法があります。継続実行する公開Laneでは、個人のパスワードを保存するより、用途と権限を限定したAPI Keyを検討するのが自然です。ただし、API Keyは証明書の秘密鍵を代替しません。利用可能な操作と権限はfastlaneのApp Store Connect API説明で確認し、Apple IDが必要な処理まで一律に置き換えないでください。
秘密情報は、リモートMacのKeychain、権限を絞った環境変数、または安全なファイル注入機構から読み込みます。シェル履歴、ビルドログ、Fastfile、Gitリポジトリへ出力されないことを、意図的に失敗させるテストで確認してください。
注意:環境変数へ設定した値も、デバッグ出力や例外メッセージから漏れることがあります。認証失敗を調べるときは、値そのものではなく変数名、権限、読み込み元、発生時刻だけをログに残します。
第四段階:TestFlightへのアップロードを単独で受け入れる
アップロードLaneは、まず既存のアーカイブまたはIPAを受け取ってTestFlightへ送るだけにします。fastlaneのpilot公式説明を確認し、メタデータ変更やApp Review提出まで一度に追加しないでください。
実行後は、次の三つを別々に保存します。
- IPAまたはxcarchive:何を送ったかを確認する証拠
- fastlaneとXcodeのログ:どこまで実行したかを確認する証拠
- App Store Connect上のビルド状態:Apple側で処理されたかを確認する証拠
App Store公開まで行う場合も、ビルドを選択する工程と審査へ提出する工程を分けます。TestFlightでの検証が済んでいないビルドを自動で提出しない停止条件を設け、公開担当者がバージョン番号、リリースノート、審査用情報を確認してから次へ進めます。
fastlaneでTestFlightへ自動アップロードするにはどうすればよいですか。
テスト済みのIPAを作り、アップロード専用Laneへ渡し、App Store Connect認証を環境変数または安全な認証ファイルから読み込ませます。アップロード後はfastlaneの終了コードだけで完了とせず、App Store Connectのビルド状態とバージョン番号を確認します。
第五段階:断線と再起動からの復旧を検証する
リモートMacを常駐のiOSビルド環境にする前に、通常成功する手順だけでなく、失敗後に再開できるかを確認します。復旧テストでは、タスクID、コミット識別子、出力パス、開始時刻、最後のLane名をログへ残してください。
次の順番で確認します。
- SSH接続を切断し、処理が継続するか確認する
- 再接続後、同じタスクのログと生成物を参照する
- ユーザーを再ログインさせ、Keychainへアクセスできるか確認する
- Macを再起動し、Developer Directoryと環境変数が戻るか確認する
- API Keyや証明書を無効な状態にして、安全に停止するか確認する
- 既存IPAを重複送信せず、どの段階から再実行するか決める
リモートMacの再起動後にfastlaneの公開処理を復旧するにはどうすればよいですか。
まず、処理が再起動前にテスト、Archive、Export、アップロードのどこまで進んだかをログで確認します。環境変数、Keychain、Developer Directory、Gemfile.lockを復元し、既存のIPAが有効かを確認してから、必要なLaneだけを再実行します。状態が分からない場合は、重複アップロードを避けてArchiveからやり直します。
常駐化する前の選択:一時利用か固定環境か
手動公開から自動化へ移る段階では、次の対照で判断します。
一時的なリモートMacが向くケース
- Xcode 27の正式版に合わせて構成を検証したい
- 初回のArchive、署名、TestFlightだけを試したい
- 発売前の短い期間に複数の構成を確認したい
- 常時稼働ではなく、必要なときだけLaneを実行する
固定したリモートMacが向くケース
- 同じアプリを継続的にTestFlightへ配信する
- Xcode、Ruby、Bundler、fastlaneを固定して再現性を優先する
- SSH断線やホスト再起動後も、ログと生成物を追跡したい
- ローカル端末を閉じても、公開作業を続けたい
公開前の合格判定
- [ ] Xcode 27の正式版またはRCを、実行時点のApple公式要件と照合した
- [ ] Ruby、Bundler、fastlane、Gemfile.lockを保存した
- [ ] 手動ArchiveとTestFlightアップロードの基準を残した
- [ ] テスト、Archive、アップロードのLaneを個別に実行できる
- [ ] Bundle ID、Scheme、Team設定を脱敏した設定資料に記録した
- [ ] 署名資産とApp Store Connect API Keyを別々に管理した
- [ ] IPA、ログ、App Store Connectの状態を三つの証拠として保存した
- [ ] 断線、再ログイン、再起動、認証失敗後の停止条件を確認した
- [ ] Xcode更新用の検証Laneを本番Laneから分離した
- [ ] TestFlight確認前にApp Review提出を自動実行しない
すでに一度公開Laneを成功させ、同じXcodeと認証構成を継続利用したいなら、完全な権限を持つMacを固定しておく方が、臨時環境を都度作り直すより判断しやすい場合があります。短期の検証ならMACGPUのレンタルを試し、常駐のビルド機として使うなら、発行頻度と復旧要件を基準に期間を選ぶのが現実的です。開始前にMACGPUの利用ページで、必要な接続方式と環境条件を確認してください。