Mercurial est un système de gestion de version décentralisé, c’est à dire qu’il ne nécessite pas de serveur pour fonctionner.
Il vous permet de garder un historique de toutes les modifications que vous avez apporté aux fichiers d’un projet et revenir facilement à une version antérieure. Il permet également de créer des branches (versions différentes d’un projet) et possède encore bien d’autres fonctionnalités.
Mercurial est notamment utilisé pour le développement de Python, MoinMoin, NetBeans, Xen ou encore Mozilla.
Nous allons voir dans cet article comment installer Mercurial, créer des dépôts et ensuite pouvoir y effectuer des PUSH et PULL via HTTP et HTTPS grâce au script hgwebdir.cgi.
Introduction
Nous aurons deux types de dépôts :
- Les dépôts privés : on y accèdera avec un nom d’utilisateur et mot de passe en HTTPS.
https://NOM_UTILISATEUR:MOT_DE_PASSE@depots.mondomaine.com/mercurial/MON_DEPOT - Les dépôts publiques : accessibles via HTTP sans authentification.
http://depots.mondomaine.com/mercurial/MON_DEPOT
Vu que la connexion avec les dépôts privés sera en SSL, vous devrez avoir installé un certificat sur votre serveur. Vous pouvez créer un certificat auto-signé ou acheter un certificat auprès d’une autorité de certification.
Nous allons imaginer ici que nous avons 2 domaines : mondomaine.com et mon2emedomaine.com.
Nous organiserons les répertoires des domaines comme ceci :
/home/mondomaine.com/
Tous les fichiers concernant le domaine mondomaine.com
/home/mondomaine.com/www/
Dans ce répertoire nous allons créer autant de dossiers que de sous-domaines.
/home/mondomaine.com/www/www/public_html/
Contient tous les fichiers de http://www.mondomaine.com
/home/mondomaine.com/www/depots/public_html/
Contient tous les fichiers de http://depots.mondomaine.com
/home/mondomaine.com/www/depots/secure_html/
Contient tous les fichiers de https://depots.mondomaine.com
Les dossier /home/mondomaine.com/www/depots/public_html/ et /home/mondomaine.com/www/depots/secure_html/ ne contiendront que deux fichiers :
index.cgi
Le fichier CGI qui nous permettera d’accéder à nos dépôts.
hgweb.config
Le fichier de configuration (inclus dans index.cgi) qui contiendra la liste des dépôts à partager.
Nous aurons 1 dépôt par domaine qui correspondra au répertoire web de celui-ci.
Nous allons considérer ici que vous avez déjà configuré vos domaines dans Lighttpd, nous ne nous occuperons que de la création et de la configuration des dépôts Mercurial.
Installation de Mercurial
On commence par simplement installer Mercurial via les dépôts officiels :
sudo apt-get install mercurial
On peux ensuite vérifier que tout s’est bien passé en executant :
hg -v
Vous devriez obtenir quelque chose comme ceci :
Mercurial Distributed SCM (version 1.1.2) [...]
Initialisation des dépôts
Si ce n’est pas déjà fait, il va falloir initialiser vos dépôts Mercurial.
Comme expliqué précédemment, les dépôts correspondrons aux répertoires web de nos domaines.
L’initialisation d’un dépôt se fait en se placant dans le répertoire du dépôt (avec la commande cd) et en exécutant ensuite la commande hg init. Nous ajoutons ensuite tous les fichiers du répertoire courant au dépôt et effectuons le premier commit :
cd /home/mondomaine.com/www/www/public_html hg init hg add . hg commit -m "Premier commit"
cd /home/mon2emedomaine.com/www/www/public_html hg init hg add . hg commit -m "Premier commit"
Configuration du serveur web Lighttpd
On configure dans Lighttpd depots.mondomaine.com qui nous permettra d’accéder directement à nos dépôts (remplacez xxx.xxx.xxx.xxx par l’IP de votre serveur) :
nano /etc/lighttpd/conf-available/depots.mondomaine.com.conf
$SERVER["socket"] == "xxx.xxx.xxx.xxx:443" { # Configuration HTTPS $HTTP["host"] =~ "depots.mondomaine.com" { # Adresse du serveur et répertoire web server.name = "depots.mondomaine.com" server.document-root = "/home/mondomaine.com/www/depots/secure_html/" # Désactivation de PHP pour plus de sécurité fastcgi.server = ( ) # Configuraton de l'authentification auth.debug = 2 auth.backend = "htpasswd" auth.backend.htpasswd.userfile = "/home/mondomaine.com/www/depots/.htpasswd" auth.require = ( "" => ( "method" => "basic", "realm" => "Source Code Control", "require" => "valid-user" ) ) # Règles de rewrite pour que hg/MONDEPOT et mercurial/MONDEPOT redirige sur le script CGI avec MONDEPOT en paramètre url.rewrite-once = ( "^/hg([/?].*)?$" => "/index.cgi$1", "^/mercurial([/?].*)?$" => "/index.cgi$1" ) # On défini que le script CGI doit-être lancé avec python (activation du script CGI) $HTTP["url"] =~ "^/index.cgi([/?].*)?$" { cgi.assign = ( ".cgi" => "/usr/bin/python" ) } } } else $SERVER["socket"] == "xxx.xxx.xxx.xxx:80" { # Configuration HTTP $HTTP["host"] =~ "depots.mondomaine.com" { # Adresse du serveur et répertoire web server.name = "depots.mondomaine.com" server.document-root = "/home/mondomaine.com/www/depots/public_html/" # Désactivation de PHP pour plus de sécurité fastcgi.server = ( ) # Règles de rewrite pour que hg/MONDEPOT et mercurial/MONDEPOT redirige sur le script CGI avec MONDEPOT en paramètre url.rewrite-once = ( "^/hg([/?].*)?$" => "/index.cgi$1", "^/mercurial([/?].*)?$" => "/index.cgi$1" ) # On défini que le script CGI doit-être lancé avec python (activation du script CGI) $HTTP["url"] =~ "^/index.cgi([/?].*)?$" { cgi.assign = ( ".cgi" => "/usr/bin/python" ) } } }
Je ne vais pas entrer dans les détails de cette configuration, je penses que les commentaires que j’y ai placé sont assez explicites ;-). Si vous avez des questions ou problèmes avec celle-ci, les commentaires vous attendent !
Une fois la configuration fermée et enregistrée, on l’active (on crée un lien symbolique dans le dossier conf-enabled) :
ln -s /etc/lighttpd/conf-available/depots.mondomaine.com.conf /etc/lighttpd/conf-enabled/depots.mondomaine.com.conf
Puis on crée le fichier htpasswd qui contiendra la liste des utilisateurs autorisés à accéder aux dépôts privés.
La commande htpasswd est disponible dans le paquet apache2-utils.
Installez le si ce n’est pas déjà fait :
sudo apt-get install apache2-utils
Lancez ensuite la commande htpasswd (remplacez NOM_UTILISATEUR par un nom d’utilisateur de votre choix). On vous demandera de choisir un mot de passe.
htpasswd -c /home/mondomaine.com/www/depots/.htpasswd NOM_UTILISATEUR
On recharge ensuite la nouvelle configuration dans Lighttpd :
/etc/init.d/lighttpd force-reload
Le script CGI
Installation du script CGI pour les dépôts privés
On crée le répertoire qui contiendra le script CGI et sa configuration :
mkdir -p /home/mondomaine.com/www/depots/secure_html
On copie le script CGI depuis le répertoire de Mercurial vers notre répertoire web et on en profite pour le renommer index.cgi :
cp /usr/share/doc/mercurial/examples/hgwebdir.cgi /home/mondomaine.com/www/depots/secure_html/index.cgi
Définition des dépôts privés à partager
On doit maintenant créer un fichier de configuration afin d’indiquer au script CGI les dépôts mercurial à partager :
nano /home/mondomaine.com/www/depots/secure_html/hgweb.config
[paths] mondomainecom = /home/mondomaine.com/www/www/public_html
On donne les droits à Lighttpd sur le dossier web du domaine et ce qu’il contient (afin d’éviter d’avoir des problèmes d’authentification) :
chown www-data:www-data -R /home/mondomaine.com/www/depots/secure_html
Installation du script CGI pour les dépôts publiques
Comme pour les dépôts privés, on crée le répertoire qui contiendra le script CGI et sa configuration :
mkdir -p /home/mondomaine.com/www/depots/public_html
On copie ensuite le script CGI depuis le répertoire de Mercurial vers notre répertoire web et on en profite pour le renommer index.cgi :
cp /usr/share/doc/mercurial/examples/hgwebdir.cgi /home/mondomaine.com/www/depots/public_html/index.cgi
Définition des dépôts publiques à partager
Nous devons maintenant créer un fichier de configuration afin d’indiquer au script CGI les dépôts mercurial à partager :
nano /home/mondomaine.com/www/depots/public_html/hgweb.config
[paths] mon2emedomainecom = /home/mon2emedomaine.com/www/www/public_html
On donne les droits à Lighttpd sur le dossier web du domaine et ce qu’il contient :
chown www-data:www-data -R /home/mondomaine.com/www/depots/public_html
Configuration des dépots
Nous allons maintenant définir la configuration de base de tous nos dépôts :
nano /etc/mercurial/hgrc
On commence par autoriser le PUSH à tous les utilisateurs car de toute façon il ne sera pas possible d’accéder aux dépôts privés sans authentification car ils sont protégés par un htpasswd.
[web] allow_push = *
On autorise ensuite le téléchargement des dépôts aux formats gz, zip et bz2 (optionel) :
allow_archive = gz, zip, bz2
On défini le contact (optionel) :
contact = Prénom NOM
On défini le style de l’interface web (optionel) :
style = gitweb
L’astuce du jour !
Lorsque l’on effectuera un PUSH vers l’un de nos dépôts, les fichiers seront modifiés dans le répertoire Mercurial du dépôt (.hg) mais pas dans le répertoire de base (/home/mon2emedomaine.com/www/www/public_html par exemple).
Nous devrons exécuter la commande hg update dans le dépôt distant afin de le mettre à jour.
Afin que ceci se fasse automatiquement, nous pouvons utiliser un petit HOOK (Un hook est en général un script ou commande s’exécutant à un moment précis dans un programme) que nous ajouterons à la fin du fichier de configuration :
[hooks] changegroup = hg update > /dev/null
Suite…
Ce qui nous donne au final :
[web] allow_push = * allow_archive = gz, zip, bz2 contact = Prénom NOM style = gitweb [hooks] changegroup = hg update > /dev/null
Accéder aux dépôts…
… avec un navigateur web
Maintenant que tout est bien configuré, nous pouvons accéder à nos dépôts directement depuis notre navigateur Internet.
Nous pourrons ainsi voir la liste des commits, les révisions, etc.
Pour accéder au dépôt privé mondomainecom il suffit d’ouvrir l’adresse suivante dans votre navigateur :
https://NOM_UTILISATEUR:MOT_DE_PASSE@depots.mondomaine.com/mercurial/mondomainecom
Pour accéder au dépôt publique mon2emedomainecom il suffit d’ouvrir l’adresse suivante dans votre navigateur
http://depots.mondomaine.com/mercurial/mon2emedomainecom
… en ligne de commande
Vous pouvez ensuite simplement effectuer des PUSH et PULL depuis un dépôt local vers un dépôt distant comme ceci :
hg pull https://NOM_UTILISATEUR:MOT_DE_PASSE@depots.mondomaine.com/mercurial/mondomainecom hg push https://NOM_UTILISATEUR:MOT_DE_PASSE@depots.mondomaine.com/mercurial/mondomainecom
Ou pour un dépôt publique :
hg pull http://depots.mondomaine.com/mercurial/mon2emedomainecom hg push http://depots.mondomaine.com/mercurial/mon2emedomainecom