Chef ServerSpec SpecInfra Uninitialized constant NameError

I am having an issue while using ServerSpec to run an integration test in my cook cookbooks. When I tried to run the test today without making any changes, I got the following error:

TL; dg

/tmp/busser/suites/serverspec/spec_helper.rb:3:in <top (required)>': uninitialized constant SpecInfra (NameError)

> [#] ---- Begin output of kitchen verify '(default)-.+' -p ----
> [#] STDOUT: -----> Starting Kitchen (v1.2.1)
> [#] -----> Verifying <default-CentOS-70>...
> [#]        Removing /tmp/busser/suites/serverspec
> [#]        Uploading /tmp/busser/suites/serverspec/localhost/nodejs_spec.rb (mode=0644)
> [#]        Uploading /tmp/busser/suites/serverspec/spec_helper.rb (mode=0644)
> [#] -----> Running serverspec test suite
> [#]        /opt/chef/embedded/bin/ruby -I/tmp/busser/suites/serverspec -I/tmp/busser/gems/gems/rspec-support-3.0.4/lib:/tmp/busser/gems/gems/rspec-core-3.0.4/lib -S /opt/chef/embedded/bin/rspec /tmp/busser/suites/serverspec/localhost/nodejs_spec.rb --color --format documentation
> [#]        /tmp/busser/suites/serverspec/spec_helper.rb:3:in `<top (required)>': uninitialized constant SpecInfra (NameError)
> [#]           from /opt/chef/embedded/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
> [#]           from /opt/chef/embedded/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
> [#]           from /tmp/busser/suites/serverspec/localhost/nodejs_spec.rb:1:in `<top (required)>'
> [#]           from /tmp/busser/gems/gems/rspec-core-3.0.4/lib/rspec/core/configuration.rb:1058:in `load'
> [#]           from /tmp/busser/gems/gems/rspec-core-3.0.4/lib/rspec/core/configuration.rb:1058:in `block in load_spec_files'
> [#]           from /tmp/busser/gems/gems/rspec-core-3.0.4/lib/rspec/core/configuration.rb:1058:in `each'
> [#]           from /tmp/busser/gems/gems/rspec-core-3.0.4/lib/rspec/core/configuration.rb:1058:in `load_spec_files'
> [#]           from /tmp/busser/gems/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:97:in `setup'
> [#]           from /tmp/busser/gems/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:85:in `run'
> [#]           from /tmp/busser/gems/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:70:in `run'
> [#]           from /tmp/busser/gems/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:38:in `invoke'
> [#]           from /tmp/busser/gems/gems/rspec-core-3.0.4/exe/rspec:4:in `<top (required)>'
> [#]           from /opt/chef/embedded/bin/rspec:23:in `load'
> [#]           from /opt/chef/embedded/bin/rspec:23:in `<main>'
> [#]        /opt/chef/embedded/bin/ruby -I/tmp/busser/suites/serverspec -I/tmp/busser/gems/gems/rspec-support-3.0.4/lib:/tmp/busser/gems/gems/rspec-core-3.0.4/lib -S /opt/chef/embedded/bin/rspec /tmp/busser/suites/serverspec/localhost/nodejs_spec.rb --color --format documentation failed
> [#]        Ruby Script [/tmp/busser/gems/gems/busser-serverspec-0.2.7/lib/busser/runner_plugin/../serverspec/runner.rb /tmp/busser/suites/serverspec] exit code was 1
> [#]
> [#] STDERR: >>>>>> Verify failed on instance <default-CentOS-70>.
> [#] >>>>>> Please see .kitchen/logs/default-CentOS-70.log for more details
> [#] >>>>>> ------Exception-------
> [#] >>>>>> Class: Kitchen::ActionFailed
> [#] >>>>>> Message: SSH exited (1) for command: [sh -c 'BUSSER_ROOT="/tmp/busser" GEM_HOME="/tmp/busser/gems" GEM_PATH="/tmp/busser/gems" GEM_CACHE="/tmp/busser/gems/cache" ; export BUSSER_ROOT GEM_HOME GEM_PATH GEM_CACHE; sudo -E /tmp/busser/bin/busser test']
> [#] >>>>>> ----------------------

      

Does anyone know why this is happening?

According to the comments:

require 'serverspec'
# require 'specinfra' #I've tried both with and without this

include SpecInfra::Helper::Exec
include SpecInfra::Helper::DetectOS

RSpec.configure do |c|
  if ENV['ASK_SUDO_PASSWORD']
    require 'highline/import'
    c.sudo_password = ask("Enter sudo password: ") { |q| q.echo = false }
  else
    c.sudo_password = ENV['SUDO_PASSWORD']
  end
end

      

This file follows the instructions outlined for using the application and previously worked unchanged.

+3


source to share


3 answers


Test Kitchen will try to install the latest ServerSpec. Unfortunately, a version of ServerSpec was recently released that can break a few things, so you might need to update your tests.



See the section http://lists.opscode.com/sympa/arc/chef/2014-10/msg00027.html

+2


source


If you are using serverpec 2+ you need to remove the SpecInfra lines and replace with the set command:

require 'serverspec'

set :backend, :exec

RSpec.configure do |c|
  c.before :all do
    c.path = '/sbin:/usr/sbin'
  end
end

# etc

      



more info in my latest PR for example repo at kitchen.ci - https://github.com/test-kitchen/guide-started-git-cookbook/pull/3

+3


source


The file /tmp/busser/suites/serverspec/spec_helper.rb

probably refers to a constant SpecInfra

, but you haven't downloaded any gem or Ruby file that actually defines this constant, so the constant is undefined.

I couldn't find much documentation on SpecInfra

, but it seems to me you just need to run gem install specinfra

in a shell to install the gem and then add require 'specinfra'

to the top of the file where the error occurs. This is the usual way to fix these types of errors.

I am assuming that spec_helper.rb

is a file that you wrote at some point that is copied to the server by a specialist server, but I have never used this tool, so I know little about it. You need to make sure the gem is installed / copied to the server where the tests are running, so you may need to add the gem to some configuration file for the server.

0


source







All Articles