Creare un mirror Subversion in sola lettura con svnsync
Questa volta ci cimenteremo nella creazione di un mirror in sola lettura di subversion.
Le motivazioni possono essere tante sul perchè vogliamo creare un repository in sola lettura, ad esempio, vogliamo un backup del nostro repository aggiornato all’ultimo commit, che possiamo utilizzare per ripristinare un repository corrotto.
Per fare questo ci torna utile il comando svnsync la cui trattazione è all’interno del manuale di subversion.
Definiamo per la nostra trattazione due server svn.
Il primo sarà chiamato master ed quello che farà la copia lo chiameremo slave.
Come prima cosa andiamo sul server slave e creiamoci un repository vuoto:
Su questo server verrà creato un utente che chiameremo per semplicità svnsync ed editiamo il file authz all’interno della directory mirror-repos/conf inserendo le seguenti direttive:
svnsync = rw
Adesso affinchè tutto funzioni, bisognerà modificare un paio di file di hook.
Per prima cosa copiamo il pre-revprop-change.tmpl:
Assicuriamoci di dare i permessi di esecuzione al file appena creato
ed editiamolo tramite il comando:
A questo punto inseriamo cancelliamo il contenuto del file e scriviamo:
USER="$3"
if [ "$USER" = "svnsync" ]; then exit 0; fi
echo "Solamente l’utente svnsync può alterare le proprietà" >&2
exit 1
Siamo a metà dell’opera!!
Spostiamoci adesso sul server master.
Qui dobbiamo crearci un’utente svnsync che però ha accesso in sola lettura rispetto al repository di cui vogliamo mantenere un mirror.
Ritorniamo sul server slave e diamo il comando:
Se la nostra versione di subversion è almeno la 1.5 potremmo dover utilizzare il seguente comando:
In ogni caso dovremmo ottenere come output dall’esecuzione di questi comandi la conferma di creazione della revision 0.
A questo punto per verificarne il funzionamento andremo ad eseguire la sincronizzazione vera e propria, e per farlo, dalla macchina slave eseguiremo:
(Per la versione 1.4)
(Per la versione 1.5 e successive)
Possiamo verificare il funzionamento facendo un checkout su entrambe i repository, e verificandone il contenuto.
A questo punto quello che ci interessa è fare in modo che ad ogni commit sul master, corrisponda un commit sullo slave.
Per farlo, andremo a modificare invece i seguenti files di hook sul master.
Qui inseriremo le seguenti righe:
(Per la versione 1.4)
REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"
svnsync –non-interactive copy-revprops –username svnsync –password password svn://slave/mirror-repos ${REV} &
(Per la versione 1.5 e successive)
REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"
svnsync –non-interactive copy-revprops –source-username svnsync –source-password password –sync-username svnsync –sync-password password svn://slave/mirror-repos ${REV} &
Editiamo adesso il file post-commit
Ed inseriamo le seguenti righe:
(Per la versione 1.4)
REPOS="$1"
REV="$2"
svnsync sync svn://slave/mirror-repos –non-interactive –username svnsync –password password &
(Per la versione 1.5 e successive)
REPOS="$1"
REV="$2"
svnsync sync svn://slave/mirror-repos –non-interactive –source-username svnsync –source-password password –sync-username svnsync –sync-password password &
Adesso se eseguiamo dei commit sul master, questi saranno automaticamente trasferiti sullo slave.
Ovviamente, potevamo creare un mirror in lettura/scrittura modificando ulteriormente lo slave, e facendo si che l’utente svnsync avesse privilegi di lettura/scrittura sul master.
Bisogna oltremodo con questa configurazione, prestare attenzione al fatto che se usiamo l’utente svnsync per eseguire dei commit sullo slave, questo altererà le revision e si perderà la sincronizzazione fra i due repository.
In ogni caso, questo esula momentaneamente dagli scopi che mi ero prefisso durante la stesura di questo post, ed eventualmente vedremo la creazione di un mirror in lettura/scrittura in un altro post.



Twitter
LinkedIn
Digg
Delicious
Leave a Reply