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:

svnadmin create mirror-repos

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:

[mirror-repos:/]
svnsync = rw

Adesso affinchè tutto funzioni, bisognerà modificare un paio di file di hook.
Per prima cosa copiamo il pre-revprop-change.tmpl:

cp mirror-repos/hooks/pre-revprop-change.tmpl mirror-repos/hooks/pre-revprop-change

Assicuriamoci di dare i permessi di esecuzione al file appena creato

chmod +x mirror-repos/hooks/pre-revprop-change

ed editiamolo tramite il comando:

vi mirror-repos/hooks/pre-revprop-change

A questo punto inseriamo cancelliamo il contenuto del file e scriviamo:

#!/bin/sh
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:

svnsync init –username svnsync –password password file:///svn/mirror-repos/ svn://master/mio_repository

Se la nostra versione di subversion è almeno la 1.5 potremmo dover utilizzare il seguente comando:

svnsync init –source-username svnsync –source-password password –sync-username svnsync –sync-password password file:///svn/mirror-repos/ svn://master/mio_repository

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)

svnsync sync –username svnsync –password password file:///svn/mirror-repos

(Per la versione 1.5 e successive)

svnsync –source-username svnsync –source-password password –sync-username svnsync –sync-password password file:///svn/mirror-repos

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.

vim mio_repository/hooks/post-revprop-change

Qui inseriremo le seguenti righe:
(Per la versione 1.4)

#!/bin/bash
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)

#!/bin/bash
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

vim mio_repository/hooks/post-commit

Ed inseriamo le seguenti righe:
(Per la versione 1.4)

#!/bin/bash
REPOS="$1"
REV="$2"
svnsync sync svn://slave/mirror-repos –non-interactive –username svnsync –password password &

(Per la versione 1.5 e successive)

#!/bin/bash
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.

VN:F [1.9.16_1159]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.16_1159]
Rating: 0 (from 0 votes)
Free PDF    Invia l'articolo in formato PDF