先日、JenkinsからConcourseに乗り換えてみたばかりですが、Jenkinsに代わるGo製OSS CIツールDroneを読んでいたら、Droneの方がプラグインも充実していてとっつきやすそうだったので、Droneも試してみました

GithubからKeyを取得

Registering OAuth Appsなどを参考に、Client IDClient Secretを作成しておきます

コールバックURLなどは、公式のInstallationを参照

コンテナ作成

公式のInstallationを見ると、Docker Compose使えと書かれているので、docker-compose.ymlを作成します

1
$ vim docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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}

それぞれの環境変数の設定内容は下記

  • DRONE_HOST: Droneが稼働するURL。変数名は「HOST」ですがURLのようです(http or https://~)
  • DRONE_GITHUB_CLIENT: Githubから取得したClient ID
  • DRONE_GITHUB_SECRET: Githubから取得したClient Secret ※←これは公開したらダメなやつ
  • DRONE_SECRET: なんでもいいのでハッシュを設定します。sanzenchouenhosiiとかでもOKです。serverもagentも同じ物です

今回はGithubを例にとりましたが、BitbucketやGitLabもサポートされています。それぞれのInstallationを参照してください。

ちなみに、GithubとBitbucket両方同時に設定してみた所、リストにGithubのリポジトリしか表示されず、その後Githubの環境変数を消したらBitbucketの認証画面が出てきたので、おそらく2つのサービスを同時に、というのは今のところ非対応で、1サービス=1コンテナという運用になる模様(たぶん)

追記: 複数コンテナ立ち上げてね。将来的にも対応する予定ないよって書いてた → Multiple remote drivers, i.e. Github and Gogs enabled #1336

その後、up実行

1
$ docker-compose up -d

http://[Droneのホスト]/にアクセスすると、GithubのOAuth認証が表示されます

hello world

リポジトリのルートにある.drone.ymlに従ってビルドが走ります

ビルドトリガは、Web画面のハンバーガーメニューの「Settings」で設定します。以下は、PushしたときにHelloするだけのyml

1
$ vim .drone.yml
1
2
3
4
5
6
pipeline:

hello:
image: alpine:3.6
commands:
- echo "Hellooo"

ビルドトリガに合わせてSSHでなんやかんやする

このサイトは元々Jenkinsでデプロイしてたんですが、今回の乗り換えの本来の目的である、masterブランチにPushがあったら指定のサーバでデプロイするみたいな事をします

SSH Pluginが公開されているので、これを利用して.drone.ymlにデプロイを記述します

SSH鍵を作ってDroneに登録

専用のDroneユーザを作ります。細部は各々の環境に合わせてください

1
2
3
4
5
6
7
8
9
10
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」に設定します

  • key: ssh_key
  • value: [コピーした秘密鍵の内容を入力]

.drone.ymlを作る

接続確認等してみて問題なければ、.drone.ymlを作成します。

1
$ vim .drone.yml
1
2
3
4
5
6
7
8
9
10
11
12
pipeline:

deploy:
host: "[SSH接続先ホスト]"
username: "drone"
port: 22
image: appleboy/drone-ssh
secrets: [ ssh_key ]
script:
- [デプロイの内容をここに書く] # git pull ... etc
when:
branch: master

追記:Droneにアクセス制限をかける

このあと、Nginx側でアクセス制限をかけたところ、ビルドが走らなくなったので調べてみたところ、Pipeline側のIPも弾いていたようなので、Bitbucketの公開IPを許可すると通りました

1
2
3
4
5
6
7
8
9
10
11
12
$ 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;

:
}