Installer un serveur Mercurial sous IIS7

Cet article relate l’installation d’un serveur Mercurial sous IIS7. Il a été inspiré par cet article de Jérémy Skinner, qui m’a bien été utile pour la mise en place de ce serveur.

Mercurial

Mercurial est un logiciel de gestion de versions. Ces logiciels permettent de conserver toutes les modifications réalisées sur le code source et de revenir à une version précise en cas d’erreur par exemple. Ils offrent aussi l’avantage d’historiser les modifications (qui ? quand ? pourquoi ?) ou encore la possibillité de gérer des branches (dév / pré-production / production). Mercurial possède la particularité d’être décentralisé, tout comme ces concurrents Git ou Bazaar, c’est à dire que chaque personne conserve l’historique des modifications sur son poste de travail.

Python est nécessaire pour que Mercurial fonctionne, celui-ci étant majoritairement écrit dans ce langage. Il faudra la version 2.6, la version 2.7 n’étant pas passée pour moi (contrairement aux indications du site…). Il est important de prendre la version x86 !

Il faut ensuite installer Mercurial, en récupérant les binaires sur le site officiel. Il s’agit d’une suite classique de « suivant » pour la réaliser.

Installer IIS7

Au sein du Server Manager, vous devez installer IIS en cliquant sur « Add Roles » dans le menu de droite. Dans la fenêtre, cochez la checkbox où il y a écrit « Web Server (IIS) »:

Web server Role

Web server Role

Sur la fenêtre « Role Services », assurez vous d’activer les extensions Basic Authentication et CGI:

Web server Role

Web server Role

Configurer Python pour IIS7

Il faut créer un nouveau dossier au sein de notre site par défaut situé dans C:\inetpub\wwwroot. Nous l’appellerons « hg », du fait du nom des commandes qui commencent toutes par ce nom, en référence au symbole chimique du mercure. Choississez l’icône « Handler mappings » pour ce répertoire, et une fois ouvert, cliquez sur « Add Script Map » dans le menu de droite.

Handlers Mapping

Handlers Mapping

Entrez *.cgi dans le champ Request Path. Le champ Executable Path doit renseigner le chemin vers Python, soit pour moi: C:\Python26\python.exe -u « %s ». Mettez comme nom « python » pour le reconnaitre ensuite.

Ajout de python en Handler

Ajout de python en Handler

Afin de tester qu’IIS exécute bien nos scripts cgi, nous pouvons tester avec ce bout de code le fonctionnement :

1
2
3
4
5
6
print 'Status: 200 OK'
print 'Content-type: text/html'
print ''
print '<html><body>'
print '<h1>It works!</h1>'
print '</body>'

Il faut l’enregistrer dans le dossier C:\inetpub\wwwroot\hg sous le nom script.cgi par exemple. En se rendant sur http://localhost/hg/script.cgi au sein du navigateur, vous devrez obtenir, si la configuration est bien réalisée, le résultat suivant:

Résultat du handler

Résultat du handler

Récupérer et configuer hgweb.cgi

Cette étape consiste à configuer notre fichier hgweb.cgi. Il s’agit d’un script Python qui gère les dépôts Mercurial au sein d’un serveur web. Dans les anciennes versions de Mercurial (< 1.5), il faut utiliser le fichier hgwebdir.cgi en lieu et place de hgweb.cgi. Ce fichier se trouve dans les codes sources de Mercurial. Il vous faudra donc les télécharger, toujours sur le site officiel. Le fichier se situe à la racine de l’archive.

Maintenant, il faut copier le fichier hgweb.cgi dans le dossier C:\inetpub\wwwroot\hg. Ouvrir ce dernier avec un éditeur de texte, puis se rendre à la fin du fichier. Les deux dernières lignes devraient ressembler à ceci:

1
2
application = hgweb('hgweb.config')
wsgicgi.launch(application)

Changez le chemin pour mettre le lien vers le dossier C:\inetpub\wwwroot\hg:

1
2
application = hgweb('c:\inetpub\wwwroot\hg\hgweb.config')
wsgicgi.launch(application)

L’étape suivante consiste à dézipper la librairie Mercurial dans le dossier C:\inetpub\wwwroot\hg. Cette librairie se trouve dans le dossier C:\Program Files\Mercurial sous le nom library.zip. Vous devez également copier le dossier Templates dans C:\inetpub\wwwroot\hg, dossier situé lui aussi dans C:\Program Files\Mercurial.

Pour finir, créer un fichier nommé hgweb.config dans le dossier C:\inetpub\wwwroot\hg. Ce fichier peut être vide pour l’instant.

En visitant l’URL http://localhost/hg/hgweb.cgi, celle-ci vous affichera une liste de dépôts vide étant donné que nous n’avons pas encore configuré ces derniers:

Résultat des dépôts

Résultat des dépôts

Configurer les dépôts

Maintenant que notre serveur Mercurial est installé, il faut lui spécifier où se trouvent nos dépôts. Pour cela, nous allons créer un dossier repositories à la racine de notre disque C:\ qui contiendra la liste de nos dépôts.

Nous allons créer un dépôt test dans notre dossier. Cette étape est facile, il suffit de créer un dossier test dans notre dossier repositories, puis d’utiliser la commande Mercurial de création de dépôts :

1
2
3
cd c:\repositories
mkdir test
hg init test

Si aucune erreur n’apparait, notre dépôt est bel et bien créé. Il faut maintenant spécifier à hgweb où il se trouve. Cela se fait en ouvrant le fichier créé plus tôt: hgweb.config. Dans celui-ci, nous ajoutons ces lignes:

1
2
[collections]
C:\repositories = C:\repositories

En se rendant à l’adresse http://localhost/hg/hgweb.cgi, celle-ci nous affiche notre dépôt tout juste créé:

Dépôt test

Dépôt test

URL Rewriting

Tout comme l’auteur original, je ne suis pas fan de devoir spécifier « hgweb.cgi » dans l’URL. Écrire le nom du projet directement serait nettement plus simple à retenir quand on veut se rendre sur un dépôt particulier. On peut réaliser ceci en mettant en place l’URL Rewriting dans IIS. Il faut tout d’abord installer l’extension pour IIS sur le site de Microsoft.

Une fois installée, une nouvelle icône apparrait dans notre interface de management IIS nommée « URL Rewrite ». Sélectionnez le dossier « hg », puis « URL Rewrite »:

URL Rewriting

URL Rewriting

Au sein de cette section, cliquez sur « add a new blank rule ». Dans la section « Match URL », mettez « Using » à « Wildcards » et « Pattern » à « * ». Dans la section « Conditions » ajouter la condiction « Is Not a File »:

Condition

Condition

Dans le champ « Rewrite URL », entrez hgweb.cgi/{R:1}.

On se retrouve avec :

Rules URL Rewriting

Rules URL Rewriting

Pour finir, ouvrir le fichier hgweb.config pour y ajouter la section suivante:

1
2
[web]
baseurl = /hg

Cela va permettre à hgweb de générer des URL /hg au lieu de /hg/hgweb.cgi. En visitant http://localhost/hg/, la page va nous lister l’ensemble de nos dépôts alors qu’une page http://localhost/hg/test nous affichera seulement le dépôts test.

Pushing

Par défaut, les dépôts sont accessibles par hgweb en lecture seule, c’est à dire que l’on ne peut pas réaliser de commande push dessus. Pour changer ce comportement, il nous est possible de spécifier les utilisateurs (en tant que compte local sur le serveur) qui sont autorisés à push en ajoutant une section « allow_push » dans notre hgweb.config:

1
2
3
4
5
6
[collections]
c:\repositories = c:\repositories
 
[web]
baseurl = /hg
allow_push = Jérémy

Cependant, si nous essayons de réaliser un push, nous obtenons l’erreur suivante:

1
2
3
4
c:\projects\test>hg push
pushing to http://localhost/hg/test
searching for changes
ssl required

Ceci est dû au fait, comme il est écrit, que SSL doit être activé. Pour l’instant, nous allons désactiver SSL en mettant la section « push_ssl » à false dans notre hgweb.config:

1
2
3
4
5
6
7
[collections]
c:\repositories = c:\repositories
 
[web]
baseurl = /hg
allow_push = Jérémy
push_ssl = false

En faisant un push maintenant, nous obtenons une erreur différente:

1
2
3
4
C:\projects\test>hg push
pushing to http://localhost/hg/test
searching for changes
abort: authorization failed

Cela se produit parce que par défaut, IIS délivre notre site sans authentification. Nous devons donc activer Basic Authentication dans la section Authentication d’IIS:

Basic authentication

Basic authentication

En réalisant maintenant un push, Mercurial nous demande de nous identifier. Une fois réalisé, en retournant sur le dépôt test sur hgweb, nous obtenons:

Push dans hgweb

Push dans hgweb

Pour terminer cet article, vous pouvez de plus activer SSL, cette partie est détaillée dans l’article original de Jérémy Skinner.