ども、かっぱです。
はじめに
TravisCI 等と肩を並べる CI ツールの一つに drone.io というサービスがあるが、このサービスを手元の環境で実行出来るオープンソースパッケージが配布されているので Vagrant上の Ubuntu にインストールして試してみる。
参考
- drone.io - Vagrant で OSS 版 drone を試す - Qiita
- GitLab+DroneでHerokuにCIする、という最高の環境を10分で作る - アルパカDiary
- Puppet - OSS版 Drone.io を社内で使い始めてる話 - Qiita
- Terraform + GitHub + CircleCI + Atlasを利用してAWSの操作を自動化した - Glide Note - グライドノート
以下のスライドも。
Drone とは
- 泣く子も黙る CI ツール
- GitHub 以外のリポジトリサービスもサポート
- Go Lang 等の各種言語をサポート
- Docker コンテナで CI する
- SaaS 版以外にもインストールして利用するオープンソース版も存在する(今回はこれを利用する)
詳細についてはこちらを。
準備
流れの整理
- Vagrant にて Ubuntu を起動
- Drone のオープンソース版をダウンロードしてインストール
- ngrok を導入して Ubuntu で起動している Drone を外部公開する(github と連携させる為)
- github にて OAUTH の設定をする
- で作成した Token と Secret Token を Drone の設定ファイル /etc/drone/drone.toml を定義
- Drone を起動
- Drone にログインする
Vagrant 構成故に...
以下の点に注意する。
以下のように利用する。
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 を実行後は以下のような状態になる。
尚、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
以下のように出力される。
指定したホスト名アクセスしてみると...
おお。
github との連携
github との連携が必要になるので github にアプリケーションとして登録する必要があるのでこちらにアクセスして Drone を登録する。
以下の項目を設定する。
- Application name
- Homepage URL
- Authorization callback URL
登録したら以下のように Client ID と Client Secret が発行されるので控えておく。
控えておいた ClientID と Client Secret を Drone の /etc/drone/drone.toml に設定する。
[github] client="xxxxxxxxxxxxxxxxxx" secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
設定したら Drone をリスタートする。
sudo restart drone
Drone へログイン
改めて Drone にアクセスすると...
ログインしてみる。
おお。
CI してみる
早速...
前回の記事で使った terraform のコードを以下のように CI してみたい。
- コードを修正したら push
- push されたら terraform plan を実行してテスト
- テストが OK だったら terraform apply を実行して環境を構築
やる意味があるかは置いといて...さて、出来るかな...。
リポジトリの選択
リポジトリ一覧から対象のリポジトリ(今回は oreno-terraform)を選択してアクティベートする。
アクティベートすると以下のように出力される。
.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
内に記述している情報)を引数として渡している。
この Private Variables は YAML 形式で記述する必要がある。
Deploy Key の設定
Deploy Key を登録する為にリポジトリから Public Key を取得して...
github のリポジトリの Deploy Keys に登録する。
とりあえずテスト(terraform plan)
適当に修正した上で push してみると...
おお、成功や。
ついでに 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 して暫くすると...
キタ━━━━(゚∀゚)━━━━!!
キタ━━━━(゚∀゚)━━━━!! のは良いけど state ファイルはどうしようかなと考えていたら terraform には Atlas に state ファイルを push 出来る機能もあるようなのでこれを利用すればいいのかしらと思案中。
ということで
Drone は...
- Drone を使えば手軽に「ナウい」CI 環境を構築することが出来そう
- まだまだ発展途上でドキュメントも整備されていない部分もあるが多くの言語に対応していたり Github 以外の連携も出来たりするので今後に期待
尚、Drone の構築にあたってはこちらの記事がとても参考になった。有難うございました。
インフラ CI は...
terraform によるインフラ CI については glidenote さんが実際に現場に投入した記事を書かれていてとても参考になった。有難うございました。
まだまだ...
自分には terraform 力足りてないなーと思った。