使用Capistrano运行bundle的问题

时间:2015-03-01 19:42:52

标签: ruby-on-rails ruby-on-rails-4 capistrano unicorn

我在其他一些问题/ Github问题上看到了这个问题,但他们未能为解决方案做出足够的启示。

错误:

bash: bundle: command not found

SSHKit::Runner::ExecuteError: Exception while executing as my-user@my-IP-address: cd /path-to-my-app/current ; bundle exec unicorn -D -c config/unicorn.rb -E production exit status: 127

cd /path-to-my-app/current ; bundle exec unicorn -D -c config/unicorn.rb -E production stdout: Nothing written
cd /path-to-my-app/current ; bundle exec unicorn -D -c config/unicorn.rb -E production stderr: bash: bundle: command not found

我在我的rails应用程序上使用最新版本的Capistrano。具体来说,它是一个带有宝石capistrano-railscapistrano-rvm的Rails 4.2.0应用程序。

我有一个非常标准的config/unicorn.rb文件,这是我登录服务器时启动独角兽的方式。我先用以下方法终止当前的PID:

kill -9 PID

然后我用:

开始独角兽
bundle exec unicorn -D -c /path-to-my/config/unicorn.rb -E production

这很好用,但显然我需要capistrano这样做,所以我基本上在我的deploy.rb文件中有这些任务,但是我得到了上面提到的那个错误。以下是我在deploy.rb中的两项任务:

namespace :deploy do
  namespace :unicorn do
    task :restart do
      on roles(:app), in: :sequence, wait: 5 do
        execute "kill -s USR2 `cat /path-to-my/tmp/pids/app-name.pid`"
      end
    end

    desc 'Start unicorn' 
    task :start do
      on roles(:app), in: :sequence, wait: 5 do
        execute "cd #{current_path} ; bundle exec unicorn -D -c config/unicorn.rb -E production"
      end
    end
  end
end

我有类似的任务重新启动DelayedJob,它会抛出相同的错误。命令为execute "cd #{current_path} ; RAILS_ENV=production bin/delayed_job -n2 restart"。就像我上面提到的,当我的用户(我用于Capistrano的用户)登录到服务器时,所有这些任务都按预期工作。

其他每个内置任务都适用于Capistrano,就像预编译资产,迁移我的数据库等一样。我添加的自定义任务会收到错误。

如果我可以添加任何内容来帮助解决问题,请告诉我。

1 个答案:

答案 0 :(得分:0)

仔细看看Capistrano的输出。诸如bundle assets:precompile makes initialization of required ruby version之类的命令:

cd /<app path>/20150301211440 && ( RAILS_ENV=staging /usr/local/rvm/bin/rvm 2.1.5 do bundle exec rake assets:precompile )

好像你不这样做。所以,可能你默认使用系统ruby并且它没有bundler gem。

尝试在命令中指定ruby版本使用RVM。我认为应该解决你的问题。