ActiveRecord や mongoid を用いたプロジェクトを Jenkins で実行する際、同じプロジェクトの spec テストを複数同時に走らせるとテストに失敗することがある。
これは、同じデータベースを複数のテストスクリプトが見てしまうのが原因なので、テストごとに異なるデータベースを見るようにする。
DB 設定ファイルの書き替え
ActiveRecord の場合
config/database.yml
test:
database: your_awesome_app_test<%= ENV['BUILD_TAG'] %>
Mongoid の場合
config/mongoid.yml
test:
sessions:
default:
hosts:
- localhost
database: your_awesome_app_test<%= ENV['BUILD_TAG'] %>
Jenkins が実行するシェルコマンドの書き替え
筆者は Jenkins に実行させたい処理をプロジェクトディレクトリ内にスクリプトファイルとして記述し、Jenkins のシェルスクリプト欄にはそのスクリプトの呼び出しのみを記述している。
script/jenkins-test.sh
bundle install --without production development
bundle exec rake all
# ActiveRecord の場合
RAILS_ENV=test bundle exec rake db:drop
# Mongoid の場合
RAILS_ENV=test bundle exec rake db:mongoid:drop
以上の設定を実施することで、テストの際にはビルドタグのついたデータベースが自動的に作成されるので、複数のビルドタスクが同一のデータベースを見てしまうことを防げる。