CI環境でAndroid SDKのダウンロードを自動化する2016


みなさん、CIしてますか。

AndroidアプリのCI環境となるマシンには、Android SDKがインストールされていないといけません。今までみなさんは、どのように環境構築を行っていたでしょうか。

Gradle Plugin for Android v2.2.0で、CI環境構築が少しだけ簡単になりそうなので、紹介したいと思います。

一般的な方法
----------

CI職人の諸兄ならば、CI環境へAndroid SDKをダウンロードするために、いずれかの方法を使ったことがあるのではないでしょうか。

* `android update sdk --no-ui --filter ...` なコマンドをcron実行しておく
* Jenkins環境なら[Android Emulator Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Android+Emulator+Plugin)にAndroid SDKを管理してもらう
* Gradleに[JakeWharton/sdk-manager-plugin](https://github.com/JakeWharton/sdk-manager-plugin)を適用して、実行時に足りないSDKをダウンロードする
* [circle.yml](https://circleci.com/docs/android/)や[travis-ci.yml](https://docs.travis-ci.com/user/languages/android)に必要なSDKを書いておくといい感じに用意してもらえる

筆者の観測範囲では、自分で細かく操作したい人は`android update sdk`コマンド、ある程度おまかせで行きたい人はsdk-manager-pluginを使っていたように思います。

さよならsdk-manager-plugin、こんにちはauto-download
----------

さて、[6月にJWがsdk-manager-pluginをdeprecatedにした](https://github.com/JakeWharton/sdk-manager-plugin#deprecated)ことはご存知でしょうか。

これはGoogleが公式に同様の機能をサポートしたのが理由です。[Gradle Plugin for Android v2.2.0-alpha4のリリースノート](http://tools.android.com/tech-docs/new-build-system)を見ると、次の項目が入っています。

> SDK auto-download: Gradle will attempt to download missing SDK packages that a project depends on.

Awesome!

sdk-manager-pluginも、新しいサポートライブラリが出たりすると保守が間に合わなくてしばらく動かせなくなるなど、問題を抱えていたので、公式サポートは大歓迎です。

使い方
----------

2つの設定が必要です。

1. Gradle Pluginのバージョンを上げる
2. ライセンスファイルをAndroid SDKのフォルダに置く

### Gradle Pluginのバージョンを上げる

Gradle Plugin for Androidをv2.2.0-alpha4より高いバージョンにしてください。

```gradle:build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0'
    }
}
```

### ライセンスファイルをAndroid SDKのフォルダに置く

実は、Gradle Pluginのバージョンを上げただけだと、初回に落ちます。罠ですね。

```sh:Gradleビルドが落ちる
$ ./gradlew clean :lib:testDebugUnitTest
# 省略
FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':lib'.
> You have not accepted the license agreements of the following SDK components:
  [Android SDK Build-Tools 24.0.1].
  Before building your project, you need to accept the license agreements and complete the installation of the missing components using the Android Studio SDK Manager.
  Alternatively, to learn how to transfer the license agreements from one workstation to another, go to http://d.android.com/r/studio-ui/export-licenses.html
```

> You have not accepted the license agreements of the following SDK components

GUIからAndroid SDKを更新するときに出てくるライセンスの承認を、Gradleビルド中にできなかったために起きているエラーのようです。

対策は次のURLで紹介されています。

* http://d.android.com/r/studio-ui/export-licenses.html

ざっくりまとめると、

* `$ANDROID_HOME/licenses`ディレクトリに入っているファイルには、どのライセンスを承認済みなのかというデータが入っている
* 手元のマシンで承認したライセンスについてのファイルを、CI環境の`$ANDROID_HOME/licenses`にコピーしてね

ということでした。実際に手元の`$ANDROID_HOME`を漁ってみます。

```sh
$ cat $ANDROID_HOME/licenses/android-sdk-license
8933bad161af4178b1185d1a37fbf41ea5269c55%
```

これをCIサーバーにコピーすると、ライセンスが承認された状態でCIが動くようになります。

```sh
$ ./gradlew clean :lib:testDebugUnitTest
Preparing "Install Android SDK Build-Tools 24.0.1".
"Install Android SDK Build-Tools 24.0.1" ready.
Finishing "Install Android SDK Build-Tools 24.0.1"
Installing Android SDK Build-Tools 24.0.1 in /Users/ciuser/.android-sdk/build-tools/24.0.1
"Install Android SDK Build-Tools 24.0.1" complete.
```

自動でダウンロードされてる！　やった！

まとめ
----------

一昔前と比べて、Android開発のCI環境構築が随分と楽になってきたように思います。

とはいえ、まだまだ導入している企業は多くはないようです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">実際みんなAndroid開発でCIやってます？</p>&mdash; mochico@技術書典ウ-01 (@_mochicon_) <a href="https://twitter.com/_mochicon_/status/751231624080044032">2016年7月8日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

自動テストをガッツリやれとはいいません。Lintとかビルドが通るか試すだけでもいいので、品質向上のために、CIサーバー上で`./gradlew clean build`を回してみませんか。

宣伝（プライベート）
----------

↑のアンケートを取ってた@mochicoが夏コミに向けてAndroidのCIサービスについてまとめた記事を書いてるらしいので、みなさんコミケでは是非、3日目西a-05abのTechBoosterにお越しください。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">TechBoosterはコミックマーケット90に 3日目西a05aで参加します！今回はひかる黄金わかめ帝国さんと合体参加です。技術書典に続いて新刊4作品、一生懸命作りました。予約販売も近日受付開始です。<a href="https://twitter.com/hashtag/C90?src=hash">#C90</a> 最新情報は <a href="https://t.co/iwVGm2iPx2">https://t.co/iwVGm2iPx2</a> です！</p>&mdash; TechBooster@3日目西a05a (@TechBooster) <a href="https://twitter.com/TechBooster/status/761211354250305538">2016年8月4日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

宣伝（会社）
----------

ウォーターセル株式会社では、CIに造詣が深いモバイルエンジニアを募集しています。地球人口100億人時代の食糧問題を解決する礎になるお仕事に興味がある方はご連絡ください。

* http://www.agri-note.jp/recruit/
* https://www.wantedly.com/projects/53479