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

  • 15
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

以前、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