今、個人プロジェクトでCIサービスを作っている。CIサービスというとTravisCIやCircleCI、ツールだとJenkinsとかが有名。それらは汎用的なCIだが、俺が作っているのはベンチマーク・パフォーマンス計測に特化したCIだ。そんなCIサービス開発について今の気持ちや状況を記事にしておこうと思う。
サービスの名前は raysCI という。
なぜ作ろうと思ったのか
コードレビューで、計測せずにコードのパフォーマンス議論をしているのを見かけて、これはあまり意味ないなと思い「推測するな、計測せよ」の精神でベンチマークとって結果をコメントしたことがあった。
その時、人間がいちいち計測するのではなく、自動で計測してくれればアプリケーションの品質可視化に一役買えるのでは?と思ったのがキッカケだと思う。
つまり、プルリクを出したらCIがベンチマーク取ってレポートしてくれる。最高だ。
どのように計測するのか
ベンチマーク対象のアプリをDockerコンテナとして動かし、計測用のDockerコンテナからベンチマークを実行するようにしている。単純だ。クラスタ管理にはkubernetesを、クラウドはGKEを利用している。
今はapache benchなどの外部からのトラフィックに対するレスポンスや、プロファイラを埋め込んだ解析レポート、ヘッドレスブラウザでのHTML DOMロードなどのパフォーマンスを計測するように実装している。
将来的には、プルリクで変更したコードに関わる部分を局所的にベンチマーク取れれば良いのだが、そこまで細かいチューニングはまだできていない。やりたい。
さらに欲をいえばパフォーマンスが悪い時には具体的なコードの改善案を出せれば最高だ。
いつリリースするのか
2017年7月中にはプライベートベータという形でリリースしたい。そもそもこのCIサービスにニーズがあるのか、あったとして開発の改善につながるのか見えていないので、それを試したいと考えている。
そのため機能は最低限、対象もRailsアプリをメインで開発をしている。無事、リリースできることを祈って…ある意味、この記事が宣言的というか書いたからには出さねばならぬという感じである。
また、オプションの機能として以下のものも考えているが、それはまだもう少し先の話。
- プルリク単位でのステージング環境の自動構築
- プロダクション環境の定期パフォーマンス計測
どうやって作っているのか
普通に会社員なので、平日は家に帰ってから2〜3時間、休日に4〜5時間ほど時間を作って開発している。また、最近は週に1日くらい休んで時間を作ったりしている。
最初のコミットが5月15日なので今日で51日たっていることになる。51日間、毎日開発しているのにまだ完成しないのかと軽く絶望しかけること数百回だが、じょじょに形にはなってきている。
こうやって書くと、しんどそうに感じるかもしれないが、1年くらい前にもpushnateというWebプッシュを配信するサービスを個人開発してたこともあり、リズムができているのか無理は感じていない。知らないことをたくさん知れて単純に楽しいというのもある。
(ただ、さすがに一人じゃ厳しい…というのは正直な所)
開発における課題ってなんだろう?と思いを巡らす時、個人的にはそれはデプロイであったり、コードレビューであったりするのだけど、それをより良くできる可能性があるサービスを開発していることに非常に興奮している。楽しい!
無事にサービスをリリースし、開発者に活用してもらい、世の中のWebアプリケーション速度が向上して、インターネットがより快適になる世界を信じ今日もコードを書く。そういう感じ。