継続的インテグレーション

継続的インテグレーションツールとは、バージョン管理システムにある最新ソースを定期的に取得してビルドおよびテストを実行し、テスト結果を出力するものです(参考)。継続的にテストを行うことで、システム全体の品質改善が期待され、統合に伴う問題を減らすことができます。ここでは代表的なツールであるJenkinsを使って、RSpecのテストコードを定期的に実行するための設定方法と結果表示を紹介し、継続的インテグレーションの概要を説明します。

 

以下の条件を前提とします。

・Ruby1.9.3

・Rails2.3.1

・RSpec2.8.0

・Subversionによるコード管理

 

1.対象とするアプリケーションの準備

既にRSpecのテストコードが含まれたアプリケーションがあれば、このセクションをスキップしても構いませんが、JenkinsでRuby1.9系を用いてカバレージを取得するには、simplecovsimplecov-rcovのgemが必要になることに注意してください(以下の1.2と1.4)。

ここでは、RSpecのテストコードが含まれたサンプルアプリの雛型(scaffold)を生成する手順を紹介します。

 

1.1 アプリケーションの土台作成

コマンドプロンプトから以下のコマンドでアプリケーションの土台を作成します。アプリケーション名をjenkins_testとし、アプリケーションのルートフォルダはc:\rails_apps\jenkins_testとします。

 

C:\rails_apps>rails new jenkins_test --skip-bundle
create
(途中略)



C:\rails_apps>cd jenkins_test

 

 

1.2 gemの追加

アプリケーションのルートフォルダにあるGemfileを開き、ファイルの末尾に以下の記述を追記して保存します。developmentモードとtestモードで4つのgemが使えるようにするための設定です。

 

group :development, :test do  
gem 'rspec'
gem 'rspec-rails'
gem 'simplecov', :require => false
gem 'simplecov-rcov', :require => false
end

 

bundle installを実行して、Gemfileに記述されたgemをインストールします。

 

C:\rails_apps\jenkins_test>bundle install --path vendor\bundle
Fetching source index for https://rubygems.org/
(途中略)
Your bundle is complete! It was installed into ./vendor/bundle

 

 

1.3 RSpecの設定ファイルの生成

以下のコマンドでRSpecの設定ファイルを生成します。

 

C:\rails_apps\jenkins_test>rails g rspec:install
create .rspec
create spec
create spec/spec_helper.rb

 

 

1.4 RSpecの設定ファイルにsimplecov等が使えるよう設定

simplecovとsimplecov-rcovが使えるようにするため、"(ルートフォルダ)\spec\spec_helper.rb"を開いて、「require 'rspec/rails'」行の前に以下の記述を追記して保存します。

 

require 'simplecov'
require 'simplecov-rcov'
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
SimpleCov.start 'rails'

 

 

1.5 scaffoldの生成

ここではサンプルアプリとして、記事テーブル"Article"を持つ簡単なアプリケーションの雛型(scaffold)を生成します。コマンドを実行すると、雛型となるファイルと同時に、article_spec.rbなどrspecのファイルも生成されていることがわかります。

 

c:\rails_apps\jenkins_test>rails g scaffold Article title:string 
content:text
invoke active_record
create db/migrate/20120315083546_create_articles.rb
create app/models/article.rb
invoke rspec
create spec/models/article_spec.rb
(以下略)

 

 

1.6 データベースのマイグレーション

rake db:migrateを実行してデータベースのマイグレーションを行います。

 

c:\rails_apps\jenkins_test>rake db:migrate
== CreateArticles: migrating =================================================
-- create_table(:articles)
-> 0.0000s
== CreateArticles: migrated (0.0100s) ========================================

 

 

1.7 テストコードの作成

必要に応じてテストコードを作成していきます。ここではRSpecによるテストコードの記述方法の説明は省略します。

 

 

1.8 テスト実行

rake specによりテストを実行します。テスト結果のカバレージは"(ルートフォルダ)\coverage/rcov"に出力されます。

 

c:\rails_apps\jenkins_test>rake spec
C:/Ruby193/bin/ruby.exe -S rspec ./spec/controllers/articles_cont
roller_spec.rb ./spec/helpers/articles_helper_spec.rb ./spec/mode
ls/article_spec.rb ./spec/requests/articles_spec.rb ./spec/routing/
articles_routing_spec.rb ./spec/views/articles/edit.html.erb_spec.
rb ./spec/views/articles/index.html.erb_spec.rb ./spec/views/artic
les/new.html.erb_spec.rb ./spec/views/articles/show.html.erb_sp
ec.rb
........
........
**......
......


Pending:
 ArticlesHelper add some examples to (or delete) c:/rails_
apps/jenkins_test/spec/helpers/articles_helper_spec.rb
 # No reason given
 # ./spec/helpers/articles_helper_spec.rb:14
 Article add some examples to (or delete) c:/rails_apps/je
nkins_test/spec/models/article_spec.rb
 # No reason given
 # ./spec/models/article_spec.rb:4

 
Finished in 1.8 seconds
30 examples, 0 failures, 2 pending
Coverage report Rcov style generated for Unit Tests to c:/rails_
apps/jenkins_test/coverage/rcov

 

 

2. Subversionへの登録

作成したアプリケーションをSubversionのリポジトリにインポートし、バージョン管理の対象となるようにします。インポートの方法はこちらを参照してください。

 

 

3. Jenkinsのインストールと設定

3.1 Jenkinsのインストール

Jenkinsを利用するには対象となるマシンに予めJDKをインストールしておく必要があります。その後、Jenkinsのパッケージをダウンロードし、Webサーバ上にデプロイします。インストールの詳細については、Jenkinsのサイトの「インストール」(日本語)を参照してください。

 

 

3.2 Jenkinsの起動

Jenkinsの起動方法についてはJenkinsのサイトの「アクセスと起動」(日本語)をご覧ください。

 

 

3.3 Jenkinsの設定

ここではSubversionで管理されたRailsアプリケーションをJenkinsに登録し、RSpecのテストを自動的に実行させる方法を説明します。

 

(1)プラグインのインストール

Jenkinsを起動し、左メニューの[Jenkinsの管理]をクリックし、次いで[プラグインの管理]をクリックし、プラグインマネージャーを開きます。[利用可能]タブを開き、プラグインの一覧から

rake plugin

ruby plugin

ruby metrics plugin

の三つにチェックを入れて、一番下の[ダウンロードして再起動後にインストール]ボタンを押します。Proxy経由で外部サイトにアクセスする場合は、プラグインマネージャーにおいて[高度な設定]タブからProxyの情報を設定した後に、[ダウンロードして再起動後にインストール]ボタンを押してください。

 

ここで一旦Jenkinsを再起動します。再起動後、[Jenkinsの管理]→[プラグインの管理]から、[インストール済み]タブを開き、上記三つのプラグインがインストールされていることを確認します。

 

Jenkinsインストール済みプラグイン一覧

 

(2)ジョブの作成

Jenkinsのトップ画面に戻り(左上の[Jenkins]をクリックします)、左メニューの[新規ジョブ作成]をクリックします。

次の画面でジョブ名を入力し、[フリースタイル・プロジェクトのビルド]をチェックして[OK]ボタンを押下します。

 

Jenkinsの新規ジョブ作成

 

(3)リポジトリの登録

"ソースコード管理システム"のところで、「Subversion」にチェックを入れます。

するとSubversion用の設定が表示されるので、その中の「リポジトリURL」に、Railsアプリケーションを登録したSubversionのリポジトリ先URLを登録します。また「チェックアウト方式」を「'svn revert'してから'svn update'を実行」にします。

 

 Jenkinsリポジトリの登録

 

(4)テスト実行スケジュールの設定
(4-1)リポジトリへのコミットに従って実行させる場合

リポジトリの更新を定期的に監視し、更新があればテストを実行する設定です。これを設定するには、"ビルド・トリガ"の「SCMをポーリング」にチェックを入れます。開いた画面の中の「スケジュール」の欄にポーリングのタイミングを入力します。例えば毎時5分にリポジトリに変更があればテストを実行させる場合、「5 * * * *」と記述します。詳しくは右の[?]で確認してください。

 

Jenkinsスケジュール設定 

 

(4-2)決まった時間に実行する場合

毎日・毎時等、決まった時間にテストを実行します。これを設定するには"ビルド・トリガ"の「定期的に実行」にチェックを入れます。開いた画面の「スケジュール」の欄にタイミングを入力します。例えば毎晩午前2時にテストを実行させる場合、「0 2 * * *」と記述します。詳しくは右の[?]で確認してください。

 

(5)テスト実行処理の設定

"ビルド"にある「ビルド手順の追加」から「Invoke Rake」を選択します。「Tasks」の欄に「spec」を入力します。これにより"rake spec"が実行されます。

 

Jankinsテスト実行処理の設定

 

更に必要があれば、"rake spec"の前処理として、"bundle install"を「シェルスクリプト」や「Windowsバッチコマンドの実行」で登録したり、"db:migrate"を「Invoke Rake」として登録することもできます。

 

(6)テスト実行後の設定

テスト実行結果のレポートを表示させるために、「Publish Rails stats report」と「Publish Rcov report」にチェックを入れます。Publish Rcov reportの「Rcov report directory」には「coverage\rcov」を入力します。

 

Jenkinsテスト実行後の設定

 

以上の設定が終わったら、下の「保存」ボタンを押下します。

 

(7)テスト実行

左のメニューにある「ビルド実行」をクリックすると、テストが開始されます。テストが成功すると、ビルド履歴のところに青いマークが付き、失敗すると赤いマークが付きます。

 

Jenkinsテスト実行

ビルド履歴の年月日のリンクをクリックして、左メニューの「コンソール出力」をクリックすると、テストを実行した際のコンソールの内容が表示されます。テストが正常に実行できない場合は、コンソール出力で詳しい内容を確認してください。

 

 

4. 継続的インテグレーション

Jenkinsでは一定期間おきに自動テストを実行し、結果の推移をグラフで表示します。「Rails stats report」や「Rcov report」のリンクをクリックするとその詳細を表示します。

 

Jenkinsテスト結果グラフ 

 

Jenkinsカバレージ結果 

 

このような情報をもとに、テストコードを書いて成功したテストのカバレージを観測していくことで、プロジェクトの開発の進捗を測ることが可能となります。