Bitrise でビルドは通るけど XCTest がコケるのを直した話を書きます。
encountered an error (Early unexpected exit, operation never finished bootstrapping - no restart will be attempted. Underlying error: Test runner exited before starting test execution.)
こういうエラーが出て困っていました。
結論
Bitrise 上の Carthage のバージョンが古く xcfilelist に対応していなかったが最新版に更新したら直った。
原因
上記のエラーは調べてみるとわかりますが使用しているライブラリがリンクされていないことが原因だということがわかります。
参考リンク
- Test target X encountered an error (Early unexpected exit, operation never finished bootstrapping – no restart will be attempted
- [覚書]XCodeでユニットテスト時のエラー
直接の原因はこれのようです。
しかし上記のリンク先のとおりやってみても直りませんでした。
xcodebuild のログを見る
Xcode Test for iOS ステップはビルド失敗時に Bitrise のビルドのログとは別にログを吐いてくれるのでそれを見てみると
dyld: Library not loaded: @rpath/Result.framework/Result
何やら見慣れたエラーが出ていました。
これは Carthage のライブラリがコピーされていないときによく見るエラーです。
というわけで Carthage の設定が怪しいと目星をつけました。
しかし carthage copy-frameworks
はちゃんと Build Phase に組み込んであるし…。
原因を作った原因
と、悩んだのですが Xcode 10 から使えるようになった .xcfilelist
を利用していたことを思い出しました。
Carthage が .xcfilelist
に対応したのは 0.31.1 からですが
Bitrise 上の Carthage のバージョンは 0.30.1 でした。
これが原因だったわけですね。
→ Carthage | 0.31.1 – Ubiquitous Upbeat
Bitrise 上の Carthage のバージョンを更新する
というわけで考えられる選択肢は 2 つ。
- Carthage 自体のバイナリをリポジトリに含めてそれを使う
- Bitrise 上の Carthage のバージョンを更新する
確実なのは前者ですがお手軽そうな後者のほうを選びました。
Bitrise 上の Carthage の更新方法は下記のページに書かれていました。
Bitrise Discuss | Update Carthage to last version
Bitrise Discuss というのは Bitrise 用の質問掲示板みたいなものっぽいです。
上記の回答の通り workflow の Do anything with Script step
で Carthage を更新すると無事ビルドが通りました。
#!/bin/bash
set -ex
brew upgrade carthage
教訓
ローカル環境では成功するのに CI 上でうまくいかないときは依存関係から見直す。