Magazine Internet

Installation de Mercurial et configuration des dépôts afin de pouvoir effectuer des PUSH et PULL via HTTP

Publié le 28 juin 2009 par Lb01

Installation de Mercurial et configuration des dépôts pour effectuer des PUSH et PULL via HTTP

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:[email protected]/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:[email protected]/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:[email protected]/mercurial/mondomainecom
hg push https://NOM_UTILISATEUR:[email protected]/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

Retour à La Une de Logo Paperblog

A propos de l’auteur


Lb01 19 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Magazines