Pour rappel (ou pas), Bazaar est un système de gestion de versions libre et décentralisé qui est développé par Canonical. Il est développé avec le langage Python (qui est très utilisé par Canonical). Avant de me lancer, j'ai passé de long moment sur un moteur de recherche bien connu pour être sûr et certain que la migration se ferait sans aucune perte.

Attention ! La suite de l'article a été réalisé grâce à Ubuntu Server 9.04 et avec le PPA de l'équipe de développement de Bazaar. Il faut donc ajouter ce dépôt, non officiel, à la liste déjà existante. Ceci peut donc être dangereux pour votre système.

1. Ajout du PPA de Bazaar et installation

Les informations sur le PPA se trouve sur cette page. Pour les utilisateurs de Jaunty Jackalope, il faut ajouter les deux lignes suivantes au fichier /etc/apt/sources.list :
deb http://ppa.launchpad.net/bzr/ppa/ubuntu jaunty main
deb-src http://ppa.launchpad.net/bzr/ppa/ubuntu jaunty main



Avant de mettre à jour la liste des dépôts et de procéder à l'installation, il ne faut pas oublier de récupérer la clé du dépôt via la commande suivante.
~$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8C6C1EFD

Maintenant, on peut installer les paquets bzr, bzrtools, bzr-svn, ssh et openssh-server.

Petite mise au point avant de se lancer dans les joyeusetés. L'accès en lecture au dépôt se fera via le protocole HTTP, l'accès en écriture se fera via SFTP et en plus de tout ceci, on mettra en place Loggerhead (pour voir les commits et le dépôt depuis un navigateur web).

2. Création du dépôt

Avant de créer le dépôt et d'y intégrer le code, il faut commencer par créer un utilisateur qui aura droit d'accès en écriture et qui servira notamment à commiter.
~$ sudo useradd --create-home --home-dir /var/local/bzr --shell /usr/lib/sftp-server bzr
~$ sudo passwd bzr
~$ sudo su
~# echo '/usr/lib/sftp-server' >> /etc/shells


On ajoute via les commandes précédentes un utilisateur nommé bzr, qui aura pour répertoire personnel /var/local/bzr (la racine du dépôt Bazaar) et qui utilisera comme shell un serveur SFTP. Avec la deuxième commande, on définit le mot de passe de l'utilisateur, il faut donc veiller à entrer un mot de passe plutôt costaud car il sera demandé lors de l'envoi d'une branche par exemple.

Maintenant, il faut que le serveur HTTP (Apache dans mon cas) puisse avoir accès au dépôt. On crée et on édite alors le fichier /etc/apache2/sites-available/bazaar puis on y met la ligne suivante.
Alias /bzr/ "/var/local/bzr/"

Enfin, on recharge la configuration du serveur HTTP.
~$ sudo a2ensite bazaar
~$ sudo /etc/init.d/apache2 force-reload


À partir de maintenant, on doit pouvoir pusher une branche afin de tester que l'upload et que le download fonctionnent.
~$ mkdir test_project
~$ bzr whoami "MoiMeme <mon_email@server.org>"
~$ cd test_project
~/test_project$ echo "public class Test {
     public static void main(String[] args) {
         System.out.println("Hello World!");
     }
}" > Test.java
~/test_project$ bzr init && bzr add
~/test_project$ bzr push --remember sftp://bzr@server.org/var/local/bzr/test_project


Si ceci fonctionne (normalement oui), on peut essayer de checkout la branche ensuite.
~$ bzr checkout http://www.server.org/bzr/test_project test

3. Migration du code du dépôt SVN vers Bazaar

Voilà la partie sensible dans laquelle il faut faire attention pourtant, ce n'est pas beaucoup plus bête qu'une ou deux lignes de commande. On commence par importer le code dans le dépôt. Ceci va en plus recréer l'historique des versions. Comme Bazaar fonctione par branche (chaque branche commence à la révsion 1), il se peut que des différences dans la numérotation apparaissent.
~$ cd /var/local/bzr/
/var/local/bzr$ sudo bzr svn-import --trees --layout=trunk0 http://www.server.org/svn/ mon_projet
/var/local/bzr$ sudo chown -R mon_projet


À ce stade, le code doit normalement être disponible via Bazaar et l'historique doit être complet. On peut le vérifier via la commande suivante.
~$ bzr log http://www.server.org/bzr/mon_projet | more

4. Mise en place de Loggerhead

Loggerhead est une sorte de Trac mais en plus simple puisqu'il ne comporte par les fonctions de Wiki, etc... Pour l'utiliser, on récupère l'archive de la dernière version.
~$ wget http://launchpad.net/loggerhead/1.10/1.10/+download/loggerhead-1.10.tar.gz

Il faut extraire l'archive dans /opt/.
~$ mv loggerhead-1.10.tar.gz /opt/
~$ cd /opt/ && sudo tar xzvf loggerhead-1.10.tar.gz
/opt$ rm loggerhead-1.10.tar.gz


Pour lancer Loggerhead facilement, on va copier le fichier /opt/loggerhead/loggerheadd dans /etc/init.d/ puis le modifier à notre guise.  On modifira surtout les quelques variables du fichier comme celles-ci :
SERVE_BRANCHES_CMD=/opt/loggerhead/serve-branches
LOG_FOLDER=/var/log/loggerhead
LOG_FILE=$LOG_FOLDER/loggerheadd.log
URL_PREFIX=/loggerhead
PORT=4155
BZRROOT=/var/local/bzr/mon_projet/


Il ne faut pas oublier de configurer le serveur HTTP pour qu'il utilise Loggerhead via le module de proxy afin de se simplifier la vie par la suite. On édite le fichier /etc/apache2/site-available/loggerhead puis on y insère le code suivant.
<Location "/loggerhead/">
    Order allow,deny
    Allow from all
</Location>
ProxyPass /loggerhead/ http://localhost:4155/
ProxyPassReverse /loggerhead/ http://localhost:4155/


On active les modules de proxy ainsi que le nouveau site. Pour finir par recharger la configuration de Apache.
~$ sudo a2enmod proxy
~$ sudo a2enmod proxy_connect
~$ sudo a2enmod proxy_http
~$ sudo a2ensite loggerhead
~$ sudo /etc/init.d/apache2 force-reload


Maintenant, on donne le droit d'exécution au script et on peut lancer Loggerhead.
~$ sudo chmod +x /etc/init.d/loggerhead
~$ sudo /etc/init.d/loggerhead start


5. Conclusion

Cet article ne se veut pas comme référence mais fait le point sur une technique qui a fonctionné pour moi. Si vous avez des améliorations ou d'autres tutoriaux à recommander je suis preneur. Notamment pour utiliser Bazaar à la mode bzr (en checkout) et bzr+ssh (en commit).