此文章是公司CEO Kevin Yang 给新项目做持续集成的时候碰到的问题,然后写在blog上的文章,转贴自此。
CruiseControl RB(简称CCRB) 和 Rspec
先说一下原理, CCRB其实是一个Rails项目。
当ccrb启动的时候, 会有一个daemon进程,每隔30秒,去检查svn是否有更新。 如果有更新,就会运行一个rake任务,从而激发一系列的php?name=%B2%E2%CA%D4" onclick="tagshow(event)" class="t_tag">测试代码被执行。
当测试失败的时候,会根据配置文件发送邮件提醒。
如果你使用rspec的话, 需要改写ccrb的一些任务,才能支持rspec
desc ‘Custom curise task for RSpec’
task :cruise do
ENV[‘RAILS_ENV’] = ‘test’
if File.exists?(Dir.pwd + "/config/database.yml")
if Dir[Dir.pwd + "/db/migrate/*.rb"].empty?
raise "No migration scripts found in db/migrate/ but database.yml exists, " +
"CruiseControl won’t be able to build the latest test database. Build aborted."
end
# perform standard Rails database cleanup/preparation tasks if they are defined in project
# this is necessary because there is no up-to-date development database on a continuous integration box
if Rake.application.lookup(‘db:test:purge’)
CruiseControl::invoke_rake_task ‘db:test:purge’
end
if Rake.application.lookup(‘db:migrate’)
CruiseControl::reconnect
CruiseControl::invoke_rake_task ‘db:migrate’
end
end
CruiseControl::invoke_rake_task ‘spec’
end
需要注意的是,
对Rspec的支持,稍有不同。 Autotest的环境初始化机制,与Rake Spec的机制不同, 会造成test数据库中的数据不同,从而导致autotest能全部通过, 在服务器上调用rake spec的时候,却出现错误。
解决的办法是: 在所有的Spec文件中,
describe Account do
fixtures :all
end
确保运行所有的测试时候,都初始化到相同的test数据环境中。
这样一来, 就能确保测试结果,不受测试工具(autotest或者rake spec)的影响。
当要启动ccrb的时候, ./cruise start -p 8006 -d
就能以服务器状态Daemon启动
每个project,都有自己的配置文件。
举例说明: ./projects/foo/cruise_config.rb
Project.configure do |project|
project.email_notifier.emails = [‘
kevin@nibirutech.com’]
project.email_notifier.from = ‘
no-reply@nibirutech.com’
end
这样就能在测试失败的时候收到邮件