程序人生

写优雅的程序,做优雅的人

多 Ruby 版本和 多 Gem 版本测试

| Comments

admin_gateway 是用于我们所有后台统一认证和授权的组件,而我们后台程序运行在多个 Ruby 版本上,主要是 Ruby 1.9.3 和 2.0,Ruby 2.1 也已经发布了,很快也需要提供 Ruby 2.1 的支持,另外 Rails 版本有 3.0,3.2 和 4.0 三大主要版本,因此一个完整的测试方案是需要包括这 3 * 3 = 9 种组合才行。

首先是多个 Ruby 版本测试。这个问题比较简单,我们现在的 Ruby 环境通常是由 RVM 管理的,RVM 可以很容易的以多个 Ruby 版本重复执行 Ruby 程序,比如下面的例子: rvm ruby-1.9.3,ruby-2.0.0,ruby-2.1.0 exec ruby -e "puts RUBY_VERSION" 如果运行的机器安装了这3个版本的 Ruby 的话,就会依次执行打出各自的 Ruby 版本号。 所以下面的命令就可以依次运行3个Ruby版本的测试了:

rvm ruby-1.9.3,ruby-2.0.0,ruby-2.1.0 exec bundle install rvm ruby-1.9.3,ruby-2.0.0,ruby-2.1.0 exec bundle exec rake test

解决多 Ruby 版本测试的问题,然后就是多 Rails 版本测试的问题。admin_gateway 这个 gem 是一个 Rails Engine,因此需要依赖 Rails。多 Rails 版本测试意味着 test 的 gem 环境是不同的,而现在 gem 环境是由 bundle 管理的,运行 bundle 命令时可以手动指定 Gemfile 文件,因此 建立多个 Gemfile 文件,重复上面的命令就可以了,例如可以建立 rails_4_0.gemfile 这个 Gemfile,然后通过命令 bundle install --gemfile rails_4_0.gemfile 执行 gem 环境安装, 然后通过命令: BUNDLE_GEMFILE=rails_4_0.gemfile bundle exec rake test 执行测试。

组合上面的方法,可以形成一个完整的多 Ruby 版本和 Rails 版本的解决方案: 1. 首先根据需要安装多个 Ruby 版本,如 ruby 1.9.3, 2.0.0 和 2.1.0,根据需要生成多个 gemfile,如 rails_3_0.gemfile, rails_3_2.gemfile 和 rails_4_0.gemfile 2. 然后使用下面的 shell 安装 gem 环境和运行测试。 rvm ruby-1.9.3,ruby-2.0.0,ruby-2.1.0 exec bundle install --gemfile=rails_3_0.gemfile BUNDLE_GEMFILE=rails_3_0.gemfile rvm ruby-1.9.3,ruby-2.0.0,ruby-2.1.0 exec bundle exec rake test 3.2 和 4.0的类似,就不重复了。

解决 gem 多版本的方法有一点不干净,因为 gemfile 有很多重复内容,shell命令也比较重复,因此有一个 gem 叫 appraise (https://github.com/cfedermann/Appraise)就是用于解决这个问题,它只需要配置一个 Appraisals 文件,在 Appraisals 声明不同的 gem 依赖就可以了,比如 admin_gateway 的 Appraisals 内容如下:

1
2
3
4
5
6
7
8
9
10
11
appraise "rails-3-0" do
  gem "rails", "3.0.20"
end

appraise "rails-3-2" do
  gem "rails", "3.2.16"
end

appraise "rails-4-0" do
  gem "rails", "4.0.0"
end

然后就可以通过 rake appraisal 完成多个 rails 版本测试,它的原理和上面提到的完全一样。

总之,多 Ruby 版本和多 gem 版本的测试并不难,利用 rvm 和 bundle 一些特性可以快速做到,利用 appraisal 可以让其更简化。

Comments