Subversion consente di rendere disponibile un repository a un indirizzo utilizzabile da tutti gli utenti. Ma come si sa le cose si rompono…
Nel caso in cui il server che mette a disposizione il repository subisca un hardware failure come possiamo da un lato avere un backup allineato all’ultima commit e dall’altro rendere disponibile immediatamente il repository agli utenti evitando lunghi periodi di downtime?
Con un semplice hack e un hook di post commit possiamo ottenere un repository clone da sostituire immediatamente a quello sulla macchina danneggiata.
Per prima cosa prepariamo due server: primary.mycompany.com e slave.mycompany.com, e poniamo che primary sia il repository principale, su slave prepariamo un nuovo repository vuoto e lo rendiamo disponibile tramite protocollo http.
Ecco una possibile configurazione del repository:
<Location> DAV svn SVNPath /var/lib/svn/repo AuthType Basic AuthName "Subversion Repository" AuthUserFile /var/lib/svn/passwd AuthzSVNAccessFile /var/lib/svn/access require valid-user satisfy all </Location>
Tale configurazione è valida sia per primary che per slave.
Sulla macchina slave creiamo il repository clone con il comando svnadmin come di consueto. Una volta creato il repository clone dobbiamo cambiargli l’uuid. L’uuid di un repository è una stringa che contiene l’identificativo univoco di un repository generata al momento della creazione. Il client Subversion controlla che l’uuid del repository che si sta conttatando sia quello da cui la working copy è stata creata, per questo motivo bisogna sostituirlo con quello del repository master.
Per ottenere l’uid del repository master possiamo utilizzare il comado svn info http://primary.mycompany.com/repo, il risultato sarà simile a questo:
# svn info http://primary.mycompany.com/repo Path: repo URL: http://primary.mycompany.com Repository Root: http://primary.mycompany.com/repo Repository UUID: 41c2915e-32ce-4739-91e1-966d5c2fcc64 Revision: 58056 Node Kind: directory Last Changed Author: admin Last Changed Rev: 58056 Last Changed Date: 2009-04-30 15:35:52 +0200 (Gio, 30 Apr 2009)
L’UUID di un repository è salvato in [REPO_PATH]/db/uuid e possiamo aggiornarlo con 1 comando
# svn info http://primary.mycompany.com | grep UUID | awk '{ print $3 }' > /var/lib/svn/repo/db/uuid
Assumendo di avere i privilegi necessari e di aver creato il repository in /var/lib/svn/repo
A questo punto abilitiamo su primary l’hook di post commit e ci inseriamo l’esecuzione di svnsync, questo post parla di svnsync e di come utilizzarlo.
