Android
Git
GitHub
GitLab

gitlab.com で いますぐCI してみよう

 QiitaでもMicrosoftによるGitHub買収でいろいろと盛り上がっていますが,よほどのアンチMSでもなければ,特にGitHubからGitLabへ移行することも無く「ふーん」で終わってしまうでしょう.

 しかし,GitLabにはGitHubには無い魅力も満載です!
 (わかりやすいところでは,プライベートリポジトリが無限に作れるところとか.GitHubもMicrosoftに買収されてやってくる気もしますが)
 見方によっては本番DBを吹き飛ばしかけたところも,とてもお茶目でかわいらしいですね

GitLabの目玉機能 CI/CD Pipeline

 今回はその魅力の一つ, CI / CD機能のご紹介です. もちろん無料です (が, 1ユーザ1ヶ月あたり2,000分の制限があります
 GitHubの場合,別途 Travis や CircleCI,Drone.ioといった外部のCIサービスと,CIのベースとするDockerのコンテナレジストリサービスと連携して行うことがほとんどだと思いますが,GitLabはいずれも自己完結することができます.
 しかし,無料だからといって仮想通貨のマイニングとかすると他のユーザにもGitLabにも迷惑なのでしないでくださいネ
 なお,今回のサンプルはAndroidアプリをベースとしています.

第三者評価でも高評価を得たCI機能

2017/9に,GitLab CIは Forrester Wave社の第三者評価で高い評価を得ています.
https://about.gitlab.com/2017/09/27/gitlab-leader-continuous-integration-forrester-wave/

image.png

右上に行くほど戦闘力高い

CIしてみる

 では早速CIしてみましょう.
 今回使用したサンプルプロジェクトはこちらで公開しています
 https://gitlab.com/tetsukay/qiita-gitlab-ci-sample

プロジェクトをpushする

まずは,GitLab上でプロジェクトをつくり,Android Studioで作ったAndroidプロジェクトを,そのままGitLab上にpushします.
GitLabのページを更新して,ファイルがアップロードされていることを確認します.

.gitlab-ci.yml を作る

次に,GitLab CI のCI/CDの設定ファイルである .gitlab-ci.yml を作ります.

image.png

プロジェクトトップ,またはリポジトリのファイル一覧のページから,New Fileを選択します.
WebIDEを使っても良いのですが,New Fileからだと .gitlab-ci.yml がテンプレート化されているので,こちらのほうがラクです.

image.png
New File の画面に遷移したあとは,テンプレートから .gitlab-ci.yml を選び,さらに Android のテンプレートを読み込みます.

.gitlab-ci.yml
# This file is a template, and might need editing before it works on your project.
# Read more about this script on this blog post https://about.gitlab.com/2016/11/30/setting-up-gitlab-ci-for-android-projects/, by Greyson Parrelli
image: openjdk:8-jdk

variables:
  ANDROID_COMPILE_SDK: "27" # 修正
  ANDROID_BUILD_TOOLS: "27.0.3" # 修正
  ANDROID_SDK_TOOLS: "24.4.1" # 修正不要

before_script:
  - apt-get --quiet update --yes
  - apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
  - wget --quiet --output-document=android-sdk.tgz https://dl.google.com/android/android-sdk_r${ANDROID_SDK_TOOLS}-linux.tgz
  - tar --extract --gzip --file=android-sdk.tgz
  - echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter android-${ANDROID_COMPILE_SDK}
  - echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter platform-tools
  - echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter build-tools-${ANDROID_BUILD_TOOLS}
  - echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter extra-android-m2repository
  - echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter extra-google-google_play_services
  - echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter extra-google-m2repository
  - export ANDROID_HOME=$PWD/android-sdk-linux
  - export PATH=$PATH:$PWD/android-sdk-linux/platform-tools/
  - chmod +x ./gradlew

stages:
  - build
  - test

build:
  stage: build
  script:
    - ./gradlew assembleDebug
  artifacts:
    paths:
    - app/build/outputs/

unitTests:
  stage: test
  script:
    - ./gradlew test

# ここから下は削除
functionalTests:
  stage: test
  script:
    - wget --quiet --output-document=android-wait-for-emulator https://raw.githubusercontent.com/travis-ci/travis-cookbooks/0f497eb71291b52a703143c5cd63a217c8766dc9/community-cookbooks/android-sdk/files/default/android-wait-for-emulator
    - chmod +x android-wait-for-emulator
    - echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter sys-img-x86-google_apis-${ANDROID_COMPILE_SDK}
    - echo no | android-sdk-linux/tools/android create avd -n test -t android-${ANDROID_COMPILE_SDK} --abi google_apis/x86
    - android-sdk-linux/tools/emulator64-x86 -avd test -no-window -no-audio &
    - ./android-wait-for-emulator
    - adb shell input keyevent 82
    - ./gradlew cAT

上記のようなテンプレートがテキストエリアに読み込まれます.
variables で設定されている ANDROID_COMPILE_SDK と ANDROID_BUILD_TOOLS のバージョンを適切に合わせます.
今回は ANDROID_COMPILE_SDK27 , ANDROID_BUILD_TOOLS27.0.3 に設定しました.
ANDROID_SDK_TOOLS はダウンロードするSDK zipのバージョンですので,そのままでも構いません
(CI中のSDKアップデートで必要なSDKバージョンを取得します)

ただ,残念なことにテンプレート中の functionalTests のセクションにかかれている androidInstrumentationTest は gitlab.com のCIでは動作しませんので,削除します.
ちゃんと設定すれば動くと思いますが,デフォルトでは動かないのでとりあえず今回は切り捨てます.
functionalTest をまるごと削除してください.

パイプライン

image.png

CI / CIメニューのパイプラインのページヘ移動すると, .gitlab-ci.yml が追加されたことでCIが走ります.
さらに,上記の running のアイコンをクリックすると

image.png

パイプライン構成を見ることができます.上の例では, build と unitTests がシーケンシャルで実施されることがわかります.
build が正常に終わると

image.png

と,変化して,unitTestsに遷移します.
build や unitTests をクリックすると,ビルドコンソールの詳細に遷移できます.

image.png

Artifacts

.gitlab-ci.yml に書かれた artifacts で指定されているファイルは成果物として保存されます.
パイプラインページ右のダウンロードボタンをクリックすると,buildステージで作られたapkをダウンロードできます.

image.png

まとめ

 GitHubにはない魅力の一つとして,GitLab CIを紹介させていただきました.
 単純にAndroidプロジェクトをビルドするだけならこのように数ステップだけで出来てしまいます.簡単ですね!

 ただ,デフォルトで用意されているCIランナーのスペックはショボいです.無料で開放しているので致し方ないところですが,少し大きいAndroidプロジェクトになると辛くなってきます.
 でもGitLab CIは,自分のPCや余っているPCにCIランナーをインストールすることで, 自分専用のGitLab.com のランナーとして追加することもできます!
 こういう柔軟なところもGitLabの魅力です!

参考情報