0

我只是在我的服务器上直接运行 rake db:migrate 没有问题:

$ pwd
/var/www/vhosts/example.com/current
$ rake db:migrate

然后我尝试通过 capistrano 任务运行它,但出现错误。任务和输出如下。为什么 rake db:migrate 不能通过我的 capistrano 任务工作?

任务

namespace :deploy do
  # run the db migrations
  task :run_migrations, :roles => :db do
    puts "RUNNING DB MIGRATIONS"
    run "cd #{current_path}; rake db:migrate RAILS_ENV=#{rails_env}"
  end
end

上限部署:运行迁移

$ cap deploy:run_migrations 
  * executing `deploy:run_migrations'
RUNNING DB MIGRATIONS
  * executing "cd /var/www/vhosts/example.com/current; rake db:migrate"
    servers: ["example.com"]
    [example.com] executing command
 ** [out :: example.com] (in /var/www/vhosts/example.com/releases/20121122011144)
 ** [out :: example.com] rake aborted!
 ** [out :: example.com] no such file to load -- rubygems
 ** [out :: example.com] /var/www/vhosts/example.com/releases/20121122011144/Rakefile:5:in `require'
 ** [out :: example.com] (See full trace by running task with --trace)
    command finished in 390ms
failed: "sh -c 'cd /var/www/vhosts/example.com/current; rake db:migrate'" on example.com

编辑

$ ruby -v
ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-linux]
$ which ruby
/usr/local/rvm/rubies/ruby-1.9.3-p125/bin/ruby
$ which rails
/usr/local/rvm/gems/ruby-1.9.3-p125/bin/rails

编辑 当我将 --trace 添加到数据库迁移时,它看起来像是在使用/usr/lib/ruby/site_ruby/1.8/rake.rb,但从这个外观来看: $ which rake /usr/local/rvm/gems/ruby-1.9.3-p125/bin/rake 我会预计它会使用 rake at/usr/local/rvm/gems/ruby-1.9.3-p125/bin/rake而不是/usr/lib/ruby/site_ruby/1.8/rake.rb.

从 deploy:run_migrations 任务中获取部署的输出

* executing `deploy:run_migrations'
RUNNING DB MIGRATIONS
  * executing "cd /var/www/vhosts/example.com/current; rake db:migrate RAILS_ENV=production --trace"
    servers: ["example.com"]
    [example.com] executing command
 ** [out :: example.com] (in /var/www/vhosts/example.com/releases/20121123184358)
 ** [out :: example.com] rake aborted!
 ** [out :: example.com] no such file to load -- rubygems
 ** [out :: example.com] /var/www/vhosts/example.com/releases/20121123184358/config/boot.rb:1:in `require'
 ** [out :: example.com] /var/www/vhosts/example.com/releases/20121123184358/config/boot.rb:1
 ** [out :: example.com] /var/www/vhosts/example.com/releases/20121123184358/config/application.rb:1:in `require'
 ** [out :: example.com] /var/www/vhosts/example.com/releases/20121123184358/config/application.rb:1
 ** [out :: example.com] /var/www/vhosts/example.com/releases/20121123184358/Rakefile:5:in `require'
 ** [out :: example.com] /var/www/vhosts/famnfo.com/releases/20121123184358/Rakefile:5
 ** [out :: example.com] /usr/lib/ruby/site_ruby/1.8/rake.rb:1828:in `load'
 ** [out :: example.com] /usr/lib/ruby/site_ruby/1.8/rake.rb:1828:in `load_rakefile'
 ** [out :: example.com] /usr/lib/ruby/site_ruby/1.8/rake.rb:1900:in `run'
 ** [out :: example.com] /usr/bin/rake:8
    command finished in 422ms
failed: "sh -c 'cd /var/www/vhosts/example.com/current; rake db:migrate RAILS_ENV=production --trace'" on example.com

添加@Super Engineers 代码后编辑输出

* executing `bundle:install'
  * executing "ls -x /var/www/vhosts/example.com/releases"
    servers: ["example.com"]
    [example.com] executing command
    command finished in 572ms
  * executing "cd /var/www/vhosts/example.com/releases/20121124160218 && bundle install --gemfile /var/www/vhosts/example.com/releases/20121124160218/Gemfile --path /var/www/vhosts/example.com/shared/bundle --deployment --quiet --without development test"
    servers: ["example.com"]
    [example.com] executing command
 ** [out :: example.com] You are trying to install in deployment mode after changing
 ** [out :: example.com] your Gemfile. Run `bundle install` elsewhere and add the
 ** [out :: example.com] updated Gemfile.lock to version control.
 ** [out :: example.com] 
 ** [out :: example.com] You have added to the Gemfile:
 ** [out :: example.com] * mysql2
 ** [out :: example.com] * therubyracer
 ** [out :: example.com] * rvm-capistrano
 ** [out :: example.com] * passenger
 ** [out :: example.com] 
 ** [out :: example.com] You have deleted from the Gemfile:
 ** [out :: example.com] * mysql
    command finished in 999ms
*** [deploy:update_code] rolling back
  * executing "rm -rf /var/www/vhosts/example.com/releases/20121124160218; true"
    servers: ["example.com"]
    [example.com] executing command
    command finished in 826ms
failed: "rvm_path=/usr/local/rvm /usr/local/rvm/bin/rvm-shell 'ruby-1.9.3-p125' -c 'cd /var/www/vhosts/example.com/releases/20121124160218 && bundle install --gemfile /var/www/vhosts/example.com/releases/20121124160218/Gemfile --path /var/www/vhosts/example.com/shared/bundle --deployment --quiet --without development test'" on example.com

编辑 整个 deploy.rb 文件

require 'bundler/capistrano'
require 'rvm/capistrano'

# set environment
set :rails_env, "production"

# set the ruby version
set :rvm_ruby_string, 'ruby-1.9.3-p125'
set :rvm_type, 'webadmin'

# server username and password
set :user, 'super'
set :password, 'secret'

# subversion repo username and password
set :scm, :subversion
set :scm_username, "super" 
set :scm_password, 'secret'
set :svnserver, "myreposerver" 
set :repository, "myrepo" 

# project info
set :server, ''
set :application, "FamNFo"
set :applicationdir, '/Volumes/Macintosh HD/Users/myname/Sites/example' 

role :web, "example.com"
role :app, "example.com"
role :db,  "example.com", :primary => true
set :use_sudo, true

# database config
#set :migrate_env, "#{rails_env}" 

# specify the rvm type. We just want to use the system wide one since we're not currently specifying gemsets for each project
set :rvm_type, :system

# where to put the files
set :deploy_to, "/var/www/vhosts/example.com" 

# fixes the "sorry, you must have a tty to run sudo" issue
default_run_options[:pty] = true

# precompiles the assets
load 'deploy/assets'

# If you are using Passenger mod_rails uncomment this:
 namespace :deploy do

    # restart the server
    task :restart, :roles => :app do
        run "/etc/init.d/http restart graceful"
    end

    # chmod the files
    task :after_update_code, :roles => [:web, :db, :app] do
        run "chmod 755 #{release_path}/public -R" 
    end

    # install new gems
    desc "run bundle install and ensure all gem requirements are met"
    task :install do
        run "cd #{current_path} && bundle install  --without=test --no-update-sources --trace"
    end

    # run the db migrations
    task :run_migrations, :roles => :db do
        puts "RUNNING DB MIGRATIONS"
        run "cd #{current_path}; rake db:migrate RAILS_ENV=#{rails_env} --trace"
    end

    # precompile assets
    task :precompile_assets do
        run "cd #{release_path}; bundle exec rake assets:precompile RAILS_ENV=#{rails_env}"
    end

    task :start do ; end
    task :stop do ; end

    # restart the server
    task :restart, :roles => :app, :except => { :no_release => true } do
        run "#{sudo} /etc/init.d/httpd restart graceful"
    end
 end

 # hook to run db migrations after code update
after("deploy:update", "deploy:run_migrations")
#after("deploy:update", "deploy:precompile_assets")
after "deploy:update", "deploy:install"
# if you want to clean up old releases on each deploy uncomment this:
after "deploy:restart", "deploy:cleanup" # leave the last 5 releases only
4

3 回答 3

4

这是因为红宝石冲突。我遇到了同样的错误。您将需要使用rvm/capistrano gem. 我将从我的 cap 文件中粘贴一些代码,这将使您了解如何在部署时设置 ruby​​ 版本。

安装宝石

gem install rvm-capistrano

在你 deploy.rb 文件中添加这些行

require 'bundler/capistrano'
require 'rvm/capistrano'

set :rvm_ruby_string, "ruby-1.9.3-p125"
set :rvm_type, 'webadmin'

有关更多信息,您可以访问此链接rvm/capistrano

于 2012-11-24T15:51:00.320 回答
1

这里的相关错误似乎是no such file to load -- rubygems.

很可能是因为生产服务器上安装了多个 ruby​​。

查看以前的解决方案以解决类似问题:https ://stackoverflow.com/a/2896596/429758

此外,capistrano 邮件列表上的这个线程很有帮助:https ://groups.google.com/forum/?fromgroups=#!topic/capistrano/JzVPRbQclY4

于 2012-11-22T06:14:47.003 回答
0

你在使用rvm/capistrano吗?有了它,您可以在 capistrano 配方中指定要在服务器上使用的 ruby​​ 版本。我怀疑当你运行 capistrano 时它没有使用你的 rvm 设置,当你登录并运行 rake 任务时,你的用户被设置为使用 rvm ruby​​ 版本。

于 2012-11-22T14:54:35.840 回答