droneとは
有象無象のCIツールのひとつです。
他ツール(CircleCI/Wercker)との違いはオンプレミスでも使えるOSS版が公開されているところです。
Dockerを使ったCIサーバ「Drone」レビュー
https://knowledge.sakura.ad.jp/2729/
k8sとのCI連携では選択肢の一つかと思い導入しようとしてみましたが、些細なところで躓いたので備忘録として。
ハマり1.sqliteデータが作られない
公式のdocker-composeをそのまま使うと、以下のエラーとなりました。
http://readme.drone.io/admin/installation-guide/
drone-server_1 | time="2017-11-07T13:14:22Z" level=error msg="unable to open database file"
drone-server_1 | time="2017-11-07T13:14:22Z" level=fatal msg="database ping attempts failed"
droneは/var/lib/drone配下にdrone.sqliteを作るようですが、権限の問題か作れませんでした。
Jenkinsでも似たような問題がありますが、ホストボリュームではなく、dockerボリュームにすると上手くいきます。
ハマり2.GitHubからのwebhookが来ない
これはdroneというよりもAWSの問題で、GitHubからのwebhookはセキュリティグループを解放してあげる必要があります。
オンプレミスでdroneを利用するときには、自前のGitHub EnterpriseやGitLabがあると思うので、レアケースかと。
GitHubのHookのIPアドレスは以下のhookより。
GitHubの外向けIPアドレス
https://qiita.com/hoyo/items/5950d5f70ba52335dcd2
ハマり3.docker-agentがpermmision denyになる
webhookが通じるようになりましたが、次は以下のエラー。
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/volumes/create: dial unix /var/run/docker.sock: connect: permission denied
agentにdocker.sockを動かす権限がないため、permission denyになってしまいました。
rootユーザの権限を与えるか、dockerグループに入れたユーザで起動する必要があります。
今回は取り急ぎ特権ユーザを付与しました。
結果
できました。
Jenkinsよりもdockerを利用したビルドの初動が早いですね。
今回利用したdocker-compose
version: '2'
services:
drone-server:
image: drone/drone:0.8
ports:
- 80:8000
- 9000
restart: always
volumes:
- /var/lib/drone
environment:
- DEBUG=true
- DRONE_OPEN=true
- DRONE_HOST=http://XXX.XXX.XXX.XXX
- DRONE_GITHUB=true
- DRONE_GITHUB_CLIENT=XXXX # GitHubのOAuth Appsの設定より
- DRONE_GITHUB_SECRET=XXXX # GitHubのOAuth Appsの設定より
- DRONE_SECRET=XXXXX # 任意のパスワード
drone-agent:
image: drone/agent:0.8
command: agent
restart: always
privileged: true
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_SERVER=drone-server:9000
- DRONE_SECRET=XXXXX # 任意のパスワード
おわりに
devopsではCI/CD、運用の自動化、セキュリティは必須だと改めて感じる今日この頃です。