社内でBitriseの面倒を見るBitriseおじさんのエラー解決Tips

どうも、ディップでBitriseおじさんをやっている e-takazawaと申します。
もともとAndroidエンジニアでしたが、今は自社でプロジェクトマネージャーをしながらBitriseの面倒を見ています。

みなさんの会社にもJenkinsに何か問題が会った時に解決してくれるJenkinsおじさんがお一人はいるかと思いますが、弊社にもBitriseで何か問題があったときに解決してくれるBitriseおじさん（つまり私）がいます。

Bitriseはとても優秀で簡単に使いやすいCIサービスですが、利用していて、突然「昨日までビルドできたのに今日はビルドできなくなった！」とかが普通に起こる（起きてきた）ので、今回の記事では実際に解決してきたエラーについて書いていこうかなと思います。

どうしてこんな記事を書こうかなと思ったかというと、AndroidアプリのエンジニアにとってCIのエラーログは中々わかりづらかったり、すぐにエラーの原因に気づかないことが多かったりすることがよくあるからです。（だからこそ私がBitriseおじさんたり得るのですが。）

# 対象としている方
おそらくエラーログでググってきた人向けになると思うので、gitやシェルのエラーログの内容に？と思ってしまう人向けになると思います。
Bitriseに慣れている人はスルーしてもらって大丈夫です。

# git clone でエラー

まずはエラーログです。

```shell
Git clone repository
=> git "init"
=> git "remote" "add" "origin" "git@github.com/xxxx.git"
=> git "fetch"
=> git "checkout" "xxxx"
Checkout failed, error: error: pathspec 'xxxx' did not match any file(s) known to git.
Retry with fetching tags...
=> git "fetch" "--tags"
=> git "checkout" "xxxx"
Checkout failed, error: error: pathspec 'xxxx' did not match any file(s) known to git.
Failed, error: error: pathspec 'xxxx' did not match any file(s) known to git.
```

ビルドするブランチのパスが間違っているだけですね。
ビルドするブランチを見直してもらえればとよいかと思います。

# org.gradle.api.internal.tasks.compile.CompilationFailedExceptionが起きた。

エラーログから。

```java

Caused by: org.gradle.api.internal.tasks.compile.CompilationFailedException: Compilation failed; see the compiler error output for details.
	at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:51)
	at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:36)
	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:99)
	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:52)
	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:37)
	at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:35)
	at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:25)
```

ちょっと見慣れないExceptionで面を食らう方もいるかと思いますが、落ち着いてください。
**ただのコンパイルエラーです。**

よくありがちなのが、ずっと開発ビルドで作業していて本番リリース用のResourceファイルを修正し忘れていた時に、Bitriseで本番用ファイルをビルドしようとすると起きます。
ローカル環境でコンパイルエラーを取り除いてからビルドしてください。

# failed to find Build Tools revision が起きた。
Bitriseのビルド環境はちょいちょい更新されるので、ビルドするアプリのビルドバージョンを上げていないとこのエラーを踏みやすいかと思います。
ただ、最近はGooglePlayにアプリをアップデートする場合はある程度最新のビルドバージョンに上げる必要があるので、このエラーを踏む可能性は低くなっているのではないかと思います。

```java

Caused by: java.lang.IllegalStateException: failed to find Build Tools revision 24.0.0
	at com.android.builder.sdk.DefaultSdkLoader.getTargetInfo(DefaultSdkLoader.java:87)
	at com.android.build.gradle.internal.SdkHandler.initTarget(SdkHandler.java:126)
	at com.android.build.gradle.BasePlugin.ensureTargetSetup(BasePlugin.java:680)
	at com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.java:617)
	at com.android.build.gradle.BasePlugin$10$1.call(BasePlugin.java:572)
	at com.android.build.gradle.BasePlugin$10$1.call(BasePlugin.java:569)
```

## Install missing Android SDK componentsをGradle runner の前に動かしておく
![installmissing.PNG](https://qiita-image-store.s3.amazonaws.com/0/115635/ade9213f-a5a9-aa07-cbe3-3ea43b87521f.png)

古いbitriseプロジェクト程入っていないことがありますが、このInstall missing Android SDK componentsをStepに入れておくとその時に足りないSDKを自動的にインストールしてくれるので、これを入れておくだけでもこのエラーは起きないかと思います。
また、新規でAndroid向けのプロジェクトをBitrise上で構築する場合は、Install missing Android SDK componentsがデフォルトで設定されていると思うので、このStepを意識しておく必要はないと思います。

## Android SDK UpdateをGradle runner の前に動かしておく
![AndroidSDKUpdate.PNG](https://qiita-image-store.s3.amazonaws.com/0/115635/20c46480-cd40-ca1a-f093-6b3ce10cf739.png)

Install missing Android SDK componentsでは解決しなかった場合は、直接AndroidSDKをインストールする手もあります。
失敗したビルドバージョンをStep内に記述しておけば良いかと思います。

# NDKビルドエラー
最近解決したようですが、AndroidNDKのアップデートに起因するエラーが起きていました。

```java

Caused by: java.lang.RuntimeException: No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
	at com.android.build.gradle.internal.ndk.DefaultNdkInfo.getDefaultToolchainVersion(DefaultNdkInfo.java:441)
	at com.android.build.gradle.internal.ndk.DefaultNdkInfo.getToolchainPath(DefaultNdkInfo.java:284)
	at com.android.build.gradle.internal.ndk.DefaultNdkInfo.getStripExecutable(DefaultNdkInfo.java:410)
	at com.android.build.gradle.internal.ndk.NdkHandler.getStripExecutable(NdkHandler.java:459)
	at com.android.build.gradle.internal.transforms.StripDebugSymbolTransform.<init>(StripDebugSymbolTransform.java:89)
	at com.android.build.gradle.internal.TaskManager.createStripNativeLibraryTask(TaskManager.java:1718)
	at com.android.build.gradle.internal.ApplicationTaskManager.createTasksForVariantScope(ApplicationTaskManager.java:226)
	at com.android.build.gradle.internal.VariantManager.createTasksForVariantData(VariantManager.java:545)
```

[Bitriseさんのコミュニティページ](https://discuss.bitrise.io/t/android-build-failed-in-gradlerunner-step-with-ndk-error-not-used/5075/9)に書いている通り、値が空のANDROID_NDK_HOMEを環境変数として設定することでビルドを通していました。（今は大丈夫なはず。）

# まとめ
これ以外にも googleレポジトリとjcenterとの関係が上手くいかないでエラーになることがよくありますが、落ち着いてエラー原因を探せば大体は何とかなると思います。
他にも、たまには https://discuss.bitrise.io/ を見て最新情報を入手するのが良いかなと思います。（この記事書きながら私も改めて思いました。）