class EY::Serverside::DependencyManager::Bundler

Constants

DEFAULT_VERSION
JOBS_NUMBER

Number of Bundler workers (–jobs)

Public Class Methods

default_version() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 12
def self.default_version
  DEFAULT_VERSION
end
jobs_number() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 16
def self.jobs_number
  JOBS_NUMBER
end

Public Instance Methods

check() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 28
        def check
          if lockfile
            shell.status "Gemfile and Gemfile.lock found"

            if config.check_database_adapter? && !lockfile.any_database_adapter?
              shell.warning <<-WARN
Gemfile.lock does not contain a recognized database adapter.
A database-adapter gem such as pg, mysql2, mysql, or do_mysql was expected.
This can prevent applications that use PostgreSQL or MySQL from booting.

To fix, add any needed adapter to your Gemfile, bundle, commit, and redeploy.
Applications not using PostgreSQL or MySQL can safely ignore this warning by
adding ignore_database_adapter_warning: true to the application's ey.yml file
under the defaults: top level key and committing the file to the repository.
              WARN
            end
          elsif ! config.ignore_gemfile_lock_warning
            shell.warning <<-WARN
Gemfile found but Gemfile.lock is missing!
You can get different versions of gems in production than what you tested with.
You can get different versions of gems on every deployment even if your Gemfile hasn't changed.
Deploying will take longer and some deploy options will be limited.

To fix this problem, commit your Gemfile.lock to your repository and redeploy.
            WARN
          end
        end
detected?() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 20
def detected?
  gemfile?
end
gemfile?() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 24
def gemfile?
  paths.gemfile.exist?
end
install() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 56
def install
  shell.status "Bundling gems..."
  clean_bundle_on_system_version_change
  install_bundler_gem
  run "#{clean_environment} && cd #{paths.active_release} && #{bundle_install_command}"
  write_system_version
end
rails_version() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 74
def rails_version
  lockfile && lockfile.rails_version
end
show_ey_config_instructions() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 68
def show_ey_config_instructions
  if lockfile && !lockfile.has_ey_config? && !config.ignore_ey_config_warning
    shell.warning "Gemfile.lock does not contain ey_config. Add gem 'ey_config' to your Gemfile to access service configurations through EY::Config."
  end
end
uses_sqlite3?() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 64
def uses_sqlite3?
  lockfile && lockfile.uses_sqlite3?
end

Protected Instance Methods

bundle_install_command() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 123
def bundle_install_command
  "ruby -S bundle _#{bundler_version}_ install #{bundle_install_options.join(" ")}"
end
bundle_install_options() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 107
def bundle_install_options
  options = [
    "--gemfile",  "#{paths.gemfile}",
    "--path",     "#{paths.bundled_gems}",
    "--binstubs", "#{paths.binstubs}",
  ]

  # Install gems in parallel (Bundler.1.5+ only)
  # @see EYPP-58
  options += ["--jobs", self.class.jobs_number] if check_version(bundler_version, ">= 1.5")

  options += ["--deployment"] if lockfile
  options += config.extra_bundle_install_options
  options
end
bundler_version() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 141
def bundler_version
  @bundler_version ||= lockfile && lockfile.bundler_version || self.class.default_version
end
check_version(version, requirement) click to toggle source

Checks that given version is satisfies give requirement.

@param [String] version @param [String] requirement @return [true, false]

# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 161
def check_version(version, requirement)
  Gem::Requirement.new( requirement ).satisfied_by? Gem::Version.new( version )
end
clean_bundle_on_system_version_change() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 127
def clean_bundle_on_system_version_change
  # diff exits with 0 for same and 1/2 for different/file not found.
  clean_bundle = "rm -Rf #{paths.bundled_gems}"

  if config.clean?
    shell.substatus "Clean bundle forced (--clean)"
    run clean_bundle
  else
    check_system = "#{config.system_version_command} | diff - #{paths.system_version} >/dev/null 2>&1"
    shell.substatus "Checking for system version changes"
    run "#{check_system} || #{clean_bundle}"
  end
end
clean_environment() click to toggle source

GIT_SSH needs to be defined in the environment for customers with private bundler repos in their Gemfile. It seems redundant to declare the env var again, but I’m hesitant to remove it right now.

# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 103
def clean_environment
  %{export GIT_SSH="#{ENV['GIT_SSH']}" && export LANG="en_US.UTF-8" && unset RUBYOPT BUNDLE_PATH BUNDLE_FROZEN BUNDLE_WITHOUT BUNDLE_BIN BUNDLE_GEMFILE}
end
install_bundler_gem() click to toggle source

Install bundler in the system ruby

# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 89
def install_bundler_gem
  egrep_escaped_version = bundler_version.gsub(/\./, '\.')
  # the grep "bundler " is so that gems like bundler08 don't get
  # their versions considered too
  #
  # the [,)] is to stop us from looking for e.g. 0.9.2, seeing
  # 0.9.22, and mistakenly thinking 0.9.2 is there
  has_gem_cmd = %{gem list bundler | grep "bundler " | egrep -q "#{egrep_escaped_version}[,)]"}
  install_cmd = %{gem install bundler -q -v "#{bundler_version}"}
  sudo "#{clean_environment} && #{has_gem_cmd} || #{install_cmd}"
end
lockfile() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 145
def lockfile
  return @lockfile if defined? @lockfile

  lockfile_path = paths.gemfile_lock
  if lockfile_path.exist?
    @lockfile = Lockfile.new(lockfile_path.read, self.class.default_version)
  end
end
write_system_version() click to toggle source
# File lib/engineyard-serverside/dependency_manager/bundler.rb, line 80
def write_system_version
  store_ruby_version   = "#{config.ruby_version_command} > #{paths.ruby_version}"
  store_system_version = "#{config.system_version_command} > #{paths.system_version}"

  run "mkdir -p #{paths.bundled_gems} && chown #{config.user}:#{config.group} #{paths.bundled_gems}"
  run "#{store_ruby_version} && #{store_system_version}"
end