Despabilando la MonoNeurona::Internet es de todos [Inicio] [Regresar]
Desarrollo \ Apuntes sobre Subversion
Desarrollo
Apuntes sobre Subversion

Este artículo ha sido consultado en 1,969 ocasiones.

¿Qué es Subversion? 

Subversion es un sistema de control de versiones (SCV), (CVS en inglés). Un sistema de control de versiones permite a muchos desarrolladores tomar, editar y colocar código en los mismo archivos de manera ordenada y sin temor a sobreescribir y perder el trabajo de otros. Subversion fue creado con la idea de subsanar las deficiencias, limitaciones e incomodidades del viejo CVS y es por ello que muchas empresas y grupos de desarrolladores están haciendo la migración CVS->Subversion.

Subversion no sólo sirve para programadores, cualquier grupo de trabajo que comparte información puede (y debería) usarlo, un grupo de traductores o los contadores que están haciendo un reporte semestral se beneficiaran si usan Subversion. En verdad Subversion es excelente y sencillo de usar.

Un SCV tiene un repositorio en el servidor que contiene los archivos, los programadores toman (copian) los archivos del servidor a su equipo y los editan con el programa de su elección (Vim, Jedit.org, Emacs, Eclipse), a esta copia se le llama "Copia de trabajo". Es decir, hay un sólo repositorio en el server, pero muchas copias de trabajo, una por cada desarrollador que participe en el proyecto. Luego de que ha terminado de editar los archivos, el usuario hace un "commit" para sincronizar los archivos de su copia de trabajo con los archivos del repositorio del server.

Como usted ya estará pensando, esto crea un problema: si el usuario_1 toma una copia del repositorio y minutos después el usuario_2 toma otra copia, habrá dos copias y cualquier usuario puede sobreescribir el trabajo de otro miembro del equipo.

La mayoría de los SCV resuelven este problema bloqueando un archivo para que un usuario lo edite, lo salve y lo libere. Esta aproximación tiene muchas limitaciones pues si, por ejemplo, Martha toma el archivo "clientes.html", los otros miembros del equipo deben esperar a que el archivo esté disponible, si a Martha se le olvida liberarlo y sale de la oficina, hay que hablar con el administrador del sitio para liberar el documento, pero entonces Martha tendrá una copia "colgada", pues la editó pero no la sincronizó con el repositorio.

Subversion no tiene esta limitación pues aunque Martha tenga "clientes.html", Luis o Enrique pueden cada uno sacar su copia para trabajar en ella. Cuando los tres concluyen Subversion pone una bandera indicando que hace falta hacer un "merge" o conjunción de archivos. Subversion es lo suficientemente inteligente para no guardar todo el contenido de las versiones de "clientes.html" que Martha, Luis y Enrique producen: sólo guarda las líneas que cambiaron entre versiones y asi se ahorra mucho espacio en disco.

Sin embargo alguien debe abrir las tres versiones nuevas y hacer el "merge" para producir la nueva versión conjunta. Existen programas, como Trac, que facilitan el proceso pues resaltan las líneas que cambiaron entre versiones del mismo documento al tiempo que indican las diferentes fechas y horas de actualización de cada versión.

Instalación 

Por lo general Subversion se apoya en Apache2 y sus módulos Webdav, SVN y SSL para implementar la seguridad y la distribución de los archivos. Para instalar Subversion en Debian/Ubuntu:

$sudo apt-get install apache2 libapache2-svn libapache-mod-dav  openssl ssl-cert subversion subversion-tools

tanto el cliente como el server están en el paquete "subversion".

En el server

Para crear un repositorio nuevo:

$svnadmin create repos

En este caso estoy como usuario www-data en /var/morg/svn/public/, este directorio repos nunca debe ser editado a mano, siempre a través de los comandos de Subversion.

En Apache2 los módulos webdav y SSL deben estar instalados:

$sudo a2enmod ssl
$sudo a2enmod dav
$sudo a2enmod svn

El puerto 443 debe estar habilitado: 

$sudo echo "Listen 443" >> /etc/apache2/ports.conf

Generamos el certificado de seguridad: 

$sudo openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem

Mi archivo de configuración de apache2 es así:

<virtualhost 122.148.107.10:443>
            ServerAdmin admin@mononeurona.org
            ServerName devel.mononeurona.org
            DocumentRoot /var/morg/svn/public/repos
           ServerAlias devel.mononeurona.org
           Options Indexes FollowSymLinks MultiViews
            SSLEngine On
            SSLCertificateFile /etc/apache2/ssl/apache.pem
            <location />
            Order allow,deny       
            Allow from all       
            DAV svn       
           #SVNParentPath /var/morg/svn/public  <-- esto no sirvio
            SVNPath /var/morg/svn/public/repos
            SVNAutoVersioning On
            Require valid-user       
            AuthType Basic       
            AuthName "MonoNeurona Subversion Repository"
        AuthUserFile /var/morg/svn/.dav_svn.passwd
        #grupos: karamelo, centauro de SVN
        AuthzSVNAccessFile /etc/apache2/svn/authz
        </location>   

      ErrorLog /var/morg/svn/log/error.log   
      # Possible values include: debug, info, notice, warn, error, crit,   
      # alert, emerg.   
        LogLevel warn   
        CustomLog /var/morg/svn/log/access.log combined               
</virtualhost>

Mi archivo /etc/apache2/svn/authz es así:

[groups]
owner    = aarkerio, karlos
karamelo = lukas, roberto, colotto
centauro = arturo, rasta, dereck
newbies  = anonymous

[/]
@owner    = rw
@karamelo = r
@newbies  = r

[centauro:/]
@owner    = rw
@centauro = rw
@newbies  = r

[karamelo:/]
@owner    = rw
@karamelo = rw
@newbies  = r

Para agregar usuarios que sean autentificados por Apache:

$sudo htpasswd  -c -m /var/morg/svn/.dav_svn.passwd aarkerio
$sudo htpasswd  -m /var/morg/svn/.dav_svn.passwd anonymous 

Al usuario anonymous, que sólo puede leer los repositorios pero no escribir en ellos, le ponemoos el password "1234". 

Nótese que, como indicamos, es Apache y no Subversion el encargado de la seguridad, es por ello que en Subversion no se colocan passwords: el archivo /etc/apache2/svn/authz no entra en acción sino hasta despúes que el usuario ha pasado la aduana de Apache.

Reiniciamos Apache2: 

$sudo /etc/init.d/apache2 restart

Trunk, branches, tags

Generalmente los repositorios de subversion tiene tres directorios:

repos/
  myproject/
     trunk/
     tags/
     branches/

a) Trunk - Este es el directorio principal de desarrollo, aquí es donde casi siempre trabajamos

b) Tags - Este es el directorio de las versiones de liberación y de las alpha/beta, es un directorio "muerto", cada vez que hay una nueva versión, se coloca en tags para el histórico y hacer el archivo project-version.tar.gz  y se sigue trabajando en trunk

c) branches -Este es el directorio de las pruebas, si alguien desea intentar algo nuevo o hacer un experimento, lo desarrolla aqui y si resulta y el grupo lo acepta, se mueve al trunk  

Para crear este árbol:

$svn --username aarkerio mkdir https://devel.mononeurona.org/karamelo -m "create project directory"
$svn mkdir https://devel.mononeurona.org/karamelo/trunk -m "create trunk directory"
$svn mkdir https://devel.mononeurona.org/karamelo/tags -m "create tags directory"
$svn mkdir https://devel.mononeurona.org/karamelo/branches -m "create branches directory"  

Ahora bien, supongamos que nuestro desarrollo está en /var/www/projects/karamelo, para colocar nuestro proyecto en el repositorio:

$svn  import /var/www/projects/karamelo https://devel.mononeurona.org/karamelo/trunk -m "initial import" 

Nos pedirá el password y el proyecto será puesto en el repositorio.

NOTA: Si tienes un archivo como my_database.php con el nombre de usuario y el password de la base de datos, muévelo a otro direcotiro ANTES de subir el proyecto, pues ese archivo no debe formar parte del proyecto.

En el cliente 

Bien, ya tenemos el código en nuestro repositorio, ahora supongamos que hay alguien que quiere ayudar en el proyecto, este usuario necesita tomar el código del proyecto para trabajar de manera local, esto lo hace con la opción checkout (co) del comando svn:

$svn --username anonymous co https://devel.mononeurona.org/karamelo/trunk

el usuario tendrá que teclear el password "1234". En el cliente todo lo relacionado con subversion se hace con el comando svn, para ver todas sus opciones:

aarkerio@prieta:~/karamelo$ svn help
uso: svn <subcomando> [opciones] [pars]
Cliente Subversion de línea de comandos, versión 1.4.2.
Tipee 'svn help <subcomando>' para ayuda sobre un subcomando específico.
Tipee 'svn --version' para ver la versión y los módulos de RA.
    o 'svn --version --quiet' para ver sólo el número de versión.

La mayoría de los subcomandos reciben parámetros de tipo archivo y/o
directorio.  Si no se proveen parámetros a estos comandos, por omisión
descenderán recursivamente desde el directorio actual (incluyéndolo).

Subcomandos disponibles:
   add
   blame (praise, annotate, ann)
   cat
   checkout (co)
   cleanup
   commit (ci)
   copy (cp)
   delete (del, remove, rm)
   diff (di)
   export
   help (?, h)
   import
   info
   list (ls)
   lock
   log
   merge
   mkdir
   move (mv, rename, ren)
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
   resolved
   revert
   status (stat, st)
   switch (sw)
   unlock
   update (up)

Subversion es una herramienta para control de versiones.
Para información adicional, vea http://subversion.tigris.org/
 

Por ejemplo, para ver el contenido de un archivo en el repositorio sin necesidad de descargarlo:

$svn cat  https://devel.mononeurona.org/karamelo/trunk/app/controllers/users_controller.php

Poco a poco conocerá todas las opciones de svn, que son pocas y muy sencillas de usar.

Bien el usuario ya posee el código, a esto como dijimos se le llama "copia de trabajo". Ahora él puede editar y trabajar con su copia, puede por un lado editar un archivo existente y por otro lado agregar un archivo al árbol. El comando st (status):

$svn st

Nos presenta los cambios que existen entre la copia de trabajo y el repositorio:

M      trunk/app/controllers/faqs_controller.php
?       trunk/app/views/faqs/show.thtml

En este caso el archivo faqs_controller.php es señalado con una M de modificado (modified) mientras el archivo show.thtml muestra un signo de interrogación (?) pues recién lo hemos creado con Jedit.org y Subversion no lo tiene en el repositorio, para agregar este archivo usamos la opción add.

$svn add  trunk/app/views/faqs/show.thtml
A         trunk/app/views/faqs/show.thtml

Subversion lo marca con una A de agregar (Add), es decir que lo hemos agregado a la copia local pero no en el repositorio del server. Para subir nuestros cambios al server usamos la opción commit (ci):

$svn ci -m "Mis primeros cambios del 13 Marzo del 2007" 
Enviando       trunk/app/controllers/faqs_controller.php
Añadiendo      trunk/app/views/faqs/show.thtml
Transmitiendo contenido de archivos ..
Commit de la revisión 2.

Pero como ya estará sospechando, el usuario anonymous no puede hacer commit pues sólo tiene permisos de lectura en /etc/apache2/svn/authz, para que un usuario pueda participar en un proyecto editando y agregando archivos tiene que ponerse en contacto con el líder de proyecto y pedir una cuenta con password de escritura.

Ignorar archivos

Hay algunos archivos que no queremos que se incorporen al repositorio, por ejemplo el archivo app/config/database.php es una archivo que necesito para desarrollar pero dado que tiene mi password no quiero que se agregue al repositorio. Para ignorar este archivo:

$svn propedit svn:ignore app/config/  <-- esto abrira un editor, aqui escribimos el archivo o archivos que queremos que sean ignorados de ese directorio
$svn update
$svn ci -m "Actualizo todo"

Otra manera de ignorar el archivo banner.png en un directorio:

$svn propset svn:ignore banner.png  trunk/app/webroot/img/imgusers/ 

Subversion y Trac

Por lo general Subversion se instala con Trac, este poderoso programa es una aplicación Web que ayuda a documentar y darle seguimiento a los bugs del programa que se está desarrollando. Podemos bajar Trac con subversion e instalarlo:

$svn co http://svn.edgewall.com/repos/trac/trunk Trac

$cd Trac

$./setup.py install

Trac también necesita su instancia de apache2:

<virtualhost 122.148.107.10:80>
            ServerAdmin admin@myserver.org
            ServerName trac.myserver.org
              DocumentRoot /var/morg/trac
              ScriptAlias /trac /usr/share/trac/cgi-bin/trac.fcgi
             
              <Directory /var/morg/trac>
                  AddDefaultCharset utf-8
                  Options Indexes FollowSymLinks MultiViews
                  AllowOverride All
                  Order allow,deny
                  Allow from all
                </Directory>
             
            ErrorLog /var/morg/chipotle/log/error.log   
            # Possible values include: debug, info, notice, warn, error, crit,   
            # alert, emerg.
            #HostNameLookups on
            #UseCanonicalName on
            ErrorDocument 404 http://www.myserver.org/perdido.php  
            LogLevel warn   
            CustomLog /var/morg/chipotle/log/access.log combined       
</virtualhost>

 

SVN tagging 

Ejemplo de como usar el directorio tags para liberar una nueva versión, además de respaldar el desarrollo:

1) Copy: 

$svn copy https://devel.mononeurona.org/karamelo/trunk https://devel.mononeurona.org/karamelo/tags/alpha-release-0.1 -m "Tagging the 0.1 alpha release of the 'Karamelo' project."

2) Export: 

$svn export https://devel.mononeurona.org/karamelo/tags/alpha-release-0.1/ /tmp/alpha-release-0.1

3) Compress: 

tar cfz /var/morg/ftp/pub/karamelo/karamelo-alpha-0.1.tar.gz   /tmp/alpha-release-0.1/ 

4) Clean: 

$rm -Rf /tmp/alpha-release-0.1

5) Backup your repository:

$svnadmin dump /var/morg/svn/public/repos/ | gzip -9 > svn-dump-karamelo-until-R47.gz

 

Hasta aquí estos apuntes sobre Subversion. 

 


Última actualización: 2007-04-29 10:57:00-05



ir arriba
The Queen is here Mozilla Firefox The Best DataBase CakePHP Framework CSS GNU Hacker