3

在这个问题上,我真的非常需要帮助,而且有点失落。

我正在尝试使用 Capistrano Ext 部署新的生产服务器以允许登台和生产服务器,但它无法成功运行 bundle install --deployment。

cap staging deploy 在现有的 Ubuntu 系统上运行良好,但新服务器经常失败,如下所示

my-app$ sh -c 'cd /var/www/html/rails/myapp/releases/20120519174459&& export PATH=/usr/local/bin:/usr/local/mysql/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/opt/local/bin:/usr/local/rvm/gems/ruby-1.9.3-p194/bin:/usr/local/rvm/gems/ruby-1.9.3-p194@global/bin:/usr/local/rvm/rubies/ruby-1.9.3-p194/bin:/usr/local/rvm/bin && bundle install --deployment'
  Fetching gem metadata from http://rubygems.org/......
  Fetching gem metadata from http://rubygems.org/..
  Installing rake (0.9.2.2) 
  Gem::LoadError: Could not find rubygems-bundler (>= 0) amongst []
  An error occured while installing rake (0.9.2.2), and Bundler cannot continue.
  Make sure that `gem install rake -v '0.9.2.2'` succeeds before bundling.

在任何其他目录中, ruby​​ -v 和 rails -v 都会产生预期的结果

my-home$ ruby -v
 ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

my-home$ rails -v
 Rails 3.2.2

生产服务器上的本地 Gem 列表显示它们都可用

my-home$ gem list

*** LOCAL GEMS ***

actionmailer (3.2.3, 3.2.2)
actionpack (3.2.3, 3.2.2)
active_utils (1.0.3)
activemerchant (1.21.0)
activemodel (3.2.3, 3.2.2)
activerecord (3.2.3, 3.2.2)
activeresource (3.2.3, 3.2.2)
activesupport (3.2.3, 3.2.2)
addressable (2.2.7)
ansi (1.4.2)
arel (3.0.2)
bcrypt-ruby (3.0.1)
bootstrap-sass (2.0.1)
builder (3.0.0)
bundle (0.0.1)
bundler (1.1.3, 1.0.21)
cancan (1.6.7)
capistrano (2.12.0, 2.11.2)
capistrano-ext (1.2.1)
cocaine (0.2.1)
coffee-rails (3.2.2)
coffee-script (2.2.0)
coffee-script-source (1.3.3, 1.2.0)
daemon_controller (1.0.0)
devise (2.0.4)
erubis (2.7.0)
execjs (1.3.2, 1.3.0)
faraday (0.7.6)
fastthread (1.0.7)
haml (3.1.4)
hashie (1.2.0)
highline (1.6.12, 1.6.11)
hike (1.2.1)
i18n (0.6.0)
journey (1.0.3)
jquery-datatables-rails (1.9.1.3)
jquery-rails (2.0.2, 2.0.1)
jquery-ui-rails (0.3.0)
jruby-pageant (1.0.2)
json (1.7.3, 1.6.5)
libv8 (3.3.10.4 x86_64-linux)
mail (2.4.4)
metaclass (0.0.1)
mime-types (1.18, 1.17.2)
minitest (2.11.3)
mocha (0.10.5)
money (3.7.1)
multi_json (1.3.5, 1.1.0)
multipart-post (1.1.5)
mysql2 (0.3.11)
net-scp (1.0.4)
net-sftp (2.0.5)
net-ssh (2.4.0, 2.3.0)
net-ssh-gateway (1.1.0)
nifty-generators (0.4.6)
oauth (0.4.5)
oauth2 (0.5.2)
omniauth (1.0.3)
omniauth-facebook (1.2.0)
omniauth-google (1.0.1)
omniauth-linkedin (0.0.6)
omniauth-oauth (1.0.1)
omniauth-oauth2 (1.0.0)
omniauth-twitter (0.0.8)
orm_adapter (0.0.6)
paperclip (3.0.2)
passenger (3.0.12)
polyamorous (0.5.0)
polyglot (0.3.3)
rack (1.4.1)
rack-cache (1.2)
rack-ssl (1.3.2)
rack-test (0.6.1)
rails (3.2.3, 3.2.2)
railties (3.2.3, 3.2.2)
rake (0.9.2.2)
rdoc (3.12)
RedCloth (4.2.9)
rubygems-bundler (1.0.0)
rvm (1.11.3.3)
sass (3.1.18, 3.1.15)
sass-rails (3.2.5)
simple_form (2.0.1)
simple_oauth (0.1.5)
sprockets (2.1.3, 2.1.2)
sqlite3 (1.3.6)
squeel (1.0.1)
therubyracer (0.10.1, 0.9.10)
thor (0.14.6)
tilt (1.3.3)
timeliness (0.3.4)
treetop (1.4.10)
turn (0.9.4)
twitter (2.2.0)
tzinfo (0.3.33, 0.3.32)
uglifier (1.2.4, 1.2.3)
validates_timeliness (3.0.8)
warden (1.1.1)
will_paginate (3.0.3)

服务器上的 rvm 系统范围似乎是正确的

my-home$ rvm list

  rvm rubies

  =* ruby-1.9.3-p194 [ x86_64 ]

  # => - current
  # =* - current && default
  #  * - default

 my-home$ rvm info

  RVM is not a function, selecting rubies with 'rvm use ...' will not work.
  You need to change your terminal settings to allow shell login.
  Please visit https://rvm.io/workflow/screen/ for example.

  ruby-1.9.3-p194:

    system:
      uname:       "Linux totg01 2.6.38-14-generic #58-Ubuntu SMP Tue Mar 27 20:04:55 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux"
      bash:        "/bin/bash => GNU bash, version 4.2.8(1)-release (x86_64-pc-linux-gnu)"
      zsh:         " => not installed"

    rvm:
      version:      "rvm 1.13.5 (stable) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]"
      updated:      "4 days 2 hours 5 minutes 13 seconds ago"

     ruby:
       interpreter:  "ruby"
       version:      "1.9.3p194"
       date:         "2012-04-20"
       platform:     "x86_64-linux"
       patchlevel:   "2012-04-20 revision 35410"
       full_version: "ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]"

    homes:
      gem:          "/usr/local/rvm/gems/ruby-1.9.3-p194"
      ruby:         "/usr/local/rvm/rubies/ruby-1.9.3-p194"

    binaries:
      ruby:         "/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby"
      irb:          "/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/irb"
      gem:          "/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/gem"
      rake:         "/usr/local/rvm/gems/ruby-1.9.3-p194/bin/rake"

    environment:
      PATH:         "/usr/local/rvm/gems/ruby-1.9.3-p194/bin:/usr/local/rvm/gems/ruby-1.9.3-p194@global/bin:/usr/local/rvm/rubies/ruby-1.9.3-p194/bin:/usr/local/rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
      GEM_HOME:     "/usr/local/rvm/gems/ruby-1.9.3-p194"
      GEM_PATH:     "/usr/local/rvm/gems/ruby-1.9.3-p194:/usr/local/rvm/gems/ruby-1.9.3-p194@global"
      MY_RUBY_HOME: "/usr/local/rvm/rubies/ruby-1.9.3-p194"
      IRBRC:        "/usr/local/rvm/rubies/ruby-1.9.3-p194/.irbrc"
      RUBYOPT:      ""
      gemset:       ""

但是应用程序目录中有一个史诗般的失败,因为 ./vendor/bundle 中没有任何内容

app-dir$ ruby -v
 ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

app-dir$ rails -v
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/bundler-1.1.3/lib/bundler/spec_set.rb:90:in `block in materialize': Could not find rake-0.9.2.2 in any of the sources (Bundler::GemNotFound)
  from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/bundler-1.1.3/lib/bundler/spec_set.rb:83:in `map!'
  from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/bundler-1.1.3/lib/bundler/spec_set.rb:83:in `materialize'
  from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/bundler-1.1.3/lib/bundler/definition.rb:127:in `specs'
  from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/bundler-1.1.3/lib/bundler/environment.rb:27:in `specs'
  from /usr/local/rvm/gems/ruby-1.9.3-p194@global/gems/rubygems-bundler-1.0.0/lib/rubygems-bundler/noexec.rb:41:in `candidate?'
  from /usr/local/rvm/gems/ruby-1.9.3-p194@global/gems/rubygems-bundler-1.0.0/lib/rubygems-bundler/noexec.rb:59:in `setup'
  from /usr/local/rvm/gems/ruby-1.9.3-p194@global/gems/rubygems-bundler-1.0.0/lib/rubygems-bundler/noexec.rb:74:in `<top (required)>'
  from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:60:in `require'
  from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:60:in `rescue in require'
  from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:35:in `require'
  from /usr/local/rvm/gems/ruby-1.9.3-p194/bin/ruby_noexec_wrapper:9:in `<main>'

系统是 Ubuntu 11.04,ruby 使用 rvm 系统范围安装,默认为 1.93

deploy.rb 如下:

# This has been added due to multi deployment staging
set :stages, %w(staging production)
set :default_stage, "staging"

require 'capistrano/ext/multistage'

default_run_options[:pty] = true 

set :user, 'appuser'
set :application, "app"
set :keep_releases, 10

set :deploy_to, "/var/www/html/rails/#{application}"
set :repository,  "appuser@gitserver:/myapps/rails/#{application}.git"
set :deploy_via, :copy
set :ssh_options, {:forward_agent => true}
set :scm, :git 
set :branch, 'master'
set :scm_verbose, true
set :use_sudo, false

# This has been added due to multi deployment staging
# since :domain is defined in another file (staging.rb and production.rb),
# we need to delay its assignment until they're loaded
set(:domain) { "#{domain}" }
role(:web) { domain }
role(:app) { domain }
role(:db, :primary => true) { domain }

# If you are using Passenger mod_rails uncomment this:
namespace :deploy do
  desc "cause Passenger to initiate a restart"
  task :restart do
    run "touch #{current_path}/tmp/restart.txt"
  end
  desc "reload the database with seed data"
  task :seed do
    run "cd #{current_path}; rake db:seed RAILS_ENV=production"
  end
end

before "deploy:assets:precompile", :bundle_install

after "deploy:update_code", :bundle_install
desc "install the necessary prerequisites"
task :bundle_install, :roles => :app do
  run "cd #{release_path}&& export PATH=/usr/local/bin:/usr/local/mysql/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/opt/local/bin:/usr/local/rvm/gems/ruby-1.9.3-p194/bin:/usr/local/rvm/gems/ruby-1.9.3-p194@global/bin:/usr/local/rvm/rubies/ruby-1.9.3-p194/bin:/usr/local/rvm/bin && bundle install --deployment"
  run "cp -Rf #{shared_path}/config/* #{release_path}/config/"
end

其他两个暂存和生产文件是....

部署/登台.rb

set :domain, "staging.myapp.com"
set :rails_env, "staging"
set :default_environment, {  
   'PATH' => "/usr/local/bin:/usr/local/mysql/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/opt/local/bin"  
}

部署/生产.rb

set :domain, "production.myapp.com"
set :rails_env, "production"
set :default_environment, {  
  'PATH' => "/usr/local/rvm/gems/ruby-1.9.3-p194/bin:/usr/local/rvm/gems/ruby-1.9.3-p194@global/bin:/usr/local/rvm/rubies/ruby-1.9.3-p194/bin:/usr/local/rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/mysql/bin"  
 }

所以失败是试图将 install --deployment 捆绑在新交付的应用程序目录中。如果 bundle install --nodeployment 运行它工作正常!

我做错了什么或没有配置。我花了 2 天时间试图解决这个问题,但为什么 thios 不起作用似乎没有任何意义

4

2 回答 2

6

您必须错过 capistrano 的 rvm 说明:https ://rvm.io/integration/capistrano/

只需阅读它们,我会建议您使用 gem 版本,它基本上可以让您选择合适的 ruby​​:

安装:

gem install rvm-capistrano

或添加到 Gemfile:

gem 'rvm-capistrano'

示例 Capfile deploy.rb :

set :rvm_type, :system    # :user is the default
set :rvm_ruby_string, ENV['GEM_HOME'].gsub(/.*\//,"") # Read from local system

require "rvm/capistrano"  # Load RVM's capistrano plugin.

但最好去查看文档,因为有更多选项可用:https ://rvm.io/integration/capistrano/

于 2012-05-21T13:58:02.870 回答
0
  1. 不要使用 rvm1/capistrano3 或 rvm/capistrano;不要设置:pty。

  2. 将服务器上的 runner 用户更改~/.rvmrc为 - 请注意,它必须位于它在不以交互方式运行时杀死自己的行之前:

# get rvm for non-interactive shells (eg capistrano) too
source /etc/profile.d/rvm.sh
export BASH_ENV=$HOME/.bashrc
export rvm_is_not_a_shell_function=0

# If not running interactively, don't do anything
[ -z "$PS1" ] && return 
于 2014-03-12T20:02:33.380 回答