GitLab CI for Android 筆記

簡介

現在只要在 GitLab Project 的根目錄裡面新增一個 .gitlab-ci.yml,就可以啟用 GitLab CI的功能,如果你不需要自己定義一個 Specific Runners 讓特定的專案使用,那麼只要使用 GitLab 提供的 Shared Runners 就可以開始使用 CI 囉(Shared Runners 預設已經開啟)!

Shared Runners on GitLab.com run in autoscale mode, are free to use, and sponsored by DigitalOcean. Autoscaling means reduced waiting times to spin up builds, and isolated VMs for each project, thus maximizing security.

概念

讓我們來認識一下在 GitLab CI 裡的一些名詞吧!
首先看一下 GitLab CI 的整體架構:

Pipeline

每一個 Pipeline 就代表一次完整任務的執行。一個完整的任務裡面會有許多個不同的階段,而在每個階段裡面可以執行各種的小任務,像是安裝環境、跑測試、產生APK等等。

任何的 Commit 或是 Merge request 都可以觸發一次 Pipeline 的執行。

Stage

Stage 就是 Pipeline 裡面的階段,我們可以在 Pipeline 裡面定義數個不同的 Stage,以下是 Stage 的特點以及和 Pipeline 的關係:

  • Stage 會按照你定義的順序執行(Synchronous)。
  • 當 Pipeline 內所有的 Stage 都成功時,Pipeline 才算成功。
  • 如果有一個 Stage 失敗時,後面的 Stage 就不會再繼續執行,並且這次的 Pipeline 就算失敗。

Job

Job 就是 Stage 裡面的小任務,一個 Stage 裡面可以執行數個不同的小任務,以下是 Job 的特點以及和 Stage 的關係:

  • 同一個 Stage 裡面的所有 Job 會同時開始進行(Asynchronous)。
  • 同一個 Stage 裡面所有的 Job 都成功時,Stage 才算成功。
  • 如果任何一個 Job 失敗,那這個 Job 所屬的 Stage 就會失敗,同時 Pipeline 也會失敗。

之後再慢慢補上 .yml 的說明。

使用 Shared Runners 跑 CI 的範例(2017/04/13 ):

image: openjdk:8-jdk

variables:
ANDROID_COMPILE_SDK: "25"
ANDROID_BUILD_TOOLS: "25.0.2"
ANDROID_SDK_TOOLS: "25.2.5"

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/tools_r${ANDROID_SDK_TOOLS}-linux.zip
- unzip android-sdk.zip

- echo y | tools/android --silent update sdk --no-ui --all --filter android-${ANDROID_COMPILE_SDK}
- echo y | tools/android --silent update sdk --no-ui --all --filter platform-tools
- echo y | tools/android --silent update sdk --no-ui --all --filter build-tools-${ANDROID_BUILD_TOOLS}
- echo y | tools/android --silent update sdk --no-ui --all --filter extra-android-m2repository
- echo y | tools/android --silent update sdk --no-ui --all --filter extra-google-google_play_services
- echo y | tools/android --silent update sdk --no-ui --all --filter extra-google-m2repository

- export ANDROID_HOME=$PWD/
- export PATH=$PATH:$PWD/
- chmod +x ./gradlew

- mkdir -p "${ANDROID_HOME}/licenses"
- echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license"

stages:
- test
- build

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

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

使用 Specific Runners 跑 CI 的範例(2017/04/17 ):

image: openjdk:8-jdk
variables:
ANDROID_COMPILE_SDK: "25"
ANDROID_BUILD_TOOLS: "25.0.2"
ANDROID_SDK_TOOLS: "25.2.5"

before_script:
- export ANDROID_HOME=/Users/willy/Library/Android/sdk/
- export PROJECT_PATH=$PWD/

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

functionalTests:
stage: test
script:
- chmod +x ./wait-emulator
- /Users/willy/Library/Android/sdk/tools/emulator -avd Nexus_5_API_22 -no-window -no-audio & ./wait-emulator
- adb shell input keyevent 82
- ./gradlew cAT
- adb emu kill

References