この記事はアクトインディ Advent Calendar 2016 1日目になります。 どうぞよろしくお願いします。
アクトインディのAndroid開発ではCIにbitriseを使用しています。 今回はbitriseで起こった問題と解決方法をご紹介します。
発生した問題
2016/11/07頃から突然bitirseでビルドエラーが発生しました。 最初は実装ミスか?と思っていたのですが、ログ調査すると以下のようなログが出力されていました。
File /root/.android/repositories.cfg could not be loaded.
Preparing "Install Solver for ConstraintLayout 1.0.0-alpha8".
"Install Solver for ConstraintLayout 1.0.0-alpha8" ready.
Finishing "Install Solver for ConstraintLayout 1.0.0-alpha8"
Installing Solver for ConstraintLayout 1.0.0-alpha8 in /opt/android-sdk-linux/extras/m2repository/com/android/support/constraint/constraint-layout-solver/1.0.0-alpha8
"Install Solver for ConstraintLayout 1.0.0-alpha8" failed.
Preparing "Install ConstraintLayout for Android 1.0.0-alpha8".
"Install ConstraintLayout for Android 1.0.0-alpha8" ready.
Finishing "Install ConstraintLayout for Android 1.0.0-alpha8"
Installing ConstraintLayout for Android 1.0.0-alpha8 in /opt/android-sdk-linux/extras/m2repository/com/android/support/constraint/constraint-layout/1.0.0-alpha8
"Install ConstraintLayout for Android 1.0.0-alpha8" failed.
ビルドしていたプロジェクトではConstraintLayoutを使用していて、 そのConstraintLayoutのインストールに失敗しているようです。
ConstraintLayoutとは
Android開発で使用する新しく登場したUIレイアウトです。 プロジェクトが依存するライブラリとしてgradleで定義しないといけないものです。 詳しくはこちらを御覧ください。
解決方法
今回の問題を解決した方法が以下になります。
./gradlew dependencies || true ←※このコマンドを追加
./gradlew "--build-file" "build.gradle" "assembleDebug" "--stacktrace"
ビルドコマンドの前に上記の※のコマンドを追加するだけです。
解決方法の解説
ビルドエラーの原因はConstraintLayoutのインストールが失敗したことです。 が、実はConstraintLayoutのインストールは完了していました。 この現象はAndroid StudioからSDK Managerを立ち上げてインストールした場合でも発生します。 以下の画像が発生した時のメッセージです。
「Finish」を押して再度SDK Managerを立ち上げてインストール状況を確認するとインストールしたことになっています。
なので
./gradlew dependencies
このコマンドで依存関係にあるライブラリを先にインストールされます。 インストールは完了していますが結果として異常終了となるので
./gradlew dependencies || true
とすることで正常終了となり、CIが止まることなくビルドすることが出来ます。
以上です。