※こちらは旧サイトです(新サイトはこちら

JenkinsからDroneに乗り換えてみた話

2017-12-12 14:16:42

先日、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を作成します

$ 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認証が表示されます

hello world

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

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

$ vim .drone.yml
pipeline:

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

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

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

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

SSH鍵を作ってDroneに登録

専用の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を作る

接続確認等してみて問題なければ、.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

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

このあと、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;

    :
}