Android CI with Docker on Circle CIを高速化する

追記: 実際に運用するときはライセンス問題にご注意ください: 公開用DockerイメージにAndroid SDKを含めるのはライセンス違反という話 - Islands in the byte stream

私は個人プロジェクトでもそれなりの規模になるときは、プルリクエストベースで機能開発してCIが通ってからマージするというスタイルをとる事が多いです。

そこでCIサービスの完了時間を短くしたいのですが、Androidプロジェクトの場合ふつうにDockerによる実行だおと7~10分くらい掛かってしまい、気持よく開発できません。そこでちょっとチューニングしてみました。といっても先人がいるのでほぼそれをなぞっただけです。

細かすぎて伝わらないかもしれない、CircleCIでDockerをごにょごにょするときのスピードアップテク - パラボラアンテナと星の日記

このエントリのうち、Androidプロジェクトでも効果がありそうなDockerイメージのキャッシュを行ってみた結果、2分ほど短縮できました。以下の右側の3つのビルドがそうで、明らかに時間が短縮されているのが見て取れます。

f:id:gfx:20151220221221p:plain

以下、Dockerイメージをキャッシュする設定です。

machine:
    services:
        - docker

dependencies:
    cache_directories:
        - "~/cache"
    override:
        - docker --version
        - docker info
        - |
            set -xe
            if [ -e ~/cache/docker-image.tar ] && [ $(md5sum Dockerfile | cut -d' ' -f1) = $(cat ~/cache/dockerfile.digest) ]
            then
              docker load < ~/cache/docker-image.tar
            else
              mkdir -p ~/cache
              docker build -t test .
              md5sum Dockerfile | cut -d' ' -f1 > ~/cache/dockerfile.digest
              docker save test > ~/cache/docker-image.tar
            fi
test:
    override:
        - docker run --name runner test

Android-Orma/circle.yml at v0.15.0 · gfx/Android-Orma · GitHub

しかし…本来AndroidのCIをdockerで走らせるのは、CIサービスへの依存をなくすためでした。こんなふうに circle.yml を育て始めるのであれば、dockerは使わなくてもいいかもしれないですね。dockerゆえのハマりどころもありますし、Android SDKのコンポーネントのうち何を含めるかという判断も難しいです。

そんなわけでAndroid CIをdockerで走らせるのを幾つかのプロジェクトでやってみた結果、そこまで便利ではないなという印象です。実案件ではおそらくやる意味はそれほどないでしょう。