Goで書かれたmackerel-agentのOSS化や自動化にまつわるあれこれ
Hatena Engineer Seminar #4
Feb 7th, 2015
Profile

僕が入社してからやったこと/やろうとしていること
- テストをオープンにする
- ビルドをオープンにする
- リリースをオープンにする
mackerel-agent

OSSにする理由
- 公開しない理由がない
- ユーザー環境で動くものだからソースを開示する
ユーザーがハックできる余地を残しておく
- エンジニア的には嬉しい
- ユーザーと一緒にサービスを作っていく
- 最近同様の事例が多い
Travis CIの場合
- コンテナのcookbookを公開していてp-rを受け付けている

github-servicesの場合
- サービス連携部分のコードが公開されている
- 自分がやってるサービスとgithubとの連携コードを自分で書ける

ソースをオープンにして第1段階クリア
- パッチ受け入れ体制
- ちゃんとリポジトリを回していく必要がある
- 逆にメンテナンスコストがかかっては本末転倒
何故githubにホストするか
- contributeしてもらう体制を作りやすい
- メールでパッチのやりとりとかお互いにとって労力がかかる
- 一番スムースにパッチのやりとりができる
- レビューのやりやすさ
どのようにパッチ受付体制を整えるのか
- 放置してはいけない
- pull requestは公平に扱う
- レビュー体制
- CIが必要
CI
- テストがコケてたら「とりあえず直して」って言える
- CIがないとお互いパッチのクオリティーを担保できない
- パッチのアクセプト基準も曖昧になり不公平感も生まれる
- 客観的なクオリティを共有できるようにしておく
- オープンなCI環境を使う
- 外部サービスを使う
Travis CI
- 使い慣れている
- encryptの仕組みとかが便利
- gitでtagをトリガにしてジョブが実行可能

mackerel-agentのCIでやってること
- go vet/golint (コードフォーマットの検査)
- go test
- coverageの計測
- cross build可能かどうか
- Travisの他に社内Jenkinsも用意
- Travisのコンテナでは取得できないメトリックがあるため
golintをCIする
- golintは指摘項目があっても終了ステータスが0なのでエラー扱いにならない
- golintはコーディング規約的な推奨事項なのでエラー扱いじゃないのは妥当
ただ、些細なコーディングスタイルの違いで議論したくないのでgolintで警告が出たらCIがコケるようにしたい
#!/bin/sh
rm -f .golint.txt
for os in "linux" "darwin" "freebsd" "windows"; do
GOOS=$os golint ./... | tee -a .golint.txt
done
test ! -s .golint.txt
Coveralls

Windows対応
- AppVeyorでCI/CD
- テスト & インストーラー作成
- 検証環境に限りがあるのでCIを充実させたい気持ち

レビュー体制
- agentは社内の人間の誰かがレビューしている
- 開発チームのp-rも他の誰かがレビュー
- 業務時間内の社内リソースをどう割り当てるか
- 「気がついた時にやる」に今はなっている
- あまり仕組み化できていない
mackerel-agent-plugins
- AWS EC2 CPU Credit
- AWS ELBSSSS RDS
- Apache2
- Elasticsearch
- HAProxy
- JVM
- Linux procs
- memcached
- MongoDB
- MySQL
- Nginx
- PHP-APC
- Plack
- PostgreSQL
- Redis
- SNMP
- Squid
- Varnish
多くのplugin
- 社外のユーザーさんが機能追加してくださっている
- リリースフローはagentよりも進んでいる部分がありagent側にバックポートしたい
- リリースプロセスをオープンに
- パッケージのTravis上でのビルド
リリースプロセスをオープンに
- make releaseコマンドでリリースpull requestを自動作成
- versionのbump up
- changelogを自動生成
- レビュー後マージボタンでマージ

パッケージの自動ビルド
- releaseマージコミットに対してtravisが自動でtagを打つ
- tagを打たれたcommitに対してTravisがビルド成果をrelease

仕組み
Perlでツール作成(標準モジュール縛り)
tool/autotag
- マージコミットかどうか判断
- マージコミットの場合マージ元のブランチ名を取得
- ブランチ名をもとにバージョンを指定
- e.g. ブランチ名がbump-version-0.5.0 -> v0.0.5
課題
- 社内で検証できないミドルウェアの動作確認をどうするか
- リリースサイクル
- どこまでをコアに同梱するか
- コアのpluginとoptionalなプラグインの分離
まとめ
- ソースをオープンにすることでユーザーと一緒にサービスを作る
- Travisなど外部サービス利用する
- テスト環境をオープンに
- リリースサイクルをオープンに
- 自動化するツールもテストできるようにしておく