Replikacja repozytoriów SVN

Replikacja repozytorium pozwala nam automatyczne tworzenie kopii zapasowej lub szybkie uruchomienie serwera do którego można wysyłać zmiany, gdy serwer główny ulegnie awarii.

Postanowiłem umieścić repozytoria pod adresem „/svn”, więc dodaję lokalizację do Apache’a:

<Location /svn>
    DAV svn
    SVNParentPath /path/to/repos
    SVNMasterURI https://url.to.repos/svn
    AuthType Basic
    AuthName "Subversion Repositories"
    AuthUserFile /path/to/passwd/file
    AuthzSVNAccessFile /path/to/authz/file
    Require valid-user
</Location>

To wystarczy, aby przeglądać repozytoria przez WWW, ale nie wystarczy do poprawnego działania serwera slave. Wszelkie próby modyfikacji danych będą przesyłane na serwer główny, ale pobieranie danych zawsze będzie odbywać się ze slave’a. Z racji tego, że korzystamy z protokołu HTTPS, musimy włączyć SSLProxyEngine dla domeny, którą będziemy wykorzystywali do komunikacji z repozytoriami.

<VirtualHost *.443>
    DocumentRoot /path/to/websvn
    ServerName url.to.svn
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/key.pem
    SSLProxyEngine On
    <Directory /path/to/websvn>
        Allow from all
        Options -Indexes
    </Directory>
</VirtualHost>

ppp

svnsync --source-username=masterusername --source-password=masterpassword --sync-username=slaveusername --sync-password=slavepassword init file:///path/to/repository https://url.to.svn/repository

Polecenie zakończy się komunikatem:

Copied properties for revision 0.

Dodatkowo, możemy zweryfikować czy synchronizacja została skonfigurowana prawidłowo przy pomocy polecenia:

svn propget svn:sync-from-url --revprop -r 0 file:///path/to/repository

Polecenie zwróci adres głównego repozytorium. W naszym przypadku to:

https://url.to.svn/repository

Synchronizujemy repozytorium:

svnsync sync file:///path/to/repository

W moim repozytorium była tylko jedna rewizja, więc synchronizacja zakończyła się komunikatem:

Committed revision 1.
Copied properties for revision 1.

Zanim zaczniemy testować zatwierdzanie zmian, upewniamy się, że Apache posiada zainstalowany i aktywny moduł proxy i proxy_http:

a2enmod proxy
a2enmod proxy_http
/etc/init.d/apache2 restart

Tworzymy kopie robocze repozytorium z serwera master oraz slave. Modyfikujemy kopię roboczą pobraną z serwera slave i zatwierdzamy zmiany. Zatwierdzanie zmian powinno wykonać się poprawnie. Teraz możemy uaktualnić kopię z serwera master, ta operacja również wykona się poprawnie, ale odświeżenie kopii z serwera slave zakończ się błędem:

Error: REPORT of '/svn/test/!svn/vcc/default': Could not read chunk size: Secure
Error: connection truncated (https://url.to.repository)

Sprawdzenie dziennika błędów Apache’a da nam wskazówkę co poszło nie tak:

tail /var/log/apache2/error.log
A failure occurred while driving the update report editor [500, #160006]
No such revision 4 [500, #160006]

Automatyczną synchronizację możemy wykonywać przy pomocy hooków w głównych repozytoriach.

Aby uniknąć pytań o zapisywanie haseł:

-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:

    Subversion Repositories

can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/root/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)?

w pliku /root/.subversion/servers należy odszukać linię „# store-plaintext-passwords = no” i usunąć komentarz (znak #) z początku linii.

Błąd związany z wersją

Rozwiązaniem poniższego problemu:

svnsync: warning: W200007: Target server does not support atomic revision property edits; consider upgrading it to 1.7 or using an external locking program
svnsync: E000022: Couldn't get lock on destination repos after 10 attempts

Jest skasowanie blokady:

svn propdel --revprop -r0 svn:sync-lock file:///path/to/repository

Linki

http://www.slideshare.net/normanmaurer/apacheconeusvnreplication

http://stackoverflow.com/questions/4077601/svnsync-couldnt-get-lock-on-destination-repos

Ten wpis został opublikowany w kategorii Linux, SVN. Dodaj zakładkę do bezpośredniego odnośnika.