Android
GitLab
AndroidStudio
GitLab-CI

GitLab CIでAndroidStudioプロジェクトのCI環境を構築する

More than 1 year has passed since last update.

AndroidStudioプロジェクトの
- ビルド
- fabricでのBeta配信
- GooglePlayStoreへのアップロード
をCI環境で実現しました。

実行環境

  • GitLab CE 9.3.9
  • GitLab-CI 9.3.9
  • Gradle 3.2
  • Android SDK Tools 26.0.2
  • Compile SDK 25
  • Build tools 25.0.2

Runnerマシンの構築

利用したMacは10.12.6

CI Runnerのインストール

GitLab本家のドキュメント通りに実行しました。
https://docs.gitlab.com/runner/install/osx.html

RunnerをGitLabに登録

こちらも本家GitLabのドキュメント通りに実行し問題ありませんでした。
https://docs.gitlab.com/runner/register/index.html#macos

そのほか、補足事項

参考までに、Runnerの登録設定

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
{gitlabのURL}

Please enter the gitlab-ci token for this runner:
{Runnerのtoken。調べ方は上のリンク (補足事項)}

Please enter the gitlab-ci description for this runner:
{ランナーの説明}

Please enter the gitlab-ci tags for this runner (comma separated):
ci-for-android

Whether to run untagged builds [true/false]:
[false]: 

Whether to lock Runner to current project [true/false]:
[false]: 

Registering runner... succeeded                     runner=cqapF6Xd
Please enter the executor: docker+machine, docker-ssh+machine, parallels, ssh, shell, virtualbox, kubernetes, docker, docker-ssh:
docker

Please enter the default Docker image (e.g. ruby:2.1):
openjdk:8-jdk

Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 

ジョブの記述

.gitlab-ci.ymlという名前のファイルにRunnerに実行させたい処理(job)を記述します。
このファイルはリポジトリのルートに置く必要があるようです。

GitLab本家のブログにサンプルのymlが公開されています。
https://about.gitlab.com/2016/11/30/setting-up-gitlab-ci-for-android-projects/
が、最新のSDK Toolを指定してビルドすることはできません。
事前準備のところでこけます。

結局、私は以下のようにしました。

before_script

image: openjdk:8-jdk

variables:
  ANDROID_COMPILE_SDK: "25"
  ANDROID_BUILD_TOOLS: "25.0.2"
  ANDROID_SDK_TOOLS: "3859397"
  SDK_ROOT: "/sdk"

before_script:
  - apt-get --quiet update --yes
  - apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
  - wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip
  - unzip android-sdk.zip -d ${SDK_ROOT}
  - mkdir -p /root/.android
  - touch /root/.android/repositories.cfg
  - mkdir -p ${SDK_ROOT}/licenses
  - cp ./android-sdk-license ${SDK_ROOT}/licenses/
  - ${SDK_ROOT}/tools/bin/sdkmanager --package_file=./packages.txt
  - export ANDROID_HOME=${SDK_ROOT}
  - export ANDROID_NDK_HOME=${SDK_ROOT}/ndk-bundle/
  - export PATH=$PATH:${SDK_ROOT}/platform-tools/
  - touch local.properties
  - echo "sdk.dir=${ANDROID_HOME}" >> local.properties
  - echo "ndk.dir=${ANDROID_NDK_HOME}" >> local.properties

SDK Toolsの指定

AndroidStudioのダウンロードページより
https://developer.android.com/studio/index.html
この数字を変数化しました。
スクリーンショット 2017-08-31 10.19.13.png

variables:
  ANDROID_SDK_TOOLS: "3859397"
# 中略
before_script:
  - wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip

repositories.cfg could not be loaded.

以下のようなワーニングが出ます。

Warning: File /root/.android/repositories.cfg could not be loaded.

ファイル自体を作成することでワーニングを回避しました。
それ以上は深追いせず。

before_script:
  #中略
  - mkdir -p /root/.android
  - touch /root/.android/repositories.cfg

AndroidSDKのダウンロード&インストール

SDK Toolsに同梱されているsdkmanagerを使い、AndroidSDKをダウンロードを試行します。
が、利用規約への同意がなされていなければ、インストールすることができません。

The following packages can not be installed since their licenses or those of the packages they depend on were not accepted:

sdkmanagerの --licenses オプションが使えそうと思ったのですが、CUIで都度"y"を入力する仕様のようでCI環境には適しませんでした。
結局、開発マシンに保存されているライセンスへの同意が記述されたファイルをコピーすることで回避しました。

また、インストールするSDKの指定方法など、こちらの記事を参考にしました。
http://y-anz-m.blogspot.jp/2017/05/android-sdkmanager.html

私の場合はNDKを含め、このようにパッケージの指定をしました。

platform-tools
build-tools;25.0.2
platforms;android-25
extras;android;m2repository
extras;google;m2repository
extras;google;google_play_services
ndk-bundle
lldb;2.3
cmake;3.6.4111459

NDKのパスを通す

続いて、以下のようなエラーが発生しました。

NDK is missing a "platforms" directory.
If you are using NDK, verify the ndk.dir is set to a valid NDK directory.  It is currently set to /builds/XXXX/XXXX/sdk/ndk-bundle.
If you are not using NDK, unset the NDK variable from ANDROID_NDK_HOME or local.properties to remove this warning.

NDKを使用していないプロジェクトにもかかわらず...です。
こちらはAndroid gradle plugin 2.3の問題のようです。
https://github.com/requery/requery/issues/467
Android gradle plugin 2.2へダウングレードすることで回避できるようですが、
NDKを扱うプロジェクトもCI環境に載せる予定だったため、NDKのパスを正しく指定することで回避しました。

variables:
  SDK_ROOT: "/sdk"

before_script:
  # 中略
  - export ANDROID_HOME=${SDK_ROOT}
  - export ANDROID_NDK_HOME=${SDK_ROOT}/ndk-bundle/
  - touch local.properties
  - echo "sdk.dir=${ANDROID_HOME}" >> local.properties
  - echo "ndk.dir=${ANDROID_NDK_HOME}" >> local.properties

※ local.propertiesをリポジトリで管理している場合は、この限りではありません。

デバックビルドしてみる

gradleでビルドしてみます。
私の環境では、これでビルドに成功しました。

image: openjdk:8-jdk

variables:
  ANDROID_COMPILE_SDK: "25"
  ANDROID_BUILD_TOOLS: "25.0.2"
  ANDROID_SDK_TOOLS: "3859397"
  SDK_ROOT: "/sdk"

before_script:
  - apt-get --quiet update --yes
  - apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
  - wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip
  - unzip android-sdk.zip -d ${SDK_ROOT}
  - mkdir -p /root/.android
  - touch /root/.android/repositories.cfg
  - mkdir -p ${SDK_ROOT}/licenses
  - cp ./android-sdk-license ${SDK_ROOT}/licenses/
  - ${SDK_ROOT}/tools/bin/sdkmanager --package_file=./packages.txt
  - export ANDROID_HOME=${SDK_ROOT}
  - export ANDROID_NDK_HOME=${SDK_ROOT}/ndk-bundle/
  - export PATH=$PATH:${SDK_ROOT}/platform-tools/
  - touch local.properties
  - echo "sdk.dir=${ANDROID_HOME}" >> local.properties
  - echo "ndk.dir=${ANDROID_NDK_HOME}" >> local.properties

stages:
  - build

build:
  stage: build
  script:
    - ./gradlew assembleDebug
  tags:
    - ci-for-android

タグの指定について

  tags:
    - ci-for-android

こちらの記事を参照してください。