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

More than 1 year has passed since last update.

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

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

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


一般的な方法

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

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


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

さて、6月にJWがsdk-manager-pluginをdeprecatedにしたことはご存知でしょうか。

これはGoogleが公式に同様の機能をサポートしたのが理由です。Gradle Plugin for Android v2.2.0-alpha4のリリースノートを見ると、次の項目が入っています。


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より高いバージョンにしてください。


build.gradle

buildscript {

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


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

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


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で紹介されています。

ざっくりまとめると、



  • $ANDROID_HOME/licensesディレクトリに入っているファイルには、どのライセンスを承認済みなのかというデータが入っている

  • 手元のマシンで承認したライセンスについてのファイルを、CI環境の$ANDROID_HOME/licensesにコピーしてね

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

$ cat $ANDROID_HOME/licenses/android-sdk-license

8933bad161af4178b1185d1a37fbf41ea5269c55%

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

$ ./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環境構築が随分と楽になってきたように思います。

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

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


宣伝(プライベート)

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


宣伝(会社)

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