Guida rapida alla configurazione del servizio svn

 


Svn o subversion è un SCM molto conosciuto ma a me ignoto fino a qualche giorno fa. Fino ad ora mi ero appoggiato a cvs per le mie (scarse) esigenze di revision control.
Il motivo per cui mi sono ritrovato a smanettare con svn si saprà tra un pò. Per il momento in questo post mi limito a dare delle linee guida per una rapida implementazione del servizio.



Riferimenti:

la documentazione ufficiale è estesa e ottima, non serve altro: sicuramente da leggere con pazienza e da sperimentare passo (è stata realizzata seguendo il processo top-down)
 

Ambiente:

Svn, a differenza di git (altro SCM molto in voga e rinomato per essere il sistema usato dagli sviluppatori del kernel linux), è un sistema centralizzato, quindi prevede 1 server e N client. Si potrebbero avere 2 o più server in ottica di ridondanza ma non lo considero al momento.

Uso un server debian lenny (S) e un client ubuntu hardy (C).

Idee che stanno alla base di questa guida:

  1. usare 1 repository per ogni progetto (politica discutibile, ma nel mio caso è quello che mi serve)
  2. configurare svn per essere accessibile via web senza aprire porte diverse dalla 80
  3. mantenere un controllo piuttosto stretto dei diritti di accesso ai singoli repository


Per svn esistono 2 metodi per accedere ai repository, uno via svnserve e uno mediante un modulo di apache che si appoggia sul modulo dav. Esistono poi diversi meccanismi di autenticazione. Mi concentro su apache ed uso l'autenticazione via htaccess, salto gli altri possibili metodi , anche se mi stuzzica non poco l'autenticazione contro LDAP [per la quale si può prendere spunto da qui].
 

Configurazione:

Lato server: (presuppongo un apache2 già funzionante)

apt-get install libapache2-svn subversion subversion-tools


Per i repository mi organizzo cosi: creo una directory svn che conterrà N sottodirectory, dove N è il numero di progetto ospitati (ad es. il progetto hello_world [si, la fantasia è il mio forte!]).

mkdir /svn/hello_world -p
chown www-data:www-data -fR /svn
svnadmin create /svn/hello_word


Questa è la struttura che assume il repository:

.
|-- README.txt
|-- conf
|   |-- authz
|   |-- passwd
|   `-- svnserve.conf
|-- dav
|   `-- activities.d
|-- db
|   |-- current
|   |-- format
|   |-- fs-type
|   |-- revprops
|   |   `-- 0
|   |       |-- 0
|   |       |-- 1
|   |       |-- 2
|   |       `-- 3
|   |-- revs
|   |   `-- 0
|   |       |-- 0
|   |       |-- 1
|   |       |-- 2
|   |       `-- 3
|   |-- transactions
|   |-- txn-current
|   |-- txn-current-lock
|   |-- txn-protorevs
|   |-- uuid
|   `-- write-lock
|-- format
|-- hooks
|   |-- post-commit.tmpl
|   |-- post-lock.tmpl
|   |-- post-revprop-change.tmpl
|   |-- post-unlock.tmpl
|   |-- pre-commit.tmpl
|   |-- pre-lock.tmpl
|   |-- pre-revprop-change.tmpl
|   |-- pre-unlock.tmpl
|   `-- start-commit.tmpl
`-- locks
    |-- db-logs.lock
    `-- db.lock

 

Il manuale di svn indica più di un modo per gestire gli accessi ai repository (acl). Tra questi ho scelto apache. Riassumendo anticipatamente quello che scriverò tra poco, utilizzerò apache per effettuare l'autenticazione dell'utente (determino CHI ha accesso) mentre utilizzero le acl di svn per limitare l'accesso a repository o a sottodirectory di repository (determino A COSA ha accesso).


Abilito i moduli per apache2 (dovrebbero già essere abilitati ma un double check non fa mai male)

a2enmod dav dav_svn

se è necessario, riavvio apache2.

Configuro apache2 per indicare al modulo dav_svn dove si trova il repository e quali acl voglio che siano implementate:

vim /etc/apache2/apache2.conf 


in fondo al file aggiungo:

#Questo indica ad apache che quando arriva una richiesta da un client per http://hostname/svn significa che il client vuole accedere ai repository contenuti in /svn
<Location /svn>
  DAV svn

  #Questo indica ad apache che la directory /svn contiene più di un repository
  SVNParentPath /svn

  #Questo consente
  SVNListParentPath on

  # significa: al primo tentativo di accesso assumi che sia un accesso anonymo.
  # in seconda battuta, se necessario richiedi l'autorizzazione
  Satisfy Any
  Require valid-user

 # autenticazione utente
  AuthType Basic    #ATTENZIONE! usando Digest non funziona più l'autenticazione [qualcuno sa il perchè?]
  AuthName "Spippolo svn repository"  #nome del repository
  AuthUserFile /etc/svn/auth-file  #file che contiene utenti e password
  AuthzSVNAccessFile /etc/svn/authz   #file che contiene le acl per gli utenti
</Location>

#Dirotto i log legati a svn su di un file esterno a quello di apache per non sporcarlo
CustomLog /var/log/svn_logfile "%t %u %{SVN-ACTION}e" env=SVN-ACTION


aggiungo l'utente damko

mkdir /etc/svn
#uso cifratura md5
htpasswd -cm /etc/svn/auth-file dam

al prompt inserisco la password per l'utente dam

Ora che ho un utente posso configurare le acl per l'utente dam e per il progetto hello_world. Uso il modello di file fornito da svn
cp /svn/hello_world/conf/authz /etc/svn/

Edito il file delle acl e lo modifico in modo che l'utente dam abbia accesso in lettura / scritttura al repository in modo che possa effettuare i commit.

vim /etc/svn/authz
[aliases]
# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average

[groups]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe

# tutti hanno accesso in lettura a qualunque repository salvo eccezioni
[/]
* = r

[hello_world:/]
dam = rw
* = r

volendo potrei anche definire una politica più fine per il singolo repository: ad es. potrei inibire l'accesso in scrittura per l'utente dam alla sottodirectory branches del progetto hello_world in questo modo e impedire l'accesso, anche in lettura a tutti gli altri utenti.

[hello_world:/branches/]
dam = r
* = 


riavvio apache2

apache2ctl restart


Test:

Se accedo via browser all'indirizzo http://hostname/svn mi viene chiesta username e password. Fornendo le credenziali vedo la lista dei progetti ospitati.

Se accedo via browser all'indirizzo http://hostname/svn/hello_world ho accesso anche senza credenziali

Lato client:

apt-get install libapache2-svn subversion


Questo mi consente di usare i comandi di svn, update checkout, commit ... ma questa è un'altra storia per un altro post.
 

Commenti

"Svn o subversion è un SCM

"Svn o subversion è un SCM molto conosciuto ma a me ignoto fino a qualche giorno fa. Fino ad ora mi ero appoggiato a cvs per le mie (scarse) esigenze di revision control.
Il motivo per cui mi sono ritrovato a smanettare con svn si saprà tra un pò. Per il momento in questo post mi limito a dare delle linee guida per una rapida implementazione del servizio."
Thanks for the information

Invia nuovo commento

Il contenuto di questo campo è privato e non verrà mostrato pubblicamente.
  • Indirizzi web o e-mail vengono trasformati in link automaticamente
  • Elementi HTML permessi: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Linee e paragrafi vanno a capo automaticamente.
  • Internal paths in double quotes, written as "internal:node/99", for example, are replaced with the appropriate absolute URL or relative path.

Ulteriori informazioni sulle opzioni di formattazione

CAPTCHA
Questa domanda serve per verificare che tu sia un visitatore umano (non un computer) e per prevenire lo spam
Image CAPTCHA
Scrivi ció che vedi nella immagine.