GitLab+DroneでHerokuにCIする、という最高の環境を10分で作る

※2015/4/17
GitLab7.9 / Drone0.3 版に記事をアップデートしました。
Drone0.3で大きく変更されたため、手順もだいぶ変わっています。
今回の手順で主な変更点としては以下の様なものがあります。

  • GitLabでDroneアプリケーションを登録する必要がある
  • Drone側でリポジトリをsyncする機能が追加され、その中から選択する方式になっている
  • Herokuへのdeployについて、0.3からsshキーではなくAPIキー(token)を用いる方法に変更されている


GitLab+OSS版DroneをEC2に0から構築し、herokuにCIする
という環境を10分くらいで作ってみます*1
また、すこしだけDroneについての説明もメモ程度ですが書き記しておきます。



GitLabとは/Droneとは

GitLabGitHubクローンのOSSです。
DroneTravisやCircleCIに似たCIサービスです。
全てがDockerコンテナ上で動く、というのが特徴です。
OSS版も公開されていて、v0.2.1のREADMEを見ると
どのようなことができるかざっくり確認できると思います。
テストを動かしたり、S3やHerokuにパブリッシュしたり、DBコンテナを起動できたりと
主要なものは機能提供されていますし
普通にシェルスクリプトも書けるので柔軟なデプロイなども行うことが出来ます。


また現在は GitHub/GitLab/Bitbucket と連携することが出来るようです。
なのでGitLab限定というわけではないですよ:)


DroneのOSS版が公開されているので今回はこちらをEC2上に構築します。



構築環境

Droneがubuntu推奨らしいので、EC2のubuntu(ami-e74b60e6)に0から構築してみます。
たぶんt2.microでもよいですが、メモリが若干心配なのでt2.smallで構築してみました。
また、本番として使うときにはディスクサイズ多めで起動したほうが良いでしょう。
(さらにプラスでセキュリティ周りも追加しておいたほうが良いですね)

ami ami-e74b60e6
インスタンスタイプ t2.small
Drone webポート 80
GitLab webポート 81

もちろん、EC2限定ではないのでお好きなクラウドVPCで実行してもOKです!


前準備

Heroku

Herokuのアプリケーションが無い場合は
アカウントとアプリケーションを新規作成しておきましょう。
また、HerokuデプロイのためにAPIキーが必要があります。
アカウント設定からAPIキーをメモしておきましょう。

Docker/Drone/GitLabインストール

Gistにスクリプトを公開しているのでこれを実行すると一発構築出来ます。

一応、個々のインストールについてのRefも記載しておきます。

GitLabとDroneの連携について補足説明

連携するためにどういうことが必要か説明します。

  1. GitLabにDroneアプリケーションを登録。
  2. GitLabにリポジトリ登録。.drone.ymlを追加しておく。
  3. Droneの設定でGitLabのURLやクライアントキーを登録。
  4. DroneにログインするとGitLabのリポジトリ一覧がsyncされているので、CIしたいリポジトリをActiveにする

あとはGitLabのリポジトリが更新されると .drone.yml の内容でCIが実行されます。
意外と簡単。

GitLabにDroneアプリケーション登録

それでは設定を準備する手順を進めていきましょう。
まずはGitLabにDroneアプリケーションを登録します。
管理者用画面から「Applications」から名前とコールバックURLを登録します。
コールバックURLは「/api/auth/gitlab.com」です。

この辺りのドキュメントはこちら

GitLabにリポジトリ作成/Herokuへpush

次に、GitLabのGUIからリポジトリ作成しソースコードをpushしておきます。
今回はこちらのチュートリアルのコードを利用してみました。
さらにプラスで.drone.ymlを追加しておきましょう。以下のようなファイルを用意しておきます。

image: dockerfile/ubuntu

deploy:
  heroku:
    app: gitlab-drone-test
    token: "<Herokuで確認したAPIキー>"
    force: false

また、この時点でHerokuへpushしておきましょう*2

Drone

コンフィグ設定

まず、インストール後にGitLabの情報を/etc/drone/drone.tomlに記述しておく必要があります。

[gitlab]
url="http://<GitLabのURL>"
client="<GitLabで登録したアプリケーションのApplication Id>"
secret="<GitLabで登録したアプリケーションのSecret>"
skip_verify=false
open=false

修正後に restart drone で反映しておきます。


すると、Droneの画面で以下のような画面が表示されているはずです。
ここの GitLab のボタンをクリックするとGitLabへのOAuthが開始されるので
GitLabでログインしている情報でAcceptすると、DroneとGitLabの連携が完了します。


GitLabリポジトリを選択

ダッシュボードを見ると、GitLabのリポジトリの一覧がsyncされていると思います。
ここで、先ほど登録したリポジトリを選択して Activate しましょう。


あとはリポジトリに .drone.yml が存在していれば
pushを契機にherokuへのCIが開始されます。

正常に終わるとグリーン表示されます。
(ちなみにDrone0.3から、リアルタイムでbuildログを確認することが可能になっています)


サイトにも反映されているようですね。iei!!!

Drone:気になるところ/ハマりどころ

CI速度について

一度目、Dockerイメージのpullが入ると遅いですが
二回目以降は速くなるので気にしなくてよいです。

公式のイメージサイズがバカでかい

割とサイズが大きい物が多いので、自前で必要な物だけインストールしたイメージを使うのが良いでしょう。

自前のイメージを使うときの注意点

gitが必須です。また、publish/s3 を動かすためには aws-cliも必要になるので
一緒にインストールしておくとよいでしょう。

Dockerなので

ディスク容量には気をつけましょう。

コンテナに入りたいナリ〜

Droneの機能としては(おそらく)提供されていないので入るのは難しそうです。
.drone.ymlがscriptの羅列だけであれば
ローカルで同じコンテナ起動してscript実行してみる、というくらいでしょうか…
(もしかしたらもっといい方法があるのかも)



まとめ

繰り返しますが、このスクリプトを実行すると一発で構築できます!!
またここでは詳しく説明しませんでしたが、
OSS版Droneがよく出来ているのでお手軽CIツールとしてだいぶ良いのではないでしょうか。
オススメです!

Drone:ref

*1:ちなみにs3の機嫌が大きく左右するので10分で終わるとは限りません><

*2:Droneから連携する場合、Herokuへ一度でもmasterにpushされている必要があるようです