Table des matières

, , ,

Installation d'un dépôt subversion (SVN)

Subversion est l'un des logiciels de gestion de configuration les plus utilisés.

Nous allons voir ici comment créer un dépôt subversion permettant d'héberger plusieurs projets, le tout accessible en web.

Comme toujours l'installation se fera sur une debian stable (lenny actuellement).

L'authentification se fera sous deux formes :

Prérequis

Installation

Configuration

Virtualhost apache

Création du virtualhost

Elle se fait en ajoutant un fichier /etc/apache2/svn.mondomaine.com (je vous laisse adapter le nom a votre cas) :

cat << EOF > /etc/apache2/svn.mondomaine.com
#######################################
# VirtualHost pour le svn
######################################
<VirtualHost *:443>
        ServerName svn.mondomaine.com
        ServerAdmin webmaster@localhost
        SSLEngine on
        # certificats SSL: adapter a votre cas
        SSLCertificateFile    /etc/ssl/certs/svn.mondomaine.com.crt
        SSLCertificateKeyFile /etc/ssl/private/svn.mondomaine.com.key


        DocumentRoot /var/www/svn.mondomaine.com/htdocs/
        ErrorLog /var/log/apache2/svn_mondomaine_com_error.log
        CustomLog /var/log/apache2/svn_mondomaine_com_access.log combined

        #RedirectMatch ^/$ /svn/
        RedirectMatch ^svn$ /

        <Location /svn>
                DAV svn
                # use SVNParentPath if you have multiple repositories under
                # under a single directory (/var/lib/svn/repo1, /var/lib/svn/repo2, ...).
                # You need either SVNPath and SVNParentPath, but not both.
                SVNParentPath /var/lib/svn
                #SVNPath /var/lib/svn

                AuthType Basic
                AuthName "Subversion Repository"
                #Fichier d'authentification des utilisateurs
                AuthBasicProvider file
                AuthUserFile /etc/apache2/dav_svn.passwd

                # Puis authentification PAM
                AuthPAM_Enabled on
                AuthPAM_FallThrough off

                AuthBasicAuthoritative off
                Satisfy Any
                Require valid-user

                # pour aller plus loin, si vous voulez donner un look plus sympa , allez regarder sur http://reposstyle.com/
                #SVNIndexXSLT "/repos-web/view/repos.xsl"
                
                # fichier contenant les ACL pour les depots SVN
                AuthzSVNAccessFile /etc/apache2/dav_svn.authz
        </Location>

        <Directory "/var/www/svn.mondomaine.com/htdocs">
                Options Indexes MultiViews
                AuthType Basic
                AuthName "Subversion Repository"

                AuthBasicProvider file
                AuthUserFile /etc/apache2/dav_svn.passwd
                
                AuthPAM_Enabled on
                AuthPAM_FallThrough off

                AuthBasicAuthoritative off

                Satisfy Any
                Require valid-user
        </Directory>

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        ServerSignature Off
</VirtualHost>
EOF

Activation du virtualhost

Si vous avez des erreurs comme “Invalid command 'AuthPAM_Enabled', perhaps misspelled or defined by a module not included in the server configuration” il vous manque surement des modules apache chargés. Dans le cas present le module auth_pam

Creation de la page d'accueil

Nous allons créer une page d'accueil pour lister les projets du subversion :

cat << EOF > /var/www/svn.mondomaine.com/htdocs/index.php
<?php
// Filtrage pour interdire acces depuis exterieur a la liste des projets
// remplacer x.y.z.t par votre adresse IP , ajouter au besoin d'autres adresses
if ($_SERVER['REMOTE_ADDR'] == 'x.y.z.t') {
    // On construit la liste des projets
    echo "<html><h1>Liste des projets du Subversion</h1><ul>\n";
    $repo_root="/var/lib/svn";
    $repo_base_url="https://svn.mondomaine.com/svn";
    foreach (glob($repo_root."/*") as $file) {
        $repo=str_replace($repo_root."/", "", $file);
        if (is_dir($file) && $repo != 'lost+found') {
             echo "<li><a href=\"$repo_base_url/$repo\">$repo</a></li>\n";
        }
    }
    echo"</ul></html>";
} else {
    echo "Acces NON autorise";
}

?>
EOF

C'est bien gentil tout ca, mais cette liste de dépôt est pour l'instant désespérément vide, nous allons remédier à ça, mais tout d'abord il faut remplir le fichier d'ACL pour permettre la creation de dépôts.

Fichier ACLs

Les accès au dépôts et sous dépôts sont à autoriser dans le fichier /etc/apache2/dav_svn.authz mentionné ci dessus.

cat << EOF > /etc/apache2/dav_svn.authz
#################################################
# groupes
# definition des groupes utilisateurs, a adapter a vos besoins
#################################################
[groups]
alldev = john, bang, bob
maindev = alice, claudy
devRead = luke, georges

#################################################
# droits d'acces aux depots
#################################################

# utilisateur qui a accès à tous les depots
# Utilise pour la création d'un depot via le script /usr/local/sbin/createRepoSvn.sh
[/]
usersvncreate = rw

# exemple de droits
#[mondepot1:/]
#@maindev = rw
#georges = rw
#@devRead = r
# on peu limiter les droits a une sous arborescence du projet :
#[mondepot1:/trunk]
#alice = rw

EOF

Restrictions d'acces a ce fichier :

chown root:www-data /etc/apache2/dav_svn.authz
chmod 640 /etc/apache2/dav_svn.authz

Création du premier dépôt

La création de dépôt est une opération courante, que nous allons donc automatiser grâce a un petit script qui-va-bien. Ce script va donc créer le dépot SVN avec un nom passé en parametre. Il crée aussi une arborescence indispensable a tout dépot :

qui vous permettra d'héberger respectivement le trunk, les branches et les tag de ce projet.

cat << EOF > /usr/local/sbin/createRepoSvn.sh
#!/bin/bash
# création de projets svn
#
# 31/08/2009 Script initial
# jerome drouet - jerome -at- drouet.eu
#
PATHREPOSVN='/var/lib/svn';

echo -n "nom du projet :"
read projet;

# adapter l'URL suivant vos besoins
site="https://svn.mondomaine.com/svn/$projet";

while true; do
    echo -n "Confirmez : $site ? (y/n)";
    read yn;
    case $yn in
        [nN]* ) echo "Abandon";echo;exit;;
        [yY]* ) echo;break;;
    esac
done

if test -d "$PATHREPOSVN/$projet"
then
    echo "Le Projet $projet existe déjà, Abandon";
    exit
fi

svnadmin create $PATHREPOSVN/$projet --fs-type fsfs
# les fichiers doivent etre en acces lecture/ecriture pour l'utilisateur qui fait tourner apache
chgrp -R www-data $PATHREPOSVN/$projet
chmod -R 770 $PATHREPOSVN/$projet"

# creation des repertoires SVN
echo "svn mkdir $site/trunk $site/branches $site/tags -m \"Création des répertoires d'archivage Subversion.\"";
svn mkdir  --username usersvncreate $site/trunk $site/branches $site/tags -m "Création des répertoires d'archivage Subversion."

echo "
################################################
Pour les autorisation d'accès,
Editez ce fichier:
        /etc/apache2/dav_svn.authz
Pour les Login hors LDAP:
        htpasswd -m /etc/apache2/dav_svn.passwd [MyUser]

#################################################
";

echo "Fin";
EOF

Rendons maintenant ce script exécutable :

chmod +x /usr/local/sbin/createRepoSvn.sh

Vous avez surement vu que ce script utilise un utilisateur “usersvncreate” pour créer les dépots. Cet utilisateur n'existe pas encore, nous allons le créer dans le fichier texte d'authentification, en utilisant un mot de passe généré grâce la encore a la commande pwgen.

Pour créer effectivement le dépôt “mondepot” il faut utiliser la commande suivante :

/usr/local/sbin/createRepoSvn.sh

et entrer ensuite le nom du depot souhaité.

Une fois le dépôt créé il faut ajouter dans le fichier /etc/apache2/dav_svn.authz les groupes éventuels et les droits correspondants.

Le dépôt sera accessible via l'URL https://svn.mondomaine.com/svn/mondepot