====== Servidor SVN ======
Este servicio nos permite mantener un //Control de Versiones// que es el arte del manejo de los cambios en la información, pudiendo ser esta un código, una aplicación, documentos, esquemas, etc...
Este tema ha sido durante mucho tiempo un tema crítico para los desarrolladores o programadores, quienes normalmente emplean su tiempo en hacer cambios en el software y después deshaciendo esos cambios o realizando otros.
Pero la utilidad del //Software de Control de Versiones// se extiende mucho más allá de los límites del mundo del desarrollo de software. Allá en donde pueda encontrarse gente frente a computadores manejando información que es modificada a menudo, hay un //gran espacio// para el **Control de Versiones** y aquí es donde entra el juego **SubVersión o SVN**.
===== Que es Subversión =====
{{ :informatica:svn_arch.png|Esquema SVN}}
Subversión es un sistema de control de versiones libre y de código fuente abierto.
Es decir //Subversión// maneja archivos y directorios a través del tiempo. Hay un árbol de archivos en un repositorio central.
El repositorio es como un servidor de archivos común, excepto porque recuerda todos los cambios hechos a sus archivos y directorios.
Esto permite recuperar versiones antiguas de sus datos, o examinar el historial de cambios de los mismos, esto permite desde este punto de vista, disponer de una //maquina del tiempo para los archivos//.
//Subversión// puede acceder al repositorio definido a través de redes, lo que permite ser usado por personas que se encuentran es distintas máquinas o distintos lugares físicos.
Bueno conociendo estos rasgos generales podemos dedicarnos a la configuración y puesta en servicio del sistema de control de versiones.
===== Instalando el Servidor =====
Lo primero que debemos hacer es instalar el //Servidor de Subversión//, este es una máquina corriendo algún Unix para la implementación del sistema, en nuestro caso hemos puesto en servicio un FreeBSD-7.1 como servidor de Subversión.
==== Como instalamos Subversión ====
La instalación en FreeBSD es bastante simple, así como tambien en otros sistemas operativos como Debian, Fedora y otros, aquí nos concentraremos en FreeBSD.
La instalación de Subversión:
# cd /usr/ports/devel/subversion && make install clean
Con ello queda instalado el servidor de versiones en nuestro sistema.
==== Como corremos el Servidor ====
Uno de los detalles importantes antes de correr el servicio, es que el //administrador// tenga conciencia que no debemos correr este servicio con privilegios de //root//, para ello generamos un usuario y grupo que correrá el servicio, esto limita fuertemente las posibilidades de que puedan aprovecharse de correr otros servicios o comandos de administrador sobre el servidor de desarrollo.
=== Crear Grupo y Usuario ===
Para realizar esta tarea en nuestra maquina FreeBSD, lo que haremos es correr los siguientes comandos:
Crear Grupo:
# pw groupadd developer
Creamos al Usuario:
# pw useradd svn -g developer
Con los comandos anteriores tenemos creados al grupo y al usuario, al cual lo hemos agregado al grupo //developer//.
=== Como corremos el Servicio SVN ===
Antes de ejecutar un comando, lo que debemos tener en cuenta es que correremos el servicio como demonio y no bajo plataforma WEB, esto es porque simplemente ocupa menos recursos, su ejecución en notoriamente más rápida y requiere menos recursos de máquina.
Teniendo esto en cuenta, lo que haremos es conectarnos a la maquina via SSH como usuario //svn//. Suponiendo que tenemos un directorio creado que llamaremos **/home/repositorios** y que corresponde al $HOME del usuario **svn**.
ssh svn@dartagnan --> Nos logeamos correctamente
Si estamos logeados y en el home del usurio.
$ svnserver -d -r /home/repositorios
El servicio SVN habre el puerto 3690 udp/tcp, cosa que podemos ver con un **nmap** y lo que además hemos logrado es correr el servicio como usuario y no como //root//, esto no nos deja tomada la terminal y podemos verificar el servicio con el comando //ps -aux//.
===== Como creamos un Proyecto? =====
Para crear proyectos, lo que debemos hacer es //logearnos// en la maquina servidora como usuario dueño del repositorio, una vez dentro de la maquina que proporciona el servicio, lo que haremos es ejecutar el siguiente comando:
$ svnadmin create --fs-type fsfs nombre_del_proyecto
Lo que hace el servidor **SVN** es crear la estructura del repositorio completo. La cual mostramos como ejemplo:
svn developer 229 Jan 30 11:32 README.txt
svn developer 512 Jan 30 11:35 conf/ --> Aquí dentro definimos la configuración del proyecto.
svn developer 512 Jan 30 15:44 db/
svn developer 2 Jan 30 11:32 format
svn developer 512 Jan 30 11:32 hooks/
svn developer 512 Jan 30 11:32 locks/
Se muestran sólo en //owner//, //group//, tamaño, fecha, hora y nombre de archivo y directorio. Dentro del directorio **conf/**, es donde SVN pone los archivos de configuración del repositorio que hemos creado recientemente, el que contiene tres archivos, estos son:
svn developer 1080 Jan 30 11:32 authz
svn developer 309 Jan 30 11:32 passwd
svn developer 2278 Jan 30 11:35 svnserve.conf
El archivo que define las políticas de funcionamiento del servidor SVN es //svnserve.conf//.
===== Clientes de SVN =====
Los clientes SVN que deben correr en las maquinas donde se encuentran los repositorios locales, es decir por el lado del usuario, hay varios clientes graficos (kdesvn, gnubversion y otras), pero lo mejor es **trabajar por consola**, ya que ahí se sabe con claridad que está pasando con el servicio y que cosas se han realizado con los repositorios centrales.
==== Como bajamos el Proyecto al Repositorio local ====
Para bajar un proyecto, lo que debemos hacer por el lado del cliente es disponer de un directorio de trabajo en donde dejaremos //nuestra copia local del proyecto//, aquí se generarán todos los archivos de control del proyecto y nos permitirá actualizar el repositorio central o bajar las ultimas versiones de los archivos que se encuentren en este.
Para realizar una copia local del proyecto, debemos crear un directorio de trabajo y cambiarnos dentro de este y correr solo la __primera vez__ el comando para la generación del proyecto como //copia local//, para ello corremos en nuestra consola:
$ svn checkout svn://dartagnan/nombre_del_proyecto ==> Comando largo del checkout
$ svn co svn://dartagnan/nombre_del_proyecto ==> Comando corto del checkout
El cliente SVN se comunica con el servidor central donde se encuentra el repositorio del proyecto identificado con //nombre_del_proyecto// y genera en el directorio donde estamos parados (nuestro espacio de trabajo local), los contenidos de los archivos de control del proyecto que los deja en unos subdirectorios escondidos definidos como **.svn/**, dentro de nuestro directorio de trabajo local. Con esto tenemos todo lo necesario ya para poder trabajar sobre nuestros archivos.
==== Espacio local de Trabajo ====
Al realizar nuestro primer contacto con el servidor SVN, corriendo el "//svn checkout//", como hemos visto se han creado sólo los archivos de control del proyecto pero en verdad no se ha creado //nada// del proyecto en si, por lo que ahora veremos como empezar a definir las cosas dentro del proyecto.
=== Estructura de Directorios ===
Existen varios modelos pero la propuesta es a tener una estructura mas universal, la cual pasaremos a indicar, existen 3 directorios en la raíz del proyecto, estos son:
TRUNKs - Directorio principal de desarrollo del proyecto. Aquí se deja la documentación, requerimientos, diseño del proyecto y código fuente.
TAGs - Directorio de marcas del desarrollo, iteraciones (cada vez que se termina una, se copia aqui TRUNK) y releases o versión terminada.
BRANCHs - Directorio en donde se hacen las bifurcaciones del proyecto, es decir son derivaciones distintas generadas a partir del proyecto principal.
== Definiciones Generales ==
**TRUNK** Este es el directorio raíz o principal del proyecto en donde se deben generar la documentación detallada de este, entre esta la toma de requerimientos, el análisis, diseño, implementación, pruebas de concepto, los manuales del usuario, manual de instalación, manuales de administración si son necesarios y la documentación de la puesta en servicio.
**TAGs** Directorio de marcas del desarrollo, en donde se encuentran las iteraciones y los releases.
* Iteraciones: Cada vez que se termina una iteración, se hace una copia del TRUNK aquí con el formato YYYYMMDD_ITER_Nro
* Releases: Cada vez que se entrega el producto, se hace una copia de la iteración que generó el release aquí, con formato YYYYMMDD_RELEASE_Nro.
**BRANCHs** Este directorio es creado para generar en él copias que pueden servir del proyecto original para generar un subproducto o para una determinada versión de un código o parte de él que pueda ser utilizado en otro proyecto.
----
==== Como incorporamos estos Directorios al Proyecto ====
Para incorporar estos directorios al proyecto en __nuestra copia local del mismo__, debemos correr una serie de comandos //SVN// para generar la estructura indicada como parte del proyecto, esto es:
snv mkdir trunk
svn mkdir tag
svn mkdir branch
En nuestra copia local del proyecto con estos comandos sólo lo creamos, pero aún se encuentran en nuestra copia local y no hemos //subido// estas modificaciones al //REPOSITORIO CENTRAL// del proyecto, esto lo hacemos de la siguiente forma:
svn commit -message "Hemos creado la estructura base del proyecto" ==> Este es el formato del comando largo.
svn ci -m "Hemos creado la estructura base del proyecto" ==> Este es el formato del comando corto.
Si bien hasta ahora hemos logrado //subir// el repositorio local al //REPOSITORIO CENTRAL//, lo que no hemos hecho hasta ahora es //SINCRONIZAR// ambos repositorios, esto es necesario para que los LOG's y las versiones sean las mismas en ambos repositorios, aún cuando sea generada la versión en la misma máquina local, para ello debemos correr:
svn update ==> Comando para actualizar en el repositorio local, la misma versión del repositorio central.
svn up ==> Mismo comando anterior pero en formato corto.
Tenemos algunas formas de validar las actualizaciones, esto significa que podemos chequear antes de hacer modificaciones al repositorio central las diferencias o estatus que nos proporcionarán información suficiente para determinar si estamos con la copia local actualizada, esto lo hacemos con los siguientes comandos:
svn status ==> Nos indica si el repositorio local ha sufrido modificaciones y cuales son.
svn diff ==> Nos muestra las diferencias entre nuestro repositorio local y el central del proyecto.
svn log ==> Nos muestra los eventos ocurridos hasta nuestra última actualización del repositorio.
Si con esta información que es bastante, determinamos que hemos realizado varias modificaciones y no están reflejadas en el repositorio central, además si estamos seguros que estas nuevas copias de los archivos están en versiones //mostrables// al resto de los desarrolladores o se encuentran en estado de desarrollo usable, procedemos a realizar un //commit//, depues un //update//.