18 septembre 2010

Je passe à Mercurial

J'avais des repositories Subversion sur un serveur à la cave, et il a planté hier. Heureusement qu'il y a les backups automatiques journaliers (backup-manager + cron qui envoyait tout ça sur une VM xen sur un serveur distant).

Je vais en profiter pour migrer la totalité de mes projets vers Mercurial, un DVCS bien sympa, même que le Project Hosting de Google Code l'utilise.

L'architecture que j'ai choisie est celle-ci :
  • hébergement chez Google Code quand le projet a vocation à être open source
  • hébergement sur une VM sur un serveur dédié loué quand le projet est privé
  • backups dans tous les sens grâce aux repositories locaux sur mes machines
Simple et pas prise de tête.

Le serveur qui vient de flancher hébergeait déjà quelques repositories Mercurial, histoire de découvrir. J'avais fait ceci :
  • accès par SSH et clefs publiques (tout comme j'utilisais Subversion)
  • j'avais installé mercurial-server (mauvaise idée car j'ai dû pour cela passer à la sid (squeeze) au lieu de rester en lenny),
  • et tout le bataclan des clefs nommées, etc. (cela dit c'est propre)
Maintenant je fais la chose suivante :

Fichier .hgrc sous Windows
[ui]
username = dandriana
ssh="C:\Program Files\Putty\PLINK.EXE" -ssh -l hg -i "D:\Mes Documents\ma_clef.ppk"
J'utilise PAGEANT sous Windows pour ajouter la clef en début de session.

Sur la VM (xen) du serveur distant, j'installe Mercurial et crée un utilisateur Unix hg. Mes projets seront dans /home/hg/projects/

Sur le Dom0 (le serveur distant), je crée un utilisateur Unix hg, mais sans installer Mercurial.

Pour cet utilisateur je crée un exécutable de nom hg, que je mets dans le PATH, et qui contient ceci :
#!/bin/sh
ssh "hg $*"
En effet, quand je ferai sous Windows « hg -v clone ssh:////home/hg/projects/toto » (attention au double slash « // » avant « home » quand il s'agit d'un chemin absolu) pour récupérer le projet « toto », voici ce qui se passera :
  • le programme hg sous Windows (installation standard de Mercurial) se connectera via SSH au serveur distant avec le nom d'utilisateur hg (voir plus haut, directive « -ssh -l hg » de PLINK),
  • il essaiera d'y lancer la commande « hg -R /home/hg/projects/toto serve --stdio » (c'est l'option « hg -v » plus haut qui permet d'afficher ce détail),
  • donc le serveur distant lancera en fait « ssh "hg -R /home/hg/projects/toto serve --stdio" »,
  • c'est-à-dire se connectera à la VM, où s'exécuteront les opérations Mercurial.
Boah, ça fonctionne bien.

Je trouve deux énormes intérêts à un DVCS :
  1. les commits en mode déconnecté. Je peux poser des savepoints alors que je travaille dans le train, ou que je progresse pas à pas.
  2. le fait de ne pas à faire de choix structurant quant à utiliser un serveur plutôt qu'un autre (à la maison ? loué ? partagé ?…)
Je vais sans doute utiliser hgsvn pour finir la migration.