Class: Chef::Cookbook::GemInstaller

Inherits:
Object
  • Object
show all
Includes:
Mixin::ShellOut
Defined in:
lib/chef/cookbook/gem_installer.rb

Constant Summary

Constants included from Mixin::ShellOut

Mixin::ShellOut::DEPRECATED_OPTIONS

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Mixin::ShellOut

#run_command_compatible_options, #shell_out, #shell_out!, #shell_out_with_systems_locale, #shell_out_with_systems_locale!

Constructor Details

#initialize(cookbook_collection, events) ⇒ GemInstaller

Returns a new instance of GemInstaller.



31
32
33
34
# File 'lib/chef/cookbook/gem_installer.rb', line 31

def initialize(cookbook_collection, events)
  @cookbook_collection = cookbook_collection
  @events = events
end

Instance Attribute Details

#cookbook_collectionChef::CookbookCollection

Returns the cookbook collection.

Returns:



29
30
31
# File 'lib/chef/cookbook/gem_installer.rb', line 29

def cookbook_collection
  @cookbook_collection
end

#eventsChef::EventDispatch::Dispatcher

Returns the client event dispatcher.

Returns:



27
28
29
# File 'lib/chef/cookbook/gem_installer.rb', line 27

def events
  @events
end

Instance Method Details

#installObject

Installs the gems into the omnibus gemset.



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/chef/cookbook/gem_installer.rb', line 38

def install
  cookbook_gems = []

  cookbook_collection.each do |cookbook_name, cookbook_version|
    cookbook_gems += cookbook_version..gems
  end

  events.cookbook_gem_start(cookbook_gems)

  unless cookbook_gems.empty?
    begin
      Dir.mktmpdir("chef-gem-bundle") do |dir|
        File.open("#{dir}/Gemfile", "w+") do |tf|
          tf.puts "source '#{Chef::Config[:rubygems_url]}'"
          cookbook_gems.each do |args|
            tf.puts "gem(*#{args.inspect})"
          end
          tf.close
          Chef::Log.debug("generated Gemfile contents:")
          Chef::Log.debug(IO.read(tf.path))
          so = shell_out!("bundle install", cwd: dir, env: { "PATH" => path_with_prepended_ruby_bin })
          Chef::Log.info(so.stdout)
        end
      end
      Gem.clear_paths
    rescue Exception => e
      events.cookbook_gem_failed(e)
      raise
    end
  end

  events.cookbook_gem_finished
end