Jenkinsで何をやっているのか、またその効果を聞かれた(上司に)ので、どのように利用しているのか書きます。ただし、細かい設定方法については本文書のスコープ外とします。
困りごと
我々の開発チームでは、毎週新しいバージョンのウェブアプリケーションをリリース、およびデプロイ(ウェブサーバへの配置、インストール)する必要があるが、その作業に3〜5時間程度かかっている。
この3〜5時間の内訳は主には、(ビルド)、システムアップデート、自動テスト、デプロイにかかる待ち時間や作業メモを参照している時間であり、生産的な作業に時間を費やせているとは言えない。
自動化して解決したい。
解決方法
継続的インテグレーション(Continuous Integration: CI)を導入した。
利用するツール
- Jenkins http://www.atmarkit.co.jp/fjava/rensai4/devtool21/devtool21_1.html
- ソースコードを統合してビルドを自動化するCIツール。人手でコンパイルやデプロイ、テストを行うと、手順漏れが発生したり、統合/テストできる人が特定の人に限られることがあるが、ビルドを自動化しておけば誰でも簡単にビルドできるようになる。
- rspec http://jp.rubyist.net/magazine/?0021-Rspec
- ruby の単体テストフレームワーク。Java でいう JUnit, C++ でいう CppUnit のようなものと思ってもらえば差し支えない
- capistrano http://www.oiax.jp/rails/capistrano.html
- 自動デプロイツール。cap コマンド1発でサーバにウェブアプリをインストール(デプロイ)することなどができる。
我々の開発チームの情報(前提)
まず、大前提として、我々の開発チームでは ruby / Ruby on Rails を利用してウェブアプリケーションの開発をしている。
それらの Rails アプリケーションは、ウェブサーバアプリである nginxと、nginx 上で Rails アプリを動かすための passenger モジュールを用いて動作させている。
また、バージョン管理ツールには git を利用しており、リリース用ブランチ master と、開発中ブランチ develop、およびそれから派生した各開発者が自由に分岐させたブランチが存在している。
単体テスト、およびシステムテストは rspec を用いて自動化している。開発は Test Driven で行っており、テストが通らなければ、develop ブランチへマージすることは許されない。
我々の開発チームでの実践
Jenkins を用いて以下のことを自動化した。「成功した場合に次の作業を実施する」という仕組みはビルド・パイプラインというJenkinsのプラグインを用いて実現している。
- 開発者が develop ブランチにマージすると、rspec の単体テストが走る。単体テストが通らなかった場合、開発者に(IRCチャットで)通知し、修正を促す。
- 単体テストが通った場合、cap コマンドを用いて、develop 用 nginx に rails アプリをデプロイする。
- デプロイに成功したら、rspec のシステムテストを走る。システムテストが通らなかった場合、開発者に通知し、修正を促す。
これと同じ仕組みを master ブランチ(システムリリース用ブランチ)にも適用しており、毎週のシステムリリースも自動化されるようになっている。
効果
これらの自動化により、毎週3〜5時間かかっていた工数が、(問題がない時には)5分程度の工数ですむように改善された。
おわり