みなさん、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にAndroid SDKを管理してもらう
- GradleにJakeWharton/sdk-manager-pluginを適用して、実行時に足りないSDKをダウンロードする
- circle.ymlやtravis-ci.ymlに必要な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つの設定が必要です。
- Gradle Pluginのバージョンを上げる
- ライセンスファイルをAndroid SDKのフォルダに置く
Gradle Pluginのバージョンを上げる
Gradle Plugin for Androidをv2.2.0-alpha4より高いバージョンにしてください。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
}
}
ライセンスファイルをAndroid SDKのフォルダに置く
実は、Gradle Pluginのバージョンを上げただけだと、初回に落ちます。罠ですね。
$ ./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環境構築が随分と楽になってきたように思います。
とはいえ、まだまだ導入している企業は多くはないようです。
実際みんなAndroid開発でCIやってます?
— mochico@技術書典ウ-01 (@_mochicon_) 2016年7月8日
自動テストをガッツリやれとはいいません。Lintとかビルドが通るか試すだけでもいいので、品質向上のために、CIサーバー上で./gradlew clean build
を回してみませんか。
宣伝(プライベート)
↑のアンケートを取ってた@mochicoが夏コミに向けてAndroidのCIサービスについてまとめた記事を書いてるらしいので、みなさんコミケでは是非、3日目西a-05abのTechBoosterにお越しください。
TechBoosterはコミックマーケット90に 3日目西a05aで参加します!今回はひかる黄金わかめ帝国さんと合体参加です。技術書典に続いて新刊4作品、一生懸命作りました。予約販売も近日受付開始です。#C90 最新情報は https://t.co/iwVGm2iPx2 です!
— TechBooster@3日目西a05a (@TechBooster) 2016年8月4日
宣伝(会社)
ウォーターセル株式会社では、CIに造詣が深いモバイルエンジニアを募集しています。地球人口100億人時代の食糧問題を解決する礎になるお仕事に興味がある方はご連絡ください。