Capistrano是否可以通过反向SSH隧道进行检出?

10
我正在开发一个应用程序,它位于公共主机上,但源代码必须保留在公司防火墙后面的 Git 存储库中。我已经非常厌倦通过 scp 部署的速度缓慢(每次部署都要复制整个存储库并通过 SSH 进行传输),希望远程主机只需执行 git pull 来进行更新。问题是防火墙禁止传入的 SSH 连接。
我能否从我的计算机设置一个到部署计算机的 SSH 隧道,并使用我的存储库作为 git pull 的来源?毕竟,git 是分布式的,因此我的副本与中央副本一样有效。如果这是可能的,那么隧道命令和 Capistrano 配置会是什么?
我认为隧道将看起来像:
ssh -R something:deployserver.com:something deploybot@deployserver.com
2个回答

7

Net::SSH 实现远程转发。我已经查看了所有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

请查看我在这个stackoverflow问题中的回答:

使用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的README中Tunneling and other related SSH themes部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接