是否有可能让Capistrano通过反向SSH隧道进行结账?

我正在开发一个驻留在公共主机上的应用程序,但其源代码必须保存在公司防火墙后面的Git存储库中。 我已经厌倦了通过scp部署的缓慢(复制整个存储库并在每次部署时通过SSH发送它),并且希望让远程主机简单地执行git pull更新。 问题是防火墙禁止传入SSH连接。

我可以设置从我的计算机到部署计算机的SSH隧道,并使用我的存储库作为git pull的来源吗? 毕竟, git是分布式的,因此我的副本与中央副本一样有效。 如果可以,那么tunnel命令和Capistrano配置是什么?

我认为隧道看起来像

 ssh -R something:deployserver.com:something deploybot@deployserver.com 

Net :: SSH 实现远程转发 。 我查看了所有Capistrano的源代码,在当前版本中看不到任何对它的引用。 尽管如此,在使用Capistrano进行部署之前,这并不能阻止您建立远程转发。

您要做的是分别设置:local_repository:repository路径。 :local_repository在本地引用,以确定在启动连接之前将使用哪个提交进行部署。 这留下:repository远程服务器的:repository在连接启动后从中拉出。 您可以在此处指定防火墙后面的存储库的路径。

 # deploy.rb set :local_repository, "ssh://git@serverbehindfirewall/path/to/project.git" set :repository, "ssh://git@localhost:9000/path/to/project.git" 

在部署之前,请确保建立远程转发。 您需要为部署到的每个服务器重复此操作。

 $ ssh -R 9000:serverbehindfirewall:22 deploybot@deployserver.com # CTRL + C + A (Screen) or ⌘ + T (Terminal.app) to open new tab $ cap HOSTFILTER=deployserver.com deploy # HOSTFILTER reduces set to specified host. Only useful if you have multiple servers. 

使用Net :: SSH可以很容易地将其转换为在部署到多个服务器之前提供更大灵活性的任务之前执行的任务。

最后,鉴于您一直在使用scp,您可能需要设置deploy_via, :remote_cache ,它会在远程服务器上保留存储库的副本。 这大大减少了您的部署时间,降低了腐败的可能性。

从这个SO问题看我的答案:

使用Capistrano 3.x,以下内容适用于我:

 namespace :deploy do desc "Open SSH Tunnel to GitLab" task :open_tunnel do on roles(:app) do info "Opening SSH Remote Tunnel..." self.send(:with_ssh) do |ssh| # ssh -R 9000:192.168.1.123:22 ssh.forward.remote(22, "192.168.1.123", 9000) end end end before "deploy:check", "deploy:open_tunnel" end 

请注意, ssh.forward.remote期望参数的顺序与ssh -R不同,上面的等价于ssh -R 9000:192.168.1.123:22

此任务调用私有方法,如果有人知道获取访问Capistrano的ssh连接的官方方式,请评论或编辑。

编辑:另请参阅SSHKit自述文件的隧道和其他相关SSH主题部分