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

时间:2010-04-28 11:48:04

标签: ruby-on-rails deployment ssh capistrano ssh-tunnel

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

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

我认为隧道看起来像

git

2 个答案:

答案 0 :(得分:7)

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

您要做的是分别设置:local_repository:repository路径。本地引用:local_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,它会在远程服务器上保留存储库的副本。这大大减少了部署时间,降低了腐败的可能性。

答案 1 :(得分:1)

请参阅this SO question的答案:

使用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自述文件的Tunneling and other related SSH themes部分