capistrano 部署无法在没有互联网连接的情况下捆绑安装 gem

capistrano deployment unable to bundle install gem with no internet connection

我正在将我的应用程序部署到已安装所有内容的新服务器。

我正在使用以下 capistrano deploy.rb:

require "capistrano/ext/multistage"
require "bundler/capistrano"

set :default_environment, {
    'ORACLE_HOME' => "/opt/oraclient/64/11.2.0.2/",
    'LD_LIBRARY_PATH' => "$ORACLE_HOME/lib:/usr/local/lib",
    'PATH' => "/opt/ruby/bin:$PATH:$ORACLE_HOME/bin"
}

SECURE_FILES = ['database.yml', 'ldap.yml', 'initializers/secret_token.rb']

set :application,   "myapp"
set :use_sudo,      false

set :scm,           :git
set :repository, "ssh://git@hostname:7999/web/myapp.git"
set :user, "webuser"
set :deploy_via, :remote_cache

after "deploy:update_code", "custom:create_symlinks", "custom:assets_precompile", "custom:miscellaneous"
after "deploy", "deploy:migrate"
after "deploy", "deploy:cleanup"

namespace :deploy do
  desc "Restarting mod_rails with restart.txt"
  task :restart, :roles => :app, :except => { :no_release => true } do
    run "touch #{current_path}/tmp/restart.txt"
  end

  [:start, :stop].each do |t|
    desc "#{t} task is a no-op with mod_rails"
    task t, :roles => :app do ; end
  end

  namespace :web do
    desc "Enable maintenance mode for apache"
    task :enable_maintenance, :role => :web do

      run "mkdir -p #{shared_path}/system"
      on_rollback { run "rm -f #{shared_path}/system/maintenance.html" }
      page = File.read('public/maintenance.html')
      put page, "#{shared_path}/system/maintenance.html", :mode => 0644
    end

    desc "Disable maintenance mode for apache"
    task :disable_maintenance, :role => :web do
      run "rm -f #{shared_path}/system/maintenance.html"
    end
  end
end

namespace :custom do
  desc "Creating config, bundler-GEMS symlinks"
  task :create_symlinks, :roles => :app do

    #Secure Configuration File Symlinks 
    SECURE_FILES.each do |link|
      fobj = "#{release_path}/config/#{link}"
      run <<-CMD
        if [ -e #{fobj} ]; then rm -f #{fobj}; fi;
        rm -f #{previous_release}/config/#{fobj};
        ln -s #{vormetric_path}/#{application}/#{link} #{fobj};
      CMD
    end

    #Bundler GEM Installation Symlink 
    shared_bundler_dir = File.join(shared_path, 'bundle')
    release_bundler_dir = File.join(current_release, 'vendor/bundle')
    run "ln -s #{shared_bundler_dir} #{release_bundler_dir}"
  end

  desc "Assets Pre-Compilation"
  task :assets_precompile, :roles => :app do
    run "cd #{current_release} && RAILS_ENV=#{rails_env} bundle exec rake assets:precompile"
  end

  desc "Miscellaneous Tasks"
  task :miscellaneous, :roles => :app do
    run "chmod -f +w #{current_release}/db/schema.rb"
  end
end

这是 box 特定的部署脚本 myhostname.rb:

服务器 "myhostname", :app, :web, :db, :primary => true

set :deploy_to, "/opt/web/var/myapp"
set :rails_env, "customertest"
set :branch, "staging"

现在远程盒子无法访问互联网,但我的所有 gem 都存储在 vendor/cache 下。所以它应该从那里开始。(vendor/cache 在远程服务器上的 /myapp/current/vendor/cache 下有 nokigiri)

当我运行

cap deploy servername

,我收到以下错误:

 ** [out :: myhost] An error occurred while installing nokogiri (1.5.9), and Bundler cannot
 ** [out :: myhost] continue.
 ** [out :: myhost] Make sure that `gem install nokogiri -v '1.5.9'` succeeds before bundling.

我应该部署代码的远程盒子设置了以下文件夹:

 /opt/web/var/myapp
 /opt/web/var/myapp/current(where all the code is cloned currently)
 /opt/web/var/myapp/releases
 /opt/web/var/myapp/shared

我不确定我应该如何获取和安装 gem。

打包程序文档中的这句话可能是相关的(强调我的):

http://bundler.io/v1.9/bundle_package.html

By default, if you simply run bundle install after running bundle package, Bundler will still connect to rubygems.org to check whether a platform-specific gem exists for any of the gems in vendor/cache. This behavior can be avoided by instead running bundle install --local. Note that this requires you to have the correctly platformed version for all of your gems already cached. The easiest way to achieve this is to run bundle package on an identical machine and then check in those vendored gems.

所以,简而言之,您需要在生产服务器中 运行 捆绑程序时传递 --local 标志,以避免完全连接到 ruby​​gems。

capistrano 一起使用的解决方案是在您的 deploy.rb 文件中设置此变量:

# deployment and quiet are used by default, we add the local flag
set :bundle_flags, "--deployment --quiet --local"