はじめに
以前、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 のインストール
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
右上の register users
のようにしてアカウント発行する。これで他のメンバもログインできるようになるはずだ。
ビルドの設定
ビルドを許可するレポジトリの選択
左上のメニュー > Repositories
レポジトリを検索して、チェックを入れる
.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 画面から設定できる。
これで 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 を作り直すなどした。
普通の方には不要な作業のはず。。。
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