エンジニアの kenkoooo です。オープンソース CI の Drone を GitHub Enterprise と連携させて使ってみました。
以下の環境で構築しました。
公式ドキュメント の通り1 、 drone:0.7
を docker-compose
を使って起動します。以下のような docker-compose.yml
を作成し, docker-compose
コマンドによって起動します。
version: '2'
services:
drone-server:
image: drone/drone:0.7
ports:
- 80:8000
volumes:
- /var/lib/drone:/var/lib/drone/
restart: always
environment:
- DRONE_OPEN=true
- DRONE_HOST=http://xxx.xxx.xxx.xxx:80
- DRONE_GITHUB=true
- DRONE_GITHUB_URL=https://github.enterprise.hoge
- DRONE_GITHUB_CLIENT=github_client_xxxxxx
- DRONE_GITHUB_SECRET=github_secret_xxxxxx
- DRONE_GITHUB_SCOPE=repo,repo:status,user:email,read:org
- DRONE_GITHUB_PRIVATE_MODE=true
- DRONE_GITHUB_MERGE_REF=true
- DRONE_GITHUB_SKIP_VERIFY=true
- DRONE_GITHUB_CONTEXT=continuous-integration/drone
- DRONE_SECRET=secret_xxxxxx
drone-agent:
image: drone/drone:0.7
command: agent
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_SERVER=ws://drone-server:8000/ws/broker
- DRONE_SECRET=secret_xxxxxx
いくつかの設定項目について見ていきましょう。
Drone が起動するサーバーの URL を設定します。GitHub 上で status が更新されない場合は、この項目の設定がうまくいっていないことが原因らしいです。自分の環境ではポート番号も入れないと error setting commit status
というエラーが出て status が更新されませんでした。2
GitHub Enterprise の URL です。GitHub Enterprise をオンプレ環境で動かしているので設定が必要です。
OAuth Application として GitHub に登録した時の Client ID
を貼ります。
OAuth Application として GitHub に登録した時の Client Secret
を貼ります。
GitHub Enterprise 上でリポジトリが private mode (ログインしないと public リポジトリも参照できない状態) で設定されている場合、この項目を true にしておく必要があります。
drone-server
と drone-agent
が通信する際の認証に用いられる文字列です。サーバー側とエージェント側で同じ文字列を設定すれば良いですが、空文字列は認められないため注意が必要です。
Drone が起動してしまえば、Web UI 上からビルドしたいリポジトリを設定し、 .drone.yml
をリポジトリのルートに入れてプッシュすることで、自動的にビルドが走ります。 .drone.yml
では幅広い設定が可能です。ファイル内のコメントでその一部をご紹介します。
# 各ジョブは pipeline 以下に入れます。
pipeline:
# ジョブの名前は自由です。
gradle-build:
# ジョブ内で使用する Docker イメージを指定します。
# ここでは Java のコンパイルを行うための openjdk を指定しています。
image: openjdk
# 実行するコマンドをリストで記述します。
commands:
- ./gradlew build
# S3 にファイルをアップロードするジョブを作ります。
deploy-s3:
# AWS CLI をインストールするため python のインストールされたイメージを指定します。
image: library/python:3.5
# secrets の項で指定したキーに対応する値をジョブ内で使用することができます。
# Web UI 上であらかじめ、 aws_access_key_id を Secret Name として、値を定義しておく必要があります。
# aws_access_key_id として指定した値は環境変数 $AWS_ACCESS_KEY_ID としてジョブ内で使うことができます。
# このように、指定したキーの名前を大文字にした環境変数として、あらかじめ設定した値を取り出すことができます。
secrets: [aws_access_key_id, aws_secret_access_key]
command:
- pip install awscli
# aws コマンドは $AWS_ACCESS_KEY_ID と $AWS_SECRET_ACCESS_KEY が設定されていると、それを認証情報として利用します。
- aws s3 cp ./hoge.jar s3://hoge.hoge/deploy/hoge.jar
# Slack に結果を通知するジョブを作ります。
slack-notify:
# Drone の Slack プラグインのイメージを使います。
image: plugins/slack
# 通知先の Web Hook を指定します。
webhook: https://hooks.slack.com/services/XXXXX/XXXXXXXXXXXXXXXX
# ユーザー名は自由に指定できます。
username: drone
# もちろんアイコンも自由です。寿司を好んで食べます。
icon_emoji: ":sushi:"
# デフォルトのメッセージでも十分ですが、メッセージを自由に設定できます。
template: >
<!channel>
*{{build.status}}*
<{{build.link}}|{{repo.owner}}/{{repo.name}}> ({{build.branch}}) by {{build.author}}
# どのような場合にジョブを実行するかを指定します。
# 前のジョブで失敗していた場合、基本的に後続のジョブは実行されませんが、このように指定することで失敗している場合でも実行されます。
# ビルドが失敗していても Slack に通知してほしいのでこのように書きます。
when:
status: [ success, failure ]
Travis CI や CircleCI など使いやすい CI は色々とある一方で、オンプレ環境では Jenkins 一択という状態でしたが、Drone は簡単に設定できる上に十分な機能が揃っていて、まさに求めていたものでした。Jenkins のようになんでもできるわけではありませんが、機能を絞っているからこそ導入が簡単で、社内でも広めていけそうです。
Drone はまだ発展途上で、これからどんどん良くなっていくでしょう。知見を共有して、みんなで盛り上げていきましょう!
RCO アドテク部では、継続的インテグレーションや、ソフトウェアテストなどに興味のあるエンジニアも募集しています。