L'objectif

Tout d'abord, voici les quelques contraintes que je me suis fixées :

  • Ayant une petite configuration, et un serveur web (apache) tournant déjà, j'ai choisi d'utiliser subversion avec le module apache (mod_dav_svn). Cela m'évite d'avoir à utiliser svnserve, d'ouvrir un port, de gérer un service supplémentaire... Je préfère gérer les accès via apache, l'utilisant déjà pour mes sites
  • Le dépôt SVN sera placé dans un vhost spécifique : svn (pour un accès avec une URL de type http://svn.nicoleau-fabien.net/projet...)
  • Chaque projet hébergé sera géré séparément des autres, notamment pour les accès. Ainsi il me sera possible d'héberger sur le dépôt un projet auquel je ne participe pas, sans avoir de droits dessus. Si réellement deux projets ont la même liste d'utilisateurs, alors je pourrais faire pointer les fichiers des accès au même endroit
  • Pour le moment, il n'y aura pas de gestion de droits avec les ACL. Les actions de lecture (comme le checkout) seront accessibles anonymement, alors que les actions d'écritures (comme le commit) seront soumises à une authentification. Ajouter les ACL ensuite n'est pas compliqué, si le besoins s'en fait sentir, il sera facile de le faire

Il est important de bien comprendre le principe et les atouts de subversion, et ensuite de se renseigner sur les différentes façons de le configurer, afin d'avoir un système proche de ses besoins, et de ses possibilités. Voici les quelques liens que j'ai consultés avant de me lancer dans l'installation et la configuration du dépôt :

Installation

L'installation est assez simple, on prends le paquet subversion, et mod_dav_svn, qui permettra d'utiliser apache pour l'accès au dépôt :

# yum install subversion mod_dav_svn

Evidemment, il faut un serveur apache installé, configuré, et en marche.

Configuration

La configuration se limite à l'édition du fichier /etc/httpd/conf.d/subversion.conf. Il est bien documenté, et correspond quasiment à la configuration finale voulue. Une petite particularité dans mon cas : mes sous-domaines pointent actuellement tous sur le même serveur (ils me servent surtout  à bien dissocier mes services), donc afin que l'accès au dépôt ne se fasse bien que dans le sous-domaine svn, je déclare un VirtualHost dans ce fichier, et place la configuration de subversion à l'intérieur de ce vhost. Voici le contenu du fichier de configuration (commentaires retirés) :

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
<VirtualHost *:80>
        ServerName   svn.nicoleau-fabien.net
        # Dossier contenant les pages
        DocumentRoot /var/www/svn

        <Location /trustyrc>
               DAV svn
               SVNPath /var/www/svn/trustyrc
               # SSLRequireSSL
               AuthType Basic
               AuthName "trustyRC subversion repository"
               AuthUserFile /etc/subversion/svn-auth-trustyrc.conf
               <LimitExcept GET PROPFIND OPTIONS REPORT>
                      Require valid-user
               </LimitExcept>
       </Location>
</VirtualHost>

J'utilise ici une configuration spécifique pour le projet trustyRC, et non pas une configuration qui engloberait plusieurs projets. Cela m'obligera à modifier ce fichier à chaque nouveau projet hébergé sur le dépôt, mais me permet de bien les dissocier. Comme dis plus haut, "au pire", je pourrais faire pointer les directives AuthUserFile de plusieurs projets sur le même fichier, si les utilisateurs sont les mêmes. A part le fait que le dépôt soit placé dans un vhost, il n'y a rien de particulier ici. On remarque que le "Require valid-user" est placé dans un LimitExcept, permettant de ne demander une authentification que pour les opérations d'écriture. Un checkout par exemple pourra se faire anonymement.

Gestion des comptes utilisateurs

La gestion des utilisateurs se fait par l'intermédiaire d'un fichier des mot de passes, créé par la commande htpasswd :

$ htpasswd -cm /etc/subversion/svn-auth-trustyrc.conf eponyme

Le mot de passe pour l'utilisateur sera demandé deux fois. Le fichier sera ensuite créé (option -c, à n'utiliser que la première fois pour un même fichier) et le mot de passe chiffré avec un algorithme md5 (option -m, au peut utiliser -s pour du SHA). Pour un second utilisateur dans le même fichier, on utilisera donc cette syntaxe :

$ htpasswd -m /etc/subversion/svn-auth-trustyrc.conf second_user

Préparation du dépôt

Création du répertoire qui contiendra les projets, puis création du dépôt pour le projet trustyrc :

# mkdir /var/www/svn
# cd /var/www/svn
# svnadmin create trustyrc
# chown -R apache:apache trustyrc

Il faut ensuite préparer l'arborescence du projet. Je choisis le schéma classique trunk, branches, tags :

$ mkdir -p /tmp/trustyrc/{trunk,branches,tags}

Il n'y a plus qu'a initialiser ces répertoires, selon l'état du projet. J'ai pour ma part créé des tags avec les sources des anciennes releases, et copié les sources actuelles dans le trunk.

Importation

Le dépôt et l'arborescence sont prêts. Il n'y a plus qu'a importer le nouveau projet :

# svn import /tmp/trustyrc/ file:///var/www/svn/trustyrc -m "Initialisation du dépôt pour le projet trustyRC"

Checkout

Tout est prêt maintenant, ne reste plus qu'à récupérer une copie de travail du projet en cours pour travailler sur un autre poste :

$ svn co http://svn.nicoleau-fabien.net/trustyrc/trunk/

La première révision est alors téléchargée. Aucune authentification n'est demandée.

Commit

Après avoir effectuer des modification, on peut "commiter" les changements vers le dépôt :

$ svn ci -m "Première mise à jour des sources"

Pour cette opération "d'écriture", un login et un mot de passe sont alors demandés (ceux créés avec la commande htpasswd et stockés dans le ficher /etc/subversion/svn-auth-trustyrc.conf).

Conclusion

Les objectifs cités au départ sont remplis. Un dépôt svn offre une réelle souplesse pour la gestion des sources. Une étape supplémentaire pourrait d'être utiliser en plus du dépôt le logiciel trac, l'association semblant être intéressante. Je vous conseille vraiment de prendre le temps de lire les documentations cités, et même d'autres, afin de bien comprendre le principe, d'utiliser la bonne configuration, et de découvrir toutes les commandes/possibilités offertes. Pour ceux qui choisiraient d'utiliser svnserve, notez qu'il est possible de l'utiliser avec xinetd.


Fabien (eponyme)