安装新的宝石后,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故障的解决方案,但其中大多数都是首次部署而且对我不起作用。
答案 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之间发生奇怪的名称冲突。