drone.io

droneの導入にハマった

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グループに入れたユーザで起動する必要があります。

今回は取り急ぎ特権ユーザを付与しました。

結果

image.png

できました。
Jenkinsよりもdockerを利用したビルドの初動が早いですね。

今回利用したdocker-compose

docker-compose.yaml
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、運用の自動化、セキュリティは必須だと改めて感じる今日この頃です。