2014-04-29 116 views
3

Capistrano(> 3)中的这个错误阻止了我部署Rails应用程序。我的Capistrano配置在另一个环境中工作正常。Capistrano:NoMethodError:undefined方法`recv'for#<IO:fd XX>

DEBUG [6c7d7bed] Command: if test ! -d /opt/my_app/releases/20140429175529; then echo "Directory does not exist '/opt/my_app/releases/20140429175529'" 1>&2; false; fi 
cap aborted! 
NoMethodError: undefined method `recv' for #<IO:fd 49> 
/Users/such/.rvm/gems/[email protected]_app/gems/net-ssh-2.8.0/lib/net/ssh/buffered_io.rb:65:in `fill' 
/Users/such/.rvm/gems/[email protected]_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/packet_stream.rb:86:in `next_packet' 
/Users/such/.rvm/gems/[email protected]_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/session.rb:178:in `block in poll_message' 
/Users/such/.rvm/gems/[email protected]_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/session.rb:173:in `loop' 
/Users/such/.rvm/gems/[email protected]_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/session.rb:173:in `poll_message' 
/Users/such/.rvm/gems/[email protected]_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/session.rb:210:in `block in wait' 
/Users/such/.rvm/gems/[email protected]_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/session.rb:208:in `loop' 
/Users/such/.rvm/gems/[email protected]_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/session.rb:208:in `wait' 
/Users/such/.rvm/gems/[email protected]_app/gems/net-ssh-2.8.0/lib/net/ssh/transport/session.rb:87:in `initialize' 
/Users/such/.rvm/gems/[email protected]_app/gems/net-ssh-2.8.0/lib/net/ssh.rb:200:in `new' 
/Users/such/.rvm/gems/[email protected]_app/gems/net-ssh-2.8.0/lib/net/ssh.rb:200:in `start' 
/Users/such/.rvm/gems/[email protected]_app/gems/sshkit-1.4.0/lib/sshkit/backends/connection_pool.rb:24:in `create_or_reuse_connection' 
/Users/such/.rvm/gems/[email protected]_app/gems/sshkit-1.4.0/lib/sshkit/backends/netssh.rb:173:in `ssh' 
/Users/such/.rvm/gems/[email protected]_app/gems/sshkit-1.4.0/lib/sshkit/backends/netssh.rb:126:in `block in _execute' 
/Users/such/.rvm/gems/[email protected]_app/gems/sshkit-1.4.0/lib/sshkit/backends/netssh.rb:123:in `tap' 
/Users/such/.rvm/gems/[email protected]_app/gems/sshkit-1.4.0/lib/sshkit/backends/netssh.rb:123:in `_execute' 
/Users/such/.rvm/gems/[email protected]_app/gems/sshkit-1.4.0/lib/sshkit/backends/netssh.rb:66:in `execute' 
/Users/such/.rvm/gems/[email protected]_app/gems/sshkit-1.4.0/lib/sshkit/backends/abstract.rb:75:in `within' 
/Users/such/.rvm/gems/[email protected]_app/gems/capistrano-3.2.1/lib/capistrano/tasks/deploy.rake:207:in `block (3 levels) in <top (required)>' 
/Users/such/.rvm/gems/[email protected]_app/gems/sshkit-1.4.0/lib/sshkit/backends/netssh.rb:54:in `instance_exec' 
/Users/such/.rvm/gems/[email protected]_app/gems/sshkit-1.4.0/lib/sshkit/backends/netssh.rb:54:in `run' 
/Users/such/.rvm/gems/[email protected]_app/gems/sshkit-1.4.0/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute' 
Tasks: TOP => deploy:set_current_revision 
(See full trace by running task with --trace) 
The deploy has failed with an error: #<NoMethodError: undefined method `recv' for #<IO:fd 49>> 

我正在使用代理连接到我的远程服务器(在两种环境中)。 SSH连接完美运行。

set :ssh_options, proxy: Net::SSH::Proxy::Command.new('ssh [email protected] -W %h:%p') 

有没有人遇到过这个问题?

解决方法

我的错误弱的理解是,SSH协商后,有时插座回到净SSH是一个文件描述符这是意想不到的。 我已经加入:

gem 'sshkit', github: 'msimonin/sshkit', branch: 'gateway' 

我的Gemfile使得ssh连接成立仅一次。

相关的配置是:

SSHKit.config.backend.configure do |ssh| 
    ssh.gateway = '[email protected]' 
end 

它正常工作,这种方式。我不能等待拉取请求被合并。

+0

什么是在另一个环境中的红宝石和钢轨版本,你是否使用类似的版本的Capistrano? –

+0

我使用的是完全相同的版本:Rails 4.1.0,ruby 2.1.1,Capistrano 3.2.1(不能与3.2.0一起工作) – Such

+0

看起来像一堆其他人都有这个问题https:/ /github.com/capistrano/sshkit/issues/150 –

回答

0

如果您使用的是代理命令,则连接对象始终是文件描述符支持的IO实例。该代码位于lib/net/ssh/proxy/command.rb中,并且它在注入管道后等待某些内容变得可读的位后注入recv方法,所以我不确定它为什么有时会失败(我'也见过它)。基于callstack,我认为它已经返回了,所以recv应该在那里。

您是否打开过一个问题?

+0

我没有。你猜这是Net :: SSH问题呢? – Such