Droneのオープンソース版を試してみました。

Droneのオープンソース版が公開されたということで、早速こちらを試してみました。

GitHub: https://github.com/drone/drone
デモビデオ: https://docs.google.com/file/d/0By8deR1ROz8memUxV0lTSGZPQUk

GitHubREADME.mdによると、Droneは現在以下のバージョンのUbuntuで動作検証が実施されているとのことでしたので、今回は前述のデモビデオでの手順通り、DigitalOceanでDocker 0.8 Ubuntu 13.04 x64のDropletを作成・起動し、その上でDroneをインストールすることにしました。

  • Ubuntu Precise 12.04 (LTS) (64-bit)
  • Ubuntu Raring 13.04 (64 bit)

f:id:kysd:20140208130000p:plain

インストール

$ wget http://downloads.drone.io/latest/drone.deb
$ sudo dpkg -i drone.deb
$ sudo start drone

以上の作業により、ポート番号80番でDroneが起動します。http://DRONE-HOSTNAME/installへアクセスすると、以下のサインアップ画面が表示されます。

f:id:kysd:20140208131019p:plain

この画面で名前、Eメールアドレス、パスワードを入力し、Create Adminボタンをクリックするとアカウントが作成され、Sysadmin画面が表示されます。

f:id:kysd:20140208131211p:plain

設定

GitHubのAccount settings -> ApplicationsにてRegister new applicationボタンをクリックします。

f:id:kysd:20140208124613p:plain

Homepage URLにhttp://DRONE-HOSTNAME/を、Authorization callback URLにhttp://DRONE-HOSTNAME/auth/login/githubをそれぞれ入力し、GitHub Applicationを登録します。

f:id:kysd:20140208132243p:plain

登録したGitHub ApplicationのClient ID、Client Secretを、Drone Sysadmin画面のGitHub Client ID and Secret:へ入力し、Saveボタンをクリックします。

f:id:kysd:20140208131922p:plain

Droneの画面右上のNew Repositoryボタンをクリックし、リポジトリの登録作業に移ります。

f:id:kysd:20140208132548p:plain

Link Your GitHub AccountのLink NowボタンをクリックしてGitHubアカウントを連携させた後、Repository Setup画面のGitHub Owner、Repository Nameに、DroneでビルドしたいGitHubリポジトリ名を入力し、Addボタンをクリックします。(今回はyosssi/gonhkというリポジトリを登録します。)

f:id:kysd:20140208135018p:plain

.drone.ymlファイルの作成

Droneでビルドしたいリポジトリのルートディレクトリに、以下のような.drone.ymlファイルを作成します。

image: mischief/docker-golang
env:
  - GOPATH=/var/cache/drone
script:
  - go build
  - go test -cover -v

Droneに登録したリポジトリへモジュールをプッシュすると、.drone.ymlファイルの定義情報をもとにビルドが自動的に実行されます。

f:id:kysd:20140208141634p:plain

f:id:kysd:20140208141649p:plain

Docker image

Droneでは、.drone.ymlのimageで設定されたDocker imageをベースにしたコンテナ上でビルドが実行されます。前述の手順ではmischief/docker-golangというDocker imageが使用されています。

リポジトリは、Dockerコンテナ上の以下パスにクローンされます。

/var/cache/drone/src/github.com/$owner/$name

Drone公式のDocker image

Drone公式のDocker imagesとして、以下のものがあります。

# these are the base images for all Drone containers.
# these are BIG (~3GB) so make sure you have a FAST internet connection
docker pull bradrydzewski/ubuntu
docker pull bradrydzewski/base

# clojure images
docker pull bradrydzewski/lein             # image: lein

# dart images
docker pull bradrydzewski/dart:stable      # image: dart

# erlang images
docker pull bradrydzewski/erlang:R16B      # image: erlangR16B
docker pull bradrydzewski/erlang:R16B02    # image: erlangR16B02
docker pull bradrydzewski/erlang:R16B01    # image: erlangR16B01

# gcc images (c/c++)
docker pull bradrydzewski/gcc:4.6          # image: gcc4.6
docker pull bradrydzewski/gcc:4.8          # image: gcc4.8

# go images
docker pull bradrydzewski/go:1.0           # image: go1
docker pull bradrydzewski/go:1.1           # image: go1.1
docker pull bradrydzewski/go:1.2           # image: go1.2

# haskell images
docker pull bradrydzewski/haskell:7.4      # image: haskell

# java and jdk images
docker pull bradrydzewski/java:openjdk6    # image: openjdk6
docker pull bradrydzewski/java:openjdk7    # image: openjdk7
docker pull bradrydzewski/java:oraclejdk7  # image: oraclejdk7
docker pull bradrydzewski/java:oraclejdk8  # image: oraclejdk8

# node images
docker pull bradrydzewski/node:0.10        # image node0.10
docker pull bradrydzewski/node:0.8         # image node0.8

# php images
docker pull bradrydzewski/php:5.5          # image: php5.5
docker pull bradrydzewski/php:5.4          # image: php5.4

# python images
docker pull bradrydzewski/python:2.7       # image: python2.7
docker pull bradrydzewski/python:3.2       # image: python3.2
docker pull bradrydzewski/python:3.3       # image: python3.3
docker pull bradrydzewski/python:pypy      # image: pypy

# ruby images
docker pull bradrydzewski/ruby:2.0.0       # image: ruby2.0.0
docker pull bradrydzewski/ruby:1.9.3       # image: ruby1.9.3

# scala images
docker pull bradrydzewski/scala:2.10.3     # image: scala2.10.3
docker pull bradrydzewski/scala:2.9.3      # image: scala2.9.3

データベース

Droneでは、ビルド時に以下のデータベースコンテナを起動することができます。

service:
  - cassandra
  - couchdb
  - elasticsearch
  - neo4j
  - mongodb
  - mysql
  - postgres
  - rabbitmq
  - redis
  - riak
  - zookeeper

デプロイ

Droneではビルド成功時にデプロイを自動的に行うことができます。

deploy:
  heroku:
    app: safe-island-6261

publish:
  s3:
    acl: public-read
    region: us-east-1
    bucket: downloads.drone.io
    access_key: C24526974F365C3B
    secret_key: 2263c9751ed084a68df28fd2f658b127
    source: /tmp/drone.deb
    target: latest/

通知

Droneではビルド完了時にEメール、HipChat、Webフックでの通知を自動的に行うことができます。

notify:
  email:
    recipients:
      - brad@drone.io
      - burke@drone.io

  urls:
    - http://my-deploy-hook.com

  hipchat:
    room: support
    token: 3028700e5466d375

Eメール通知の設定を行ってみます。今回はAmazon SESを使ってメールを送信することにします。

SysadminのSMTP Server Settings.の各欄へAmazon SESの情報を入力し、Saveをクリックします。

f:id:kysd:20140208152600p:plain

.drone.ymlのnotify.email.recipientsに通知先のメールアドレスを指定します。

image: go1.2
env:
  - GOPATH=/var/cache/drone
script:
  - go build
  - go test -cover -v
notify:
  email:
    recipients:
      - yoshida.keiji.84@gmail.com
      - yoshida.keiji@economica.co.jp

Droneでのビルドが完了すると、.drone.ymlで指定したメールアドレスへ以下のような通知メールが送信されます。

f:id:kysd:20140208153055p:plain

非公開の環境変数の登録

APIキー、パスワードなどの、.drone.ymlファイルに記載したくないパラメータは、リポジトリ名 ->Settings -> Paramsにて設定することができます。

f:id:kysd:20140208142200p:plain

Droneビルドバッヂの取得

リポジトリ名 -> Settings -> BadgesにてDroneビルドバッヂのMarkdown、HTMLコードを取得することができます。

登録可能なリポジトリ

現時点ではGitHub上のリポジトリのみ登録可能でした。Bitbucketはcoming soonとのことです。

所感

「使い捨ての環境を簡単に作り出せる」というDockerの特徴を十分に活かした素晴らしいサービスだと思います。やはりDockerとCIツールの相性は抜群ですね。自作のDocker imageを使ってビルドすることができるため、自分・自社のプロダクト・プロジェクトにあわせた独自のCIツールを簡単に構築することができると思います。