0

問題なく rake db:migrate をサーバー上で直接実行しました。

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

次に、カピストラーノタスクを介して実行しようとしましたが、エラーが発生しました。タスクと出力は以下のとおりです。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

$ 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 を db migrations に追加すると、 を使用しているように見え/usr/lib/ruby/site_ruby/1.8/rake.rbますが、見た目からは次のようになります: $ which rake /usr/local/rvm/gems/ruby-1.9.3-p125/bin/rake/usr/local/rvm/gems/ruby-1.9.3-p125/bin/rakeではなくrake at を使用することを期待していました/usr/lib/ruby/site_ruby/1.8/rake.rb

deploy:run_migrations タスクからの cap deploy の出力

* 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 コードを追加した後のEDIT出力

* 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。私のキャップファイルからいくつかのコードを貼り付けます。これにより、デプロイ中にルビーバージョンを設定する方法についてのアイデアが得られます。

ジェムをインストールする

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レシピでサーバーで使用するルビーバージョンを指定できます。capistranoを実行すると、rvmセットアップが使用されていないのではないかと思います。ログインして、rakeタスクを実行すると、ユーザーはrvmrubyバージョンを使用するようにセットアップされます。

于 2012-11-22T14:54:35.840 に答える