SVN – Réplication

Réplication – général

Dans le but de faire une réplication d’un repository source, il faut déjà créer le repository qui servira de miroir, nous y ferons référence en tant que repository destination ‘repoDEST’

Création du mirror repository
svnadmin create /var/svn/repoDEST

Une fois que le repository miroir est créé, il faut créer 2 hooks qui permettront d’une part de modifier les propriétés des révisions et, d’autre part, de limiter les commits sur le repoDEST au seul user voulu (celui qui fera la réplication – un compte générique) ; un repository en miroir ne doit absolument pas être modifié par des tiers.

Il faut ainsi créer un fichier pre-revprop-change dans le répertoire hook du repository destination.

RepoDEST : Enable the pre-revprop-change hook
repoDEST/hooks/pre-revprop-change

#!/bin/sh
USER= »$3″
if [ « $USER » = « root » ]; then exit 0; fi
echo « Only the root user may change revision properties » >&2
exit 1

Si on ne veut pas utiliser d’user spécifique, il suffit de laisser ce fichier vide ou de lui indiquer une sortie retour en 0.

#!/bin/sh
exit 0

Maintenant, il faut créer un fichier start-commit dans le répertoire hook du repository destination. On spécifiera pour l’exemple le user root comme seul user possible à faire ce mirroring mais de préférence, utiliser un autre user bien sûr.

RepoDEST : Enable the start-commit hook
repoDEST/hooks/start-commit

#!/bin/sh
USER= »$2″
if [ « $USER » = « root » ]; then exit 0; fi
echo « Only the root user may commit new revisions » >&2
exit 1

Si on ne veut pas utiliser d’user spécifique, il suffit de laisser ce fichier vide ou de lui indiquer une sortie retour en 0.

#!/bin/sh
Exit 0

RepoDEST : Attribution des droits d’exécution sur les 2 hooks
On doit maintenant donner les droits d’exécution sur les 2 fichiers créés. Autrement vous aurez un message d’erreur spécifiant que vous êtes bloqués par le hook pre-revprop-change avec un code d’exit 255 sans autre message d’erreur.

chmod +x /var/svn/RepoDEST/hooks/start-commit
chmod +x /var/svn/RepoDEST/hooks/pre-revprop-change

Initialiser la sync
Maintenant que le repoDEST est créé et que les hooks ont été fait, on peut lancer une initialisation d’svnsync. L’initialisation est lancé avec l’user spécifié dans les hooks :
svnsync init REPO_DEST REPO_SOURCE

Pour lancer avec un autre user (ce user doit être spécifié dans les hooks créés) :
root@ubuntu:/tmp# svnsync init –username root –password p455W0RD file:///var/svn/repoDEST file:///var/svn/repoSOURCE

Cette initialisation a modifié la r0 du répository miroir en lui attribuant des propriétés spécifiques permettant la réplication.

Lancement d’une synchronisation
root@ubuntu:/tmp# svnsync sync file:///var/svn/repodest
Transmitting file data .
Committed revision 3.
Copied properties for revision 3.
Transmitting file data .
Committed revision 4.
Copied properties for revision 4.

Sync entre 2 repo avec des password différents
#non testé
Dans Subversion 1.4, les valeurs données aux options –-username et à –-password et sont utilisées pour s’authentifier et sur le repository SOURCE et sur le repository de destination.
Cela pose un problème lorsque les login et pass sont différents pour chacun des repository notamment lorsque la commande est lancée avec l’option –-non-interactive.
Ce problème a été réglé dans Subversion 1.5 avec l’introduction de deux nouvelles paires d’options.
Utilisez –source-username et –source-password pour l’authentification auprès du repository source.
Utilisez –sync-username et –sync-password pour l’authentification auprès du repository destination.
(Les anciennes options –username et –password existent toujours pour la rétro compatibilité mais il vaut mieux les éviter.

svnsync synchronize –-source-username root –-source-password fRol12p –-sync-usename adminsvn –-sync-password rFkgP5 http://svn.domaine.com/svn/repodest

 

Réplication – avec repository destination non vide

Une synchronisation rejoue tous les commits depuis la révision 1. Cela peut prendre beaucoup de temps. Pour se donner un ordre d’idée général, un retour d’expérience d’un user sur internet donnait une durée de 10h de synchronisation en réseau local pour 50 000 révisions (sans précision sur la taille de son repository malheureusement).

Ainsi, pour gagner du temps on peut vouloir faire soi-même une copie du reposiroty source puis faire ensuite cette initialisation et cette synchro.

Hotcopy
En premier lieu pour gagner du temps sur la synchronisation, on peut tout simplement faire une hotcopy si les repository sont en local (hotcopy ne permettant pas d’agir sur des repository distants).

svnadmin hotcopy /var/svn/repoSOURCE /var/svn/repoDEST

Maintenant que notre repoDEST est peuplé, il faut mettre en place l’initialisation de svnsync.

1.7 et + – svnsync initialize pour un repoDEST non vide
Il suffit d’exécuter la commande suivante permettant d’initialiser un repository non vide. La commande retournera la dernière révision modifiée.

$ svnsync initialize –allow-non-empty file:///var/svn/repodest file:///var/svn/repoSOURCE
Copied properties for revision 32042.

pre 1.7 – svnsync initialize pour un repoDEST non vide
L’initialize sera toujours en échec. Les versions d’SVN pre 1.7 ne permettent pas d’initialiser une réplication avec un repository destination non vide mais il y a un work-around à ce problème.

Solution :
On doit spécifier dans la révision 0 du repoDEST les informations suivantes qui auraient dû être faites lors d’une initialisation classique.

Affichage d’une r0 d’une initialisation classique d’un repository miroir avec déjà 75654 commit au moment de la hotcopy
root@ubuntu:/tmp# svn proplist –revprop -r0 -v file:///var/svn/repoDEST
svn:sync-from-uuid
34bfcec2-49d6-4b64-8a19-d04b91f061ce
svn:sync-last-merged-rev
75654
svn:sync-from-url
file:///var/svn/repoSOURCE

C’est à cela que va devoir ressembler notre r0 de notre repository mirroir pre 1.7. Il va donc falloir récupérer toutes les informations nécessaires à cette initialisation.

Récupérer les informations nécessaires à l’initialisation
Afficher la dernière version du repository destination
$ svnlook youngest /var/svn/repoDEST
32042

Afficher l’uuid du repository source
$ svnlook uuid /var/svn/repoSOURCE
34bfcec2-49d6-4b64-8a19-d04b91f061ce

Initialisation du sync en manuel par modification de la r0
Maintenant que toutes les infos ont été récupérées, il faut modifier les propriétés de la r0 du repoDEST.
Un message montre la bonne exécution de l’ajout d’une propriété.

svn propset –revprop -r0 svn:sync-from-url file:///var/svn/repoSOURCE file:///var/svn/repoDEST
svn propset –revprop -r0 svn:sync-from-uuid 34bfcec2-49d6-4b64-8a19-d04b91f061ce file:///var/svn/repoDEST
svn propset –revprop -r0 svn:sync-last-merged-rev 32042 file:///var/svn/repoDEST

Autre manière d’ajouter une revprop
# Créer un fichier txt avec le contenu suivant
file:///var/svn/repoSOURCE

# Enlever la ligne supplémentaire qui pourrait être créé dans txt
cat txt | tr -d ‘\n’ > txt2

# Ajouter le paramètre de sync dans la r0
svnadmin setrevprop /var/svn/repoDEST -r0 svn:sync-from-url txt2

# On vérifier le contenu de r0
svnlook pg –revprop -r0 /var/svn/repodest svn:sync-from-url
file:///var/svn/repoSOURCE

Synchronisation
Pas besoin d’initialiser le mirorring car toutes les informations d’initialisation ont été spécifiées dans la r0. Il n’y a plus qu’à lancer la synchronisation.

$ svnsync sync file:///var/svn/repoDEST

 

Divers

Adresses de repo possibles pour svnsync
svn+ssh://user@MACHINEDEST/var/svn/repoDEST
file:///var/svn/repoDEST
http://svn.exemple.org/svn/repository
svn://

SSH
Si on fait tourner svnsync sur la machine source (ayant le repoSOURCE), il faut donner l’accès au user lançant svnsync en copiant sa clé SSH de la machine source sur la machine distante dans ./ssh/authorized_keys .

Reprendre un svnsync sync arrêté avec un ctrl+c – Méthode 1
Si on lance un svnsync sync et qu’on l’a stoppé dans son exécution avec un ctrl+c par exemple, lorsqu’on le relance, on obtient ceci :

$ svnsync –non-interactive sync file:///var/svn/repoDEST
Failed to get lock on destination repos, currently held by ‘svn.exemple.org:0e4e0d98-631d-0410-9a00-9320a90920b3’

Failed to get lock on destination repos, currently held by ‘svn.exemple.org:0e4e0d98-631d-0410-9a00-9320a90920b3’
svnsync: Couldn’t get lock on destination repos after 10 attempts

svnsync garde son état verrouillé dans une propriété spéciale dans la r0.
Donc, pour déverrouillé cet état, on peut supprimer sans danger cette propriété.

$ svn propdelete svn:sync-lock –revprop -r0 file:///var/svn/repoDEST

Reprendre un svnsync sync arrêté avec un ctrl+c – Méthode2
$ svn propdel svn:sync-lock –revprop -r0 file:///var/svn/repoDEST

Mise en place d’une réplication continuelle – live
Pour mettre en place une réplication en temps réel, il suffit d’ajouter la ligne suivante dans le hook post-commit du repoSOURCE.
Après chaque commit, le hook permettra de lancer une synchronisation.

svnsync –non-interactive sync file:///var/svn/repoDEST &

DUMP d’un repo et restore dans un autre
Pour faire une sauvegarde de la bdd en faisant un dump(sans les fichiers de configs ou autre), il suffit d’exécuter la commande suivante :
$ svnadmin dump repoSOURCE > dumprepoSOURCE
* Dumped revision 0.
* Dumped revision 1.

Pour restaurer un dump dans un repository :
$ svnadmin load repoDEST < dumprepoSOURCE
<<< Started new transaction, based on original revision 1 * adding path : test … done. * adding path : test/apple … done. * adding path : test/htc … done. * adding path : test/samsung … done. ——- Committed revision 1 >>>

Ajouter à un user une copie locale du SVN
Créer le dossier dans le répertoire courant :
svn co file:///var/svn/repo

Créer le dossier dans le répertoire /tmp/repoLOCAL :
svn co file:///var/svn/repo/ /tmp/repoLOCAL

Ajout répertoire comme commitable pour un repo
svn add repertoiretest

Commit du répertoire précédemment add
svn commit repertoiretest -m « Message expliquant les modifications effectuees »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *