Edited at

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

More than 3 years have passed since last update.


はじめに

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

Docker も Drop support for RHEL6/CentOS6 - docker/docker と言っていたりするので、そういう意味でも 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 コンテナ間の通信がうまくいかなかったりしたので修正を入れた。

 *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

で、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

右上の register users

image

image

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


ビルドの設定


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

左上のメニュー > Repositories

image

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

image


.drone.yml の作成

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

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

これで 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