Servidor subversion con Gentoo

Hoy he creado un servidor subversión (reemplazo de CVS) en mi LAN. Para los que no conozcan subversión solo decir que se utiliza para el control de versiones de código fuente (o incluso de otros tipos de archivos como configuraciones), es muy parecido a CVS pero incorpora importantes novedades que lo hacen mejor y más flexible:

  • Versionado de directorios, movimientos y metadatos. Esta era una gran carencia en CVS, para mover un archivo de directorio o renombrarlo se perdia todo el historial del mismo.
  • Commits atómicos. Dos usuarios que intenten actualizar el repositorio en el servidor a la vez no se ven afectados por tal situacion.
  • Posibilidad de trabajar con apache, esto hace que nos podamos aprovechar de toda la tecnología de este magnífico servidor web. Es posible utilizar SSL (encriptación), trabajar remotamente utilizando el puerto estándar de los servidores web (puerto 80) el cual no suele estar bloqueado por los firewalls, autentificación de usuarios, etc…

Subversion utiliza apache 2 para servir por red y yo ya disponia de este bien configurado, por tanto parto de una buena situación 🙂 Lo primero ha sido emerger subversion, es importante tener en la variable USE activado “apache2” (es posible editar las USE con el comando ufed, emerge ufed ;-)) de lo contrario solo se nos instalará el cliente y no el servidor subversion:

emerge subversion

A continuación se necesita ejecutar la configuración del ebuild, como la versión instalada ha sido la 1.0.4-r1 se utilizará el correspondiente ebuild:

ebuild /usr/portage/dev-util/subversion/subversion-1.0.4-r1.ebuild config

Esto prepara el repositorio en /var/svn/repos/, a continuación debemos crear el fichero con los usuarios que vamos a dar acceso escritura al servidor subversion:

htpasswd2 -m -c /var/svn/conf/svnusers usuario1
htpasswd2 -m /var/svn/conf/svnusers usuario2
htpasswd2 -m /var/svn/conf/svnusers usuario3

El siguiente paso es editar el archivo de configuración del módulo subversion para apache2, se encuentra en /etc/apache2/conf/modules.d/47_mod_dav_svn.conf y por defecto contiene:

<IfDefine SVN>
        <IfModule !mod_dav_svn.c>
                LoadModule dav_svn_module       extramodules/mod_dav_svn.so
        </IfModule>
        <Location /svn/repos>
                DAV svn
                SVNPath /var/svn/repos
                AuthType Basic
                AuthName "Subversion repository"
                AuthUserFile /var/svn/conf/svnusers
                Require valid-user
        </Location>
</IfDefine>

Y yo lo he modificado a:

<IfDefine SVN>
   <IfModule !mod_dav_svn.c>
      LoadModule dav_svn_module  extramodules/mod_dav_svn.so
   </IfModule>
   <Location /svn/repos>
      DAV svn
      SVNPath /var/svn/repos
                                                                                                                                         
      # Para read-only no es necesario autentificacion
      <LimitExcept GET PROPFIND OPTIONS REPORT>
         AuthType Basic
         AuthName "Subversion repository"
         AuthUserFile /var/svn/conf/svnusers
         Require valid-user
      </LimitExcept>
   </Location>
</IfDefine SVN>

De esta forma limito el acceso total (escritura) solo para usuarios autentificados y permito acceso limitado (sólo lectura) a usuarios no autentificados.

Finalmente hay que indicar a Apache que coga la configuración de los módulos DAV y SVN, por tanto se ha de añadir “-D DAV -D SVN” en /etc/conf.d/apache2:

APACHE2_OPTS="-D SSL -D PHP4 -D DAV -D SVN"

En mi caso también aparece SSL y PHP4 ya que anteriormente ya habia configurado estos 2 módulos. Y ahora ya podemos reiniciar el servidor apache:

/etc/init.d/apache2 restart

Para comprobar que funciona podemos intentar acceder a través de nuestro navegador apuntando a “http://localhost/svn/repos/” o incluso, si tenemos configurado el SSL normal, automáticamente también podremos utilizar “https://localhost/svn/repos/”. Si no hay ningun error es que todo ha ido bien, pero evidentemente el repositorio esta vacio.

En un repositorio suelen ir proyectos que esten relacionados y que en ocasiones incluso compartan ficheros, de hecho, incluso las revisiones son generales para todo el repositorio. Si queremos tener proyectos muy bien diferenciados deberiamos crear diferentes repositorios. En mi caso me va bien con tener unicamente uno.

Para poder añadir un proyecto:

cd /home/user/directorio/proyecto1/
svn import . -m "Primera subida" http://localhost/svn/repos/proyecto1/

Para bajarlo y poder trabajar con el:

cd /home/user/trabajo/
svn checkout http://localhost/svn/repos/proyecto1/

Esto nos creará “/home/user/trabajo/proyecto1/” con el codigo fuente del repositorio, a partir de ese momento podemos trabajar con dicho código (podriamos usar https en lugar de http para que la comunicación se realice cifrada bajo SSL), cuando queramos subir nuestras modificaciones de nuevo al repositorio:

cd /home/user/trabajo/proyecto1/
svn commit -m "Nuevo comentario"

Imaginemos que pasamos unas horas/dias sin modificar el código y queremos actualizarlo con la ultima versión del respositorio ya que es muy probable que algun otro programador haya subido cambios:

cd /home/user/trabajo/proyecto1/
svn update

Si continuamos modificando y añadimos un nuevo fichero al proyecto, es decir, imaginemos que teniamos 2 ficheros (“codigo.cs” y “main.cs”) y creamos uno nuevo llamado “objetos.cs”, debemos informar a subversion que lo debe incluir (funcionaria igual para subdirectorios con más ficheros, bastaria indicar el subdirectorio):

cd /home/user/trabajo/proyecto1/
svn add objetos.cs

Los cambios no seran efectivos en el servidor hasta que no se realice un commit:

cd /home/user/trabajo/proyecto1/
svn commit

Hay comandos con los que he especificado -m “texto”, esto sirve para añadir explicaciones a los cambios que hacemos. En caso de que no especifiquemos -m se abrirá el editor especificado en la variable de entorno SVN_EDITOR, como acostumbro a utilizar vi he añadido a mi .bash:

export SVN_EDITOR=vim

Cabe destacar que aqui he explicado la forma de configurar un servidor de subversión pero es posible tener un repositorio local, para el uso de una sola máquina de forma que no es necesaria la configuración de apache. Por supuesto en esta modalidad perdemos la posibilidad de que varios programadores accedan desde sus PCs al repositorio, pero puede resultar útil cuando queremos trabajar nosotros solos en algun proyecto y nos gusta utilizar control de versiones para poder deshacer cambios en cualquier momento. Para trabajar asi basta con crear un repositorio:

svnadmin create /home/usuario/repo

Y en todos los comando que antes hemos visto y utilizabamos el protocolo http://…. ahora se substituirá por file:///home/usuario/repo/, por ejemplo:

svn checkout file:///home/usuario/repo/

Estos serian los comandos más básicos, los que hayais utilizado ya CVS vereis que es muy similar su uso y por tanto la curva de aprendizaje es practicamente inexistente. Si ejecutais “svn help” podreis ver un listado rápido de todos los comandos disponibles, también es posible utilizar una herramienta gráfica llamada RapidSVN (emerge rapidsvn) con versiones para GNU/Linux y MS Windows. Para una información detallada y profunda lo mejor es consultar este libro: Version Control with Subversion.

2 thoughts on “Servidor subversion con Gentoo

Leave a Reply

Your email address will not be published. Required fields are marked *