Capistrano无法部署到远程服务器

解决方案是将以下内容添加到production.rb的顶部:

$:.unshift(File.expand_path('./lib', ENV['rvm_path'])) # Add RVM's lib directory to the load path. require "rvm/capistrano" # Load RVM's capistrano plugin. set :rvm_ruby_string, '1.9.2@rails31dataserver' # Or whatever env you want it to run in. set :rvm_bin_path, '/usr/local/rvm/bin' 

我之前缺少的部分是set :rvm_bin_path, '/usr/local/rvm/bin'因为我之前从未在Capistrano部署中使用过该配置设置,而且我做了一些。 哦,好吧,一天都工作。 信用转到irc.freenode.net上#rvm频道的tonyflint!

原帖

克利夫说

  • 我正在运行RVM的系统安装
  • 我正在通过Capistrano部署

我目前傻眼了。 基本上发生的事情是我正在尝试通过Capistrano进行部署,而且它很难,很难。 这是我的deploy.rb和production.rb文件的pastie(我正在做一个多阶段环境并省略staging.rb文件,因为它工作正常)。 http://pastie.org/2523675

以下是cap production deploy:setup的输出cap production deploy:setup

 $ cap production deploy:setup * executing `production' triggering start callbacks for `deploy:setup' * executing `multistage:ensure' * executing `deploy:setup' * executing "sudo -p 'sudo password: ' mkdir -p /var/www/html/dataserver /var/www/html/dataserver/releases /var/www/html/dataserver/shared /var/www/html/dataserver/shared/system /var/www/html/dataserver/shared/log /var/www/html/dataserver/shared/pids" servers: ["omitted"] Password: [omitted] executing command *** [err :: omitted] sudo *** [err :: omitted] : *** [err :: omitted] sorry, you must have a tty to run sudo *** [err :: omitted] command finished in 60ms failed: "sh -c 'sudo -p '\\''sudo password: '\\'' mkdir -p /var/www/html/dataserver /var/www/html/dataserver/releases /var/www/html/dataserver/shared /var/www/html/dataserver/shared/system /var/www/html/dataserver/shared/log /var/www/html/dataserver/shared/pids'" on omitted 

现在,我知道为什么会这样。 我正在远程尝试使用sudo,这是一个安全禁忌。 所以,这意味着我需要使用default_run_options[:pty] = true 。 所以我取消注释它并运行cap production deploy:setup再次cap production deploy:setup并且所有运行都很好和花花公子。 部署的目录结构获取设置和所有内容。 真棒。 现在我尝试运行cap production deploy ,这是输出:

 $ cap production deploy * executing `production' triggering start callbacks for `deploy' * executing `multistage:ensure' * executing `deploy' * executing `deploy:update' ** transaction: start * executing `deploy:update_code' updating the cached checkout on all servers executing locally: "hg log -r default --template '{node|short}'" command finished in 52ms * executing "if [ -d /var/www/html/dataserver/shared/cached-copy ]; then hg pull --repository /var/www/html/dataserver/shared/cached-copy https://cowfish.unh.edu/hg/DataServerApp && hg update --repository /var/www/html/dataserver/shared/cached-copy --clean 6979cec4fc00; else hg clone --noupdate https://cowfish.unh.edu/hg/DataServerApp /var/www/html/dataserver/shared/cached-copy && hg update --repository /var/www/html/dataserver/shared/cached-copy --clean 6979cec4fc00; fi" servers: ["omitted"] Password: [omitted] executing command ** [omitted :: out] warning: certificate for omitted can't be verified (Python too old) ** [omitted :: out] http authorization required ** [omitted :: out] realm: Mercurial Project Repository ** [omitted :: out] user: ** [omitted :: out] d ** [omitted :: out] e ** [omitted :: out] p ** [omitted :: out] l ** [omitted :: out] o ** [omitted :: out] y ** [omitted :: out] ** [omitted :: out] password: ** [omitted :: out] ** [omitted :: out] warning: certificate for omitted can't be verified (Python too old) ** [omitted :: out] warning: certificate for omitted can't be verified (Python too old) ** [omitted :: out] warning: certificate for omitted can't be verified (Python too old) ** [omitted :: out] requesting all changes ** [omitted :: out] warning: certificate for omitted can't be verified (Python too old) ** [omitted :: out] warning: certificate for omitted can't be verified (Python too old) ** [omitted :: out] adding changesets ** [omitted :: out] adding manifests ** adding file changes ** [omitted :: out] added 11 changesets with 187 changes to 125 files ** [omitted :: out] warning: certificate for omitted can't be verified (Python too old) ** [omitted :: out] warning: certificate for omitted can't be verified (Python too old) ** [omitted :: out] 114 files updated, 0 files merged, 0 files removed, 0 files unresolved command finished in 1332ms copying the cached version to /var/www/html/dataserver/releases/20110912233835 * executing "cp -RPp /var/www/html/dataserver/shared/cached-copy /var/www/html/dataserver/releases/20110912233835 && (echo 6979cec4fc00 > /var/www/html/dataserver/releases/20110912233835/REVISION)" servers: ["omitted"] [omitted] executing command command finished in 23ms * executing `deploy:finalize_update' * executing "chmod -R g+w /var/www/html/dataserver/releases/20110912233835" servers: ["omitted"] [omitted] executing command command finished in 7ms * executing "rm -rf /var/www/html/dataserver/releases/20110912233835/log /var/www/html/dataserver/releases/20110912233835/public/system /var/www/html/dataserver/releases/20110912233835/tmp/pids &&\\\n mkdir -p /var/www/html/dataserver/releases/20110912233835/public &&\\\n mkdir -p /var/www/html/dataserver/releases/20110912233835/tmp &&\\\n ln -s /var/www/html/dataserver/shared/log /var/www/html/dataserver/releases/20110912233835/log &&\\\n ln -s /var/www/html/dataserver/shared/system /var/www/html/dataserver/releases/20110912233835/public/system &&\\\n ln -s /var/www/html/dataserver/shared/pids /var/www/html/dataserver/releases/20110912233835/tmp/pids" servers: ["omitted"] [omitted] executing command command finished in 8ms * executing "find /var/www/html/dataserver/releases/20110912233835/public/images /var/www/html/dataserver/releases/20110912233835/public/stylesheets /var/www/html/dataserver/releases/20110912233835/public/javascripts -exec touch -t 201109122338.35 {} ';'; true" servers: ["omitted"] [omitted] executing command ** [out :: omitted] find: /var/www/html/dataserver/releases/20110912233835/public/images: No such file or directory ** [out :: omitted] find: /var/www/html/dataserver/releases/20110912233835/public/stylesheets: No such file or directory ** [out :: omitted] find: /var/www/html/dataserver/releases/20110912233835/public/javascripts: No such file or directory command finished in 6ms * executing `deploy:symlink' * executing "rm -f /var/www/html/dataserver/current && ln -s /var/www/html/dataserver/releases/20110912233835 /var/www/html/dataserver/current" servers: ["omitted"] [omitted] executing command command finished in 6ms ** transaction: commit * executing `deploy:restart' * executing "sudo -p 'sudo password: ' touch /var/www/html/dataserver/current/tmp/restart.txt" servers: ["omitted"] [omitted] executing command command finished in 10ms triggering after callbacks for `deploy' * executing `deploy:migrate' triggering before callbacks for `deploy:migrate' * executing `sqlite3:link_configuration_file' * executing "ln -nsf /var/www/html/dataserver/shared/sqlite_config.yml /var/www/html/dataserver/releases/20110912233835/config/database.yml" servers: ["omitted"] [omitted] executing command command finished in 6ms * executing "cd /var/www/html/dataserver/releases/20110912233835 && rake RAILS_ENV=production db:migrate" servers: ["omitted"] [omitted] executing command ** [out :: omitted] sh: rake: command not found command finished in 5ms failed: "sh -c 'cd /var/www/html/dataserver/releases/20110912233835 && rake RAILS_ENV=production db:migrate'" on omitted 

因此看来无论它加载什么环境都看不到rake 。 要查看我创建部署任务的路径中加载的内容,请输出以下内容:

 $ cap production test_path * executing `production' triggering start callbacks for `test_path' * executing `multistage:ensure' * executing `test_path' * executing "echo $PATH" servers: ["omitted"] Password: [omitted] executing command ** [out :: omitted] /usr/local/bin:/bin:/usr/bin command finished in 11ms * executing "echo $rvm_path" servers: ["omitted"] [omitted] executing command ** [out :: omitted] command finished in 5ms 

现在你会注意到路径绝对不正确。 对于正在建立会话的用户,应该是以下内容:

 /usr/local/rvm/gems/ruby-1.9.2-p290@rails31dataserver/bin:/usr/local/rvm/gems/ruby-1.9.2-p290@global/bin:/usr/local/rvm/rubies/ruby-1.9.2-p290/bin:/usr/local/rvm/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/lpeabody/bin 

而且,我知道为什么这不起作用。 这是因为我正在运行default_run_options[:pty] = true我的环境正在加载,至少这是我目前的理论。 所以,毕竟,我得出结论 – 我需要以某种方式加载我的环境,以便rake可以在不启用远程sudo的情况下运行。

现在,我知道我不是唯一需要这样做的人,所以任何指针或提示都将非常感激。 我已经把我的大脑放在了8个小时的大部分时间里,我需要尽快部署这个应用程序。

解决方案是将以下内容添加到production.rb的顶部:

 $:.unshift(File.expand_path('./lib', ENV['rvm_path'])) # Add RVM's lib directory to the load path. require "rvm/capistrano" # Load RVM's capistrano plugin. set :rvm_ruby_string, '1.9.2@rails31dataserver' # Or whatever env you want it to run in. set :rvm_bin_path, '/usr/local/rvm/bin' 

我之前缺少的部分是set :rvm_bin_path, '/usr/local/rvm/bin'因为我之前从未在Capistrano部署中使用过该配置设置,而且我做了一些。 哦,好吧,一天都工作。 信用转到irc.freenode.net上#rvm频道的tonyflint!

确保你运行:

 gem install rvm-capistrano 

在你放之前

 require "rvm/capistrano" in your "deploy.rb" 

在我这样做之后,它有效。

在capfile中尝试一些事情(这些是用于系统范围的RVM安装,不适用于每用户安装。)

 require "rvm/capistrano" set :rvm_bin_path, "/usr/local/rvm/bin" $:.unshift(File.expand_path('./lib', ENV['rvm_path'])) # Add RVM's lib directory to the load path. 

在我的情况下,添加

 default_run_options[:pty] = true 

解决了这个问题。