運用と監査

Xcode 27 と Xcode 26 はどう共存する?2026年のリモートMac CI設定

MacHTML Lab2026.09.01 約6分
Xcode 27 と Xcode 26 はどう共存する?2026年のリモートMac CI設定

AppleのXcode 27のシステム要件では、対応するmacOSとApple siliconの条件が明示されています。ここから導ける結論は明確です。互換するApple silicon MacならXcode 27とXcode 26の共存は可能ですが、共有CIでは全体設定を切り替えず、各ジョブでDEVELOPER_DIRを固定してください。

対象は、Xcode 26で正式版をリリースしながらXcode 27 Betaで検証したい開発チームです。複数リポジトリを運用するDevOps担当者、リモートMacの更新・容量・障害復旧を担当する管理者にも適しています。

最終更新:2026年9月1日。Xcode 27の仕様、システム要件、コマンドラインツールの挙動は、同日確認したApple Developer公式資料を基準にしています。Beta期間中は要件やコンポーネントの挙動が変わる可能性があります。

Xcode 27とXcode 26の共存で起きる衝突

典型的な失敗は、パイプラインの宣言ではXcode 26を指定しているのに、ログにはXcode 27のSDKが現れるケースです。原因は、ノードのxcode-select、シェルの環境変数、CIランナーが起動する子プロセスの設定が別々に評価されることです。

共存で警戒すべき衝突は次のとおりです。

  • アプリケーションの上書きで、正式版の保存先が失われる
  • macOSの要件が合わず、片方だけ起動できる
  • SDKやシミュレーターが未導入で、ビルドだけ成功してテストで止まる
  • DerivedData、Swift Packageのキャッシュ、アーカイブが混ざる
  • 署名環境は同じでも、ジョブが意図しないツールチェーンを呼び出す
  • ノード再起動後に環境変数や既定の開発者ディレクトリが戻る

ログには少なくともXcodeのバージョン、ビルド番号、SDK、Developerディレクトリを残してください。xcodebuild -versionだけでは不十分です。xcrun --findで実体のパスも確認します。

固定配置とタスク単位の選択を分ける

正式版とXcode 27 Betaは、識別しやすく上書きされない名前で保存します。例えば次のように、アプリケーション名とDeveloperディレクトリを対応させます。

用途 アプリケーション例 CIで指定するDeveloperディレクトリ 扱い
正式リリース /Applications/Xcode-26.app /Applications/Xcode-26.app/Contents/Developer 既定の公開用ツールチェーン
ベータ検証 /Applications/Xcode-27-Beta.app /Applications/Xcode-27-Beta.app/Contents/Developer 検証ジョブだけで使用
一時的な回帰確認 /Applications/Xcode-recovery.app 保存済みの対象パス 更新失敗時の復旧用

AppleのXcode 27 Release NotesXcode 26 Release Notesを、導入する版ごとに確認します。対応していないmacOSへパッケージを改変して配置する方法は、CIの基盤にしないでください。

ノード全体の既定値を変更するxcode-select --switchは、同じMacで並列ジョブが動くと影響範囲が広すぎます。保守作業や単独ノードの初期設定には使えますが、共有CIのジョブ選択には向きません。

選択方法 影響範囲 共有ノードでの評価 主なリスク
xcode-select --switch ノード全体 既定値の設定向け 並列ジョブの版が変わる
DEVELOPER_DIR コマンドまたはジョブ 推奨 定義漏れがあると既定値へ落ちる
ラッパースクリプト 定義した処理全体 推奨 パス変更時の更新漏れ
専用ノード ノード単位 高い分離性 ノード数と運用費が増える

Appleのコマンドラインツール設定に関する公式説明でも、Xcodeの選択方法は明確に分けられています。ジョブの冒頭で環境変数を設定し、後続コマンドへ確実に継承させてください。

export DEVELOPER_DIR="/Applications/Xcode-26.app/Contents/Developer"

xcodebuild -version
xcrun --find xcodebuild
xcrun --sdk iphoneos --show-sdk-path
xcrun swiftc --version

検証ジョブではパスだけを置き換えます。

export DEVELOPER_DIR="/Applications/Xcode-27-Beta.app/Contents/Developer"

xcodebuild -version
xcrun --sdk iphonesimulator --show-sdk-path

この出力をログへ保存し、期待する文字列と一致しなければ直ちに終了させます。誤ったSDKで生成物を作り続けるより、早い段階で失敗させるほうが復旧しやすくなります。

コンポーネントとキャッシュを版ごとに隔離する

Xcodeのアイコンが開くことは、CI環境の完成を意味しません。対象プロジェクトが必要とするプラットフォーム、シミュレーターランタイム、初回起動処理を、Xcodeごとに確認します。

Appleの追加コンポーネントのインストール手順に従い、コンポーネントの操作対象が正しいXcodeであることを確認してください。追加シミュレーターは、Appleのシミュレーター追加手順も参照します。

検査対象 Xcode 26の確認 Xcode 27 Betaの確認 合格条件
初回起動 対象パスで完了 対象パスで完了 CIユーザーで保留画面が出ない
SDK プロジェクト指定と一致 ベータ用指定と一致 xcrunの実体が期待先
シミュレーター UIテストで必要な版だけ 検証対象だけ 実機またはランタイムを検出
追加コンポーネント 必要なものだけ 必要なものだけ 不要な導入を共有ノードに残さない
ログ 正式版の経路を記録 ベータ版の経路を記録 版、SDK、パスを追跡できる

キャッシュは、Xcode版だけでなく流水線名も含めて分けます。例えばDerivedData/release-xcode26DerivedData/validation-xcode27のように保存先を分離します。Swift Packageの解決キャッシュ、アーカイブ、テスト結果、ログも同じ境界で管理してください。

AppleのBuild Settings Referenceにある設定を使い、プロジェクト側の出力先を明示します。古い成果物を再利用している可能性がある場合は、まずクリーンビルドを実行し、その後に同一条件で再ビルドします。ビルド時間や性能については、実際の構成で測定した記録がない限り断定しません。

署名と再起動後の復旧を検証する

署名証明書やプロファイルをXcodeごとに複製する必要はありません。重要なのは、同じ管理されたCIユーザーとキーチェーン境界で、正式版とベータ版がそれぞれ意図したジョブを完了できることです。

確認順序は次のとおりです。

  • 正式版ジョブでクリーンビルドを実行する
  • 正式版のユニットテストとアーカイブを実行する
  • ベータ版ジョブで検証用ビルドを実行する
  • 必要な場合だけ、ベータ版でUIテストを実行する
  • 両方の署名結果と書き出しログを保存する
  • ノードを再起動し、同じジョブを再実行する
  • Xcode 27 Betaの更新を想定し、正式版の経路が変わらないことを確認する
検証経路 主な対象 失敗時の判断
正式チェーン Xcode 26、リリース、署名 失敗したら公開用ジョブを止める
検証チェーン Xcode 27 Beta、テスト、互換性 失敗しても正式版へ自動反映しない
復旧チェーン 再起動後のパス、環境変数、キャッシュ 再現できなければ共用を拡大しない

共存か専用ノードかを条件で決める

共存を続けるかは、次の分岐で決めてください。

  • 正式版と検証版のジョブが同時実行されず、各ジョブがDEVELOPER_DIRと出力先を固定できるなら、同一ノードで共存します。
  • 同時実行するが、キャッシュと署名境界を分離し、全ジョブの事前検査を強制できるなら、限定的に共存します。
  • 全体のxcode-selectをジョブごとに変更しているなら、設定をタスク単位へ移すまで共用を拡大しません。
  • 再起動後にパス、コンポーネント、署名が戻らないなら、Xcode 27の検証を独立ノードへ退避します。
  • Xcode 27 Betaの更新で正式版ジョブへ影響が出るなら、Xcode 26を固定した専用ノードへ戻します。
  • 物理デバイス、専用キーチェーン、厳格な同時実行が必要なら、最初から専用ノードを選びます。

リモートMac CIのノードを増やす場合は、まずMacHTMLのコンソールでアクセス方式と稼働状態を確認し、管理手順はMacHTMLのヘルプで照合してください。必要な期間だけ検証ノードを分ける運用なら、購入前にMacHTMLのレンタル条件と、保存するキャッシュや署名情報の扱いを確認しておくと判断しやすくなります。

よくある確認事項

FAQでは、同一Macへの導入可否、ジョブ単位の版指定、DEVELOPER_DIRxcode-selectの使い分け、共有状態、更新前の回 rollback を個別に確認できます。特にBetaを含む場合は、アプリの起動確認だけで完了扱いにしないことが重要です。

まとめ

Xcode 27とXcode 26の共存では、インストールそのものよりも、ジョブが呼び出したツールチェーンを証明できることが重要です。固定したアプリ配置、ジョブ単位のDEVELOPER_DIR、版別キャッシュ、コンポーネント確認、署名と再起動後の復旧検査を一組で運用してください。

既存のMac miniや自社サーバーを使う構成は、購入費用、保守担当者、故障時の交換、設置場所、常時接続の管理が負担になります。Linuxのクラウド環境ではXcodeとAppleの署名ツールチェーンをそのまま扱えず、仮想化構成ではmacOS要件や物理デバイス連携が別の制約になります。共存の検証結果から並列性とロールバック要件が見えたら、正式版ノードを置き換えるのではなく、Xcode 27確認用のMacHTMLリモートノードを期間限定で分ける方法を検討してください。

よくある質問

Xcode 27とXcode 26は同じMacに入れられますか?+
互換するmacOSとApple siliconの条件を満たすMacであれば、2つのXcodeを別々のアプリケーション名とパスに保存して共存させられます。ただし、アプリが起動するだけではCI投入の条件を満たしません。各版のSDK、シミュレーター、初回起動処理、署名まで個別に確認してください。
CIのジョブごとにXcodeの版を指定するにはどうしますか?+
ジョブの実行環境でDEVELOPER_DIRに対象XcodeのDeveloperディレクトリを設定し、その直後にxcodebuildとxcrunの実体を検査します。共有ノードでxcode-selectを頻繁に変更すると、並列ジョブや子プロセスへ影響が及びます。正式版とベータ版は、ジョブ定義または専用ラッパーで明示的に振り分ける方法が安全です。
DEVELOPER_DIRとxcode-selectはどちらを使うべきですか?+
ノード全体の既定値を決める場合はxcode-select、特定のコマンドやパイプラインだけを固定する場合はDEVELOPER_DIRを使い分けます。複数のCIジョブが同じMacを共有するなら、ジョブ単位のDEVELOPER_DIRを優先してください。全体設定は保守用の既定値にとどめ、ビルドの根拠にはしない構成が適しています。
複数のXcodeはシミュレーターやDerivedDataを共有しますか?+
同じユーザー領域を使うため、シミュレーターのランタイムやDerivedDataが完全に別管理になるとは限りません。版の違うSDKや生成物が混ざると、再現性の低下や古い成果物の再利用が起きます。Xcode版とパイプライン名を含むDerivedData、アーカイブ、ログの保存先を分け、必要なランタイムだけを対象Xcodeへ関連付けてください。
Xcode 27を更新する前に、どうすれば元の環境へ戻せますか?+
更新前に、Xcodeアプリの完全な保存先、ビルド番号、macOS版、SDK、必要なランタイム、署名方式、CI定義を記録します。既存のXcode 26を上書きせず、Xcode 27の新しい配置先と更新前のルーティングを残してください。更新後は再起動とジョブ再実行を行い、正式版のアーカイブが以前の経路で作れることを確認してから利用範囲を広げます。

関連記事: Xcodeの複数バージョン運用に適したCI/CD向けMac miniの性能と構成を確認する リモートMacで開発環境とシミュレーターを整える基本設定を学ぶ

Xcodeの複数環境をMacHTMLで柔軟に運用しませんか

MacHTMLなら、リモートのMac環境で正式版とベータ版のXcodeを用途別に使い分けられます。 手元のMacを変更せずに、ビルドやシミュレーター検証を進められる環境を整えられます。 開発チームで共有しやすいリモートMacを活用し、継続的インテグレーションの運用負担を抑えられます。 Xcodeの更新や検証環境の切り替えが必要な開発に、MacHTMLのリモートMacをご活用ください。

クラウド Mac mini をレンタル
Apple Silicon クラウド Mac