カマカマの雑草ブログ

個人の日記です

Jenkins 2.0+DockerをMacに入れてAndroid Buildに使う

目的

  • JenkinsでAndroid開発の継続的デリバリーを実現したい
  • Jenkinsの環境が膨れ上がるのを防ぐためDockerでジョブ毎に環境を構築したい
  • 今後iOSのビルドにも使えるようにMac上で環境を作りたい
    • iOSビルドについてはDockerコンテナ上でなくMac上でジョブを実行する

やること

  • Jenkins2.0入れる
  • Docker Toolbox入れる
  • Dockerfileで以下の環境を作る
    • JDKインストール
    • Android SDKインストール
    • SDKマネージャによるアップデート
    • Gradleのインストール <- Android SDKで入ってたら無視
  • Android Projectをcloneする
  • Dockerコンテナ上にcloneしたプロジェクトをマウントしビルドを実行する

Jenkins2.0入れる

Docker Toolbox入れる

どちらもインストーラ落としてきてインストールした。
JenkinsはHomebrewで入れようとしてもまだ1.x系らしい。tapするとか別のやり方するとイケるかもしれない。

Docker Toolboxはdocker run通らなくてCannot connect to the Docker daemon.言われたけどeval忘れてただけだった。
Cannot connect to the Docker daemon. Is 'docker -d' running on this host? · Issue #1010 · docker/kitematic · GitHub

Dockerfileつくる

良さ気な設定があるので、これをベースにする。JDK 1.8まで視野に入れた設定になっている。

https://hub.docker.com/r/gfx2015/android/

こうなる
AndroidTodo/Dockerfile at master · MKomiya/AndroidTodo · GitHub

Android Projectをcloneする

Dockerコンテナ上にプロジェクトをマウントしビルドを実行する

jenkins jobで「ソースコード管理」>「Git」からRepositoryとか諸々設定する。
その後「シェルの実行」で「シェルスクリプト」に以下を設定

docker-machine ls

docker-machine rm -f dev
docker-machine create -d virtualbox dev
eval "$(docker-machine env dev)"

docker build -t android-todo .
docker run -i android-todo ./gradlew --stacktrace test build

docker-machine stop dev
docker-machine rm -f dev

ホントはbuild.shファイルとかにしておくべきだと思う。

これでビルドまでは問題なく通る。

この後は適宜apkを保存するなりHockeyAppやDeployGateへアップロードすれば良いと思う。
ファイルは/project/path/to/build/outputs/apk/以下とかに入ってるはず。

ハマったところ

docker: command not found

JenkinsのPATHに/usr/local/binを通す。 「Jenkinsの管理」>「システムの設定」
f:id:s-wyvern:20160502210938p:plain

Host does not exist: "default"

デフォルトではdocker-machineが立ち上がってないのでcreateする必要がある。

cannot enable tty mode on non tty input

最初はdocker run -it ってやってたけどttyオプションは不要だった。

参考

Jenkins

Docker Toolbox | Docker

Dockerを用いたJenkinsの運用をしてみた話 – NET BIZ DIV. TECH BLOG

AndroidのCIはDockerでビルドするのが楽 - Qiita