2026年2月26日、GitHubはmacOS 26 Runnerが一般提供になったと発表しました。公式Changelogによれば、YAMLを変更していなくても、macos-latestの実体が変わればビルド環境は変化します。

症状:YAMLは同じなのに、Xcode、依存ライブラリ、署名、キャッシュのどこかで失敗する。
最短解決策:まず実際のOS・Runnerアーキテクチャー・Xcodeをログに出し、明示的なmacOSタグで並列検証してから切り替えてください。

この手順は、まだmacos-latestを使い、実際のRunnerイメージを確認していないiOS・macOS開発者向けです。CocoaPods、SwiftPM、Node.js、Ruby、ネイティブバイナリを管理するCI担当者や、長期稼働するMac自前Runnerの導入を判断する開発基盤チームにも適しています。

macOS 26移行の影響を最初のログで判定する

GitHub Actionsのmacos-latestは現在どのシステムなのか。

固定のOS名として推測せず、実行時のログで確認してください。GitHubはラベルの意味と利用可能なRunnerを公開していますが、ラベルとイメージの対応やプリインストールソフトは更新されます。Runnerラベルの公式説明と公式Runnerイメージ一覧を、公開日の設定だけでなく実行日の確認資料として使います。

最初に診断用のジョブを一時的に追加します。

jobs:
  inspect:
    runs-on: macos-latest
    steps:
      - name: Inspect runner
        run: |
          sw_vers
          uname -m
          xcode-select -p
          xcodebuild -version
          node --version || true
          ruby --version || true
          python3 --version || true
          brew --version || true
          clang --version

このログで、YAMLのラベルではなく、OS、CPUアーキテクチャー、Xcodeのパス、主要ランタイムの実体を記録できます。2026年6月15日から7月15日にmacos-latestをmacOS 26へ移行する計画も公式告知に含まれていたため、その期間の失敗はまずラベル移行と環境差分を照合します。移行告知の記載だけで現在の対応関係を断定せず、macOS 26イメージのREADMEと当日のログを突き合わせてください。

確認対象 まず見る証拠 移行時の扱い
ラベル runs-onの値と実行ログ macos-latestだけで固定済みと判断しない
OS・イメージ sw_vers、イメージREADME 明示的なOSタグで比較する
CPU uname -m、バイナリ検査 Intel向け依存を個別に検証する
Xcode xcode-select、xcodebuild -version パスとバージョンをJob内で固定する
キャッシュ キー、復元結果、保存結果 OS・CPU・ツールチェーン差をキーに含める

macOS 15のワークフローはmacOS 26へ移行すべきか。

テスト用の無状態Jobなら、明示的なmacOS 26タグとの並列実行で互換性を確認してから移行できます。一方、Appleプラットフォームのアーカイブ、配布、署名を含むJobは、検証が終わるまでmacOS 15相当の既存環境を回退経路として残すべきです。

ワークロード 先に取るべき方針 合格条件
単体テスト・静的解析 macOS 26と旧環境を並列実行 テスト結果と依存復元が一致する
iOS・macOSビルド XcodeとSDKを明示して検証 生成物、テスト対象、警告を比較できる
リリース署名・アーカイブ 既存Jobを直ちに上書きしない 署名検証と回退演習が完了している

XcodeとSDKの差分を失敗箇所から切り分ける

macOS 26 Runnerの更新後にビルドが失敗した場合、何から確認するか。

まず、Xcodeの選択を省略していないか確認します。xcode-select -pだけでなく、xcodebuild -version、SDK一覧、対象シミュレーターをログへ出し、AppleのXcodeシステム要件とRunnerイメージの記載を照合します。

典型的な症状は、次のように分類できます。

  • コンパイルエラー:旧SDKの挙動や非推奨APIを前提にしたコードを疑います。
  • リンクエラー:Framework、SwiftPM成果物、CocoaPodsのバイナリが新しいSDKやCPUに対応しているか確認します。
  • テスト起動失敗:指定したシミュレーターのOSと、Runnerに存在するランタイムが一致しているか調べます。
  • 署名・アーカイブ失敗:証明書、プロビジョニングプロファイル、キーチェーンの作成手順をOS更新と分離して再実行します。

次の順番で移行します。

  1. macOS 26と既存の明示的なmacOSタグに同じコミットを投入します。
  2. xcode-selectで利用するXcodeパスを選択し、選択結果をログに保存します。
  3. SDK、シミュレーター、SwiftPMまたはCocoaPodsの解決結果を記録します。
  4. コンパイル、テスト、アーカイブ、署名を別Jobに分けます。
  5. 署名を伴わない検証が通った後に、配布用Jobを実行します。
  6. 旧タグで再実行できる回退用Jobを残します。

Xcode 27など、安定版として正式に提供されているか確認できないツールチェーンは、現行の本番環境と混同しないでください。テスト段階の設定を採用する場合は、Job名と成果物を本番系から分離します。

Apple SiliconとIntel依存を4種類に分けて調べる

Apple Silicon対応を「コンパイルが成功した」という一言で判断するのは危険です。GitHubの自前Runner資料でも、ラベル、OS、アーキテクチャーは別の選択要素として扱われています。自前Runnerの公式仕様を確認し、実行対象のCPUでテストしてください。

依存の種類 見える症状 検証方法
事前ビルドバイナリ 実行時にCPU不一致やロード失敗 file、lipo -infoで形式を確認
ネイティブ拡張 npm、Ruby、Python依存のビルド失敗 再ビルドログとコンパイラーを確認
スクリプトの判定 CPU名の条件分岐が誤動作 uname -mを出力して分岐を追う
生成物の互換性 別CPUで実行すると失敗 実際の対象アーキテクチャーでテスト

arm64向けにビルドできても、Intel環境で動く証明にはなりません。反対にx86_64のツールをRosetta経由で動かせても、ネイティブ依存がApple Siliconで正常に動くとは限らないため、ビルドと実行を同じCPU条件で分けて記録します。

ランタイム、キャッシュ、署名を独立した検証対象にする

macOS 26への移行で、すべてのスクリプトエラーをOSのせいにしてよいか。

いいえ。Node.js、Ruby、Python、Homebrew、Clang、OpenSSLの差異、Actionの更新、プロジェクト側の依存固定不足を分離してください。各Jobの冒頭でバージョンと実行ファイルのパスを出し、最小の再現Jobを作ります。

特にキャッシュは、古いOSやCPUで作成した成果物を新しい環境へ復元している可能性があります。GitHub Actionsの依存キャッシュ仕様に沿って、OS、アーキテクチャー、Xcode、ロックファイルのハッシュをキャッシュキーに含め、初回はキャッシュなしでも成功するか確認します。

署名Jobでは、次を別々に確認します。

  • 証明書とプロファイルが想定した対象へ入っているか。
  • 一時キーチェーンを作成する順番が変わっていないか。
  • security find-identityとアーカイブ後の署名検証結果が一致するか。
  • ログに秘密情報や署名関連の機密値が出ていないか。

ここまでの検証結果は、SSHMacのヘルプセンターにある運用上の確認項目とも照合できます。自前Runnerを追加する場合は、登録トークン、私有リポジトリへのアクセス権、Runner更新を分離し、公式のRunner登録と安全対策に従って権限を最小化してください。

判定結果を3段階の移行条件へ落とし込む

次の条件分岐で、タグ変更を一度に本番へ反映するかを決めます。

  • 無状態のテストが中心で、macOS 26と既存環境のテスト結果が一致する場合:明示的なmacOS 26タグへ移行します。macos-latestは将来の自動移行を受けるため、再現性が必要なJobでは避けます。
  • Xcode、SDK、ネイティブ依存の差分が残る場合:OSタグとXcodeを固定し、依存更新またはスクリプト修正を先に行います。リリースJobは旧環境へ回退できる状態を保ちます。
  • 固定ツールチェーン、署名ID、持続キャッシュが不可欠な場合:独立したMac自前Runnerを追加します。ホステッドRunnerとの併用にし、単一障害点にしない構成が適切です。
  • 物理USB、特定の周辺機器、長時間の固定処理が必要な場合:レンタルや自前Runnerの接続条件を先に確認します。ホステッドRunnerだけで代替できない可能性があります。

合格とする証拠は、単発の成功では足りません。連続したビルド結果、生成物の比較、署名検証、キャッシュ有無での再実行、旧環境への回退演習を記録してください。自前Runnerは安定性だけを理由に無制限の権限を与えず、リポジトリ分離、秘密情報の扱い、更新確認、利用後のワークスペース消去を運用に組み込みます。

ホステッドRunnerは毎回クリーンな環境で走る短時間のテストには扱いやすい一方、イメージ変更、依存の再取得、署名環境の再構築が発生します。固定Xcodeや長期キャッシュを優先するなら、SSHMacのMacレンタルプランで独立したMac環境を確保し、GitHub Actionsの自前Runnerとして使う方法を検討できます。

最終的には、環境差分を許容できるテストは明示タグ付きのホステッドRunner、署名と固定ツールチェーンを重視するリリースは管理可能なMacノード、という分担が現実的です。SSHMacのリモートMacを使う場合も、まず必要なXcode、CPU、接続方法、契約期間、アクセス権限を確認し、短期検証ならレンタル、長期の安定負荷なら自社保有を含めて比較してください。

最終更新:2026年8月23日。タグ対応、macOS 26イメージ、Runner仕様はGitHub Changelog、GitHub Docs、runner-images、Appleの公式資料を基に確認しています。公開時には診断Jobの実行ログで再確認してください。