Bitriseでビルド&テストする前にローカルでビルド&テストをデバッグしたい

ユニットテストを実装し、ローカルでテストがパスすることが確認できた。
コードをプッシュしてBitriseでテストできるように設定しよう。

...ビルドが失敗する。。
たぶんこの設定がおかしいんだな。もう一度プッシュしてビルド!

...ビルドが失敗する。。

この繰り返し、辛いですよね。

コードをプッシュしてBitriseでビルドをする前にローカルでBitriseのビルドを再現できると良さそうです。

Bitriseで実行されているコマンドを取得する

Bitriseのビルドログを見てみると、XCode Test for iOSステップで以下のコマンドが実行されていることがわかります。

$ set -o pipefail && env "NSUnbufferedIO=YES" xcodebuild "-project" "/Users/vagrant/git/BambooCIApp.xcodeproj" "-scheme" "BambooCIApp" "build" "COMPILER_INDEX_STORE_ENABLE=NO" "test" "-destination" "id=4422D9E7-5596-4817-B7CA-0B4E211E7C61" "-resultBundlePath" "/var/folders/6q/wgy6jtp12w5gzgm9lzcglpqw0000gn/T/XCUITestOutput498033798/Test.xcresult" | xcpretty "--color" "--report" "html" "--output" "/Users/vagrant/deploy/xcode-test-results-BambooCIApp.html"

f:id:bamboohero:20210420014237p:plain:w900

ローカルでビルド&テストする

Bitriseで実行されているコマンドには色々とオプションがついていますが、ひとまず以下を実行してビルドできるかを試してみるのが良いと思います。
XCode Test for iOSステップでxcodebuildコマンドにオプションを渡している場合は、それらのオプションも指定した方が良いですね。

$ xcodebuild -scheme BambooCIApp build test -destination "id=C3060FCF-0426-4B6D-83B8-6628440DAD7D"

ここで、"id=xxx"の部分だけ説明しておきます。
xxxの部分はテストを実行するデバイスのIDを示しています。
デバイスのIDは以下のコマンドで一覧を見ることができます。

$ xcrun xctrace list devices

== Devices ==
C02YP0CZJGH5 (51DA8B48-F3E9-53A7-BC0D-FFF7A92D4564)

== Simulators ==
...
iPad Pro (9.7-inch) (13.7) (DC49DB18-4AC1-4701-BC3C-14DE0942A3F3)
iPad Pro (9.7-inch) (14.4) (E8A938CC-EA9A-42F1-9986-3A81C1821107)
iPhone 11 (13.7) (3CDFDC16-2864-4975-9226-C1EB54D97385)
iPhone 11 (14.4) (9E8BCD39-1B7A-4A0C-A7BC-DEA292097E9C)
...
iPhone 12 (14.4) (C3060FCF-0426-4B6D-83B8-6628440DAD7D)
iPhone 12 (14.4) + Apple Watch Series 5 - 44mm (7.2) (F984D465-BFEE-4117-A420-0B9923AD9A0F)
...

instruments -s devicesというコマンドを使うという記事を良く見ますが、instrumentsコマンドはdeprecatedになっているようです

C3060FCF-...はiPhone12のシミュレーターのIDです。

ローカルでビルド&テストが実行できることを確認してからBitriseの設定を行えると捗りますね!