DockerでAndroidアプリのビルド環境を作る

[「PORT」アドベントカレンダー](https://qiita.com/advent-calendar/2018/port) 15日目
新卒エンジニアの@kichinagaです。
業務では、主にサーバーサイドや、アプリの開発を行っています。

最近、SlackからGithubのAndroidのプロジェクトをDeploygateにデプロイするための前準備として、DockerでAndroidアプリのビルド環境を作成したので、それについて書きます。

# 元イメージ
なるべく容量を抑える為にalpineイメージを使用しました。
またglibcの入っているイメージを使用しました。
glibcの入ったイメージを使用しているのは、普通のalpineイメージだとappt周りで失敗する為です。

```dockerfile:Dockerfile
FROM frolvlad/alpine-glibc:alpine-3.8
```

# パッケージのインストール
jdkなど、必要なものがいくつかあるので、それらのパッケージをインストールします。

```dockerfile:Dockerfile
RUN apk update && \
    apk upgrade && \
    apk --no-cache --virtual .build add \
	bash \
	openjdk8 \
	wget 
```

# 環境変数, Pathの設定
次にjdkや、sdk　toolsのパスや、ビルドするAndroidのバージョンの設定を行います

```dockerfile:Dockerfile
## ENV settings
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV SDK_TOOL_VERSION=sdk-tools-linux-4333796
ENV ANDROID_HOME=/usr/local/android-sdk-linux
ENV BUILD_TOOLS_VERSION=28.0.3
ENV PLATFORMS_VERSION=android-28
ENV PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin
```

# SDK Toolのインストール
sdkmanagerコマンドを使えるように、sdk toolsをインストールします。
[公式サイト](https://developer.android.com/studio/?hl=ja#command-tools)からlinux用のsdk toolsをwgetでダウンロードし、unzipで指定の場所にsdk toolsを展開します。
展開した後はsdk toolsのzipは必要なくなるので、容量削減の為に削除しましょう。

```dockerfile:Dockerfile
# install android sdk tools
RUN mkdir $ANDROID_HOME && \
  wget "https://dl.google.com/android/repository/${SDK_TOOL_VERSION}.zip" && \
  unzip -d $ANDROID_HOME $SDK_TOOL_VERSION.zip && \
  rm -rf $SDK_TOOL_VERSION.zip
```

# ライセンスの認証
sdk toolsは使用する為にライセンスに同意する必要があります。
`sdkmanager --licenses`コマンドで全てのライセンスに同意できます。
ライセンスは複数あり、同意時には`y`を押す必要があるので、yesコマンドで同意します。
また、`Warning: File ~/.android/repositories.cfg could not be loaded.`という警告が出るので、あらかじめ`~/.android/repositories.cfg`を作成しておきます。

```dockerfile:Dockerfile
# agree sdkmanager licenses
RUN mkdir ~/.android && \
	touch ~/.android/repositories.cfg
RUN yes | sdkmanager --licenses
```

# ビルドツールのインストール
最後に、Androidアプリのビルドツール群をsdkmanagerからインストールします。

```dockerfile:Dockerfile
# install android tools and more
RUN sdkmanager "tools" "build-tools;${BUILD_TOOLS_VERSION}" "platforms;${PLATFORMS_VERSION}" "platform-tools" "extras;android;m2repository"
```

これで、Androidビルド用のDockerイメージが作成できました。

# Dockerfile
今までのをまとめた物です


```dockerfile:Dockerfile
FROM frolvlad/alpine-glibc:alpine-3.8

## install package
RUN apk update && \
    apk upgrade && \
    apk --no-cache --virtual .build add \
	bash \
	openjdk8 \
	wget 

## ENV settings
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV SDK_TOOL_VERSION=sdk-tools-linux-4333796
ENV ANDROID_HOME=/usr/local/android-sdk-linux
ENV BUILD_TOOLS_VERSION=28.0.3
ENV PLATFORMS_VERSION=android-28
ENV PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin

# install android sdk tools
RUN mkdir $ANDROID_HOME && \
  wget "https://dl.google.com/android/repository/${SDK_TOOL_VERSION}.zip" && \
  unzip -d $ANDROID_HOME $SDK_TOOL_VERSION.zip && \
  rm -rf $SDK_TOOL_VERSION.zip

# agree sdkmanager licenses
RUN mkdir ~/.android && \
	touch ~/.android/repositories.cfg
RUN yes | sdkmanager --licenses

# install android tools and more
RUN sdkmanager "tools" "build-tools;${BUILD_TOOLS_VERSION}" "platforms;${PLATFORMS_VERSION}" "platform-tools" "extras;android;m2repository"
```

# おまけ
上のdockerfileをイメージ化しておき、androidのプロジェクト直下に下のbuild.shを置いて次のコマンドを実行すると、Docker上でbuildを行い、deploygateにデプロイしてくれます。

```shell:build.sh
#!/bin/bash

./gradlew clean && \
./gradlew dependencies && \
./gradlew assembleDebug

curl \
  -F "token=[deploygeteのtoken]" \
  -F "file=@/project/app/build/outputs/apk/debug/app-debug.apk" \
  -F "message=sample" \
  https://deploygate.com/api/users/[ユーザー名]/apps
```

```
コマンド

$ docker run -v `pwd`:/project -w /project -t [コンテナ名] sh /project/build_debug.sh
```

# 参考
[AlpineベースのAndroidビルド環境のDockerイメージを作成した](http://sakebook.hatenablog.com/entry/2017/06/07/033128)

# 最後に

本当はSlackでdeployまでやりたかったんですが、時間的に厳しかったです...
CIにも流用できそうなので、Slack deployも含めて、時間を作って手を伸ばしたいと思います。

<hr>
[PORT 株式会社](https://www.theport.jp/)では、自社サービスを支えてくれる優秀な Ruby エンジニアを募集しています(Ruby エンジニア以外も)。
[もくもく会](https://freestyle-mokumoku.connpass.com/)も行なっていますので、ぜひ一緒にもくもくしましょう！

[PORT Advent Calendar](https://qiita.com/advent-calendar/2018/port) はまだまだ続きます。乞うご期待！