クラウド上でアプリをビルドしたい!CodeBuildでAndroidアプリをビルドするときのTips
CodeBuild
の小ネタです。AWS CodeBuildはyamlの定義に従ってビルド処理をマネージドサービスです。
今回はAndroidアプリをCodeBuildでビルドする時のTipsを紹介します。
ビルド対象のAndroid SDKを指定する
まず、Androidアプリをビルドする必要なのはAndroid SDKですね。 CodeBuildでのビルド時にもインストールされている必要がありますので、設定方法を説明します。
AWS提供のイメージを使う
一番簡単なのが、AWSが提供しているコンテナイメージをそのまま使う方法です。 サポートされているイメージをAWS CLIで確認してみましょう。
1aws codebuild list-curated-environment-images
json形式でデータが返ってきます。中を見ると、コンテナのイメージ名が含まれていることがわかります。
(以下のサンプルでいうと、 aws/codebuild/eb-java-7-amazonlinux-64:2.1.3
がそれにあたります。)
このイメージ名はCodeBuildの設定を行う際に使います。
1{
2 "platforms": [
3 {
4 "platform": "AMAZON_LINUX",
5 "languages": [
6 {
7 "language": "JAVA",
8 "images": [
9 {
10 "name": "aws/codebuild/eb-java-7-amazonlinux-64:2.1.3",
11 "description": "AWS ElasticBeanstalk - Java 7 Running on Amazon Linux 64bit v2.1.3",
12 "versions": [
13 "aws/codebuild/eb-java-7-amazonlinux-64:2.1.3-1.0.0"
14 ]
15 },
16(以下略)
以前は aws/codebuild/android-java-8:26.1.1
のようにAndroidイメージが提供されていたのですが、少し仕様が変わったようですね。
CodeBuild のビルド仕様に関するリファレンス を確認すると、「 ubuntu/standard/2.0
を使って、 buildspec.yml
内の runtime-versions
で指定しなさい」と記載されているので、そのようにします。
1phases:
2 install:
3 runtime-versions:
4 java: openjdk8
5 android: 28
ただし、ubuntu/standard/2.0
が2019/05現在でサポートしているのはAndroid 28.x
なので、古いバージョンは指定できないことに注意が必要です。
複数のAndroid SDK、または古いSDKが必要な場合
CodeBuildがデフォルトで提供しているAndroid SDK 以外のバージョンを使いたい場合には、buildspec.yml
内で個別にインストールする必要があります。
以下では install
フェーズに sdkmanager
コマンドを使って任意のバージョンをインストールしています。
指定方法は sdkmanager --list
で出力されたものに限ります。
1 install:
2 commands:
3 - sdkmanager --list
4 - sdkmanager "build-tools;26.0.0"
CodeBuildの標準出力を日本語化する
CodeBuildのジョブを設定した実際に動かしてみると、文字化けしていることがあります。 これはUbuntuのイメージの中に日本語化パックが入っていないことが原因なので、個別にインストールしましょう。
以下がサンプルコードです。 language-pack-ja-base
や language-pack-ja
をインストール後、有効化しています。
1phases:
2 install:
3 commands:
4 - apt-get -y update
5 - apt-get -y install language-pack-ja-base language-pack-ja
6 pre_build:
7 commands:
8 - locale-gen ja_JP.UTF-8
9 - /usr/sbin/update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
10 - export LANG=ja_JP.UTF-8
11 - export LANGUAGE=”ja_JP:ja”