在Capistrano部署Rails应用程序期间出现SSHKit错误

时间:2016-01-06 23:14:11

标签: ruby-on-rails sinatra capistrano

安装新的宝石后,Slackistrano已经成功部署了Capistrano的应用程序,我们的部署在rake资产期间开始失败并出现以下错误:预编译或rake db:迁移任务

cap aborted!
SSHKit::Command::Failed: rake stdout: Nothing written
rake stderr: Nothing written
/Users/pete/.rvm/gems/ruby-2.2.2/gems/sshkit-1.3.0/lib/sshkit/command.rb:94:in `exit_status='

这个错误显然不是很有帮助。

如果我运行capistrano任务上限暂存资产:预编译,它会成功。

那么这里发生了什么?

在封顶部署期间,还有一些其他解决SSHKit故障的解决方案,但其中大多数都是首次部署而且对我不起作用。

1 个答案:

答案 0 :(得分:0)

这是我如何找出解决方案(经过多次拔毛)。

我知道这可能是导致问题的新宝石。所以我进入了sshkit / command.rb的源代码,并输出了它试图在远程服务器上执行的命令。

然后我登录到远程服务器并手动运行并获得以下输出:

$ cd /home/web/sites/site.com/releases/20160106224143 && ( RAILS_ENV=production ~/.rvm/bin/rvm default do bundle exec rake db:migrate )
rake aborted!
NoMethodError: undefined method `each_pair' for "slack:deploy:updating":String
/home/web/sites/site.com/shared/bundle/ruby/2.2.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1602:in `compile!'
/home/web/sites/site.com/shared/bundle/ruby/2.2.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1344:in `add_filter'
/home/web/sites/site.com/shared/bundle/ruby/2.2.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1331:in `before'
/home/web/sites/site.com/shared/bundle/ruby/2.2.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1989:in `block (2 levels) in delegate'
/home/web/sites/site.com/shared/bundle/ruby/2.2.0/gems/slackistrano-1.0.0/lib/slackistrano/tasks/slack.rake:121:in `<top (required)>'

所以,问题始于Slackistrano,但那么,什么?为什么Sinatra在那里?我不在我的应用程序中使用Sinatra。

好吧,我发现我的Gemfile中有一个gem只用于开发(mailcatcher)但是在Gemfile的生产部分。我删除了这个并成功重新部署。

然而,显然存在一个更深层次的问题,因为似乎在sinatra和capistrano的“before”方法中存在某种名称冲突,这首先导致了这种情况。

我发布这里是为了帮助其他人在Cap部署期间调试可能的SSHKit错误,也可能引导其他人在Sinatra和Capistrano之间发生奇怪的名称冲突。