GitHub ActionsのmacOSランナーには、複数のバージョンのXcodeがインストールされている。ワークフローで使うXcodeのバージョンを固定するには、sudo xcode-select -sでXcodeを切り替える。

- name: Select Xcode
  run: sudo xcode-select -s "/Applications/Xcode_26.2.app/Contents/Developer"

- name: Show Xcode version
  run: xcodebuild -version

sudoを使えない場合や、特定のステップだけで切り替えたい場合は、環境変数DEVELOPER_DIRを使う。

実行例はmacOS 27.0.1、Xcode 27.0のもの。

ランナーにインストールされているXcodeを確認する

ランナーのイメージにインストールされているXcodeは、actions/runner-imagesリポジトリの、イメージごとのREADMEに一覧がある。macOS 26のarm64のイメージは、images/macos/macos-26-arm64-Readme.mdである。

参考: actions/runner-images(macOSのイメージのREADME)

「Xcode」の節の表は、次のようになっている(イメージのバージョン20260907.0351.1)。

バージョンビルドパスシンボリックリンク
26.6(デフォルト)17F113/Applications/Xcode_26.6.app/Applications/Xcode_26.6.0.app、/Applications/Xcode.app
26.517F42/Applications/Xcode_26.5.app/Applications/Xcode_26.5.0.app
26.4.117E202/Applications/Xcode_26.4.1.app/Applications/Xcode_26.4.app
26.317C529/Applications/Xcode_26.3.app/Applications/Xcode_26.3.0.app
26.217C52/Applications/Xcode_26.2.app/Applications/Xcode_26.2.0.app
26.1.117B100/Applications/Xcode_26.1.1.app/Applications/Xcode_26.1.app
26.0.117A400/Applications/Xcode_26.0.1.app/Applications/Xcode_26.0.app

各バージョンのXcodeは、/Applications/Xcode_[バージョン].appにインストールされている。デフォルトのバージョンには、/Applications/Xcode.appのシンボリックリンクも付く。

デフォルトのバージョンは、イメージの更新で変わる。同じREADMEのお知らせには、macOS 26のデフォルトのXcodeを、2026年7月21日に26.6へ変更する告知が載っている。バージョンを指定しないワークフローは、イメージの更新でXcodeが変わる。ビルドの結果が変わる場合もある。

xcode-select -sでXcodeを切り替える

xcode-select -s(--switch)は、使用するXcodeのDeveloperフォルダを切り替える。パスには、XcodeのContents/Developerか、.appのフォルダを指定する。

$ sudo xcode-select -s "/Applications/Xcode_26.2.app/Contents/Developer"

切り替えた後は、xcode-select -pで、選択中のDeveloperフォルダを確認できる。xcodebuild -versionで、Xcodeのバージョンも確認できる。

$ xcode-select -p
/Applications/Xcode_26.2.app/Contents/Developer
$ xcodebuild -version
Xcode 26.2
Build version 17C52

ワークフローには、xcodebuild -versionのステップを残しておく。ログに、使われたXcodeのバージョンが残る。

xcode-select -sは、rootの権限で実行する。sudoを付けないと、エラーになる。

$ xcode-select -s /Applications/Xcode.app/Contents/Developer
xcode-select: error: --switch must be run as root (e.g. `sudo xcode-select --switch <xcode_folder_path>`).

xcode-select -sの設定は、マシン全体に影響する。manページにも、システムのすべてのユーザーに影響すると書かれている。自分のMacで試すと、普段使うXcodeが切り替わる。GitHubホストランナーは、GitHubがホストする新しい仮想マシンなので、設定を変更しても、普段の環境には影響しない。

GitHub ActionsのmacOSランナーは、パスワードなしでsudoを実行できる。

参考: GitHubホステッド ランナー リファレンス

DEVELOPER_DIRで切り替える

環境変数DEVELOPER_DIRを設定すると、sudoを使わずに、Xcodeを切り替えられる。DEVELOPER_DIRの値は、システム全体の設定より優先される。値には、Contents/Developerのフォルダと、.appのフォルダのどちらも指定できる。

$ DEVELOPER_DIR=/Applications/Xcode.app xcodebuild -version
Xcode 27.0
Build version 27A266a
$ DEVELOPER_DIR=/Applications/Xcode.app xcode-select -p
/Applications/Xcode.app/Contents/Developer

GitHub Actionsでは、ステップのenvに指定すると、そのステップだけで使われる。

- name: Build
  env:
    DEVELOPER_DIR: /Applications/Xcode_26.2.app/Contents/Developer
  run: xcodebuild -scheme [スキーム名] build

ジョブ全体で使うときは、ジョブのenvに指定する。

優先順位を確認する

Command Line ToolsをDEVELOPER_DIRに指定すると、システム全体の設定がXcode.appでも、DEVELOPER_DIRの値が優先される。

$ xcode-select -p
/Applications/Xcode.app/Contents/Developer
$ DEVELOPER_DIR=/Library/Developer/CommandLineTools xcode-select -p
/Library/Developer/CommandLineTools
$ DEVELOPER_DIR=/Library/Developer/CommandLineTools xcrun --find clang
/Library/Developer/CommandLineTools/usr/bin/clang

Command Line Toolsにはxcodebuildが含まれない。xcodebuildは、エラーで終了する。

$ DEVELOPER_DIR=/Library/Developer/CommandLineTools xcodebuild -version
xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
$ echo $?
1

存在しないXcodeを指定する

イメージにインストールされていないバージョンをDEVELOPER_DIRに指定すると、xcrunがエラーで終了する。

$ DEVELOPER_DIR=/Applications/Xcode_26.2.app/Contents/Developer xcodebuild -version
xcrun: error: missing DEVELOPER_DIR path: /Applications/Xcode_26.2.app/Contents/Developer
$ echo $?
1

固定したバージョンがイメージから外れると、DEVELOPER_DIRを指定したステップは、同じエラーで失敗する。ランナーのイメージのREADMEで、固定するバージョンが一覧にあるかを確認する。

どちらの方法を選ぶか

方法sudo影響の範囲向いている場面
sudo xcode-select -s必要ジョブの以降のステップすべてジョブ全体で同じXcodeを使う
DEVELOPER_DIR不要envを指定したステップかジョブ特定のステップだけ別のXcodeを使う

ジョブ全体でXcodeを固定するなら、ジョブの最初のステップでxcode-select -sを実行する。ステップごとに別のバージョンを使うなら、DEVELOPER_DIRをステップのenvに指定する。

スクリプトの中でツールの場所を調べるときは、xcode-select -pの出力を使わず、xcrun --findを使う。manページでも、xcode-select -pは確認用で、スクリプトやツールはxcrunを使うよう勧めている。

$ xcrun --find xcodebuild
/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild

参考: 【xcrun】Xcodeに含まれるツールのパスを調べる (--find)