1

Serverspec に問題があります。ansible を使用して CloudBees jenkins ビルド サーバーから、クラウド VM にデプロイされたインフラストラクチャをテストしようとしています。Serverspec を使用して、各 ansible ロールのテストを作成しました。現在、テストを正しく実行して VM に接続できるかどうかを確認しようとしています。

問題は、「rake spec」を実行すると、「Do n't know how to build task '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"] が得られます。現在、タスク spec:all はそのタスクに依存しています。で始まるループで

hosts.each do |host|

定義されているタスクは 1 つだけで、「scm-va」と呼ばれます。

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

また、このタスクはホストのすべての要素に対して定義されていることに注意してください(あなたの例ではそれは1つだけですが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 に答える