「PORT」アドベントカレンダー 15日目
新卒エンジニアの@kichinagaです。
業務では、主にサーバーサイドや、アプリの開発を行っています。
最近、SlackからGithubのAndroidのプロジェクトをDeploygateにデプロイするための前準備として、DockerでAndroidアプリのビルド環境を作成したので、それについて書きます。
元イメージ
なるべく容量を抑える為にalpineイメージを使用しました。
またglibcの入っているイメージを使用しました。
glibcの入ったイメージを使用しているのは、普通のalpineイメージだとappt周りで失敗する為です。
FROM frolvlad/alpine-glibc:alpine-3.8
パッケージのインストール
jdkなど、必要なものがいくつかあるので、それらのパッケージをインストールします。
RUN apk update && \
apk upgrade && \
apk --no-cache --virtual .build add \
bash \
openjdk8 \
wget
環境変数, Pathの設定
次にjdkや、sdk toolsのパスや、ビルドするAndroidのバージョンの設定を行います
## 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をインストールします。
公式サイトからlinux用のsdk toolsをwgetでダウンロードし、unzipで指定の場所にsdk toolsを展開します。
展開した後はsdk toolsのzipは必要なくなるので、容量削減の為に削除しましょう。
# 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
を作成しておきます。
# agree sdkmanager licenses
RUN mkdir ~/.android && \
touch ~/.android/repositories.cfg
RUN yes | sdkmanager --licenses
ビルドツールのインストール
最後に、Androidアプリのビルドツール群をsdkmanagerからインストールします。
# install android tools and more
RUN sdkmanager "tools" "build-tools;${BUILD_TOOLS_VERSION}" "platforms;${PLATFORMS_VERSION}" "platform-tools" "extras;android;m2repository"
これで、Androidビルド用のDockerイメージが作成できました。
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にデプロイしてくれます。
#!/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イメージを作成した
最後に
本当はSlackでdeployまでやりたかったんですが、時間的に厳しかったです...
CIにも流用できそうなので、Slack deployも含めて、時間を作って手を伸ばしたいと思います。
[PORT 株式会社](https://www.theport.jp/)では、自社サービスを支えてくれる優秀な Ruby エンジニアを募集しています(Ruby エンジニア以外も)。 [もくもく会](https://freestyle-mokumoku.connpass.com/)も行なっていますので、ぜひ一緒にもくもくしましょう!
PORT Advent Calendar はまだまだ続きます。乞うご期待!