Drone.io のご紹介

Preview:

Citation preview

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/

ご清聴 ありがとうございました!