ようへいの日々精進XP

よかろうもん

Vagrant で drone オープンソース版を試す(1)〜 terraform のコードを CI してインフラ CI 入門 〜

ども、かっぱです。

はじめに

TravisCI 等と肩を並べる CI ツールの一つに drone.io というサービスがあるが、このサービスを手元の環境で実行出来るオープンソースパッケージが配布されているので Vagrant上の Ubuntu にインストールして試してみる。

参考

以下のスライドも。

www.slideshare.net

Drone とは

  • 泣く子も黙る CI ツール
  • GitHub 以外のリポジトリサービスもサポート
  • Go Lang 等の各種言語をサポート
  • Docker コンテナで CI する
  • SaaS 版以外にもインストールして利用するオープンソース版も存在する(今回はこれを利用する)

詳細についてはこちらを。

準備

流れの整理

  1. Vagrant にて Ubuntu を起動
  2. Drone のオープンソース版をダウンロードしてインストール
  3. ngrok を導入して Ubuntu で起動している Drone を外部公開する(github と連携させる為)
  4. github にて OAUTH の設定をする
    1. で作成した Token と Secret Token を Drone の設定ファイル /etc/drone/drone.toml を定義
  5. Drone を起動
  6. Drone にログインする

Vagrant 構成故に...

以下の点に注意する。

  • ngrok が必要になる
  • ngrok とはローカル の VM で稼働しているサービスを安全に外部に公開する為のツール

以下のように利用する。

wget "https://api.equinox.io/1/Applications/ap_pJSFC5wQYkAyI0FIVwKYs9h1hW/Updates/Asset/ngrok.zip?os=linux&arch=386&channel=stable"
mv 'ngrok.zip?os=linux&arch=386&channel=stable' ngrok.zip
unzip ngrok.zip
sudo ./ngrok -hostname="xxxxx.drone.ngrok.com" 8800

尚、-hostname で公開した際のホスト名を設定する。

ngrok を実行後は以下のような状態になる。

f:id:inokara:20150322180700p:plain

尚、Vagrant 等のローカルマシンの VM 環境は利用せずに EC2 等を利用すればこの操作は不要なので、EC2 を利用したいところであるが初志貫徹 Vagrant で起動した Ubuntu 14.04 に Drone のセットアップを進める。

Drone のオープンソース版をダウンロードしてインストール

既に Ubuntu は起動している状態で Drone の deb バッケージをダウンロードする。

wget downloads.Drone/master/drone.deb
sudo dpkg -i drone.deb

以下のように出力されてインストールは終了。

Selecting previously unselected package drone.
(Reading database ... 61831 files and directories currently installed.)
Preparing to unpack drone.deb ...
Unpacking drone (0.3.0-alpha-1426873630) ...
Setting up drone (0.3.0-alpha-1426873630) ...
Your system ubuntu 14: using upstart to control Drone
drone start/running, process 4430

一度、Drone を起動しておく。

sudo start drone

Docker と sqlite のインストール

Drone には Docker 及び sqlite が必要なので Docker もインストールする。

sudo apt-get install docker.io
sudo apt-get install sqlite

インストールが終わったら念の為に Docker が起動していることを確認する。

$ sudo docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: docker-8:1-262381-pool
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 291.5 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 0.7 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.13.0-46-generic
WARNING: No swap limit support

よしよし。 尚、sqlite 以外にも MySQL 等が利用できるとのことなので必要に応じで検討したい。

ngrok を導入して Ubuntu で起動している Drone を外部公開する

sudo ./ngrok -hostname="xxxxxxxx.drone.ngrock.com" 80

以下のように出力される。

f:id:inokara:20150322150541p:plain

指定したホスト名アクセスしてみると...

f:id:inokara:20150322150454p:plain

おお。

github との連携

github との連携が必要になるので github にアプリケーションとして登録する必要があるのでこちらにアクセスして Drone を登録する。

f:id:inokara:20150322151904p:plain

以下の項目を設定する。

  • Application name
  • Homepage URL
  • Authorization callback URL

登録したら以下のように Client ID と Client Secret が発行されるので控えておく。

f:id:inokara:20150322152205p:plain

控えておいた ClientID と Client Secret を Drone の /etc/drone/drone.toml に設定する。

[github]
client="xxxxxxxxxxxxxxxxxx"
secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

設定したら Drone をリスタートする。

sudo restart drone

Drone へログイン

改めて Drone にアクセスすると...

f:id:inokara:20150322153332p:plain

ログインしてみる。

f:id:inokara:20150322153702p:plain

おお。


CI してみる

早速...

前回の記事で使った terraform のコードを以下のように CI してみたい。

  • コードを修正したら push
  • push されたら terraform plan を実行してテスト
  • テストが OK だったら terraform apply を実行して環境を構築

やる意味があるかは置いといて...さて、出来るかな...。

リポジトリの選択

リポジトリ一覧から対象のリポジトリ(今回は oreno-terraform)を選択してアクティベートする。

f:id:inokara:20150322115206p:plain

アクティベートすると以下のように出力される。

f:id:inokara:20150322154534p:plain

.drone.yml を用意する

.drone.yml を用意しろと言われているのでリポジトリに以下のような .drone.yml を用意する。

image: bradrydzewski/hashicorp
script:
  - terraform plan -var access_key=${AWS_ACCESS_KEY_ID} -var secret_key=${AWS_SECRET_ACCESS_KEY} -var ssh_key_name=${SSH_KEY_NAME} -var ssh_allow_ip=${SSH_ALLOW_IP} -var key_file_path=${KEY_FILE_PATH} -var build_script=${BUILD_SCRIPT} /var/cache/drone/src/github.com/inokappa/oreno-terraform
  • image には CI に利用する Docker コンテナイメージの名前を定義する(今回は terraform 入りのコンテナを用意)
  • script には CI 時に実行するコマンドを記述する

尚、-var を羅列しているのは Drone の設定ページにて以下のように環境変数を定義することが出来るので、この機能を利用して AWS の Credential な情報や github 内に push したくない情報各種(terraform.tfvars内に記述している情報)を引数として渡している。

f:id:inokara:20150322161706p:plain

この Private Variables は YAML 形式で記述する必要がある。

Deploy Key の設定

Deploy Key を登録する為にリポジトリから Public Key を取得して...

f:id:inokara:20150322115427p:plain

githubリポジトリの Deploy Keys に登録する。

f:id:inokara:20150322115720p:plain

とりあえずテスト(terraform plan)

適当に修正した上で push してみると...

f:id:inokara:20150322161106p:plain

おお、成功や。

ついでに deploy まで

では、terraform plan が正常に終了(テストが成功)したら terraform apply を実行して環境を構築してみたいので .drone.yml を以下のように記述しておく。

image: bradrydzewski/hashicorp
script:
  - terraform plan -var access_key=${AWS_ACCESS_KEY_ID} -var secret_key=${AWS_SECRET_ACCESS_KEY} -var ssh_key_name=${SSH_KEY_NAME} -var ssh_allow_ip=${SSH_ALLOW_IP} -var key_file_path=${KEY_FILE_PATH} -var build_script=${BUILD_SCRIPT} /var/cache/drone/src/github.com/inokappa/oreno-terraform
  - if [ $? = "0" ];then terraform apply -var access_key=${AWS_ACCESS_KEY_ID} -var secret_key=${AWS_SECRET_ACCESS_KEY} -var ssh_key_name=${SSH_KEY_NAME} -var ssh_allow_ip=${SSH_ALLOW_IP} -var key_file_path=${KEY_FILE_PATH} -var build_script=${BUILD_SCRIPT} /var/cache/drone/src/github.com/inokappa/oreno-terraform ; fi

ちょっと力技だが...push して暫くすると...

f:id:inokara:20150322162713p:plain

キタ━━━━(゚∀゚)━━━━!!

キタ━━━━(゚∀゚)━━━━!! のは良いけど state ファイルはどうしようかなと考えていたら terraform には Atlas に state ファイルを push 出来る機能もあるようなのでこれを利用すればいいのかしらと思案中。

ということで

Drone は...

  • Drone を使えば手軽に「ナウい」CI 環境を構築することが出来そう
  • まだまだ発展途上でドキュメントも整備されていない部分もあるが多くの言語に対応していたり Github 以外の連携も出来たりするので今後に期待

尚、Drone の構築にあたってはこちらの記事がとても参考になった。有難うございました。

インフラ CI は...

terraform によるインフラ CI については glidenote さんが実際に現場に投入した記事を書かれていてとても参考になった。有難うございました。

まだまだ...

自分には terraform 力足りてないなーと思った。