Posted at

Vagrant で OSS 版 drone を試す

More than 3 years have passed since last update.

とりあえず試しに導入してみたかったので、ローカルの Vagrant 上の Ubuntu で

drone を動かして github のリポジトリをビルドできるようにしてみた。


drone とは

https://github.com/drone/drone これ。

drone は Go で書かれた CI 。ビルドは Docker の中で実行する。

クラウド版の https://drone.io/ もあるけど、 OSS 版はかなり UI が違う。


Vagrant で Ubuntu を用意。

vagrant init ubuntu/trusty64

これで Vagrantfile が作られるので次のようにする。

(コメント部分は省略)

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.network "forwarded_port", guest: 80, host: 8080
config.ssh.forward_agent = true
end

起動して、ssh で入る。

vagrant up

vagrant ssh


drone の起動

vagrant 上で次のコマンドを実行する。

sudo apt-get update

sudo apt-get upgrade
sudo apt-get install libsqlite3-dev docker.io
wget downloads.drone.io/master/drone.deb
sudo dpkg --install drone.deb
sudo start drone

これだけで drone が動かせるので、ホストマシンのブラウザで次のURLにアクセスする。

http://localhost:8080

drone のページが表示されればOK

top01.png


ngrok で web hook を local で受け取れるようにする

drone は github 等からの web hook を受け取ってビルドを実行するため、

localhost でも web hook を受け取れるようにする必要がある。

https://ngrok.com/ を使うと一時的に localhost に外部からアクセスできるようになるのでこれを使う。

ngrok をダウンロードして、次のコマンドを実行する。

ngrok -hostname="kbaba1001drone.ngrok.com" 8080

ngrok はオプション無しだと適当に hostname を設定するが、後々のために固定したいので指定する。

これにより http://kbaba1001drone.ngrok.comlocalhost:8080 にアクセスできるようになる。


github でログインできるようにする

drone を動かすための最低限の設定として、 github や BitBucket などホスティングサービスに

アクセスできるようにする設定が必要となる。

今回は github にアクセスしたいので、 https://github.com/settings/applications/new

次ように設定する。

登録すると Client IDClient Secret が発行されるので、これを drone に設定する。

drone の設定は /etc/drone/drone.toml に書く。

/etc/drone/drone.toml[github] の項目をコメントアウトして先ほどの Client IDClient Secret を書く。

- [github]

- client=""
- secret=""
+ [github]
+ client="xxxxxxxxxxxxxx"
+ secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# orgs=[]
# open=false

設定が終わったら drone を再起動する。

sudo restart drone

これで github にログインできるようになれば成功。

github_login.png


docker のセットアップ

drone はビルドをすべて docker 上で行う。

ビルドを行うための基礎となる image が配布されているので、とりあえずそれをいれる。

sudo docker pull bradrydzewski/ubuntu

sudo docker pull bradrydzewski/base

あとはビルドする言語別の docker が必要となるので下記を参考にして淹れる。

前者は image が配布されているが後者は自分で Dockerfile から build する。

例えば Ruby 2.0.0 でビルドしたい場合、次のようにする。

sudo docker pull bradrydzewski/ruby:2.0.0


.drone.yml の用意

ビルドしたいリポジトリのルートディレクトリに .drone.yml を用意してビルドの設定を書く。

例えば postgresql を使っている rails アプリをビルドする場合、次のような感じにする。

image: ruby2.0.0

services:
- postgres
env:
- SECRET_KEY_BASE=xxxxxxxxxxxx
script:
- mkdir -p /tmp/bundle
- sudo chown -R ubuntu:ubuntu /tmp/bundle
- gem update bundler
- bundle install -j8 --path /tmp/bundle
- cp config/database_drone.yml.example config/database.yml
- bundle exec rake db:create db:migrate spec
cache:
- /tmp/bundle


drone にリポジトリを登録する

drone でリポジトリを検索して activate すると github に web hook が自動的に設定される。

この状態でコミットを push したり Pull Request を作ると drone でビルドが走る。

初回のビルドは postgres など docker image を取得するので時間がかかる。

気長に待って失敗か成功をすればok

build_success.png


まとめ

github や ruby 向けの設定を取り除いた Vagrantfile 。

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "private_network", ip: "192.168.33.10"
config.ssh.forward_agent = true
config.vm.provider "virtualbox" do |vb|
vb.memory = 2048
vb.cpus = 2
end

config.vm.provision :shell, inline: <<-SHELL
apt-get update
apt-get -y upgrade
apt-get install -y libsqlite3-dev docker.io
wget downloads.drone.io/master/drone.deb
dpkg --install drone.deb
rm drone.deb
docker pull bradrydzewski/ubuntu
docker pull bradrydzewski/base
SHELL
end