GitHub Actions で xcodebuild でのビルドに失敗する
Cannot infer contextual base in reference to member 'allCases'
はい。
上記のようなエラーは型推論が効いている場合に型名を省略できるというやつがうまく動かない場合(もしくはなにもないところに .
を入れたりして、型推論させたいっぽいなと Xcode が思ったものの当然失敗する場合)に発生するエラーです。
Text("この機能の正式な名前知らないんだよね")
.foregroundColor(.white) // <- これ! Color.white の代わりに .white と書ける
手元の Xcode や xcodebuild でテストを実行した場合はビルドに成功するのに、GitHub Actions で実行すると失敗するというケースです。なので、単純なシンタックスエラーではないです。
原因
手元の Xcode のバージョンは 12.5.1 でしたが、GitHub Actions で使われていたのは 12.4 でした。おそらくこれが原因だと思います。(おそらく、というのは、ぼくが Xcode 12.5 のアップデートについて詳細を知らないからです。多分、型推論周りで修正があったんじゃないのかと思ってます。IDEに任せて「いけそうならよし」でコードを書いてると、できることが増えてもいつそうなったのか気づかない愚かさを露呈していますね)
なぜ Xcode のバージョンが違ったのか
なぜ GitHub Actions の実行環境で 12.4 が使われたのか。
GitHub Actions の Workflow には実行環境を記述する項目があります。例えば、デフォルトの Swift の Workflow を(GitHub にレコメンドされるままに)導入すると、2021年9月14日時点で以下のようなファイルが .github/workflows/swift.yml
として追加されます。
name: Swift
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- name: Build
run: swift build -v
- name: Run tests
run: swift test -v
runs-on: macos-latest
を見てください。最新の MacOS で動作するように見えますよね。
GitHub Actions の仮想環境についてのドキュメントは GitHub にあるようです。
macos-10.13-Readme.md
macos-10.14-Readme.md
macos-10.15-Readme.md
macos-11-Readme.md
なるほど。どう見ても macos-11 が最新ですね。(2021年9月14日現在)
こちらのファイルの内容を確認する限り、Xcode 12.5 もインストールされてそうです。しかし、実際に上記のファイルをいじって xcodebuild を使ってみると、実行される xcodebuild のパスは以下のようになっています。
/Applications/Xcode_12.4.app/Contents/Developer/usr/bin/xcodebuild
macos-11 に記述されている Xcode 12.4 のパスと一致していますね。一致しているのはいいんですが、12.5.1 がインストールされているはずなのに、なぜ 12.4 が実行されるのか?
……ていうか、そもそも不自然な点があります。
じつはこのコンパイルエラーとは無関係に、ほかのプロジェクトでも違和感を感じていたのですが、GitHub Actions の macos-latest 環境で iOS 14.5 が利用できない状態なのです。14.4 まではむしろ、古いバージョンのサポートがすぐに切られて(むしろ macos-latest が切り替わって?)、外部要因でビルドが通らなくなったりして困っていたのですが、iOS 14.5 のリリース時にはそのようなことは起こりませんでした。
実際、今回 GitHub Actions を導入したプロジェクトでも、なぜか iOS 14.5 でビルドできない(そんな destination ないよ、って言われてしまう)という不可解がありました。
xcodebuild: error: Unable to find a destination matching the provided destination specifier:
{ platform:iOS Simulator, OS:14.5, name:iPhone 12 Pro Max }
はい。
要するに、macos-latest は macos-11 ではなく macos-10.x だったということなんですね。なんでやねん。
解決法
jobs:
build:
runs-on: macos-11
これで無事、Xcode 12.5.1 の xcodebuild が動作し、iOS バージョンも 14.5 で実行できました。(テストは失敗してました)
参考文献
ないですが、GitHub が macos-latest についてなにかコメントを出していたりしそうな気はします。
(追記)
調べたら Issue あったわ。まだ macos-latest は macos-11 にセットされてないというのが前提に書かれてて草だった。
ていうかドキュメントに書いてある。
The macos-latest label currently uses the macOS 10.15 runner image.
Discussion