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


# 概要

Travisを使うまでは今までJenkinsを使っていました。テストコードを充実させていくうちにGitHubのPull Requestごとにビルドさせたいという意識が高まり、[GitHub pull request builder plugin](https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin) といったJenkinsプラグインをインストールしようと試みました。
しかしあまりにも設定が面倒なので、Jenkins職人への道は諦めてTravisでCIを回すようにしました。

[Travis CI: Building an Android Project (beta)](http://docs.travis-ci.com/user/languages/android/)

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

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

# Robolectricでテストする

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

```shell-session
gradle build connectedCheck
```

または```gradlew```がある場合

```shell-session
./gradlew build connectedCheck
```

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

```yaml:.travis.yml
script:
  - ./gradlew build test
```

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

# .travis.yml

```yaml:.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でリリースビルドを作らなければいいわけです。

```yaml:.travis.yml
script:
  - ./gardlew assembleDebug test
```

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

## 暗号化文字列の作成

```travis encrypt```を使って暗号化された文字列を作成します。
```travis``` コマンドが入っていなければRubyGemsを使って ```gem install travis``` でインストールできます。


```shell-session
% 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`` にはこんな感じに書きます。

```yaml:.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`` を参照するようにします。

```groovy: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おじさんを眺めることができます。感動！！