2014-11-15
■[Gitlab][drone][heroku]GitLab+DroneでHerokuにCIする、という最高の環境を10分で作る

※若干釣りタイトルです
GitLab+OSS版DroneをEC2に0から構築し、herokuにCIする
という環境を10分くらいで作ってみます*1
また、すこしだけDroneについての説明などもメモ書きしておきます。
GitLabとは/Droneとは
DroneはTravisや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のアプリケーションが無い場合は
Docker/Drone/GitLabインストール
Gistにスクリプトを公開しているのでこれを実行すると一発構築出来ます。
が、一応手作業で行う時の説明も書いておきます。
Docker
http://docs.docker.com/installation/ubuntulinux/
こちらの手順を元に、docker.ioとlxc-dockerをインストールしましょう。
うまくインストールされているかは以下のコマンドで確認してみます。
sudo docker run -i -t busybox echo 'hello world!'
TCPで待ち受けるためにdockerのコンフィグに以下を追記し、再起動します。
sudo vi /etc/default/docker ... DOCKER_OPTS="-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock" # 再起動 sudo restart docker
Droneインストール
masterは不安定バージョンなので、v0.2.1をインストールします。
# インストール(stableバージョン) wget http://downloads.drone.io/0.2.1/drone.deb sudo dpkg -i drone.deb # デバッグログをオンにしておくと良いかも(/var/log/upstart/drone.log) sudo vi /etc/default/drone ... DRONED_OPTS="-port=:80 -log.debug=true" # 再起動 sudo restart drone
GitLab
http://d.hatena.ne.jp/toritori0318/20140523/1400863038
初期ユーザ/パスワードはこちら
- Username: root
- Password: 5iveL!fe
GitLabとDroneの連携について補足説明
連携するためにどういうことが必要か説明します。
- GitLabにリポジトリ登録。.drone.ymlを追加しておく(ymlはのちほど追加してもOK)
- DroneからGitLabのリポジトリを登録。この時点でGitLabにWebhookが自動で追加される
あとはGitLabのリポジトリが更新されると .drone.yml の内容でCIが実行されます。
意外と簡単。
GitLabにリポジトリ作成/Herokuへpush
それでは設定を準備する手順を進めていきましょう。
まずはGitLabのGUIからリポジトリ作成し、ソースコードをpushしておきます。
今回はこちらのチュートリアルのコードを利用してみました。
(.drone.ymlは後ほど追加します)
また、この時点でHerokuへpushしておきましょう*2
Drone
初期設定
http://\<ip\>/install にアクセスし、初期ユーザを登録/ログインします。
その後setting画面で、GitLabの項目にURLを入力します。
GitLabリポジトリを登録
Droneに新規リポジトリとして
先ほど作成したGitLabリポジトリを登録しましょう。
GitLabに諸々自動登録するためのAPIキーを登録します。
次に、リポジトリの情報を登録します。
この段階で連携に必要なWeb hookやssh鍵情報をGitLabへ自動登録してくれます。
さらに今回はHerokuと連携するので、SSHキーをHerokuに登録しておく必要があります。
公開キーはDroneから リポジトリ選択 > Settings > Key Pairs で確認できます。
webhookをテスト実行してみる
ここまで行うと基本的な設定は完了です。
試しに先ほど自動登録されたweb hookをGitLabから実行してみましょう。*3
GitLabの Project > Settings > Web hooks から確認することが出来ます。
すると、こんなエラーメッセージが表示されています。
.drone.ymlが無いよ、と言われているので以下を追加してpushしてみます。
image: dockerfile/ubuntu deploy: heroku: app: gitlab-drone-test
すると今度はうまく実行されているようです。
サイトにも反映されています。iei!!!
Drone:気になるところ/ハマりどころ
CI速度について
一度目、Dockerイメージのpullが入ると遅いですが
二回目以降は速くなるので気にしなくてよいです。
公式のイメージサイズがバカでかい
割とサイズが大きい物が多いので、自前で必要な物だけインストールしたイメージを使うのが良いでしょう。
自前のイメージを使うときの注意点
gitが必須です。また、publish/s3 を動かすためには aws-cliも必要になるので
一緒にインストールしておくとよいでしょう。
Dockerなので
ディスク容量には気をつけましょう。
コンテナに入りたいナリ〜
Droneの機能としては(おそらく)提供されていないので入るのは難しそうです。
.drone.ymlがscriptの羅列だけであれば
ローカルで同じコンテナ起動してscript実行してみる、というくらいでしょうか…
(もしかしたらもっといい方法があるのかも)
まとめ
繰り返しますが、このスクリプトを実行すると一発で構築できます!!
またここでは詳しく説明しませんでしたが、
OSS版Droneがよく出来ているのでお手軽CIツールとしてだいぶ良いのではないでしょうか。
さらにv0.3では結構便利機能が追加されるようなので期待して待っております。
オススメです!
Drone:ref
- Stable版のREADME https://github.com/drone/drone/tree/22268eb2e669619b8dbc4b92f65a487eec946861
- 公開されているOSS版ドキュメント(ちょっと古い)http://drone.readthedocs.org/en/latest/index.html
- 上記の最新版?ドキュメント(自前ビルドが必要)https://github.com/drone/docs
- サービス版ドキュメント(OSS版と異なる部分が多いので参考程度に) http://docs.drone.io/
- 使える環境変数など http://docs.drone.io/env.html
- Drone用ダッシュボード https://github.com/drone/drone-wall
- 5 http://t.co/CCoyUQ1R9r
- 4 http://t.co/tYLK7ceiBs
- 4 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDEQFjAB&url=http://d.hatena.ne.jp/toritori0318/20141115/1416077495&ei=taNnVI6oBIT51AXSVQ&usg=AFQjCNHdofFE0ONyVL8fbNmIls5PJcD6cQ
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CC8QFjAB&url=http://d.hatena.ne.jp/toritori0318/20140523/1400863038&ei=JvtnVILhIuPvmAWA6oDoAw&usg=AFQjCNEP629b7oLvkPMycqc0Ng_RgW12kQ&sig2=Ic78ddWfwgFwakWLyvo51w&bvm=bv.79142
- 2 http://ezsch.ezweb.ne.jp/search/?query=パワーゲージ&start-index=16&adpage=3&ct=1301&sr=0000&t=20141116093037&filter=1
- 2 https://www.google.co.jp/
- 1 http://api.twitter.com/1/statuses/show/533693826959802369.json
- 1 http://api.twitter.com/1/statuses/show/533696221727051776.json
- 1 http://b.hatena.ne.jp/add?mode=confirm&url=http://d.hatena.ne.jp/toritori0318/20141113/1415898291&title=OSS版DroneでDockerコンテナに対してansibleを実行%
- 1 http://bit.ly/1xIq2sJ