OSS版 drone.io を CentOS 7 で動かして Github Enterprise のリポジトリをテストする

## はじめに

以前、[Docker/Drone を CentOS 6.5 で動かして Github Enterprise のリポジトリをテストする - TAKUMI SAKAMOTO’S BLOG](http://blog.takus.me/2014/02/25/drone-on-centos/) のように CentOS 6.5 に Drone を立てたのであるが、最近の Drone は CentOS 6.5 のサポートを切り捨てているようで、CentOS 6.5 で動かそうとすると色々困難がある。CentOS 7 であれば rpm が用意されているのでさっくりインストールすることができる。

Docker も [Drop support for RHEL6/CentOS6 - docker/docker](https://github.com/docker/docker/issues/14365) と言っていたりするので、そういう意味でも CentOS 7 で動かしたほうが良い。もしくは Ubuntu.

## Docker のインストール

### iptables 有効化

CentOS 7 は標準では iptables ではなく firewalld を使うが、docker が iptables を利用するので、firewalld を無効化して iptables を有効化する

```
systemctl stop firewalld
systemctl disable firewalld
yum install iptables-services
systemctl enable iptables
systemctl start iptables
```

/etc/sysconfig/iptables で制限がかかっていて docker コンテナ間の通信がうまくいかなかったりしたので修正を入れた。

```diff
 *filter
 :INPUT ACCEPT [0:0]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [0:0]
 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 -A INPUT -p icmp -j ACCEPT
 -A INPUT -i lo -j ACCEPT
--A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
+-A INPUT -p tcp -m state --state NEW -m tcp -j ACCEPT
--A INPUT -j REJECT --reject-with icmp-host-prohibited
--A FORWARD -j REJECT --reject-with icmp-host-prohibited
 COMMIT
```

### Docker のインストール

https://docs.docker.com/installation/centos/

```
curl -O -sSL https://get.docker.com/rpm/1.7.0/centos-7/RPMS/x86_64/docker-engine-1.7.0-1.el7.centos.x86_64.rpm
yum localinstall --nogpgcheck docker-engine-1.7.0-1.el7.centos.x86_64.rpm
yum install libcgroup-tools # これも必要
```

yum install docker でも入るが、こちらの rpm のほうがバージョンが新しそうなのでこちらにした

動作確認

```
docker run hello-world
```


## Drone のインストール

cf. http://readme.drone.io/setup/install/centos/

```
wget downloads.drone.io/master/drone.rpm
sudo yum localinstall drone.rpm
```

### Drone の起動

起動

```
systemctl start drone
```

確認

ブラウザから80番ポートへアクセス

ログ

```
journalctl -u drone
```

### Drone の認証設定

github:e の OAuth を使って認証管理する。

https://GITHUB_DOMAIN/settings/applications/new

* Application Name: drone
* Homepage URL: http://DRONE_HOST
* Authorization Callback: http://DRONE_HOST/api/auth/enterprise.github.com

で、client id と client secret が発行されるので、/etc/drone/drone.toml に登録

```
[github_enterprise]
client="xxxxx"
secret="xxxxxxxxxxxxxx"
url = "https://GITHUB_DOMAIN"
api = "https://GITHUB_DOMAIN/api/v3/"
# orgs=[] # github_enterprise の特定 organization に所属しているメンバーのみユーザ登録を許可
private_mode=true # これで git@ でアクセスするようになる。github:e なので git@ でアクセスさせる
open=true # ユーザ登録を open にする
```

GITHUB_DOMAIN には github enterprise のドメインを、DRONE_HOST には drone をたてたホストを入れる。


再起動

```
systemctl restart drone
```

確認

ブラウザから80番ポートにアクセスし、github:e の OAuth でログインできることを確認

### アカウント発行

左上のメニュー > Users

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/860a1a0b-c0e0-790c-a586-f4ed81d61330.png)


右上の register users

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/a369d123-a757-2181-3e64-560719bb1532.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/9641/f052192d-ba5b-4b78-a218-57e9df9ce08d.png)

のようにしてアカウント発行する。これで他のメンバもログインできるようになるはずだ。

## ビルドの設定

### ビルドを許可するレポジトリの選択

左上のメニュー > Repositories

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/534660ac-d657-d09c-ef86-d18a2fa61f52.png)

レポジトリを検索して、チェックを入れる

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/ea8d8bc6-3803-5672-d86f-6923eb9274e2.png)

### .drone.yml の作成

そのレポジトリに .drone.yml を push する。自分はこんなかんじにしている。

```yaml
image: "bradrydzewski/ruby:2.0.0"
env:
  - RAILS_ENV=test
cache:
  - /tmp/bundler
git:
  depth: 1
script:
  - pwd
  - whoami
  - rbenv versions
  - lsof -P | grep TCP
  - ps -ef | grep socat
  - ls -la /tmp/bundler
  # for debug until here
  - sudo chown -R ubuntu:ubuntu /tmp/bundler
  - bundle install --path /tmp/bundler
  - bundle exec rake db:create db:migrate
  - bundle exec rspec
services:
  - mysql
  - redis
branches: # PR and this branches only
  - master
notify:
  slack:
    webhook_url: $$SLACK_WEBHOOK_URL
    username: 'drone'
    channel: '#sonots'
    on_started: false
    on_success: true
    on_failure: true
```

秘匿情報は .drone.yml に書かずに、drone 上で設定して参照するようにすると良い。この例では $$SLACK_WEBHOOK_URL がソレで、プロジェクトの Settings 画面から設定できる。

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/84541b26-b137-bed6-683d-b0523f9b3dd3.png)


これで commit && push すれば drone 上のビルドが動くはず。

## Troubleshooting

### database.yml の変更

config/database.yml の localhost 指定を 127.0.0.1 指定に変更する必要あり。

localhost 指定の場合、port を指定していても libmysqlclient が tcp ポートではなく unix domain socket を使って mysql にアクセスしようとしてしまい、drone の環境ではポートフォーワードして mysql コンテナにアクセスしている都合上 unix domain socket アクセスでは上手くいかない。See http://kitak.hatenablog.jp/entry/2013/10/11/062548

### Drone 用の docker イメージをビルドする

See http://qiita.com/sonots/items/986f16dc15ba7b09aa06

### コンテナの中に入ってデバグする

See http://qiita.com/sonots/items/b1f9c1708e4474b9c2be

### おまけ - docker0

docker は docker0 という仮想ネットワークデバイスを作成して、docker コンテナ  <-> ホスト間の通信を行うのであるが、デフォルトのサブネットが 172.17.0.0/16 となっており、弊社の環境が使っているサブネットとコンフリクトして(!!!) ping すら通らなくなったので docker0 を作り直すなどした。

普通の方には不要な作業のはず。。。

https://support.zenoss.com/hc/en-us/articles/203582809-How-to-Change-the-Default-Docker-Subnet

```
ip link set dev docker0 down
ip addr del 172.17.42.1/16 dev docker0
ip addr add 192.168.5.1/24 dev docker0
ip link set dev docker0 up
```

もろもろ再起動

```
systemctl restart docker
systemctl restart iptables
```