OpenJDKのDockerコンテナを使ってKotlinアプリのビルドを行う

# 経緯
- KotlinでAndroid開発をやっているが、毎度AndroidStudioでビルドするのが面倒になってきた
- gitlabを使ってるのでついでにgitlabciを使ってみよう（別プロジェクトでrunner設定済みだったので今回必要なさそう）
- まずは手動でコンテナからビルドできるか試してみよう

# Dockerインストール
最近手に入れた開発用Macなので、まだDockerが入っていませんでしたorz
ここは特に書くことないので省略します

# コンテナ起動まで
今回はopenjdk8を使用します
理由はgitlabciのAndroid用テンプレートYAMLにデフォルトとして使われているのがこいつだったのと、JAVAのパッケージとかをインストールする手間が省けるからです（だから使われてるんだと思うけど）

まずはいつも通りpullします
バージョン指定は必須です

```
docker pull openjdk:8-jdk
```

そしてコンテナ起動します

```
docker run -it openjdk:8-jdk
```

# 必要なパッケージインストール
上記まで行うと自動的にコンテナの中に入れると思うので、パッケージをインストールしていきます

```
apt-get --quiet update --yes
apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1

export ANDROID_COMPILE_SDK=28
export ANDROID_BUILD_TOOLS=29.0.3
export ANDROID_SDK_TOOLS=6514223
export ANDROID_HOME="/android-home"

install -d $ANDROID_HOME
wget --output-document=$ANDROID_HOME/cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip

pushd $ANDROID_HOME
unzip -d cmdline-tools cmdline-tools.zip
popd
export PATH=$PATH:${ANDROID_HOME}/cmdline-tools/tools/bin/

sdkmanager --version

yes | sdkmanager --sdk_root=${ANDROID_HOME} --licenses || true
sdkmanager --sdk_root=${ANDROID_HOME} "platforms;android-${ANDROID_COMPILE_SDK}"
sdkmanager --sdk_root=${ANDROID_HOME} "platform-tools"
sdkmanager --sdk_root=${ANDROID_HOME} "build-tools;${ANDROID_BUILD_TOOLS}"

chmod +x ./gradlew
```

コンソールでエラーが出ていないかの確認と、念の為printenvで環境変数の確認くらいはやっても良いと思います

# git clone
ビルドするソースコードをコンテナ内に持ってきます
ここはcloneするだけなので省略

# ビルド実行
ビルド自体は簡単で、Gradleのコマンドを叩くだけです

```
./gradlew assemble
```

variantsとflavorを使いたい人はコマンドを変更してください
[こちら](https://techblog.zozo.com/entry/build_variants)を参考にさせていただきました

ただ、このままだとエラーになってうまく行かないです
私はここで躓いてしまったので、そのポイントを2点紹介いたします

## local.properties作成
ビルドした際に下記のエラーが発生しました

「SDK location not found. Define location with an ANDROID_SDK_ROOT environment variable or by setting the sdk.dir path in your project's local properties file at」

「local propertiesにSDKの場所が書かれてない」的なエラーに見えます

言われたとおりlocal propertiesを探したのですが見つかりませんでした

AndroidStudioをのときは勝手に作られてた（多分）ので意識してなかったのですが、どうやらlocal propertiesを作り、SDKの場所を記載しないといけないようです

そもそもvimを入れてなかったのでそこからです^^;


```
apt-get install vim
```

アプリのトップフォルダに移動して

```
vi local.properties
```

中身はこんな感じです

```
## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Wed Jan 07 15:34:05 JST 2015
sdk.dir=/android-home
```

これで再度ビルドコマンドを叩きましたが、今度は別のエラーが

## メモリ上限解放
次のエラーは
「Could not connect to kotlin daemon. Using fallback strategy.」
という内容

調べてみると、メモリが上限まで行ってデーモンちゃんが死んじゃったみたいです

Macのステータスバーにあるクジラのマークをクリックして、dockerのアプリから設定を変更して上限メモリを増やしてあげます
やり方の詳細は[こちら](https://blog.pinkumohikan.com/entry/increase-memory-limit-of-docker-for-mac)を参考にさせていただきました

# ビルド成功！！
ようやく「BUILD SUCCESSFUL」の文字が！

ビルドの際に署名を聞かれなかったことが気になってるので、そこに関しては後日追記したいと思います
Debugだからかなーと思いましたが、AndroidStudioでビルドするときはReleaseでもDebugでも署名必要なのでなんとも言えませんね

今回はdockerfileを作りませんでした
理由はgitlabci.yamlに記載するからです

次回は

- gitlabciからcommit時に自動ビルド
- variantsとflavorを指定してビルド

あたりができたらなと思います

以上です
お付き合いいただきありがとうございました

※全体的に[こちら](https://www.rhoboro.com/2016/07/30/docker-build-android-app.html)も参考にさせていただきました