Direct naar de tekst

Met svnsync kan een slave-repository gesynchroniseerd worden met een master-repository. Een handige manier om een Subversion repository incrementeel te backupen. Dit kan naar een (externe) backup schijf of een andere computer over het netwerk.

Subversion svnsync repository replication

Geschreven door Dennis Burger op

In het SVN-book, hoofdstuk Repository Replication (PDF vanaf pagina 155) wordt het niet helemaal duidelijk uitgelegd.

Hier volgt een uitleg hoe een bestaande master-repository gesynchroniseerd wordt naar een (lege) slave-repository. De master repository moet via een authentication systeem (Apache of svnserve) geserveerd worden. Dit heeft te maken met zogenaamde svn hooks die toegang verlenen tot svn repositories.

Master-repository

De master-repository is te bereiken op onderstaande url. Lees het artikel over Subversion svnserve automatisch opstarten hoe je het svn:// protocol aan de praat krijgt.

svn://mijn-mac.local/mijnwebsite

Via het /etc/hosts bestand wordt het 127.0.0.1 IP nummer gekoppeld aan een fictieve mijn-mac.local nepdomein. Met deze opzet wordt er naar een domeinnaam verwezen welke in feite onze eigen Mac is.

Slave-repository (empty)

In dit voorbeeld willen we de master-repository backupen naar een externe backupschijf welke direct aan de Mac hangt (bijvoorbeeld USB / Firewire). Deze repository is te bereiken via onderstaand pad met het normale file:// protocol:

file:///Volumes/Backupdisc/svn_sync/mijnwebsite

Slave-repository aanmaken

De master-repository bestaat reeds en is al enige tijd mee gewerkt. De slave-repository moet leeg zijn voordat deze gebruikt kan worden als replication mirror.

Maak een lege slave-repository aan op de backup schijf, maak eventueel ook de juiste mappen aan (svn_sync/). Open de Terminal (/Applications/Utilities/Terminal)

Lege slave-repository

svnadmin create /Volumes/Backupdisc/svn_sync/mijnwebsite

Deze slave-repository is nu leeg en klaar voor gebruik. Gebruik deze repo. ook alleen voor synchronisatie doeleinden. Niet voor dagelijks gebruik of andere zaken. Anders kan deze repo. niet goed meer geschroniseerd worden.

Hooks

In de hooks map van de slave-repository moeten 2 hookscripts geplaats worden. Deze wordt gestart door Subversion bij bepaalde acties zoals het vooraf gaan aan een svn commit en property-changes.

In beide gevallen wordt gecontroleerd of de synchronisatie door de syncuser wordt uitgevoerd.

start-commit (onderstaande is 1 regel)

Plaats dit voorbeeld start-commit hookscript:

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

… in de volgende map met de juiste naam:

/Volumes/Backupdisc/svn_sync/mijnwebsite/hooks/start-commit

En zet de Unix permission met de Terminal zo dat dit script uitgevoerd kan worden (onderstaande is 1 regel).

chmod ugo+x /Volumes/Backupdisc/svn_sync/mijnwebsite/hooks/start-commit

pre-revprop-change (onderstaande is 1 regel)

Plaats dit voorbeeld pre-revprop-change hookscript:

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

…in de volgende map met de juiste naam:

/Volumes/Backupdisc/svn_sync/mijnwebsite/hooks/pre-revprop-change

Ook hiervan zetten we de juiste Unix permissions (onderstaande is 1 regel):

chmod ugo+x /Volumes/Backupdisc/svn_sync/mijnwebsite/hooks/pre-revprop-change

Usermanagement / password

De slave-repository wordt gebruikt om te synchorniseren. Deze maakt gebruik van bovenstaande hookscripts die controleren of een bepaalde gebruiker de syncrhonisatie mag uitvoeren. Namelijk de syncuser. In een password bestand wordt deze gebruiker aangemaakt me een plain text-password.

passwd (onderstaande is 1 regel)

Plaats dit voorbeeld passwd:

[users]
syncuser = mysecret

… bestand in onderstaande map met de juiste naam:

/Volumes/Backupdisc/svn_sync/mijnwebsite/conf/passwd

Repository configuratie

Nu moeten we voor de slave-repository nog aangeven hoe deze is geconfigureerd. Plaats dit voorbeeld svnserve.conf

[general]
anon-access = none
auth-access = write
password-db = passwd
realm = my slave-repo name

… in de juist map met de juiste naam:

/Volumes/Backupdisc/svn_sync/mijnwebsite/conf/svnserve.conf

In dit bestand kun je de slave-repository ook een goede naam geven:

realm = my slave-repo name

Initialisatie

De setup is bijna klaar. We geven nu aan dat de slave-repository geinitialiseerd moet worden aan de master-repository.

Deze zal dat vanaf nu onthouden. Bij een synchronisatie commando weet de slave-repository welke master-repository deze moet repliceren en waar deze de vorige keer is gebleven. Open de Terminal en typ onderstaande:

Onderstaande is 1 regel:

svnsync init file:///Volumes/Backupdisc/svn_sync/mijnwebsite svn://mijn-mac.local/mijnwebsite/

In beeld verschijnt er een melding welke aangeeft dat de properties gekopieerd zijn van de master-repository.

Copied properties for revision 0.

Synchroniseren

Met 1 commando naar de slave-repository geven we aan dat de master-repository alle changesets moet repliceren naar de slave-repository. De slave-repository intepreteerd alle changesets weer en maakt op die manier een exacte kopie van de master-repository. In de Terminal:

svnsync sync file:///Volumes/Backupdisc/svn_sync/mijnwebsite

De volgende keer dat er weer gesynchroniseerd moet worden pakt de slave-repository het punt weer op waar de is gebleven ten opzichte van de master-repository.

Unix shell scripts en cron-achtige preiodieke taken

Op deze manier kun je de synchronisatie commando’s allemaal verzamelen in bijvoorbeeld 1 Unix shell script. Voer dit script uit en alle svnsync acties worden uitgevoerd.

MacOS X heeft uiteraard ook zoiets als periodieke taken. Het oude Unix cron is uiteraard nog aanwezig. Apple heeft dit vervangen door launchd. Met launchd kun je ook dit soort shell scripts laten uitvoeren op bepaalde tijden.

Op YouTube staat ook een saai filmpje over launchd.