1

我在使用 Serverspec 时遇到问题。我正在尝试从使用 ansible 的 CloudBees jenkins 构建服务器测试部署在云 VM 上的基础架构。我使用 Serverspec 为每个 ansible 角色创建了一个测试。现在我只是想检查我是否可以正确运行测试,并连接到我的虚拟机。

问题是,一旦我运行“rake spec”,我就会收到“不知道如何构建任务'spec:84'”错误,这不在我的代码中。

整个日志在这里:

########## Testing infrastructure ##########
+ cd openshift-testing/
+ rake spec --trace
** Invoke spec (first_time)
** Invoke spec:all (first_time) rake aborted! Don't know how to build task 'spec:84'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/task_manager.rb:62:in
`[]'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/task.rb:57:in
`lookup_prerequisite'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/task.rb:53:in
`block in prerequisite_tasks'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/task.rb:53:in
`map'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/task.rb:53:in
`prerequisite_tasks'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/task.rb:199:in
`invoke_prerequisites'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/task.rb:178:in
`block in invoke_with_call_chain' /usr/share/ruby/monitor.rb:211:in
`mon_synchronize'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/task.rb:172:in
`invoke_with_call_chain'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/task.rb:201:in
`block in invoke_prerequisites'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/task.rb:199:in
`each'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/task.rb:199:in
`invoke_prerequisites'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/task.rb:178:in
`block in invoke_with_call_chain' /usr/share/ruby/monitor.rb:211:in
`mon_synchronize'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/task.rb:172:in
`invoke_with_call_chain'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/task.rb:165:in
`invoke'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/application.rb:150:in
`invoke_task'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/application.rb:106:in
`block (2 levels) in top_level'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/application.rb:106:in
`each'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/application.rb:106:in
`block in top_level'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/application.rb:115:in
`run_with_threads'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/application.rb:100:in
`top_level'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/application.rb:78:in
`block in run'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/application.rb:176:in
`standard_exception_handling'
/home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/lib/rake/application.rb:75:in
`run' /home/jenkins/.gem/ruby/1.9.1/gems/rake-10.4.2/bin/rake:33:in
`<top (required)>' /usr/local/bin/rake:23:in `load'
/usr/local/bin/rake:23:in `<main>'

这是我的 Rakefile:

  1 require 'rake'
  2 require 'rspec/core/rake_task'
  3 
  4 hosts = %w(
  5   84.39.33.93 
  6 )
  7 
  8 task :spec => 'spec:all'
  9 
 10 namespace :spec do
 11   task :all => hosts.map {|h| 'spec:' + h.split('.')[0] }
 12   hosts.each do |host|
 13     short_name = "sca-vm"
 14     role       = "common"
 15 
 16     desc "Run serverspec to #{host}"
 17     RSpec::Core::RakeTask.new(short_name) do |t|
 18       ENV['TARGET_HOST'] = host
 19       t.pattern = "spec/base,#{role}/*_spec.rb"
 20     end
 21   end
 22 end                                                                         
~           

spec_helper.rb:

require 'serverspec'
require 'net/ssh'

set :backend, :ssh

if ENV['ASK_SUDO_PASSWORD']
  begin
    require 'highline/import'
  rescue LoadError
    fail "highline is not available. Try installing it."
  end
  set :sudo_password, ask("Enter sudo password: ") { |q| q.echo = false }
else
  set :sudo_password, ENV['SUDO_PASSWORD']
end

host = ENV['TARGET_HOST']

options = Net::SSH::Config.for(host)

options[:user] ||= Etc.getlogin

set :host,        options[:host_name] || host
set :ssh_options, options

# Disable sudo
# set :disable_sudo, true


# Set environment variables
# set :env, :LANG => 'C', :LC_MESSAGES => 'C' 

# Set PATH
# set :path, '/sbin:/usr/local/sbin:$PATH'

最后,这是我正在使用的 test_spec,它只是验证一个名为 now.txt 的纯文本文件的存在:

require 'spec_helper'

describe file('~/now.txt') do
  it { should be_file }
end

我现在真的很困惑。你们能帮我理解发生了什么吗?

4

1 回答 1

0

代码片段

hosts.map {|h| 'spec:' + h.split('.')[0] }

单独产生:[“spec:84”]。现在,任务规范:全部取决于该任务。在循环开始

hosts.each do |host|

只定义了一个任务,它被称为“scm-va”:

RSpec::Core::RakeTask.new(short_name) do |t|
   # ...
end

另请注意,此任务是为主机的每个元素定义的(在您的示例中,这只是一个,但我假设您制作了hosts一个数组是有原因的)。

尝试rake -T -A在命令行上列出所有任务,即使是没有描述的任务,以查看 Rake 实际知道哪些任务。

换句话说:代码示例声明 spec:all 依赖于一个未定义的任务(或多个任务)。

如果将行更改为

    RSpec::Core::RakeTask.new('spec:' + host.split('.')[0]) do |t|

该代码不会引发异常,但我不确定是否能解决您的问题。也许重要的是,“scm-vm”实际上是定义的任务名称的一部分。

但是,如果这是您想要的,您应该重构host.split('.')[0]为它自己的方法。

于 2015-05-21T13:18:36.273 回答