2010-04-28 7 views
10

Je développe une application qui réside sur un hôte public mais dont je dois conserver la source dans un dépôt Git derrière un pare-feu d'entreprise. Je reçois très fatigué de la lenteur du déploiement via scp (copier le référentiel entier et l'expédier sur SSH sur chaque déploiement) et souhaite que l'hôte distant fasse simplement un git pull pour mettre à jour. Le problème est que le pare-feu interdit les connexions SSH entrantes.Est-ce que Capistrano peut faire un checkout sur un tunnel SSH inversé?

Serais-je en mesure de configurer un tunnel SSH de mon ordinateur vers l'ordinateur de déploiement et d'utiliser mon référentiel comme source pour le git pull? Après tout, git est distribué, donc ma copie est un référentiel tout aussi valide que le référentiel central. Si cela est possible, quelle serait la commande du tunnel et la configuration de Capistrano?

Je pense que le tunnel va ressembler à quelque chose comme

ssh -R something:deployserver.com:something [email protected] 

Répondre

7

Net :: SSH implements remote forwarding. J'ai examiné tout le code source de Capistrano et je n'ai vu aucune référence dans la version actuelle. Néanmoins, cela ne vous empêche pas d'établir une redirection à distance avant de vous déployer avec Capistrano.

Ce que vous voulez faire est de définir les chemins :local_repository et :repository individuellement. :local_repository est référencé localement pour déterminer la validation qui sera utilisée pour le déploiement avant le lancement de la connexion. Cela laisse :repository pour le serveur distant à tirer après que la connexion a été initiée. C'est ici que vous pouvez spécifier le chemin vers le référentiel derrière le pare-feu.

# deploy.rb 
set :local_repository, "ssh://[email protected]/path/to/project.git" 
set :repository, "ssh://[email protected]:9000/path/to/project.git" 

Avant de déployer, assurez-vous d'établir l'avant à distance. Vous devrez répéter ceci pour chaque serveur sur lequel vous déployez.

$ ssh -R 9000:serverbehindfirewall:22 [email protected] 
# 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. 

En utilisant Net :: SSH cela pourrait facilement être transformé en une tâche qui est exécutée avant tout autre offrant une plus grande flexibilité lors du déploiement sur plusieurs serveurs. Enfin, étant donné que vous avez utilisé scp, vous pouvez définir deploy_via, :remote_cache qui conserve une copie du référentiel sur le serveur distant. Cela réduit considérablement votre temps de déploiement réduit les risques de corruption.

0

Voir ma réponse de this SO question:

En utilisant 3.x Capistrano, les travaux suivants pour moi:

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 

S'il vous plaît noter que ssh.forward.remote paramètres dans un attend autre ordre que ssh -R, ce qui précède est équivalent Cette tâche appelle une méthode privée, si quelqu'un connaît un moyen officiel d'accéder à la connexion ssh Capistrano, s'il vous plaît commenter ou modifier.

Edit: Voir aussi la section Tunneling and other related SSH themes de README

de SSHKit
Questions connexes