macos-15 と macos-26 で xcrun simctl list に何分もかかる:最初の呼び出しは simdiskimaged がシミュレーターのランタイムをマウントし、中を歩き終わるまで待つ
GitHub のホストの macos-15 と macos-26 のランナー(Apple Silicon)では、ジョブで最初の xcrun simctl が simdiskimaged を起動し、それがシミュレーターのランタイムのイメージをマウントします。多くの VM では、残りをマウントする前に1つ(ときに2つか3つ)のランタイムのファイルの木を全部たどり、コマンドはそれを待ちます。そのため最初の xcrun simctl list -j devices は最大2.5分かかり、2回目からは2.5秒もかかりません(runner-images #15247・イメージごとに30ジョブで測った報告)。イメージの担当者は調べると答えています。
見え方
それだけでは何も落ちず、最初のシミュレーターのステップが遅いだけです。落ちるのは、その呼び出しのまわりに短い時間の制限があるときです。あるプロジェクトのセットアップのスクリプトは xcrun simctl list devices --json に30秒しか与えておらず、ホストの macOS のランナーではときどき切れます(OpenCine #111):
TimeoutExpired(['xcrun', 'simctl', 'list', 'devices', '--json'], 30)
そのスクリプトを使うシミュレーターのテストは、どれも何もテストしないうちに落ちえました。シミュレーターを並べたり起動したりするテストランナーやビルドのツールも同じ最初の呼び出しをするので、待ちがそれらのタイムアウトの中に入ることもあります。自分のジョブで見るには、2回続けて時間を測ります:
- run: time xcrun simctl list -j devices > /dev/null - run: time xcrun simctl list -j devices > /dev/null
測った数字
報告から(1行あたり30ジョブ・3コア 7 GB のランナー):
macos-15・イメージの CoreSimulator 1051.17.8:30ジョブのうち26でランタイムをたどり、最初の呼び出しは中央値33.7秒・6.6〜152.9秒。macos-26・イメージの CoreSimulator 1051.55:30のうち11でたどり、中央値7.3秒・5.0〜65.9秒。xcode-27・CoreSimulator 1174.20:たどったジョブは0、中央値4.0秒・2.6〜8.0秒。- ジョブの中で CoreSimulator 1174.9.2 を入れると、
macos-15(中央値8.6秒)でもmacos-26(中央値4.0秒)でも、たどったジョブは0でした。
つまり、Xcode 16 と Xcode 26 のリリースが入れる CoreSimulator 1051 で起きます。どのランタイムをたどるかは VM ごとに違い、iOS・tvOS・watchOS・visionOS のどれも出てきます。Intel のイメージは試されていません。
効かないこと
- 待つこと:ジョブが始まって3分後、VM が起動して13分たってから最初の呼び出しをしても変わりませんでした。
simdiskimagedは、最初のsimctlが起動するまで動いていません。 - 呼び出しの前の
xcodebuild -runFirstLaunchも変わりませんでした。 - ジョブの早いうちに
xcrun simctl listを裏で始めても、たどる時期が早まるだけです。ジョブはその時間を払い、すぐあとでシミュレーターが要るならやはり待ちます。
テストのタイムアウトに入れない
- 最初の
simctlの呼び出しには余裕を:30秒でなく数分の制限か、やり直しを付けます。シミュレーターを並べたり起動したりするツールの最初のステップも同じです。 - 最初の呼び出しを、ビルドとテストの前の独立したステップにします。待ちはそこに出て時間もログに残り、テストランナーのタイムアウトの中には入りません:
- name: Mount the simulator runtimes run: time xcrun simctl list -j devices > /dev/null timeout-minutes: 5
- Xcode 27 に移れるなら、
xcode-27のイメージではたどりません。シミュレーターのデバイスには別の落とし穴があります(xcode-27 と iOS 27.1 のシミュレーター)。 - 報告者は、
xcode-27のイメージの Xcode にあるXcodeSystemResources.pkgを Actions のキャッシュでジョブの間に渡し、macos-15とmacos-26に入れることも試しました。CoreSimulator 1174 になってたどらなくなり、古い Xcode でもシミュレーターが起動して小さなxcodebuild testが通りました。確かめたのはそこまでなので、直し方でなく試しとして扱います。 - イメージの側の変更は runner-images #15247 で追えます。
見分け方
- 最初の
simctlだけが遅く、2回目は速い:このページです。 - 「Unable to find a device matching the provided destination specifier」:そのシミュレーターのランタイムにデバイスが無い(xcode-27 のランナー)。
- 「xcrun: error: unable to find utility "simctl", not a developer tool or in PATH」:選ばれている開発者ディレクトリが Xcode でなく Command Line Tools です。
sudo xcode-select -s /Applications/Xcode.appで Xcode を選びます。 - ジョブが時間の上限で「The job has exceeded the maximum execution time」と止まる:実行時間の上限。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べるので、シミュレーターを待って時間切れになったステップがすぐ分かり、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標、Apple・Xcode・macOS は Apple Inc. の商標です。このページはそのいずれとも提携しておらず、承認も受けていません。
ほかに:xcode-27 のランナー · macOS 14 の終わり · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English