Installer Subversion et Trac

Ce tutoriel explique comment installer le gestionnaire de révisions et de source Subversion (svn) et Trac, un ensemble d’applications associés à SVN contenant un wiki, un collecteur de bugs, etc.

Installation

aptitude update
aptitude install trac libapache2-svn subversion subversion-tools

Création du dépôt pour subversion

Dans mon cas, je veux que mon dépot subversion soit dans /home/svn/nomduprojet

Ainsi quand je voudrais créer d’autres projets, je les mettrais dans l’arbo /home/svn/ avec des noms distincts.

Je fais donc :

mkdir /home/svn
chown www-data: -R /home/svn (pour pouvoir commiter via le module webdav d'apache)
svnadmin create --fs-type fsfs /home/svn/monprojet

Mon projet, avant import dans svn, est dans /home/moi/monprojet.

Dans ce répertoire, il faut créer 3 répertoires : trunk, branches et tags :

mkdir trunk branches tags

Il vous faut ensuite déplacer tous les fichiers de votre projet dans /trunk/.

Pour les importer, il suffit de procéder de la façon suivante :

nicolas@ange:$ svn import /home/moi/monprojet file:///home/svn/monprojet/
Adding monprojet
Adding monprojet/trunk
Adding monprojet/trunk/i18n
Adding monprojet/trunk/i18n/francais.php
Adding monprojet/trunk/test.php
Adding monprojet/trunk/config
Adding monprojet/trunk/config/config.php
Adding monprojet/trunk/inscription.php
Adding monprojet/trunk/fonctions.php
Adding monprojet/trunk/functions
Adding monprojet/trunk/functions/authentification.php
Adding monprojet/trunk/functions/mysql.php
Adding monprojet/trunk/login.php
Adding monprojet/branches
Adding monprojet/tags
Committed revision 1.
nicolas@ange:$

Pour vérifier que votre projet est bien créé dans svn :

nicolas@ange:$ svn list --verbose file:///home/svn/monprojet

Voilà mon projet est dans subversion. Par contre pour travailler dessus, je dois d’abord réaliser un check-out pour me synchroniser avec Subversion.

Si je devais créer un deuxième projet, il me suffirait de répéter l’étape ci-dessus une seconde fois.

Mon répertoire projet initial ne me sert alors plus à rien - je peux donc le supprimer après en avoir fait une sauvegarde au cas où ;-)

Je me mets donc dans mon nouveau répertoire de travail pour un de mes projets et je fais :

svn checkout file:///home/svn/monprojet/trunk

avec :

  • /home/svn/ : mon dépôt pour subversion
  • monprojet : mon projet
  • trunk : le lieu où les fichiers sont initialement stockés

A ce stade, je considère que Subversion fonctionne et par conséquent que l’on peut passer à l’étape suivante. Pour vous familiariser avec Subversion, je vous invite à consulter le book de Subversion (voir lien en bas de page).

Paramétrage de Subversion dans Apache

Activer le support webdav et subversion d'apache

Vérifiez que les modules de SVN sont bien chargés dans apache :

a2enmod dav
a2enmod dav_fs
a2enmod dav_svn
a2enmod rewrite

Paramétrer votre hôte virtuel

Dans la configuration du virtual host de votre serveur apache, ajoutez :

<Location /svn>
    DAV svn
    SVNPath /home/svn/monprojet
    AuthType Basic
    AuthName "Mon Projet"
    AuthUserFile /home/svn/monprojet.htpasswd
    <LimitExcept GET PROPFIND OPTIONS REPORT>
        Require valid-user
    </LimitExcept>
</Location>

Relancer apache :

/etc/init.d/apache2 restart

Allez à "http://localhost/svn/" et vous devez voir votre projet apparaître.

Initialiser Trac

Création de l'instance Trac

Je veux que trac soit installé dans /home/trac donc je le crée sous l’utilisateur root :

mkdir /home/trac/

Je veux ensuite initialiser mon environnement trac dans /home/trac/monprojet :

trac-admin /home/trac/monprojet initenv
Creating a new Trac environment at /home/trac/monprojet
Trac will first ask a few questions about your environment in order to initalize and prepare the project database.
Please enter the name of your project. This name will be used in page titles and descriptions.
Project Name [My Project]> Mon Projet
Please specify the absolute path to the project Subversion repository. Repository must be local, and trac-admin requires read+write permission to initialize the Trac database.
Path to repository [/var/svn/test]> /home/svn/monprojet
Please enter location of Trac page templates. Default is the location of the site-wide templates installed with Trac.
Templates directory [/usr/share/trac/templates]>
Creating and Initializing Project
[...]

Pour que trac fonctionne correctement, il faut que l’utilisateur utilisé par apache aient les droits de lecture et écriture :

chown www-data: -R /home/trac/

Intégrer Trac avec Apache (cgi)

Editez ensuite le fichier de configuration d’apache (vous devez normalement déjà avoir la partie dédiée à Subversion) :

## TRAC #
Alias /trac "/usr/share/trac/htdocs"
ScriptAlias /monprojet /usr/share/trac/cgi-bin/trac.cgi
<Location "/monprojet">
    SetEnv TRAC_ENV "/home/trac/monprojet"
</Location>

<Directory "/usr/share/trac/htdocs">
    Options Indexes MultiViews
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

# You need something like this to authenticate users #
<Location "/cgi-bin/trac.cgi/login">
    AuthType Basic
    AuthName "project"
    AuthUserFile /home/svn/monprojet.htpasswd
    Require valid-user
</Location>

Redémarrer apache pour que ces éléments soient pris en compte :

/etc/init.d/apache2 restart

Intégrer Trac avec Apache (mod_python)

Installer mod_python :

aptitude install libapache2-mod-python
a2enmod mod_python
/etc/init.d/apache2 reload

Editez ensuite le fichier de configuration de votre VirtualHost :

<Location /trac>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv /home/nicos/django-trac
    PythonOption TracUriRoot /
    PythonPath "sys.path + ['/home/nicos/django-trac']"
</Location>

<Location /trac/login>
    AuthType Basic
    AuthName "Mon Projet"
    AuthUserFile /home/svn/monprojet.htpasswd
    Require valid-user
</Location>

Que vous ayez installé Trac en CGI ou avec mod_python

Redémarrer apache pour que ces éléments soient pris en compte :

/etc/init.d/apache2 restart

Rendez vous alors sur "http://localhost/monprojet/" et vous devez avoir une magnifique interface Trac et dans "Browser source" vous devez voir votre projet.

Sécurité et politique d'accès

Gestion globale des utilisateurs (authentification)

Trac, par défaut, gère ses utilisateurs via l’authentification apache (couple de fichiers .htaccess/.htpasswd). Il est néamoins possible d’utiliser une base MySQL, un annuaire LDAP pour authentifier les utilisateurs mais tel n’est pas mon besoin.

Pour l'accès à trac et subversion, j'ai défini dans la configuration des mes hôtes virtuels un lien vers un fichier /home/svn/monprojet.htpasswd, dans lequel seront stockés un couple login / mot de passe.

Il faut créer ce fichier :

htpasswd2 -c /home/svn/monprojet.htpasswd monutilisateur
New password :
Re-type password for user monutilisateur :

Pour ajouter d'autres utilisateurs :

htpasswd2 /home/svn/monprojet.htpasswd utilisateur2
New password :
Re-type password for user utilisateur2 :

Relancez apache pour que vos modifications soient prises en compte :

/etc/init.d/apache2 reload

Rendez vous sur votre instance Trac et cliquez sur "login" et authentifiez vous...

Gestion des droits des utilisateurs dans Trac

Il faut savoir que, par défaut, un profil anonyme (anonymous) peut tout faire sur votre instance Trac. Vous n’avez certainement pas envie que cela soit possible.

Pour visualiser les permissions, il vous suffit de taper dans une console :

trac-admin /home/trac/monprojet permission list

Cela donne par ex :

nicolas@ange:$ sudo trac-admin /home/trac/monprojet/ permission list
User Action
--------------------------
anonymous BROWSER_VIEW
anonymous CHANGESET_VIEW
anonymous FILE_VIEW
anonymous LOG_VIEW
anonymous MILESTONE_VIEW
anonymous REPORT_SQL_VIEW
anonymous REPORT_VIEW
anonymous ROADMAP_VIEW
anonymous SEARCH_VIEW
anonymous TICKET_CREATE
anonymous TICKET_MODIFY
anonymous TICKET_VIEW
anonymous TIMELINE_VIEW
anonymous WIKI_CREATE
anonymous WIKI_MODIFY
anonymous WIKI_VIEW
Available actions: BROWSER_VIEW, CHANGESET_VIEW, CONFIG_VIEW, FILE_VIEW, LOG_VIEW, MILESTONE_ADMIN, MILESTONE_CREATE, MILESTONE_DELETE, MILESTONE_MODIFY, MILESTONE_VIEW, REPORT_ADMIN, REPORT_CREATE, REPORT_DELETE, REPORT_MODIFY, REPORT_SQL_VIEW, REPORT_VIEW, ROADMAP_ADMIN, ROADMAP_VIEW, SEARCH_VIEW, TICKET_ADMIN, TICKET_APPEND, TICKET_CHGPROP, TICKET_CREATE, TICKET_MODIFY, TICKET_VIEW, TIMELINE_VIEW, TRAC_ADMIN, WIKI_ADMIN, WIKI_CREATE, WIKI_DELETE, WIKI_MODIFY, WIKI_VIEW

On voit ici qu’un anonyme peut créer/modifier une page de wiki et un ticket, or ce n’est pas ce que je souhaite.

Je souhaite que :

  • L’internaute anonyme n’ait qu’un accès en lecture
  • Les développeurs aient un accès en lecture/ecriture.

Supprimons déjà les droits de modiifcation/création pour les anonymes :

trac-admin /home/trac/monprojet permission remove anonymous WIKI_CREATE WIKI_MODIFY TICKET_CREATE TICKET_MODIFY

Ajoutons l’utilisateur que j’ai créé plus tôt dans un groupe "developpeur" que je crée par la même occasion :

trac-admin /home permission add monutilisateur developpeur

Donnons ensuite des permissions au groupe developpeur pour la création/modification de Tickets et des pages du wiki :

trac-admin /chemin/de/mon/instance/trac permission add developpeur WIKI_CREATE WIKI_MODIFY TICKET_CREATE TICKET_MODIFY

Note : on pourrait donner des permissions par utilisateur de la même manière mais je préfère gérer des groupes, c’est plus évolutif...

Il ne vous reste plus qu’à affiner les droits en fonction de vos souhaits...

Notes :

  • Les droits en _ADMIN (ex : WIKI_ADMIN), donne tous les droits inférieurs. Donc WIKI_ADMIN = WIKI_VIEW + WIKI_CREATE + WIKI_MODIFY + WIKI_DELETE
  • Le droit TRAC_ADMIN donne tous les droits sur l’ensemble de l’application ; à manier avec précaution !

Gestion des droits des utilisateurs dans Subversion

Editez le fichier /home/svn/monprojet/conf/svnserve.conf pour avoir les options suivantes (j’ai enlevé les tonnes de commentaires pour un gain évident de place) :

[general]
anon-access = read
auth-access = write
password-db = passwd
realm = monprojet realm

Editez ensuite le fichier /home/svn/monprojet/conf/passwd (passwd = nom du fichier définit à lza ligne password-db) et ajoutez-y votre utilisateur

### This file is an example password file for svnserve.
### Its format is similar to that of svnserve.conf. As shown in the
### example below it contains one section labelled [users].
### The name and password for each user follow, one account per line.
[users]
monutilisateur = monmotdepasse

Tester votre serveur

A ce stade, en anonyme, vous devez pouvoir mener un checkout des 2 façons suivantes :

svn co http://localhost/svn/trunk monprojet
svn co file:///home/svn/monprojet/svn/trunk monprojet

Par contre, pour commiter, il vous faut vous identifier depuis votre client SVN (Tortoise, plugin Subclipse pour Eclipse, etc) et dans ce cas, je vous renvoie à la documentation de votre logiciel... ;-)

Learn more »

Migrer de subversion à mercurial

Migrer vos dépôts

Installer hgsvn

Il vous faut récupérer et installer hgsvn (actuellement en version 0.1.3), qui est un ensemble de script permettant de travailler sur des dépôts mercurial et subversion. :

sudo easy_install hgsvn

Migrer un dépôt complet

Imaginons que vous avez un projet dans une instance subversion, pour le migrer, il suffit de procéder de la façon suivante :

Création de la racine des dépots
mkdir -p /home/hg
cd /home/hg
# Récupération des informations du dépôt svn
hgimportsvn http://votredepot.domaine.tld/chemin/du/depot/ dossier_de_destination
cd dossier_de_destination
# Récupération de l'historique de SVN et création d'un changeset mercurial pour tout commit svn
hgpullsvn
hg update (optionnel)
# Suppression des méta-données de svn (vu qu'on n'en a plus besoin)
find . -name .svn | xargs rm -fr

Migrer un dépôt contenant plusieurs projets en n dépots mercurial

C'est à peu près la même chose, il suffit d'indiquer le chemin de votre projet (et non seulement du dépôt) :

cd /home/hg
# Récupération des informations du dépôt svn
hgimportsvn http://votredepot.domaine.tld/chemin/du/depot/projet_b/trunk projet_b
cd projet_b
# Récupération de l'historique de SVN et création d'un changeset mercurial pour tout commit svn
hgpullsvn
hg update (optionnel)
# Suppression des méta-données de svn (vu qu'on n'en a plus besoin)
find . -name .svn | xargs rm -fr

et recommencer si vous avez un projet_c, projet_d, etc.

Installer l'interface web de consultation d'un dépot mercurial : hgweb

Si vous avez un seul dépot, il vous faut utiliser hgweb.cgi - si vous en avez plusieurs (ou si vous comptez en avoir plusieurs, il vous faut installer hgwebdir.cgi.

Utilisation de hgweb.cgi

Copier hgweb.cgi dans le répertoire qui vous servira de DocumentRoot pour votre Virtual Host Apache :

# Création de mon répertoire :
mkdir /home/hg/hgweb
cp /usr/share/doc/mercurial/examples/hgweb.cgi /home/hg/hgweb/

Editez ensuite hgweb.cgi :

# Décommentez les lignes suivantes si vous affichez les données en UTF-8
#import os
#os.environ["HGENCODING"] = "UTF-8"

# Adaptez /path/to/repo sur la valeur de /home/hg/projet_b
#
# Ex return hgweb("/home/hg/projet_b", "Mon Projet B")

def make_web_app():
    return hgweb("/path/to/repo", "repository name")

Utilisation de hgwebdir.cgi

Copier hgwebdir.cgi dans le sous-répertoire hgweb du répertoire qui vous servira de DocumentRoot pour votre Virtual Host Apache :

# Création de mon répertoire :
mkdir /home/hg/hgweb
cp /usr/share/doc/mercurial/examples/hgwebdir.cgi /home/hg/hgweb/

Editez ensuite hgwebdir.cgi :

# Décommentez les lignes suivantes si vous affichez les données en UTF-8
#import os
#os.environ["HGENCODING"] = "UTF-8"

# Remplacer ensuite hgweb.config par le chemin ou sera placé votre fichier de configation de hgwebdir
# Dans mon cas : return hgwebdir("/home/hgconf/hgweb.config")
def make_web_app():
    return hgwebdir("hgweb.config")

Il faut juste que le fichier ne soit pas accessible par le web pour des raisons de sécurité. Vous pouvez le mettre où vous voulez (/etc/hgweb/hgweb.conf par ex)

Editez ensuite votre fichier hgweb.conf :

[collections]
/home/hg = /home/hg

Si vos dépots mercurial ne sont pas tous dans /home/hg, il vous faudra utiliser la section paths

[paths]
projecta = /depot/mercurial/du/projet/a/
projectb = /depot/projet/b

Configuration d'apache

Editer votre configuration apache pour y ajouter les éléments suivants :

<VirtualHost xxx.xxx.xxx.xxx>
    ServerName hg.domaine.tld
    DocumentRoot /home/hg/
    <Directory /home/hg/>
        DirectoryIndex hgweb/hgwebdir.cgi
        AddHandler cgi-script .cgi
        Options ExecCGI FollowSymLinks
        Order allow,deny
        Allow from all
        AuthUserFile /home/hgconf/hg.htpasswd
        AuthName "Depot Mercurial"
        AuthType Basic
        <Limit POST PUT>
            Require valid-user
        </Limit>
        RewriteEngine on
        RewriteBase /hgweb
        RewriteRule ^$ hgwebdir.cgi  [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule (.*) hgwebdir.cgi/$1  [QSA,L]
    </Directory>
</VirtualHost>

Remplacez hgwebdir.cgi par hgweb.cgi si nécessaire ;-)

Vérifier que le module cgi d'apache est bien installé et activé puis relancez Apache :

apachectl configtest
/etc/init.d/apache reload

et rendez vous sur http://hg.domaine.tld pour apprécier le résultat.

Configurer Trac pour fonctionner avec Mercurial

Cf la page du plugin TracMercurial suivant votre version de Trac (>= 0.10)

Paramétrer vos instances mercurial

Voir la page man de hgrc pour voir toutes les options possibles :)

Définition de paramètres globaux pour toutes vos instances

Si je veux définir des éléments globaux, je dois le préciser dans /etc/mercurial/hgrc :

# system-wide mercurial configuration file
# See hgrc(5) for more information

[web]
# Définition du style à utiliser
style = gitweb
# Choix des formats sous lesquels votre code est mis à disposition
allow_archive = bz2 zip
# Nom du contact par défaut
contact = Vous
# Mettre false si https n'est pas configuré
push_ssl = true
# Masquage du hgweb(dir).cgi dans les urls en supposant que votre dépot est dispo sous une url de type http://hg.domaine.com/
baseurl =

Définition de paramètres particuliers à un instance

Dans votre instance mercurial, éditez le fichier .hg/hgrc :

[paths]
default = /home/hg/projet_b

[web]
description = Projet B : Gestion de lettre au père noel
# Qui est autorisé à commiter/envoyer des fichiers sur le dépot :
allow_push = Vous
# Qui n'est pas autorisé à commiter/envoyer des fichiers sur le dépot :
deny_push = pere_fouettard

Travailler avec votre dépôt mercurial

Pour un checkout :

hg clone http://hg.domaine.tld/projet_a projet_a

Pour un commit :

hg add monfichier.txt
hg commit -m "Ajout mon fichier.txt"
hg push http://hg.domaine.tld/projet_b

Note : Pour faire du push en http(s), il faut que le répertoire de destination soit accessible en écriture par l'utilisateur apache (www-data en général). Donc soit vous faites un :

chmod 777 -R /home/hg/projet_b

ou bien vous rendez l'utilisateur apache propriétaire de votre dépot via :

chown -R www-data: /home/hg/projet_b

Cela vous évitera d'avoir :

abort: ‘http://hg.domaine.tld/projet_b’ does not appear to be an hg repository!

Vous pouvez aussi faire le push par ssh par ex :

hg push ssh://vous@domaine.tld//home/hg/projet_b

Mercurial et Eclipse

Installez le plugin Mercurial Eclipse.

View details »

Sauvegarder et restaurer vos instances Trac & Subversion

Sauvegarde et restauration de votre instance Trac

Sauvegarde de votre instance Trac

C’est assez simple :

trac-admin /chemin/de/votre/instance/trac hotcopy /chemin/de/votre/dossier/de/sauvegarde

Pendant le temps de l’opération, la base Trac est vérouillée.

Vous pouvez ensuite sauvegarder normalement ce dossier :

tar cjf trac_backup.tar.bz2 /chemin/de/votre/dossier/de/sauvegarde

Il vous reste plus qu’à récupérer votre fichier trac_backup.tar.bz2 ;-)

Restauration de votre instance Trac

Il vous suffit de décompresser votre dossier de sauvegarde à la place de votre instance précédente. Si vous restaurer la sauvegarde sur une autre machine, il vous faudra peut être ajuster certaines valeurs du fichier conf/trac.ini.

Conflit de version 0.10 vs 0.9

Note : Mon instance de production étant sous Trac 0.10 issue de Debian Testing, j’ai eu le droit à une jolie erreur lors de la restauration sous Ubuntu :

PythonHandler trac.web.modpython_frontend: DatabaseError: file is encrypted or is not a database

J’ai récupéré une version 0.10 de Trac pour Ubuntu Feisty, car dans Edgy et Dapper, Trac est disponible sous la version 0.9.6. Il m’a aussi fallu installer le paquet python-pysqlite2 et le tour fut joué !

Sauvegarde et restauration de votre instance Subversion

Sauvegarde de votre instance subversion

svnadmin dump /chemin/de/votre/instance/subversion > ~/monprojet.svndump

Il vous suffit de compresser & récupérer ce fichier sur votre machine si besoin.

Restauration de votre instance subversion

svnadmin load /chemin/de/votre/instance/subversion < ~/monprojet.svndump

Si vous déplacez votre instance subversion sur une autre machine, il vous faudra créer votre dépôt subversion en premier lieu :

svnadmin create /chemin/de/votre/nouvelle/instance/subversion
svnadmin load /chemin/de/votre/nouvelle/instance/subversion < ~/monprojet.svndump
View details »