Hatena::ブログ(Diary)

アルパカDiary このページをアンテナに追加 RSSフィード

Perl用ブログも始めましたPerl勉強メモ

2014-11-15

[][][]GitLab+DroneでHerokuにCIする、という最高の環境を10分で作る 03:51 GitLab+DroneでHerokuにCIする、という最高の環境を10分で作るを含むブックマーク GitLab+DroneでHerokuにCIする、という最高の環境を10分で作るのブックマークコメント

※若干釣りタイトルです


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推奨らしいので、EC2ubuntu(ami-e74b60e6)に0から構築してみます。

たぶんt2.microでもよいですが、メモリが若干心配なのでt2.smallで構築してみました。

また、本番として使うときにはディスクサイズ多めで起動したほうが良いでしょう。

(さらにプラスでセキュリティ周りも追加しておいたほうが良いですね)

amiami-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

こちらをご参照下さい。RPMで簡単インストール

http://d.hatena.ne.jp/toritori0318/20140523/1400863038

初期ユーザ/パスワードはこちら

  • Username: root
  • Password: 5iveL!fe



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

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

  1. GitLabにリポジトリ登録。.drone.ymlを追加しておく(ymlはのちほど追加してもOK)
  2. 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を入力します。

f:id:toritori0318:20141116031721p:image:w450


GitLabリポジトリを登録

Droneに新規リポジトリとして

先ほど作成したGitLabリポジトリを登録しましょう。

f:id:toritori0318:20141116031722p:image:w550

GitLabに諸々自動登録するためのAPIキーを登録します。

f:id:toritori0318:20141116031723p:image:w550

次に、リポジトリの情報を登録します。

f:id:toritori0318:20141116031724p:image:w550

この段階で連携に必要なWeb hookssh鍵情報をGitLabへ自動登録してくれます。


さらに今回はHerokuと連携するので、SSHキーをHerokuに登録しておく必要があります。

公開キーはDroneから リポジトリ選択 > Settings > Key Pairs で確認できます。

f:id:toritori0318:20141116031726p:image:w550





webhookをテスト実行してみる

ここまで行うと基本的な設定は完了です。

試しに先ほど自動登録されたweb hookをGitLabから実行してみましょう。*3

GitLabの Project > Settings > Web hooks から確認することが出来ます。

f:id:toritori0318:20141116031725p:image:w500


すると、こんなエラーメッセージが表示されています。

f:id:toritori0318:20141116031727p:image:w500

.drone.ymlが無いよ、と言われているので以下を追加してpushしてみます。

image: dockerfile/ubuntu

deploy:
  heroku:
    app: gitlab-drone-test

すると今度はうまく実行されているようです。

f:id:toritori0318:20141116031728p:image:w500

サイトにも反映されています。iei!!!

f:id:toritori0318:20141116031729p:image:w500


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

CI速度について

一度目、Dockerイメージのpullが入ると遅いですが

二回目以降は速くなるので気にしなくてよいです。

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

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

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

gitが必須です。また、publish/s3 を動かすためには aws-cliも必要になるので

一緒にインストールしておくとよいでしょう。

Dockerなので

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

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

Droneの機能としては(おそらく)提供されていないので入るのは難しそうです。

.drone.ymlがscriptの羅列だけであれば

ローカルで同じコンテナ起動してscript実行してみる、というくらいでしょうか…

(もしかしたらもっといい方法があるのかも)




まとめ

繰り返しますが、このスクリプトを実行すると一発で構築できます!!

またここでは詳しく説明しませんでしたが、

OSS版Droneがよく出来ているのでお手軽CIツールとしてだいぶ良いのではないでしょうか。

さらにv0.3では結構便利機能が追加されるようなので期待して待っております。

オススメです!


Drone:ref

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

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

*3:この手順は動作を確認するためのものなので通常は必須ではありません

トラックバック - http://d.hatena.ne.jp/toritori0318/20141115/1416077495