※こちらは旧サイトです(新サイトはこちら)
先日、JenkinsからConcourseに乗り換えてみたばかりですが、Jenkinsに代わるGo製OSS CIツールDroneを読んでいたら、Droneの方がプラグインも充実していてとっつきやすそうだったので、Droneも試してみました
Registering OAuth Appsなどを参考に、Client ID
とClient Secret
を作成しておきます
コールバックURLなどは、公式のInstallationを参照
公式のInstallationを見ると、Docker Compose使えと書かれているので、docker-compose.ymlを作成します
$ vim docker-compose.yml
version: '2'
services:
drone-server:
image: drone/drone:0.8
ports:
- 80:8000
- 9000
volumes:
- /var/lib/drone:/var/lib/drone/
restart: always
environment:
- DRONE_OPEN=true
- DRONE_HOST=${DRONE_HOST}
- DRONE_GITHUB=true
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
- DRONE_SECRET=${DRONE_SECRET}
drone-agent:
image: drone/agent:0.8
command: agent
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_SERVER=drone-server:9000
- DRONE_SECRET=${DRONE_SECRET}
それぞれの環境変数の設定内容は下記
今回はGithubを例にとりましたが、BitbucketやGitLabもサポートされています。それぞれのInstallationを参照してください。
ちなみに、GithubとBitbucket両方同時に設定してみた所、リストにGithubのリポジトリしか表示されず、その後Githubの環境変数を消したらBitbucketの認証画面が出てきたので、おそらく2つのサービスを同時に、というのは今のところ非対応で、1サービス=1コンテナという運用になる模様(たぶん)
追記: 複数コンテナ立ち上げてね。将来的にも対応する予定ないよって書いてた → Multiple remote drivers, i.e. Github and Gogs enabled #1336
その後、up実行
$ docker-compose up -d
http://[Droneのホスト]/
にアクセスすると、GithubのOAuth認証が表示されます
リポジトリのルートにある.drone.yml
に従ってビルドが走ります
ビルドトリガは、Web画面のハンバーガーメニューの「Settings」で設定します。以下は、PushしたときにHelloするだけのyml
$ vim .drone.yml
pipeline:
hello:
image: alpine:3.6
commands:
- echo "Hellooo"
このサイトは元々Jenkinsでデプロイしてたんですが、今回の乗り換えの本来の目的である、masterブランチにPushがあったら指定のサーバでデプロイするみたいな事をします
SSH Pluginが公開されているので、これを利用して.drone.yml
にデプロイを記述します
専用のDroneユーザを作ります。細部は各々の環境に合わせてください
user ~$ sudo useradd -d /home/drone drone
user ~$ sudo passwd drone
user ~$ su - drone
drone ~$ ssh-keygen -t rsa
drone ~$ cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
drone ~$ chmod 600 ~/.ssh/authorized_keys
drone ~$ cat ~/.ssh/id_rsa
[秘密鍵の内容をクリップボードなどにコピー]
drone ~$ exit
秘密鍵は右上のハンバーガーメニューの「Secret」に設定します
接続確認等してみて問題なければ、.drone.yml
を作成します。
$ vim .drone.yml
pipeline:
deploy:
host: "[SSH接続先ホスト]"
username: "drone"
port: 22
image: appleboy/drone-ssh
secrets: [ ssh_key ]
script:
- [デプロイの内容をここに書く] # git pull ... etc
when:
branch: master
このあと、Nginx側でアクセス制限をかけたところ、ビルドが走らなくなったので調べてみたところ、Pipeline側のIPも弾いていたようなので、Bitbucketの公開IPを許可すると通りました
$ cat /etc/nginx/conf.d/inc/allow_bitbucket_pipeline
allow 104.192.136.0/21;
$ cat /etc/nginx/conf.d/drone.conf
server {
:
include conf.d/inc/allow_bitbucket_pipeline;
deny all;
:
}