GMO Pepabo, Inc.
技術基盤チーム Advanced Senior
近藤うちお
2015/03/13 CIツール勉強会@福岡
Drone.ioのご紹介
こんにちは
me
Contributor of Drone.io
Drone.io
CIツール第三世代?
> 第一: とにかく自動で実行する奴
> 第二: Jenkins
> 第三: Travis-CI に代表される

・設定がyamlなどで簡潔

・ビルド環境をクリーンに都度作成

なやつ
Drone.io
> Hosting版とOSS版がある
!
!
!
!
> https://drone.io/
特徴
> 毎回ビルド環境をDockerで作る
> サービスコンテナを別途立ち上げられる
> 意外と豊富な外部サービス連携
> SlackやWebhook通知、s3やHerokuなどへの
デプロイ
> OSS/Apache License v2
> Go製/debやrpmも提供
基本、Drone.io
version 0.3の話をします
導入の経緯
Jenkinsよ……
> CI自体は全社的に普及していた
> しかし
> 各チームでJenkinsを立てていてダブってる感
> 一部の人しか触れないJenkins
> Jenkinsでは通るけどローカルでどうすれば良
いのか不明なテスト
> などなど…
ナウいCIしたいんや!
> 外部サービスは割と高額
> まずは効果検証のため導入したい
> Drone.io ってのがあるよ?
> 0.2ぐらいの頃は機能不足……
> 0.3になったらサクっと動いた
じゃあ、Drone.io
しませんか
インストール
deb一発
!
!
> 事前にDockerを入れること
> 実はDockerは同じホストでなくても良い
> rpmはCentOS >= 7向けのようだ
> 未検証…
# Ubuntu, Debian
wget downloads.drone.io/master/drone.deb
sudo dpkg -i drone.deb
データベース
> SQLite3, MySQL, PostgreSQL
> SQLite3はさすがにテスト用っぽい
のでMySQLかポスグレで
> ペパボはMySQL
その他設定
> /etc/drone/drone.toml です
> 詳細はドキュメント
> デフォルトのコメントで空気は分かる……
> 環境変数でも良い
> 不便だけど
リポジトリの設定
> GitHubなりGH:Eなり設定を有効化
> tomlに項目を追加し、 open=true をセット
> ログイン
> sync
> enable
> .drone.yml をプロジェクトルートに配置
してプッシュ→完了
.drone.yml
便利機能
ビルドイメージのカスタマイズ
> 既存で用意されている言語
> ruby, php, node, go, erlangにdartも
> バージョンのそろい方が微妙。

Dockerfileはあるので自作で……
> → https://github.com/drone/drone/blob/master/shared/build/images.go#L174
> ないものは作ればいい
> 2パターン
> 全く独自にイメージを作る
> bradrydzewski/base をベースに作る
ビルドのコツ
> bradrydzewski/base ベースだと
> デフォでrubyとかnode、build-essential、等入り
> ubuntuユーザ
> drone/* と言う名前でないと正しく使えない
> 独自だと、結構自分で色々入れないといけな
いっぽい(特にsocatコマンド)
> Qiitaにもう書いちゃった…
> 「OSS版 Drone.io を社内で使い始めてる話」
サービス立ち上げ
> テストの実行に必要な外部サービスを指
定できる
> MySQL、Redisなど有名どころは組み
込みでサポート
!
!
> → https://github.com/drone/drone/blob/master/shared/build/images.go#L20
service:
- mysql
- redis
- mongodb:2.2
特別なサービスが必要なとき
> 自分でコンテナを作って指定可能
> コンテナでは、EXPOSEで

ポートを指定すれば検知してくれる
> ポートフォワーディングに

socat コマンドを使っている模様
service:
- udzura/custom-mysql:5.6
通知
> notify: ディレクティブで指定
> email(しょぼい……)
> slack
> hipchat
> webhook
Webhook便利
> 組み込みの通知は、

フォーマットがあまり柔軟じゃない
> JSONを食べて別のサービスに渡す
だけの簡単なproxyを書いた
JSONの様子
> Goで雑にWeb APIを書いた
デプロイ系
> publish: と deploy: がある
> deploy
> Heroku, CloudFoundry, 

その他git repo, ssh
> publish
> s3/Swift, Azure, Github Release
s3に上げる
> 雑に成果物をぶち上げる
!
!
!
> 意外と便利
> AWS Keyはハードコードしなくても、

settingで別途指定可能
publish:
s3:
acl: public-read
region: ap-northeast-1
bucket: hoge-bucket
access_key: $$AWS_KEY
secret_key: $$AWS_SECRET
source: hoge.zip
target: hoge/production/$DRONE_BRANCH/
recursive: false
when:
branch: master
Dokkuにプッシュ
> Heroku以外にも、git push がで
きるということで利用
> 普通にプッシュすれば良い
when: 句
> ブランチ、pushした人、などで

デプロイするしないを判定可能
publish:
s3:
acl: public-read
region: ap-northeast-1
bucket: hoge-bucket
access_key: $$AWS_KEY
secret_key: $$AWS_SECRET
source: hoge.zip
target: hoge/production/$DRONE_BRANCH/
recursive: false
when:
branch: master
Hack: Capistrano……
> 対応してないので

ビルドコマンド側の最後に……
script:
# ……
- '[ "${DRONE_BRANCH}" != "master" ] && exit 0'
# master以外の場合この下は実行しないぞ!
- sudo chown -R ubuntu:ubuntu /var/tmp/bundle
- mkdir -p vendor
- ln -s /var/tmp/bundle vendor/bundle
- bundle install --path vendor/bundle
- bundle exec cap production deploy
!
cache:
- /var/tmp/bundle
.drone.ymlの便利ドキュメント
> https://godoc.org/
github.com/drone/drone/
shared/build/script#Build
> godocやんけ……
> しかし一番詳しいし最新だ
運用の実際
オンプレツール運用のイメージ
> 基本厳しい
> インストール困難
> 落ちてエンジニアが一日取られる
> 大変ですね……
> 主にGitl○bと言うインストール型ツールが
培ったイメージ…ごにょごにょ
Drone.ioは?
> インストール楽(1バイナリ最高)
> ほぼ全く落ちない
> Goって凄いんだな、と思わざるを得ない
……
とは言え
> バグや機能不足はそれなりにある
> 結構どんどん直る
> マシンパワーは、まあ要るっすな
……
最近の LA の様子です
困ってる/たこと
fdがリークしていた
> https://github.com/drone/drone/
issues/644
> 定期的に再起動しないと、too many
open files がめっちゃ出てた
> 直った →

https://github.com/drone/drone/
pull/762
ハードディスクが足りない!
> イメージやコンテナもそうだが、
> 一番でかいのはファイルキャッシュ機能
> リポジトリ ブランチごとに残すので、

github-flowだととんでもないことに
> cronで定期的に消すように
> GitHubのdelete webhookを検知してディレクトリ
消せばいいんじゃないかと思うが分散環境じゃ難しいか
……
秘伝のスクリプト
$ find /tmp/drone/*/*/*/* -type d -maxdepth 0 |  # ディレクトリのみ
> grep -v master |  # master のキャッシュは消さない
> xargs -n 5 --verbose rm -rf # 5件ずつじゃないと進 が……
これを毎週末回して解決(...)
並列数/分散ビルド
> workerを追加すればできる
> デフォルトでは
> 同ホストのdocker.sockを見る
> 2つできる(ハードコード)
> 同じエントリを追加すれば、エント
リの数だけworkerを増やしてくれる
8workerにする例
分散で困ること
> どのworkerでビルドするかは選べない
> 独自イメージを使ってると

全台で同期する必要が……
> インハウスなDocker registoryで解決するが

それはそれで別の、ねえ…
> Drone用のDockerfileをリポジトリ管理し、そ
のCDをDroneで行う、みたいなのを考えている
率直な感想
強いマシンさえあれば何とかなる?
> 運用自体はそこまで難しくない印象
> だいぶ地雷を踏み抜いた
> LAは高いが、これ多分

今も「実験的運用」なのでVM上で

走らせてるからです……
テストのポータブル化が進む
> これは非常に大きい
> Jenkins上にしかない秘伝のタレを
はがす
> 手順がリポジトリに必ず入る
> 再現可能なテストになる
テストがポータブルになると
> 将来、「やっぱdroneだめだね…」
となっても、TravisCI/Wercker/
CircleCIなどへ移行するのは手間で
はない
> それが、とにかくまずDroneを入れ
てみる最大のメリットと思う
他の第三世代CIと比べて
> CircleCIの方が使いやすいかも……
> 未経験なですが画面等を見た印象
> 最大の違いはオープンソース
> 困ったらソースを見れば良い
困ったらソースを

見れば良い
便利
総括
CIをナウくしたいなら
> Drone.ioは参入障壁が低い
> OSSで無料です
CIをナウくしたいなら
> Drone.ioは参入障壁が低い
> OSSで無料です
> まあ、余ったサーバがあればだけど……
> まあ、Dockerの扱いにある程度慣れていれ
ば……
> まあ、Goのコードをある程度(ry
自信があるんなら
いいんじゃないすかね……
テストのポータブル化が重要
> ツールでやりたいのは、そういうこと
> 秘伝のタレはがし
> 手順をリポジトリに入れる
> クリーンな環境で通るようにする
> そういう意味では、Drone.io は

良いきっかけになるのでは?
記事広告
Drone.ioを全力で使える仕事あります
> GMOペパボは

福岡/東京ともにエンジニアを

募集中です。
> アプリケーション/インフラ両方です!
> 詳細は:

http://pepabo.com/recruit/
career/
注目の求人
minne 基盤エンジニア
ペパランチョン
> カジュアルにエンジニアの話を聞ける制度です

福岡ではガレリア様のご協力のもと開催中!
http://pepabo.com/recruit/pepaluncheon/
ご清聴
ありがとうございました!

Drone.io のご紹介