Vuncloud ブログ
← ブログに戻る

Xcode 27 GitHub Actions セルフホストRunner構築

Xcode 27 betaを本番環境へ一括導入せず、Xcode 26.6を残したまま独立したApple Silicon Macへ検証用Runnerを追加する手順を解説します。環境要件、Runnerの常駐化、ワークフロー分離、署名検証、失敗時の切り戻しまで時系列で確認できます。约 3 分で読める

Xcode 27 GitHub Actions セルフホストRunner構築 — Vuncloud

2026年7月31日時点で、AppleはXcode 27 beta 4についてApple Silicon MacとmacOS Tahoe 26.4以降を要求しています。したがって、今週の判断は明確です。Xcode 26.6を本番用に残し、独立したApple Silicon MacへXcode 27のセルフホストRunnerを追加する二系統移行を選びます。全量切り替えは、ビルド、テスト、署名、Archiveの検証が終わるまで保留してください。 (Appleのシステム要件)

最終更新日:2026年7月31日。 Xcodeの対応表、Xcode 27 Release Notes、GitHub ActionsのRunner仕様とChangelogを照合しています。Appleの次回ベータ、Release Candidate、正式版の公開、またはGitHubのxcode-27ラベルや対応アーキテクチャの変更があった場合は、環境要件を再確認してください。

今週の移行判断を先に固定する

Xcode 27 GitHub Actions セルフホストRunnerを導入する際に避けるべきなのは、既存の本番Runnerへベータ版を上書きすることです。Xcode 27 beta 4はApple Silicon専用で、macOS Tahoe 26.4以降が必要です。一方、Appleのシステム要件表ではXcode 26.6が安定版として掲載され、macOS Tahoe 26.2以降に対応しています。(AppleのXcodeシステム要件)

また、GitHubが提供するxcode-27のホストRunnerは2026年7月16日に公開プレビューとなりましたが、ARM64専用であり、従来のIntel向けRunnerとは扱いが異なります。これは互換性確認には使えますが、署名鍵や社内リソースを含む本番処理を、検証なしで移す根拠にはなりません。(GitHub Changelogの公開プレビュー告知)

状況 今週の選択 本番への影響
現行アプリがXcode 26.6で安定し、Xcode 27向けSDKの検証を急がない Xcode 26.6を継続 既存Jobを変更しない
iOS 27 SDK、Swift 6.4、Xcode 27固有の挙動を確認したい 独立したXcode 27 Runnerを追加 検証用ブランチとJobだけを対象にする
署名、UIテスト、第三者ライブラリが未検証 全量移行を延期 Xcode 26.6を既定値として維持する

この判断は、Xcode 27の新機能を評価する記事ではありません。目的は、現在のiOS CI/CDを止めずに、次のツールチェーンを実際のプロジェクトで検証できる状態へ移すことです。

この手順の対象は、iOSまたはmacOS CI/CDを担当するDevOpsエンジニア、手元にApple Silicon MacがなくSSHで長時間稼働するビルド環境を必要とする開発者、複数アプリの切り戻し条件を決める開発責任者です。単にXcodeをローカルで試したいだけなら、ここまでのRunner分離は必要ありません。

移行前に主ホストとパイプラインの境界を確認する

最初に確認するのは、Xcodeのインストール方法ではなく、検証用Macが本番Jobを受け取らない設計になっているかです。セルフホストRunnerはオンラインで待機しているホストがJobを実行するため、ラベルやRunner Groupを誤ると、Xcode 27の検証Jobだけでなく既存のArchive処理まで同じマシンへ送られる可能性があります。(GitHub公式のセルフホストRunner仕様)

確認項目 Xcode 27検証ノードの条件 未達時の対応
チップ Apple Silicon、Runner上でARM64を確認 Intel Macを候補から外す
OS macOS Tahoe 26.4以降 OS更新後に再確認する
権限 Runner登録、サービス登録、Xcode選択に必要な管理者権限 管理者作業と運用作業を分ける
接続 SSH接続、外向きHTTPS、GitHub関連ドメインへの接続 ファイアウォールと許可リストを確認する
常時稼働 ログアウトやSSH切断後もRunnerがオンライン launchdサービスとして登録する
作業領域 DerivedData、Simulator、依存キャッシュ、Archiveを分離できる保存領域 容量不足ならJobを開始しない

GitHubの公式仕様では、RunnerはGitHubへ接続してJobを受け取るため、外向きHTTPSの443番ポートと、ワークフローに応じたGitHub関連ドメインへの接続が必要です。通信要件として最低70kbpsの送受信速度も記載されていますが、これはXcodeやSimulatorの実用的な性能を保証する数値ではありません。大きな依存関係やSimulatorランタイムの取得を想定する場合は、帯域だけでなく遅延と保存領域も確認します。

次に、既存ワークフローから以下を一覧化します。

  • xcodebuildが参照するXcodeのパス
  • Swiftの言語モードとコンパイラー
  • 使用するSDK、Simulator、テスト対象OS
  • Swift Package Manager、CocoaPodsなどの依存キャッシュ
  • 証明書、Provisioning Profile、Keychainの参照方法
  • Archive、署名、配布処理を実行するJob
  • 本番ブランチ、Pull Request、手動実行のトリガー

Xcode 26.6とXcode 27を同一ホストに入れる構成も技術的には可能ですが、同じDerivedDataやSimulatorの状態を共有すると、ツールチェーン差分ではなくキャッシュ汚染が原因の失敗を生みます。初回移行では、ホスト自体を分けるほうが診断しやすく、失敗時の切り戻しも短くなります。

注意: Xcode 27のRelease Notesには、並列テスト時に複数プロセスの標準出力・標準エラーが遅延する既知の問題や、SimulatorデバイスがDevice Hubに表示されない可能性が記載されています。テスト失敗だけでなく、ログの遅延やSimulator検出の異常もベータ版固有の問題として記録してください。(Xcode 27 Beta Release Notes)

最初の1時間でRunner登録と常駐化を終える

1. 登録範囲をリポジトリ単位で決める

検証対象が1つのアプリだけなら、まずリポジトリ単位でRunnerを登録します。複数アプリで共用する場合でも、最初から組織全体へ公開せず、Xcode 27の検証用Runner Groupを作り、対象リポジトリだけを許可する構成が安全です。

GitHubではリポジトリ、組織、エンタープライズの各階層でセルフホストRunnerを追加できます。Runner Groupでは、利用できるリポジトリやワークフローを制限できます。(GitHub公式のRunner管理手順)

2. Apple SiliconとXcode 27をラベルで識別する

Runnerの登録時には、既定ラベルに加えて、例えば次のようなカスタムラベルを付けます。

runs-on: [self-hosted, macOS, ARM64, xcode-27, validation]

ラベルは累積条件です。上記の場合、self-hostedmacOSARM64xcode-27validationのすべてを持つRunnerだけが候補になります。GitHub公式ドキュメントでも、OS、アーキテクチャ、用途を組み合わせたラベル指定が案内されています。(ラベルによるRunner選択)

ラベル名だけで実機の状態が検証されるわけではありません。GitHubは、設定時に与えられた既定ラベルが実際のOSやアーキテクチャと一致するかを検証しないため、Runner上でuname -msw_versxcodebuild -versionを実行し、ログへ出力してください。

3. Runnerをサービスとして登録する

Runnerの展開ディレクトリで公式のサービス登録手順を実行し、Macの起動時にRunnerが立ち上がるようにします。GitHubの管理手順では、Runnerアプリケーションをサービス化すると、ホスト起動時に自動開始できると説明されています。

登録後は、次の順で確認します。

  1. Macを再起動する。
  2. SSHで接続し、Runnerサービスの状態を確認する。
  3. GitHubのRunner一覧でオンライン表示を確認する。
  4. uname -msw_versxcodebuild -versionを出力する最小Jobを実行する。
  5. SSH接続を閉じた状態でもJobが完了することを確認する。

オンラインにならない場合は、まずサービスのログ、外向き443番ポート、登録トークンの期限、Runnerディレクトリの権限を確認します。Jobが待機したままなら、ラベルの綴り、Runner Groupの許可対象、RunnerがIdle状態かどうかを確認します。

二系統ワークフローでXcodeの選択を固定する

本番用Jobを変更せず、検証用Jobを追加するのが基本です。xcode-selectをホスト全体へ常時適用するのではなく、各Jobの冒頭で使用するDeveloper Directoryを明示します。

Job Runner指定 Xcode選択 実行条件
Production Build xcode-26-6 Xcode 26.6 既存の本番ブランチ、通常のRelease処理
Xcode 27 Validation xcode-27validation Xcode 27 beta 手動実行、検証ブランチ、限定したPull Request
Signing Acceptance xcode-27signing-validation Xcode 27 beta 承認済み環境でのみ実行
Rollback Build xcode-26-6 Xcode 26.6 Xcode 27側の失敗時に実行

Xcodeのパスは環境に合わせて置き換えます。重要なのは、Jobの途中で暗黙に現在の選択状態へ依存しないことです。

jobs:
  xcode27-validation:
    if: github.event_name == 'workflow_dispatch' || github.ref == 'refs/heads/xcode27-validation'
    runs-on: [self-hosted, macOS, ARM64, xcode-27, validation]
    steps:
      - uses: actions/checkout@v6

      - name: Print toolchain
        run: |
          sudo xcode-select -s "/Applications/Xcode-27-beta.app/Contents/Developer"
          uname -m
          sw_vers
          xcodebuild -version
          xcodebuild -showsdks

      - name: Build and test
        run: |
          xcodebuild \
            -workspace App.xcworkspace \
            -scheme App \
            -destination 'platform=iOS Simulator,name=iPhone 17' \
            clean test

actions/checkoutのバージョンはプロジェクトの採用状況に合わせて固定し、サンプルをそのまま本番へコピーしないでください。Xcode 27ではSDKやSwiftの挙動だけでなく、Simulatorの識別、依存関係の解決、署名処理のログも比較対象になります。

分離対象 Xcode 26.6 Xcode 27 分離方法
DerivedData 本番用パス 検証用パス -derivedDataPathをJobごとに指定
依存キャッシュ 安定版キー ベータ版キー Xcode、Swift、OSをキーへ含める
Simulator 本番テスト用 検証用ランタイム デバイス名とOSを固定し、存在を事前確認
Archive リリース候補 検証専用 出力ディレクトリと保存名を分ける
署名情報 本番Secrets 承認済み検証Secrets EnvironmentとRunner Groupを限定する

キャッシュキーへXcodeのバージョンを含めない設計は避けます。Xcode 26.6で生成した中間生成物をXcode 27が再利用すると、再現性のない失敗が発生し、切り分けに余計な時間がかかります。

初日に実プロジェクトで受け入れを記録する

最初の検証対象は、最重要の本番アプリではなく、依存関係、テスト、署名の構成が本番に近い非中核プロジェクトが適しています。単純なコンパイルだけでは、Xcode 27への移行可否を判断できません。

受け入れ段階 実行内容 合格の判断 不合格時の次の処理
依存解決 パッケージ取得、依存キャッシュなしの初回実行 取得と解決が完了する 依存ライブラリとSwift互換性を確認
コンパイル Debug、Releaseのビルド 警告とエラーを記録して完了 Xcode 27 Release Notesと差分を照合
単体テスト 並列実行を含む既存テスト 失敗、停止、ログ遅延を記録 並列性を下げて再現性を確認
UIテスト 指定Simulatorで実行 デバイス検出とテスト完了 SimulatorランタイムとDevice Hubを確認
Archive 配布用Archiveを生成 生成物が保存される Build Settingsと署名設定を確認
署名検証 Exportまたは署名確認 想定Bundle IDとProfileが一致 SecretsとKeychainを分離して再実行

各段階で、次の情報をArtifactとして保存します。

  • 実際のXcode、Swift、SDK、macOS、アーキテクチャ
  • xcodebuildのコマンドと主要なBuild Settings
  • 依存解決の結果とキャッシュキー
  • Simulatorのデバイス名、OS、ランタイム
  • Archiveの識別情報と署名検証結果
  • 失敗したJobの完全なログと再現条件

AppleのXcode 27 Release Notesには、修正済みの問題と既知の問題が掲載されています。失敗したら、最初からプロジェクトコードの不具合と決めつけず、Release Notes、第三者ライブラリ、Runner環境、署名設定の四つへ分類します。

初週の切り戻し条件と権限分離を決める

Xcode 27のJobが一度失敗しただけで全量切り戻す必要はありませんが、同じ失敗が環境初期化後にも再現し、単体テスト、UIテスト、Archive、署名のいずれかに影響する場合は、Xcode 26.6を既定の本番経路へ戻します。

切り戻しは、Runnerラベルを削除するだけで終わらせません。Xcode 27側で生成したキャッシュをXcode 26.6側へ流さず、検証用Artifactを保管し、同じコミットをXcode 26.6で再実行して差分を比較します。

GitHubは、公開リポジトリでセルフホストRunnerを使うことをほぼ避けるべきだと説明しています。ForkからのPull RequestがRunner上でコードを実行し、秘密情報やホスト環境へ影響を与える可能性があるためです。(GitHubの安全利用リファレンス)

運用上は、次の境界を固定します。

  • Xcode 27 Runner Groupは対象リポジトリだけに許可する
  • 公開リポジトリのPull Requestを署名用Runnerへ送らない
  • 秘密情報を使わないビルド、テスト、署名検証を別Jobに分ける
  • 本番証明書を検証ノードへ常時保存しない
  • 署名Jobは承認済みEnvironmentと限定ワークフローからのみ起動する
  • Runnerの管理者権限とアプリ開発者の変更権限を分離する

GitHubのRunner Groupは、リポジトリだけでなく利用ワークフローを限定する用途にも使えます。Xcode 27の検証段階では、署名を含むJobを少数の承認済みワークフローへ閉じ込める設計が適しています。

切り替え前の可否判定チェックリスト

  • [ ] Apple SiliconとmacOS Tahoe 26.4以降をRunner上で確認した
  • [ ] Xcode 27の実パスとXcode 26.6の実パスをJobごとに固定した
  • [ ] xcodebuild -version、Swift、SDK、CPUアーキテクチャをログへ出した
  • [ ] Xcode 26.6とXcode 27でDerivedDataとキャッシュを分離した
  • [ ] 検証RunnerのラベルとRunner Groupを確認した
  • [ ] Mac再起動後もRunnerがオンラインになることを確認した
  • [ ] SSH切断後も最小Jobが完了した
  • [ ] 依存解決、コンパイル、単体テスト、UIテストを実行した
  • [ ] Archiveと署名検証を実行し、生成物を保存した
  • [ ] Xcode 27失敗時にXcode 26.6へ戻す手順を実行した
  • [ ] 公開リポジトリや未信頼のPull Requestを署名用Runnerから除外した
  • [ ] 初週のログと失敗分類を担当者が確認した

よくある判断をFAQで確認する

FAQの回答は、Xcode 27 beta 4、Xcode 26.6、GitHub Actionsの公式仕様に基づいています。正式版の公開日や将来の互換性は、AppleまたはGitHubが明示するまで移行計画の前提にしないでください。

Xcode 27 GitHub Actions セルフホストRunnerを今すぐ本番化すべきですか

本番の既定ツールチェーンを直ちにXcode 27へ変更する段階ではありません。Xcode 26.6を残し、Xcode 27を独立したApple Silicon Macで検証し、ビルド、テスト、Archive、署名が安定してから対象ブランチを段階的に広げます。

Runnerがオフラインになった場合はどこから確認しますか

Macのサービス状態、Runnerログ、外向き443番ポート、GitHub関連ドメイン、Runner Groupの割り当てを順番に確認します。GitHub上でオンラインでもJobを受け取らない場合は、ラベルの組み合わせとRunnerがIdle状態かどうかを確認してください。

本番移行を急がず、必要な期間だけMac環境を分ける

ローカルMacをCI用に常時稼働させる方法は、電源管理、ネットワーク到達性、OS更新、画面ロック、ストレージ消費、担当者不在時の復旧を開発チーム側で負担することになります。LinuxのクラウドサーバーだけではXcodeとApple SDKを扱えず、仮想化環境ではApple Silicon、Simulator、署名、macOSの更新条件が別の制約になります。

そのため、短期のXcode 27検証や移行期間だけ、root権限とSSH接続を確保できるApple Silicon Macを使う構成は、専用実機を購入するより運用上の切り分けがしやすい選択肢です。VuncloudのMacレンタル環境を検討する場合も、まずは非本番ブランチでRunner登録、サービス常駐、署名なしの検証Jobを通し、その後に必要な権限と秘密情報の扱いを確認してください。

ただし、長期にわたり高頻度の本番ビルドを継続し、物理デバイス接続や専用ネットワーク機器が必要なチームには、自社管理のMac実機のほうが適しています。逆に、Xcode 27の検証期間だけMacが必要、Apple Silicon環境をまだ保有していない、SSHで管理できる一時的なCIノードが必要という条件なら、利用前のサポート情報を確認し、Vuncloudのサービス概要と自社のRunner権限設計を照合するのが現実的です。

検証用Macを、必要な期間だけVuncloudでご用意いただけます

Vuncloudなら、独立したMac環境を検証用のセルフホストRunnerとして利用し、本番環境への影響を抑えながら開発環境を確認できます。

Apple Silicon搭載Macを遠隔で利用できるため、専用機材を購入せずにビルドや署名検証の環境を整えられます。

Cloud Mac プランを見る

開発ノート · CI/CD

専用 Cloud Mac ノード

Xcode · Swift · MCP · AI 自動化

Cloud Mac プランを見る
期間限定 プランを見る