OSS版droneで快適オンプレCI
OSS版drone をソースからビルドして自前サーバで稼働し、GitHub Enterprise (バージョン11) のprivate repogitoryでCIしました。
CentOS 6.5上に構築してます。現在のdroneはCentOS 6.xはサポート対象外という噂ですが、以下の手順でとりあえず問題なく動作します。
droneのバージョンは、2015/12/02 時点でのmasterブランチのHEADのもの使ってます。
セットアップの手順と、GH:E 11 x private repoならではのハマりどころに対するworkaroundを書きます。
droneを使った感想は、オンプレ版Travis CIみたいで控えめに言って最高といったところです。
dockerインストールと動作確認
http://qiita.com/kajitack/items/776437138630d2f4d763 通り。
sudo rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm sudo yum update sudo yum -y remove docker sudo yum -y install docker-io sudo service docker start sudo chkconfig docker on sudo docker pull centos sudo docker images centos sudo docker run -i -t centos /bin/bash # ゲストOSへ入ってみる exit
Go 1.5 のセットアップ
droneはGo製で、1.5からのvendoring使ってるので。
wget https://storage.googleapis.com/golang/go1.5.1.linux-amd64.tar.gz tar xvf go1.5.1.linux-amd64.tar.gz mv go goroot mikdir gopath # ~/.bashrcに追記 # Go export GOROOT=$HOME/goroot export GOPATH=$HOME/gopath export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
droneのビルド
gitインストール
yum install -y git
gccのアップグレード
CentOS 6.5の gcc 4.4.7だと、droneの依存ライブラリのlibsassがコンパイルエラーになる。 http://abyssluke.hatenablog.com/entry/2014/07/07/202702 を参考にgccをアップグレード。
wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo sudo yum install devtoolset-2-gcc devtoolset-2-binutils sudo yum install devtoolset-2-gcc-c++ devtoolset-2-gcc-gfortran /opt/rh/devtoolset-2/root/usr/bin/gcc --version
droneビルド
git clone git://github.com/drone/drone.git $GOPATH/src/github.com/drone/drone cd $GOPATH/src/github.com/drone/drone git log |head -n1 commit 69f5d90fd3076fe0d3db0d342e818a0800477fcd make deps # Download required dependencies scl enable devtoolset-2 bash # 新しいg++じゃないとsassのビルドに失敗する sudo ./contrib/setup-sassc.sh sudo ./contrib/setup-sqlite.sh export GO15VENDOREXPERIMENT=1 make gen # Generate code make build # Build the binary
dronercを設定してブラウザでアクセス
http://qiita.com/sonots/items/71da7797139aab7c28d1 を参考に。
https://github.dena.jp/settings/applications/new
で、CI回したい対象のレポジトリにアクセス権のあるuser/organizationでdroneアプリを登録しておく。
Application name
- drone
Homepage URL
Authorization callback URL
dronerc
を編集。 (ネットには drone.toml
での設定情報が多いが、最近は dronerc
に移行中らしい)
vim /etc/drone/dronerc #!/bin/bash # server configuration SERVER_ADDR=":80" #SERVER_CERT="" #SERVER_KEY="" # database configuration DATABASE_DRIVER="sqlite3" DATABASE_CONFIG="/var/lib/drone/drone.sqlite" # remote configuration REMOTE_DRIVER="github" REMOTE_CONFIG="https://github.dena.jp?client_id=xxxxxxxxxxxxx&client_secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&private_mode=true&open=true&ssh=true" ## private_mode=true : private repo を扱う ## ssh=true : `git fetch` するときに、private repoのhttpsだとUsernameやPassword入力を求められてしまうので、それを回避 # docker configuration DOCKER_HOST="unix:///var/run/docker.sock" #DOCKER_CERT="" #DOCKER_KEY="" #DOCKER_CA="" # plugin configuration PLUGIN_FILTER="plugins/*"
droneを立ち上げてみる。
sudo $GOPATH/src/github.com/drone/drone/drone --config=/etc/drone/dronerc
localhostから http://DRONE_HOST:80
へアクセスし、ログインしてOAuthも突破。
注意: REMOTE_CONFIG
の ssh=true
は、GH:E 11を使用しているなら本質的に重要です。GH:E 11 だと、初回起動より前にこのオプションをつけていなければ git fetch
に失敗してテストが進行しません。もしも先に起動してしまったら、 /var/lib/drone/drone.sqlite
を一度消しましょう。
droneをデーモンとして動かす
sudo vim /etc/init.d/drone #!/bin/bash # # chkconfig: 2345 85 15 # description: drone - a CI service. ## http://qiita.com/volanja/items/383fcd6d2d2e14792723 を見て書いた . /etc/rc.d/init.d/functions prog="drone" APP_ROOT=$HOME/gopath/src/github.com/drone/drone APP_USER="root" conf=/etc/drone/dronerc lockfile="/var/lock/subsys/${prog}" logfile="/var/log/${prog}.log" CMD="${APP_ROOT}/drone --config=${conf} &" action="$1" RETVAL=0 cd ${APP_ROOT} || exit 1 start(){ echo -n $"Starting $prog: " daemon --user=${APP_USER} "cd ${APP_ROOT} && ${CMD}" > $logfile 2>&1 RETVAL=$? [ $RETVAL -eq 0 ] && touch $lockfile echo } stop(){ echo -n $"Stopping $prog: " killproc ${prog} RETVAL=$? if [ $RETVAL = 0 ]; then rm -f ${lockfile} success $"$prog stop" else failure $"$prog stop" fi echo } rh_status() { status ${prog} } case $action in start) start ;; stop) stop ;; status) rh_status ;; restart) stop sleep 2 start ;; *) echo >&2 "Usage: $0 <start|stop|restart|status>" exit 1 ;; esac exit 0
sudo chkconfig --add drone
あとは...
普通にレポジトリを有効化して、レポジトリに .drone.yml
を追加して、ブランチpushすればテストが走る。
travisみたいな感じ。
おまけ: .drone.yml の例
C++製のライブラリと、そのGoバインディングのテストを走らす設定。
build: image: drone/golang:1.5 commands: # https://github.com/google/googletest を引っ張ってくる - git submodule init - git submodule update # drone/golang:1.5 は割とミニマムなので、インクルードヘッダの入ったパッケージを取得可能にする - echo 'deb-src http://httpredir.debian.org/debian jessie main' >> /etc/apt/sources.list - apt-get update - apt-get install zlib1g-dev - wget -q https://cmake.org/files/v3.3/cmake-3.3.0-Linux-x86_64.tar.gz - tar xf cmake-3.3.0-Linux-x86_64.tar.gz - cmake-3.3.0-Linux-x86_64/bin/cmake -DCMAKE_BUILD_TYPE=Debug . - make -j4 VERBOSE=1 mytest - ./test/mytest - go test -x -v