| Despabilando la MonoNeurona::Internet es de todos [Inicio] [Regresar] |
|
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 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> Mi archivo /etc/apache2/svn/authz es así: [groups] Para agregar usuarios que sean autentificados por Apache: $sudo htpasswd -c -m /var/morg/svn/.dav_svn.passwd aarkerio 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, tagsGeneralmente 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" 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 clienteBien, 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 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: 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 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" 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 archivosHay 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 Otra manera de ignorar el archivo banner.png en un directorio: $svn propset svn:ignore banner.png trunk/app/webroot/img/imgusers/ Subversion y TracPor 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>
SVN taggingEjemplo 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 |
| Este trabajo está licenciado bajo la MonoNeurona Commons License. 2002-2008 © :: Colectivo MonoNeurona.org :: |