Sometimes I write things, sometimes I don't.

To content | To menu | To search

Migration de SVN vers Bazaar

Migrer d'un système de contrôle de version à un autre peut parfois être utile. On peut distinguer deux raisons de migration :

  • le besoin (pour des raisons de gestion du projet), et,
  • l'envie (par préférence d'utilisation).

Le cas numéro 2 a été le mien. En effet, en développant de plus en plus pour java-gnome, je me suis pris d'affection pour Bazaar. J'ai donc décidé de migrer le code de gSplit de SVN à Bazaar sans perte de données.

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).

Comments

1. On Wednesday 8 July 2009, 14:08 by regala

Hello ! merci pour ce tuto très complet et très détaillé. J’avais une question plutôt offtopic.
Qu’est-ce qui t’a amené à choisir Bzr comme DVCS, alors que Git, Mercurial, par exemple, supportent plus de fonctionnalités (je pense aux branches internes qui m’ont cruellement manqué lorsque j’ai dû utiliser Bzr et maintenir 7 arbres séparés pour 7 branches de développement) et finissent par être largement plus répandus ?
Sinon félicitations encore pour la clarté, et la précision de ton tuto. :)

2. On Wednesday 8 July 2009, 17:41 by Guillaume

@regala : Ah les branches internes, ça c’est clair que ça me manque. Comme je le dis vite fait au début de l’article, j’en suis arrivé à Bazaar plutôt à cause de mon développement sur java-gnome qui utilise ce DVCS. Je l’ai trouvé très simple d’utilisation et me suis donc laissé séduire. Bazaar reste quand même en plein développement donc je vais voir comment ça va évoluer mais peut-être que dans l’avenir je me tournerai vers d’autres DVCS justement comme Git. Les goût évoluent, avant j’étais un pro SVN maintenant je préfère Bazaar :-p

3. On Friday 10 July 2009, 22:06 by Yoko

Je n’ai pas tout lu mais quand tu dis sans aucune perte de données tu parle de garder aussi tout les numéros de révisions c’est ça ?

4. On Saturday 11 July 2009, 13:27 by Guillaume

@Yoko : Exactement.

5. On Monday 20 July 2009, 12:47 by tenshu

Salut, question bête mais existe t’il un équivalent aux svn externals dans Bazaar?

6. On Monday 20 July 2009, 13:18 by Guillaume

@tenshu : Je ne crois pas que des équivalents de svn:externals existent pour les DCVS, mais c’est à vérifier.