免责声明:对ruby和rspec来说是非常新的
我一直在尝试使用泊坞窗图片构建私人仓库作为我们不同项目的基本图像。我们还尝试将测试多个docker镜像作为测试套件的一部分。
我们虽然有rspec
的奇怪问题,但似乎测试运行在错误的docker机器上。
目前,我们在一个单独的文件夹上有两个泊坞窗图像
.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── Jenkinsfile
├── README.md
├── Rakefile
├── nodejs
│ ├── 7.0
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ └── spec
│ │ └── image_spec.rb
│ └── README.md
├── python
│ ├── 2.7
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── docker-entrypoint.sh
│ │ ├── requirements.txt
│ │ └── spec
│ │ └── image_spec.rb
│ └── README.md
└── spec
└── spec_helper.rb
这基本上是我们目前使用的结构,spec/spec_helper.rb
使用默认/简单
require 'serverspec'
require 'docker'
RSpec.configure do |config|
# Use color in STDOUT
config.color = true
# Use color not only in STDOUT but also in pagers and files
config.tty = true
# Use the specified formatter
config.formatter = :documentation # :progress, :html, :textmate
end
这是我们正在使用的Rakefile
内容
require 'rake'
require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:rspec) do |t|
t.pattern = Dir.glob('*/*/spec/*_spec.rb')
t.rspec_opts = '--format documentation --require spec_helper --color'
end
task :default => :spec
我们遇到的问题是,当我们运行bundle exec rake rspec
时,python/2.7/spec_image.rb
测试失败,因为我们确定它们正在nodejs/7.0
上运行。当我们运行bundle exec rspec python/2.7/spec/image_spec.rb
时,它会成功运行。
image_spec.rb
python/2.7
代码也是如此
require 'serverspec'
require 'docker'
DOCKER_FOLDER = "python/2.7"
describe "Python/2.7 Specs" do
before :all do
add_simplejson_to_requirements
image = Docker::Image.build_from_dir(DOCKER_FOLDER, ARG: 'requirements.txt')
set :path, '/usr/local/bin:$PATH'
set :os, family: :alpine
set :backend, :docker
set :docker_image, image.id
end
#test for python version 2.7
it 'has python 2.7 installed' do
expect(command('python -c "import sys; print(sys.version_info[:])"').stdout).to include\
'2, 7'
end
it 'installs requirements.txt given as --build-arg' do
expect(command('pip install simplejson==3.6.3').stdout).to include\
'Requirement already satisfied'
end
end
有人可以指出我们正确的方向吗?
由于
答案 0 :(得分:0)
万一有人发现这个旧线程,我最近在测试多个图像/容器时遇到了同样的问题。我的解决方案是添加一个after(:all)
块,该块在后端调用clear
方法:
after(:all) do
# Reset the docker backend so other images/containers can be tested.
Specinfra::Backend::Docker.clear
end
有点臭,但能解决问题。更好的解决方案是创建自己的后端类,并从一开始就实现多图像/容器支持。