[英]SSHKit error during Capistrano deployment of Rails app
安装新的 gem 后,Slackistrano 已经成功部署了 Capistrano 应用程序,我们的部署开始失败,并在 rake assets:precompile 或 rake db:migrate 任务期间出现以下错误
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 task cap staging assets:precompile,它就会成功。
那么这是怎么回事?
在 cap 部署期间,还有一些其他解决 SSHKit 失败的解决方案,但其中大多数是针对首次部署的,对我不起作用。
这是我找出解决方案的方式(拉了很多头发后)。
我知道可能是导致问题的新宝石。 因此,我进入了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。
好吧,我发现我的Gemfile中有一个gem仅供开发使用(mailcatcher),但在Gemfile的生产部分中。 我删除了此文件,并成功进行了重新部署。
但是,显然存在一个更深层次的问题,因为sinatra和capistrano的“之前”方法似乎首先引起了某种名称冲突。
我在这里发布的内容是为了帮助其他人在Cap部署过程中调试可能的SSHKit错误,并且也许还可以指导其他人在Sinatra和Capistrano之间发生奇怪的名称冲突。
对我来说,如果您在运行 Capistrano 时不小心使用了 Ruby 的不兼容版本,就会出现此问题。 在使用gem 'capistrano', '3.11.0'
时,我必须添加一个.ruby-version
以将它限制为2.7.5
。
所以我不确定声明Ruby 版本 2 或更高版本是否严格正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.