Chapitre 12. Le travail en groupe avec Subversion

Table des matières
1. Qu'est-ce que Subversion ?
2. Installer et utiliser un client Subversion
2.1. Installer le package
2.2. Utiliser le client Subversion
3. Monter un serveur Subversion
3.1. Créer un répository SVN pour un premier projet
3.2. Donner l'accès aux utilisateurs du système via SSH
3.3. Donner l'accès à des utilisateurs extérieurs
3.4. La notification de commit par mail

1. Qu'est-ce que Subversion ?

Subversion (alias SVN) est un logiciel libre basé sur une architecture client-serveur qui permet de travailler à plusieurs et en même temps sur les mêmes fichiers. En effet, Subversion dispose d'un mécanisme intelligent de fusion des modifications apportées sur des fichiers texte. C'est un outil très utilisé pour le développement de logiciels, mais il peut également être utilisé pour gérer des sites Web, écrire des rapports en LaTeX, etc... d'une manière générale pour tout ce qui implique de travailler à plusieurs sur les mêmes fichiers textes. Il a pour but de remplaçer le logiciel CVS, qui assurait la même tâche, mais souffrait de certaines limitations dues à la conception trop ancienne de son architecture (ces limitations sont expliquées sur la page principale du site Web de Subversion).

2. Installer et utiliser un client Subversion

2.1. Installer le package

Le client et le serveur Subversion sont contenus dans le package subversion :


# apt-get install subversion

2.2. Utiliser le client Subversion

[TODO : expliquer moi-même ou lier vers une doc française]

3. Monter un serveur Subversion

3.1. Créer un répository SVN pour un premier projet

Je vais vous guider pas-à-pas pour la création d'un répository SVN pour un projet d'exemple appelé projet1.

Commençez par créer un groupe svn-projet1 associé au répository, qui permettra une bonne gestion des droits d'accès au répository :


# addgroup --system svn-projet1

Ensuite, créez le répository SVN (situé dans le répertoire /usr/local/svn/projet1 dans notre exemple, mais nous créerons aussi un lien symbolique /svn/ qui servira de raccouri) et donnez-lui les bonnes permissions :


# mkdir /usr/local/svn
# ln -s /usr/local/svn /svn
# svnadmin create --fs-type fsfs /usr/local/svn/projet1
# chgrp -R svn-projet1 /usr/local/svn/projet1
# chmod -R g+w /usr/local/svn/projet1

3.2. Donner l'accès aux utilisateurs du système via SSH

Note

Cette section requière qu'un serveur SSH soit installé sur le système. Pour plus d'informations sur ce sujet, cf L'accès à distance par SSH.

Pour donner un accès au SVN à l'utilisateur toto qui a un compte sur le système, il suffit alors de le rajouter dans le groupe svn-projet1 :


# adduser toto svn-projet1

L'utilisateur toto peut alors se connecter au SVN par SSH :


% svn co svn+ssh://toto@server.exemple.org/svn/projet1

serveur.exemple.org est le nom DNS du serveur. A l'exécution de la commande, il vous demandera votre mot de passe système (ou votre pass-phrase si vous avez mis en place des clés SSH protégées par mot de passe).

3.3. Donner l'accès à des utilisateurs extérieurs

Pour donner accès au SVN à des utilisateurs qui n'ont pas de compte sur le système, il faut passer par inetd : toute connexion sur le port SVN (port 3690, cf /etc/services) déclanchera le lancement de svnserve en tant qu'utilisateur svnowner.

Créez l'utilisateur svnowner et donnez-lui les droits sur le répository SVN :


# adduser --system --home /usr/local/svn svnowner
# chown -R svnowner /usr/local/svn/

Ajoutez la ligne suivante au fichier /etc/inetd.conf :


svn stream tcp nowait svnowner /usr/bin/svnserve svnserve -i

Dites à inetd de tenir compte de ce changement :


# /etc/init.d/inetd reload

Ensuite, éditez le fichier /usr/local/svn/projet1/conf/svnserve.conf. Vous allez décommenter certaines lignes pour configurer les droits d'accès à votre répository SVN ; les lignes qui commencent par trois '#' sont des commentaires (à lire !) ; les lignes qui commencent par un seul '#' sont destinées à être décommentées et personnalisées pour répondre à vos besoins.

Pour les projets OpenSource, il est courant de donner un accès en lecture seule aux utilisateurs non authentifiés. Si telle est votre motivation, mettez le paramètre anon-access à read ; sinon, pour empêcher tout accès non authentifié, mettez-le à none. Quant au paramère auth-access, il contrôle le niveau d'autorisation des utilisateurs authentifiés ; pour donner un accès en lecture et en écriture aux utilisateurs authentifiés, ce qui est probablement votre souhait, mettez-le à write. Le paramètre password-db définit l'emplacement du fichier contenant les noms d'utilisateurs et leurs mots de passe. Enfin, le paramètre realm vous permet de donner un nom long à votre répository, qui sera communiqué à la personne qui se connecte au serveur SVN.

Par exemple, pour un répository sans accès anonyme en lecture seule, le fichier svnserve.conf contiendra par exemple les lignes suivantes :


[general]
anon-access = none
auth-access = write
password-db = passwd
realm = Le projet numéro 1

Enfin, créez le fichier contenant les noms d'utilisateur et les mots de passe, que vous avez défini dans le fichier svnserve.conf. Dans notre exemple, nous avons mis la ligne password-db = passwd ; nous allons donc créer un fichier passwd dans le même répertoire que le fichier svnserve.conf, et qui ressemblera au fichier suivant si on veut avoir deux utilisateurs toto et tonton :


[users]
toto = mot_de_passe_de_toto_en_clair
tonton = mot_de_passe_de_tonton_en_clair

Enfin, assurez-vous que le fichier appartient à l'utilisateur svnowner et restreignez les droits sur ce fichier pour que tous les utilisateurs du système ne puisse pas voir les mots de passe qu'il contient :


# chown svnowner /usr/local/svn/projet1/conf/passwd
# chmod 600 /usr/local/svn/projet1/conf/passwd

L'utilisateur toto peut maintenant se connecter au serveur SVN grâce au client SVN qu'il a aura préalablement installé sur sa machine. Il lui suffira d'exécuter la commande suivante sur sa machine pour checkouter le répository :


% svn co svn://toto@server.exemple.org/svn/projet1

serveur.exemple.org est le nom DNS du serveur.

Note

L'authentification se fait par la technique du "challenge" ; le mot de passe n'est donc pas transmis sur le réseau.

3.4. La notification de commit par mail

Nous allons configurer le répository SVN pour qu'un mail soit envoyé à chaque commit ; ce mail devant contenir le nom de l'utilisateur qui a fait le commit, la liste des fichiers qu'il a modifiés, le message de commit et les modifications effectuées. Installez le package subversion-tools qui contient notamment un script de notification des commits par mail :


# apt-get install subversion-tools

Activez l'utilisation de ce script pour votre répository SVN :


# cd /usr/local/svn/projet1/hooks/
# mv post-commit.tmpl post-commit
# chmod 755 post-commit

Dans le fichier post-commit, vous verrez à la fin une ligne de commande qui fait appel à un script /usr/lib/subversion/hook-scripts/commit-email.pl, qui est le script de notification par mail du package subversion-tools. Vous pouvez améliorer l'utilisation du script en modifiant le fichier post-commit pour qu'il ressemble par exemple à ça :


REPOS="$1"
REV="$2"

AUTHOR=$(svnlook author --revision $REV $REPOS)

/usr/lib/subversion/hook-scripts/commit-email.pl "$REPOS" "$REV" --from "provenance@exemple.org" -s "[projet1] $AUTHOR |" destination@exemple.org

provenance@exemple.org et destination@exemple.org sont les adresses de provenance et de destination des mails de commit. Par exemple, vous pouvez mettre en adresse de provenance et de destination une mailing-liste à laquelle tous les participants du projet sont abonnés. Vous pouvez également personnaliser le flag dans le sujet du mail, qui est [projet1] dans cet exemple.

Désormais, les commits ne passeront plus inaperçus !