AndroidでTravisCIしようとしてハマった話


## 結論

```.travis.yml``` は最終的にこのようになりました。
記憶が残っている内になぜこの様に変更になったか、備忘録として残します。
どなたかのお役にたてれば幸いです。

```(before).travis.yml
language: java
sudo: false
env:
  global:
  - GRADLE_OPTS="-Xmx512m -XX:MaxPermSize=512m"
  - ADB_INSTALL_TIMEOUT=10
jdk:
  - oraclejdk7
script:
  - ./gradlew test
```

```(after).travis.yml
language: android
android:
sudo: false

components:
  - tools
  - platform-tools
  - build-tools-23.0.2
  - android-23
  - extra
  - extra-android-m2repository
 
install:
  - android-update-sdk --accept-licenses='android-sdk-license-.+' --components=tools
  - android-update-sdk --accept-licenses='android-sdk-license-.+' --components=build-tools-23.0.2
  - android-update-sdk --accept-licenses='android-sdk-license-.+' --components=android-23
  - android-update-sdk --accept-licenses='android-sdk-license-.+' --components=extra-android-m2repository
  - android-update-sdk --accept-licenses='android-sdk-license-.+' --components=extra-google-m2repository

env:
  global:
  - GRADLE_OPTS="-Xmx512m -XX:MaxPermSize=512m"
  - ADB_INSTALL_TIMEOUT=10

jdk:
  - oraclejdk7

script:
  - ./gradlew test

cache:
  directories:
  - $HOME/.m2
  - $HOME/.gradle
```

では、ここに行き着くまでの課程を順を追って記していきます。
そもそもこの ```.travis.yml``` が正しいのかも不明。

## 環境

- Android Studio 2.1.3

- Android 23.0.2

- kotlin 1.0.1-2


## あらすじ

そもそも、下記の様なエラーが発生していてCIが壊れていた。

```Job.log
* What went wrong:
A problem occurred evaluating project ':app'.
> Failed to apply plugin [id 'com.android.application']
> Minimum supported Gradle version is 2.14.1.  Current version is 2.10. If using the gradle wrapper, try editing the distributionUrl in /home/travis/build/IsaoCorp/goalous_app_android/gradle/wrapper/gradle-wrapper.properties to gradle-2.14.1-all.zip
```

CIが壊れる前後でgradleのバージョン関連のコミットが見つからず、幸先が不安な所からのスタート。プロジェクトからそれっぽいファイルを見つけてコミットしてみました。

```gradle/wrapper/gradle-wrapper.properties
- distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
+ distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
```

これでなんとか該当箇所は抜けたものの、別のエラーに遭遇しました。

```Job.log
* What went wrong:
A problem occurred evaluating project ':app'.
> SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.
```

ここで[The SDK directory does not exist Travis CI](http://stackoverflow.com/questions/39056335/the-sdk-directory-does-not-exist-travis-ci)を参考に ```.travis.yml``` を書き換えてみます。

```.travis.yml
language: android

sudo: false
env:
  global:
  - GRADLE_OPTS="-Xmx512m -XX:MaxPermSize=512m"
  - ADB_INSTALL_TIMEOUT=10
jdk:
  - oraclejdk7
script:
  - ./gradlew test

install:
  - true
  - chmod +x ./gradlew; ls -l gradlew; ./gradlew wrapper -v
android:

components:
# Uncomment the lines below if you want to
# use the latest revision of Android SDK Tools
# - platform-tools
# - tools

# The BuildTools version used by your project
 - build-tools-23.0.3

# The SDK version used to compile your project
 - android-23

```

```ANDROID_HOME``` のエラーは解消されました。

```Job.log
* What went wrong:
A problem occurred configuring project ':app'.
> failed to find target with hash string 'android-23' in: /usr/local/android-sdk
```

しかし、エラーの場所が変わったので、次の様に下記を削除。

```.travis.yml
- android:
- 
- components:
- # Uncomment the lines below if you want to
- # # use the latest revision of Android SDK Tools
- # - platform-tools
- # - tools
- 
- # The BuildTools version used by your project
-  - build-tools-23.0.3
- 
- # The SDK version used to compile your project
-  - android-23
```

ちょっと削除してみる。

```Job.log
0.00s$ build-tools-23.0.1
/home/travis/build.sh: line 45: build-tools-23.0.1: command not found
```

またエラー箇所が変わった。
だんだん辛みが増してくる。


```build-tools-23.0.1```がないと言われているので、先程削除したものを戻してみる。

```.travis.yml
+ # The BuildTools version used by your project
+   - build-tools-23.0.1
+ 
+ # The SDK version used to compile your project
+   - android-23
```

これではどうか。

```Job.log
* What went wrong:
A problem occurred configuring project ':app'.
> failed to find target with hash string 'android-23' in: /usr/local/android-sdk
```

ひとつ前のエラーの戻った。まぁ当然といえばそうだけれども。
今度は、'android-23'が見つからないという事で[ここ](http://ksoichiro.blogspot.jp/2015/12/androidcibuild-tools.html)を参考に以下の様に修正

```.travis.yml
  install:
   .
   .
+   - android-update-sdk --accept-licenses='android-sdk-license-.+' --components=tools
+   - android-update-sdk --accept-licenses='android-sdk-license-.+' --components=build-tools-23.0.2
+   - android-update-sdk --accept-licenses='android-sdk-license-.+' --components=android-23
```

上記ブログでは、
>
Travis CIの場合はlanguageをandroidにしておけば、 
toolsをアップデート対象に含めておくだけで良さそう。 
(参考: https://github.com/travis-ci/travis-ci/issues/5036)

とありますが、自分のTravisだと解決しませんでした。
ともあれ該当のエラーは解消されたのですが、また以下のエラーが新しく発生しました。


```Job.log
* What went wrong:
A problem occurred configuring project ':app'.
> Could not resolve all dependencies for configuration ':app:_stgDebugCompile'.
   > Could not find com.android.support:appcompat-v7:23.4.0.
   .
   > Could not find com.android.support:design:23.4.0.
   .
   > Could not find com.google.android.gms:play-services-gcm:8.4.0.
   .
   > Could not find com.google.android.gms:play-services-appindexing:8.4.0.
   .
   > Could not find com.android.support:support-v4:23.4.0.
   . 
```

こちらも、[ここ](http://stackoverflow.com/questions/37615379/travis-ci-build-doesnt-work-with-android-constraint-layout)を参考に、下記の様に修正。

```.travis.yml
install:
   .
   .
+  - android-update-sdk --accept-licenses='android-sdk-license-.+' --components=extra-android-m2repository
+  - android-update-sdk --accept-licenses='android-sdk-license-.+' --components=extra-google-m2repository
```

上記のエラーは無くなりましたが、今度は次の様なエラーになりました。

```Job.log
* What went wrong:
Execution failed for task ':app:lint'.
> Lint found errors in the project; aborting build.
```

今度はAndroidのLintでエラーがでています。[こちら](http://blog.ch3cooh.jp/entry/20150515/1431658067)を参考に修正。

```app/build.gradle
+ lintOptions {
+     abortOnError false
+    }
```

ここまでやってようやくビルドが通りました👏👏👏
かなり煩雑になってしまったので、エラーの一覧をまとめていければと思います。

## 最後に

AndroidのCIの知識が皆無の状態から、Buildを通すところまでなんとかたどり着く事ができました。
今後は、テストの実行・Robolectric・Espressoあたりを触ってみたいと思います。
ご指摘などあれば、よろしくお願いします🙏

## 謝辞

- [codepath/android_guides/wiki/Setting-up-Travis-CI - Github](https://github.com/codepath/android_guides/wiki/Setting-up-Travis-CI)

- [https://googledevjp.blogspot.jp/2014/11/appcompat-v21-lollipop.html](https://googledevjp.blogspot.jp/2014/11/appcompat-v21-lollipop.html)

- [https://github.com/travis-ci/travis-ci/issues/3642](https://github.com/travis-ci/travis-ci/issues/3642)

- [gradle build fails on lint task - Stackoverflow](http://stackoverflow.com/questions/20699147/gradle-build-fails-on-lint-task)

- [JakeWharton/sdk-manager-plugin - Github](https://github.com/JakeWharton/sdk-manager-plugin)

- [http://stackoverflow.com/questions/37615379/travis-ci-build-doesnt-work-with-android-constraint-layout](http://stackoverflow.com/questions/37615379/travis-ci-build-doesnt-work-with-android-constraint-layout)

- [TravisCI: Androidをgradleからビルドした時の依存関係をcacheする - Qiita](http://qiita.com/jfsso/items/0ac573670bb08a8b34ba)

- [Gradle SDKManagerPluginによるSDKパッケージの依存関係解決 - Qiita](http://qiita.com/FGtatsuro/items/fd7f4f5ee13cc02ced07)

- [Error:Cause: com.android.sdklib.repository.FullRevision - Stackoverflow](http://stackoverflow.com/questions/33881984/errorcause-com-android-sdklib-repository-fullrevision)

- [Android: Could not find com.android.support:support-v4:23.2.1 - Stackoverflow](http://stackoverflow.com/questions/36222111/android-could-not-find-com-android-supportsupport-v423-2-1)

- [AndroidのCIでbuild-toolsの新しいバージョンが見つからない場合の対処 - Blogspot](http://ksoichiro.blogspot.jp/2015/12/androidcibuild-tools.html)

- [https://github.com/mrmans0n/smart-location-lib/commit/2b873cb7fde647085ed67a490a189267ede7f1d4](https://github.com/mrmans0n/smart-location-lib/commit/2b873cb7fde647085ed67a490a189267ede7f1d4)

- [Failed to find Build Tools revision 23.0.2 · Issue #5036 · travis-ci/travis-ci · GitHub](https://github.com/travis-ci/travis-ci/issues/5036)

- [Travis CI for Android - Build Error: Failed to find target & Could not find dependencies](http://stackoverflow.com/questions/30729943/travis-ci-for-android-build-error-failed-to-find-target-could-not-find-depe)

- [failed to find target with hash string 'android-22' - Stackoverflow](http://stackoverflow.com/questions/32715418/failed-to-find-target-with-hash-string-android-22)

- [m-awadi/travis-android-sample - Github](https://github.com/m-awadi/travis-android-sample/blob/master/.travis.yml)

- [Travis CIでAndroidアプリを簡単にビルドしてRobolectricのテストを動かす - Qiita](http://qiita.com/itochan/items/682cf931f184c33e0ec2)

- [JenkinsでGradleを使ってAndroidアプリをビルドしたときの失敗と対処方法 - 酢ろぐ！](http://blog.ch3cooh.jp/entry/20150515/1431658067)

- [Gradle, Android and the ANDROID_HOME SDK location - Stackoverflow](http://stackoverflow.com/questions/19794200/gradle-android-and-the-android-home-sdk-location)

- [Android Travis CI Error: failed to find target with hash string 'android-23' in: /usr/local/android-sdk - Stackoverflow](http://stackoverflow.com/questions/35198143/android-travis-ci-error-failed-to-find-target-with-hash-string-android-23-in)

- [https://docs.travis-ci.com/user/languages/android](https://docs.travis-ci.com/user/languages/android)

- [Android studio - Failed to find target android-18 - Stackoverflow](http://stackoverflow.com/questions/18068920/android-studio-failed-to-find-target-android-18)

- [The SDK directory does not exist Travis CI](http://stackoverflow.com/questions/39056335/the-sdk-directory-does-not-exist-travis-ci)