OSS Drone CI の 構築方法

## はじめに
Droneとは[OSS版](https://github.com/drone/drone)と[クラウド版](https://drone.io/pricing/)で提供されているCIツールです。

![download.png](https://qiita-image-store.s3.amazonaws.com/0/99874/1310e528-1fd2-24cc-e8aa-919d6b5477b0.png)

今回は、OSS版のDroneを起動し、Github（Enterprise）と連携したので、その手順をまとめます。


ザクザク行けば15分程度でDrone起動とGithub連携認証までいけると思います。

※Docker自体の環境構築がお済みでない方は、[DockerをMacにインストールする ](http://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)をご参考下さい。

また、[@y_tsubuku](https://twitter.com/y_tsubuku)が開発する[yaritori - メール共有システム](https://yaritori.jp/)も、良ければご覧ください :tada: 

## docker-compose.ymlを作成する :sparkles: 
適当なディレクトリ（今回は`drone`とします）に`docker-compose.yml`を作成します。

```bash
$ mkdir drone && cd drone
$ vi docker-compose.yml
```

```yaml:docker-compose.yml
version: '2'

services:
  drone-server:
    image: drone/drone:0.7.3
    ports:
      - 80:8000
    volumes:
      - ./drone:/var/lib/drone/
    restart: always
    environment:
      - DRONE_OPEN=true # ユーザ登録を可能にする
      - DRONE_HOST=${DRONE_HOST} # 後述
      - DRONE_GITHUB=true # Githubを使用する
      - DRONE_GITHUB_URL=${DRONE_GITHUB_URL} # Github Enterpriseを使用している場合に設定する
      - DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT} # 後述
      - DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET} # 後述
      - DRONE_SECRET=${DRONE_SECRET} # 後述
      - DRONE_GITHUB_PRIVATE_MODE=true # Github Enterpriseをプライベートモードで動かしている場合はtrueにする

  drone-agent:
    image: drone/drone:0.7.3
    command: agent
    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_SERVER=ws://drone-server:8000/ws/broker
      - DRONE_SECRET=${DRONE_SECRET}
```

## Droneを起動する :rocket: 

```
$ docker-compose up
```
この状態で、http://localhost/ にアクセスすると…

<img width="1280" alt="スクリーンショット 2017-07-03 19.22.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/99874/3c5f000f-32f8-0f70-bbc3-4fb3c964a5e2.png">


これで動作確認ができました :tada:

## ngrokでローカルとグローバルを繋ぐ :map: 
Githubとの連携にはOauth認証が必要です。
その際、コールバックのURLがグローバルでないとリクエストを受けれないため、
[ngrokの使い方（windows, mac） - Qiita](http://qiita.com/Esfahan/items/74e71edfe17d9935d47e)
を参考にngrokでグローバルなURLを取得してください。

## 環境変数を設定する :leaves: 
`docker-compose.yml`と同じディレクトリに`.env`を作成します。

```ini:.env
DRONE_GITHUB_URL=使用しているドメイン # ex) https://your-domain.com
DRONE_GITHUB_CLIENT=Githubで取得
DRONE_GITHUB_SECRET=Githubで取得
DRONE_SECRET=ランダムな文字列
DRONE_HOST=ngrokで取得したURL
```
* DRONE_GITHUB_CLIENTとDRONE_GITHUB_SECRET
    * https://github.com/settings/developers から取得
    * （enterprise版をお使いの場合はFQDNを変えてアクセス）
* DRONE_SECRET
    * ランダムな文字列。[このあたりを参考](http://qiita.com/na-o-ys/items/45446c34ea7f5fa57f28)に生成
* DRONE_HOST
    * Droneサーバのパブリックアドレス(ここではngrokで取得したURL)を設定
    * Githubのステータスを更新するのに使用される([参考](https://stackoverflow.com/questions/44689052/drone-build-status-not-updated-in-github-pending-forever))

### Githubにアプリケーションを登録する際の参考
<img width="582" alt="OAuth_Application_Settings.png" src="https://qiita-image-store.s3.amazonaws.com/0/99874/e25f8241-6376-3ba5-648a-1977e3961525.png">

## ログインする :computer: 
https://{ngrokで割り当てられたホスト名}.ngrok.io/login
から、アプリケーションを認証すれば連携可能な状態になります :tada:

<img width="1279" alt="welcome___drone.png" src="https://qiita-image-store.s3.amazonaws.com/0/99874/4f95f48f-80eb-50ca-c933-098f41525d5c.png">


## 終わりに
OSS版Droneを使用すれば、オンプレミス環境での運用も可能です。
Github Enterpriseや、閉じたネットワーク内でのCIとしての有効活用など色々と試して見てもらえればと思います。