GitLab CI with GitHub - Mobile CI/CD Meetup LT

![image.png](https://qiita-image-store.s3.amazonaws.com/0/51949/d7caa909-85dd-27ca-ea13-f598d7efc25d.png)

本日開催予定の Mobile CI/CD Meetup，LT枠で申し込んでおきながら体調を崩してしまって参加できなくなってしまいました．
関係者の方々大変ご迷惑をお掛けして申し訳ありません．

とはいえ，せっかく資料を作ったので，このまま寝かせるのももったいないのでQiitaに投稿することにします．

# GitLab CI with GitHub

<img src="https://qiita-image-store.s3.amazonaws.com/0/51949/2352200c-de1a-a05d-b493-77a4fd35589e.png" width=70%>

今回発表するつもりだったのはこちら．「GitLab CI with GitHub」です．

# Why GitLab CI?

<img src="https://qiita-image-store.s3.amazonaws.com/0/51949/5a920c70-301c-6e10-7fa1-8ee049a0dfb8.png" width=70%>

GitLabといえば，GitHubのOSSクローンや競合と思う方も多いかと思います．
しかし，GitLabはCIに関する機能も豊富で自由度が高く，このCI機能を単体で使うというのも十分に検討の価値が有ります．

上の図は， [Forrester Wave社の調査](https://about.gitlab.com/2017/09/27/gitlab-leader-continuous-integration-forrester-wave/) によるCIツールの評価です．
現在の価値提供，及びツールの戦略で高い評価を得ています．

また，GitLab CIはオンプレミスな環境に導入できますので，社外にソースコードやビルド出す必要もありません．
大人の事情でSaaSなCIサービスが使えない御社[誰？]にも最適です．

## GitLab CI is powerful!

<img src="https://qiita-image-store.s3.amazonaws.com/0/51949/8d481b8e-abcb-2380-771e-b5a6956b0913.png" width=70%>

こちらは具体的なGitLab CIの特徴です．

### GitLab CI Runner

実際にビルドなどを行うマシンにRunnerソフトウェアをインストールすることで，GitLab CIとして動かすことができるようになります．
Runnerは，オンプレミスな物理サーバやAWS，GCPなどのクラウド，または手元の余ったPCに自由にインストールできます．
OSも，Win, Mac, Linuxをサポートしています

### CI Engine(Executor)

GitLab Runnerは，CIを実行するための複数の `Executor` を提供します．
Dockerはもちろん，Shell, docker-machine, Kubernetes, VirtualBox, SSH, etc...
docker-machineでAWSやGCPを指定することで，CIのたびにインスタンスを起動する，オートスケールなCI環境を構築することもできます

### Private Container Registory

例えば，AndroidをビルドするためのDockerイメージは，Android SDKを含んだまま公開してしまうと，再配布条件に引っかかってライセンス違反となってしまいます．
GitLabはプライベートなDockerイメージのレジストリを持っており，いつでもそのプライベートなイメージでビルドすることができるようになります．
CIのたびにAndroid SDKのダウンロードやアップデートするのを最小限にでき，CIの時間を短縮できるようになります．

### Auto DevOps

モバイルでは恩恵は少ないのですが， GitLabは `Auto DevOps` というDevOps支援のツールチェインを目指していて，

- Build
- Test
- Code Quality
- Review App
- Deploy
- Monitoring

まで，一貫したDevOpsツールチェインとなっています．
恩恵に預かりやすいのはバックエンド開発でしょうか．GitLab CIのメリットはモバイル開発に限らないので，ぜひバックエンドCIでも使ってみてください．

## Network

<img src="https://qiita-image-store.s3.amazonaws.com/0/51949/44c5ef37-dcdc-7118-b865-da4bb92f6ae6.png" width=70%>

連携はこんな感じです．
GitLab本体と，CI Runnerはサーバリソースを共有しない形で立てます．
GitLabのGitHub連携は， [Premiumライセンス](https://about.gitlab.com/pricing/) が必要です．（19 USD / month / user）
そのまま利用とすると，人数分のライセンスが必要になってしまいますが，GitLab CIだけが目的であれば，管理ユーザ1名分のライセンスのみで利用できます．
結果はSlackへ通知し，各開発者はSlackで結果を確認します．

ちなみに， [Circle CI](https://circleci.com/pricing/#build-enterprise) のオンプレミス料金を見ると， 35 USD / month /user ですので，それよりもだいぶお安めです．
また，もちろん同時ビルド数に制限などありません．

## Sample GitHub repository

https://github.com/tetsukay/test-gitlab-ci

<img src="https://qiita-image-store.s3.amazonaws.com/0/51949/03511fa4-ab00-04b0-0054-3047ee3ac39b.png" width=70%>

サンプルのGitHubリポジトリです．
ここでは，単純に GitLab CI 実行するための `.gitlab-ci.yml` を配置しています．
その中身もとても簡単ですね．シェルコマンドで `ehco OK` を実行しているだけです．
もちろん，Androidのソースコードがあるリポジトリで， `./gradlew build` を実行すれば，AndroidプロジェクトのCIを実行することができます．

## Link GitHub to GitLab

<img src="https://qiita-image-store.s3.amazonaws.com/0/51949/8cf42d8e-16ac-f96b-b839-b866063656d1.png" width=70%>

それでは実際に連携してみます．
なお，この連携は自分で GitLab を立てなくても， [gitlab.com](https://gitlab.com/) で試してみることもできます．

GitLabのNew Projectから， `CI/CD external repo` を選択し，GitHubをクリックします．
GitLabがEnterprise Premium以上のライセンスでないと，この選択肢が出てきませんのでご注意ください．

---

<img src="https://qiita-image-store.s3.amazonaws.com/0/51949/6ecefef3-ae5a-505b-3a63-a4b647fb11e4.png" width=70%>

GitHubのPersonal Access Tokenの入力画面に移ります．
未発行の場合は，リンク先からPATを発行します．

---
<img src="https://qiita-image-store.s3.amazonaws.com/0/51949/c1e5e0a1-9de3-489a-f621-1481ea697b34.png" width=70%>

scopeはrepoを選択してPATを作成します．

---
<img src="https://qiita-image-store.s3.amazonaws.com/0/51949/0858e3cd-deb7-94fa-dc56-06b3c1b6bb11.png" width=70%>

PATを入力すると，連携するGitHubリポジトリの選択画面が表示されます．
各リポジトリに `Connect` ボタンがあるので，クリックすると連携できます．
連携が完了すると，画像のように `Done` と表示されます．

---
<img src="https://qiita-image-store.s3.amazonaws.com/0/51949/69b95d3e-03e3-2608-a7d9-656350c4b11e.png" width=70%>

連携が完了すると，GitLab側にもGitHubのリポジトリが取り込まれます．
この時点でWebHookも自動で連携されています．

### Pipeline

<img src="https://qiita-image-store.s3.amazonaws.com/0/51949/e7ebb8a0-b3fb-6787-42ad-3817a237e3f8.png" width=70%>

パイプラインページに移動してみると，すでにパイプラインが動いており，passしています．

### Job Details

<img src="https://qiita-image-store.s3.amazonaws.com/0/51949/26cf8ce7-b3b4-5b93-8156-9f9b47d9d4b7.png" width=70%>

ジョブの詳細を見てみると，ちゃんと ok がコンソールに出力され，ビルドがパスしているのがわかります．

# Conclusion

<img src="https://qiita-image-store.s3.amazonaws.com/0/51949/44979460-9a38-98b3-9c37-013132f73b9a.png" width=70%>

完全無料！とは行きませんでしたが，GitLab CIは十分に低コストでオンプレミスで ~~ナウい~~ モダンなCI環境を提供してくれます．
すでにGitLabを使っている方は，それこそPremiumライセンス不要でGitLab CIを使えます．(Community Editionでも．)

みなさんも試してみてはいかがでしょうか？