Edited at

Travis CIでAndroidアプリを簡単にビルドしてRobolectricのテストを動かす

More than 5 years have passed since last update.


概要

Travisを使うまでは今までJenkinsを使っていました。テストコードを充実させていくうちにGitHubのPull Requestごとにビルドさせたいという意識が高まり、GitHub pull request builder plugin といったJenkinsプラグインをインストールしようと試みました。

しかしあまりにも設定が面倒なので、Jenkins職人への道は諦めてTravisでCIを回すようにしました。

Travis CI: Building an Android Project (beta)

まだBetaの段階ですがJavaとして.travis.ymlに書かなくてもAndroidとして設定に書けるみたいで、見た感じすごい簡単そうなのでやってみることにしました。

なお、Robolectricの gradle-android-test-plugin が入っていることが前提に進めていきます。


Robolectricでテストする

ドキュメントに書いてありますが、scriptを指定しない時のデフォルトは

gradle build connectedCheck

またはgradlewがある場合

./gradlew build connectedCheck

が実行されるのでエミュレータが立ち上がってしまいます。エミュレータに関する記述が全くないとビルドに失敗するので、Robolectricでテストするために


.travis.yml

script:

- ./gradlew build test

とするとエミュレータの存在確認が行われなくなり、Robolectricのテストが走るようになります。


.travis.yml


.travis.yml

android:

components:
- build-tools-19.0.3
- android-19
- extra-android-m2repository
licenses:
- android-sdk-license-bcbbd656

env:
global:
- TERM=dumb
- secure: ......
- secure: ......
- secure: ......
- secure: ......

script:
- ./gradlew build test


componentsはビルドに必要なものを指定します。

licensesにはインストールされるコンポーネントの承諾するライセンスを指定します。これを書いておかないと自動的にライセンスを承諾できずビルドできません。


Travisでリリースビルドを作る

./gradlew build はリリースビルドも作るため、keystoreやパスワードをTravisで入力されるようにする必要があります。

keystoreを含めたりするのはよくないので、そもそもTravisでリリースビルドを作らなければいいわけです。


.travis.yml

script:

- ./gardlew assembleDebug test

とするとdebugのみビルドされます。これをやると下記の作業をやらなくていいことになります。


暗号化文字列の作成

travis encryptを使って暗号化された文字列を作成します。

travis コマンドが入っていなければRubyGemsを使って gem install travis でインストールできます。

% travis encrypt BUILD_RELEASE_STORE_FILE=foobar.keystore

Please add the following to your .travis.yml file:

secure: "......"

Pro Tip: You can add it automatically by running with --add.
% travis encrypt BUILD_RELEASE_STORE_PASSWORD=hatsukoi
Please add the following to your .travis.yml file:

secure: "......"

Pro Tip: You can add it automatically by running with --add.
% travis encrypt BUILD_RELEASE_KEY_ALIAS=foo
Please add the following to your .travis.yml file:

secure: "......"

Pro Tip: You can add it automatically by running with --add.
% travis encrypt BUILD_RELEASE_KEY_PASSWORD=anoko
Please add the following to your .travis.yml file:

secure: "......"

Pro Tip: You can add it automatically by running with --add.

--add オプションで自動的に .travis.yml に追加してくれるという機能があるのですが、YAMLが勝手にフォーマットされてインデントが崩れるのでおすすめしません。

.travis.yml にはこんな感じに書きます。


.travis.yml

before_script:

- echo "storeFile=${BUILD_RELEASE_STORE_FILE}" >> secure.properties
- echo "storePassword=${BUILD_RELEASE_STORE_PASSWORD}" >> secure.properties
- echo "keyAlias=${BUILD_RELEASE_KEY_ALIAS}" >> secure.properties
- echo "keyPassword=${BUILD_RELEASE_KEY_PASSWORD}" >> secure.properties


Gradleの設定

Gradleでビルドする際、secure.properties を参照するようにします。


build.gradle

android {

signingConfigs {
release {
File securePropertiesFile = file('secure.properties')
Properties p = new Properties()
p.load(new FileInputStream(securePropertiesFile))
storeFile file(p.storeFile)
storePassword p.storePassword
keyAlias p.keyAlias
keyPassword p.keyPassword
}
}
}

これを書いてしまうとローカルで署名付きのAPKを作成するときにsecure.propertiesが必要になってしまいます。前述のとおり ./gradlew assembleDebug のみ実行して署名付きビルドをつくらなければこんなことしなくてもいいです。


エミュレータを使ったテスト

ちなみにエミュレータを使ったテストをやりたい場合、エミュレータを立ち上げて起動が終わるまで待機するところまで対応していないので.travis.ymlに自分で書く必要があります。


最後に

これでめでたくTravisでAndroidアプリがビルドできていることでしょう。いつでもTravisおじさんを眺めることができます。感動!!