こんにちは!アクトキャット VP Engineeringのvexus2です。エンジニアチーム発信の技術ブログはじめます!
弊社はSideCIというエンジニア向けのコードレビュー自動化支援のCIサービスを作っています。
現状はRuboCopやPHP_CodeSniffer、flake8などOSSで提供されている各言語の静的解析ツールをラップしたCode Inspection as Serviceという機能をメインで提供していますが、RuboCopなど一部のツールはアップデートが頻繁に掛かることもあり、手動アップデートではとても工数が見合わないこともあり自動化しています。そんな仕組みの一部をご紹介します。
やっていること
SideCI内でのRuboCopやPHP_CodeSniffer、flake8などのツールはそれぞれ独立したDockerコンテナで立ち上げて実行する仕組みになっています。
そのため
- RuboCopなどのツールのアップデートを検知して
- Dockerコンテナ内のバージョンを更新して
- Dockerビルドを走らせて
- アプリケーション側に反映し自動テストして
- リリースする
といったことをやっています。
RuboCopなどのツールのアップデートを検知
基本的にはGitHubのreleasesのRSSフィードを元にSlackに流して検知しています。 RSSフィードの購読にはhubot-rss-readerを使っています。
Dockerコンテナ内のバージョンを更新
上記で流れてきた各ツールのアップデート情報を元にHubot経由で、Dockerfile内のバージョンを更新しPUSH -> Pull Request生成します。
ちなみに意図しないタイミングでのバージョンアップによる不具合での対応遅れなどを防ぐためにmergeは意図的に手動でやっています。
Pull Request生成周りなどGit操作は git-pr-releaseで行っています。
Dockerビルド
バージョン変更されたPull Requestがmergeされたタイミングで自動ビルドしていますが、ここでは特別なことはせず普通にSaaSとしてQuay.ioを使っています。あえてDockerHubじゃなくQuay.ioを使っている理由などはこちらに書いています。(ちょっと古い記事で恐縮ですが・・・)
もちろんDocker Registryを自前で立てた方がビルド全体のプロセスが高速になるんですが運用コストが跳ね上がってしまうので、多少のpullの遅さは許容してSaaSを使っています。
アプリケーション側に反映し自動テスト
Dockerビルドの完了通知を受け取り、別のBot経由で解析ツール側を実行させています。
自動化における各ジョブは極力最小限単位で単体実行できる形にしておき、パイプライン的に呼び出します。
リリース
幅広いお客様の環境があるため、深夜とかのタイミングでの不具合により対応遅れリスクを防ぐためリリースは意図的に手動にしています。
とはいえ極力ツールのアップデートは早めに提供したいというところもあるので後方互換の有るアップデートに関してはなるべく早めにリリースを行うことを心掛けてはいます。
おわりに
弊社ではエンジニア向けサービスを作っているということもあり、SideCIの機能が高まれば自分たちの生産性向上にもなるし、またエンジニアの生産性を上げることで全社的な生産性が高まるので、社内での「生産性の向上」や「効率化」といった観点にかなり力を入れています。
そんなアクトキャットでは絶賛エンジニアを募集しています。 興味がある方はぜひ以下からエントリーください!