12
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Androidその2Advent Calendar 2016

Day 12

GitlaberのためのAndroid Dockerベース CI

Posted at

Gitlover ではありません. Gitlaberです.

Gitlabについて

 みなさん,仕事で使っているのは Github Enterpriseでしょうか?
 Gitlab,ご存知ですか?
 成長期の評判 だったり,例のアイコンだったり,Githubクローン(単刀直入に言うと劣化版Github)というちょっとネガティブなイメージがあるかもしれません.
image(例のアイコン.いまのはこんなに眼力強くない)
 弊社ではGHEの利用価格と運用コスト(GHEでも運用費用はゼロにはならない)とGitlab Community Editionの運用コストを比較した結果,Gitlab CEが採用されることになりました.

(当時は要求していたGHEが通らず消沈していた記憶が…)

コンテナベースCI

 Androidに限った話ではないのですが,JenkinsからTravis CIやらCircle CIといったコンテナベースCIが普及してきました.Jenkinsはビルドジョブ設定がリポジトリと乖離してしまうために版管理ができないというデメリットや,特定のプラグインへの依存,UIによるジョブ設定のための属人化,クリーンなCI環境の維持の難しさが課題となっていました.
 そこに風穴を開けたのがコンテナベースCIと呼ばれる技術でしたが, まだ CircleCI で消耗してるの? という話もあり Wercker が台頭してきました.
 Werckerもコンテナベースではあるのですが, Dockerコンテナ上で動作させることができますので,最新の Android SDK を使ってCIしたい場合も,Circle CIのようにサービス側の対応を待つ必要もなく,ymlにSDKのアップデート処理を埋め込んで,CIのたびにSDKのアップデートから始まるということもありません.

会社がうるさい

 いやぁ,それでもセキュリティ面,価格面がキビシイ会社はまだまだあります.

  • Wercker? 価格は? $350? 安いね
    • え? 並列実行が制限されるの?
    • え? クラウドにソースコード出すの?
    • え? DockerfileもDockerHubにだすの?
    • えー…

めんどくさいので,社内にDockerベースCIを立ててしまうことにしましょう!

Gitlaberだけにできる選択

  • Gitlab
  • Gitlab CI Runner
  • Gitlab Container Registry

Gitlab

 Gitlab の説明は,まぁ,不要ですよね.
 Githubみたいなものです.
 バージョン8系よりCI機能がGitlabに統合され,Gitlab CIの設定も行えるようになりました.
 ただし,実際にCIする環境はGitlabとは別に用意する必要があります.

Gitlab CI Runner

 それがこのGitlab CI Runnerと言われるやつです.
 GitlabからCI命令を受け,実際にビルドを走らせる環境です.
 gitlab.com では Shared Runnerという共用サーバが提供されています が,自前でGitlab立てている場合はRunnerも自前で用意する必要があります.

Gitlab CI Runner Executor

 RunnerにはいくつかのExecutorを指定することができます.
 Executorとは,CIを実際に動かすベース環境といえば良いのでしょうか.良い表現が浮かびませんが,聞いてもらったほうがわかりやすいので,とりあえず代表的なものを紹介します.
 ひとつのRunnerに対して,複数のExecutorを指定することはできますが,副作用がある気がするのであまりお勧めできません.

Docker

 Werckerのように,DockerベースでCIすることができます.
 DockerHubなどでAndroidのDockerイメージが共有されていればそのまま使えますが, AndroidSDKを含めたDockerイメージの公開はライセンス的に問題がある という話もあるので,後述する Gitlab Container Registry と併せて使います.

Shell

 Jenkinsのように,そのRunnerの環境上でCIを実行します.
 通常,Dockerイメージの用意できないWindowsやMac上でのCIで使えると思いますが,ドキュメントには一般的にShellでの実行はセキュリティリスクがあると 書かれています

VirtualBox

 Runnerの中にVirtualBoxでVMを立てて,その中でCI?
 使い捨てのWindows環境が欲しい場合とかに有用?

SSH

 RunnerからリモートサーバへSSH接続して,リモートサーバ上でCIします.
 使いみちは…?

まぁ,ほとんどはDockerで事足りると思います.
gitlab.comのShared RunnerもDocker Executorです.

Gitlab Container Registry

 プライベートなDockerHubのようなものです.
 Dockerイメージの管理は,別途 Docker Registry を動かして管理されます.
 Gitlab Container RegistryはDocker RegistryとGitlabの接続とUIを提供します.

Gitlab CI 全体の流れ

  • GitlabにDockerImage管理用プロジェクトを立てる
  • Dockerfileと .gitlab-ci.yml に記述したビルド設定を配置する
    • Gitlab CI Runner上でDockerイメージがビルドされ,Container Registryに登録される
  • Androidプロジェクトを立てる
  • .gitlab-ci.yml に Androidのビルドを記述する
    • 上のDockerイメージを用いるようにする
  • オリジナルDockerイメージを使ってCIできる.

DockerイメージとAndroidリポジトリを結びつけるなら,Dockerイメージリポジトリをsubmoduleでリンクさせるのがベストでしょうか.

Gitlab + Gitlab CI Runner + Docker Registryの導入

カット(あまりにもAndroidからかけ離れてしまう&Gitlab CI RunnerのコンテナとRegistryが接続できずに詰まってる)
別記事として書く予定です.
今回はgitlab.comを使います

(追記)
私が書くまでもなく,Gitlab Advent Calendarで記事化してくれた方がいらっしゃいました.
http://qiita.com/masakura/items/0a0f00dfdddc8ce27f29
ただし,今回のようにGitlab CI Runner上でDockerベースCI(Docker in Docker)を行うには,Registryと正規SSL証明書で通信できるようにする必要がありそうです.

Dockerイメージの作成

Dockerfile管理用リポジトリを作成

gitlab.com でDockerfileの管理用リポジトリを作成します.
今回は名前を android-container としています.
ライセンスの問題があるので,このプロジェクトはprivateとしてください.

.gitlab-ci.yml ファイルを追加

.gitlab-ci.yml というファイルにビルドスクリプトを記述すると,Gitlab CI Runnerがそのとおりにビルドしてくれます.
gitリポジトリを作って,その中に .gitlab-ci.yml を作ってpushしても良いのですが,面倒なのでここは gitlab.com 上から作ってしまいます.
New Fileで .gitlab-ci.yml とファイル名を入力すると,右にテンプレートが選べるようになりますので,Dockerを選択してテンプレのままコミットします.

image

.gitlab-ci.yml
# This file is a template, and might need editing before it works on your project.
# Official docker image.
image: docker:latest

services:
  - docker:dind

build:
  stage: build
  script:
    - docker login -u "gitlab-ci-token" -p "$CI_BUILD_TOKEN" $CI_REGISTRY
    - docker build --pull -t "$CI_REGISTRY_IMAGE:$CI_BUILD_REF_NAME" .
    - docker push "$CI_REGISTRY_IMAGE:$CI_BUILD_REF_NAME"

コミットした瞬間からCIが走りますが,まだDockerfileがないので,ビルドは当然失敗します.

image

Dockerfile 追加

@gfx さんがMIT Licenseで公開してくださってるDockerfile をお借りします.
これをそのまま .gitlab-ci.yml と同じ場所に配置してコミットします.
コミットすると自動的にDockerイメージのビルドが走り,Registryに登録されます.

image

Android リポジトリの作成

すでにAndroidリポジトリがあれば,それを新しく作ったプロジェクトにコミットして構いません.
今回はDockerfile同様横着させていただいて, giltab-ci-shared-runner-android-example をForkさせてもらいます.

.gitlab-ci.yml 修正

ForkしたプロジェクトにはすでにFork元で作られた .gitlab-ci.yml があります.
手持ちのAndroidプロジェクトをコミットした場合は, .gitlab-ci.yml を追加してください.

.gitlab-ci.yml
image: registry.gitlab.com/greysonp/gitlab-ci-shared-runner-android-example:latest

before_script:
  - chmod +x ./gradlew

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

Fork元はこうなっています.
特別なことはしていませんね.debugビルドして,成果物を指定しています.
このymlで指定されているimageを,今回自分で作ったイメージに切り替えます.

image: registry.gitlab.com/tetsukay/android-container:master

コミットすると,Andoidプロジェクトのビルドが走ります.

image

というわけで,無事ビルドに成功しました.
Gitlabを使っている方はGitlab CI,試してみてはいかがでしょうか.

さいごに

Android成分が少なめですみません.
Gitlabへの印象は,私自身最初はやはり良い印象はありませんでした.
導入から4年ほど立ちましたが,毎月20日頃のメジャーアップデートをはじめとした進化速度や,Gitlab CI,Docker Registry連携など,欲しい機能がどんどん追加され,今では本当に素晴らしいツールに進化したと思います.
いろいろなしがらみで社内のGitlab + JenkinsでCIしている方も多いと思いますが,ぜひGitlab CIを試してみてください.

12
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?