Class: Chef::Cookbook::GemInstaller

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Mixin::ShellOut

#a_to_s, #clean_array, #shell_out, #shell_out!, #shell_out_compact, #shell_out_compact!, #shell_out_compact_timeout, #shell_out_compact_timeout!, #shell_out_with_systems_locale, #shell_out_with_systems_locale!

Methods included from Mixin::PathSanity

#enforce_path_sanity, #sanitized_path

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
71
72
73
74
# File 'lib/chef/cookbook/gem_installer.rb', line 38

def install
  cookbook_gems = Hash.new { |h, k| h[k] = [] }

  cookbook_collection.each do |cookbook_name, cookbook_version|
    cookbook_version..gems.each do |args|
      cookbook_gems[args.first] += args[1..-1]
    end
  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|
          Array(Chef::Config[:rubygems_url] || "https://www.rubygems.org").each do |s|
            tf.puts "source '#{s}'"
          end
          cookbook_gems.each do |gem_name, args|
            tf.puts "gem(*#{([gem_name] + 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