<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Soldat&#039;s log &#187; subversion</title>
	<atom:link href="http://blog.chernando.eu/tag/subversion/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chernando.eu</link>
	<description>Simplemente otro blog personal</description>
	<lastBuildDate>Thu, 22 Jul 2010 20:09:59 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.chernando.eu' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/0eb8b53f0c14a196e38f0abba5641993?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>Soldat&#039;s log &#187; subversion</title>
		<link>http://blog.chernando.eu</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.chernando.eu/osd.xml" title="Soldat&#039;s log" />
	<atom:link rel='hub' href='http://blog.chernando.eu/?pushpress=hub'/>
		<item>
		<title>Servidor de proyectos con Subversion, Trac, Apache (y LDAP)</title>
		<link>http://blog.chernando.eu/2008/07/20/subversion-trac-apache-ldap/</link>
		<comments>http://blog.chernando.eu/2008/07/20/subversion-trac-apache-ldap/#comments</comments>
		<pubDate>Sun, 20 Jul 2008 12:29:42 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[Desarrollo Software]]></category>
		<category><![CDATA[active directory]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[trac]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.chernando.eu/?p=43</guid>
		<description><![CDATA[En esta entrada vamos a montar un servidor para la gestión de proyectos. Para ello utilizaremos un sistema de control de versiones (Subversion), un sistema de gestión de incidencias (Trac) y un sistema de autenticación compartido, para ello utilizaremos Apache y alguno de sus métodos de autenticación como por ejemplo LDAP (válido si es necesario [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=43&subd=chernando&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>En esta entrada vamos a montar un servidor para la gestión de proyectos. Para ello utilizaremos un sistema de control de versiones (<a href="http://subversion.tigris.org/">Subversion</a>), un sistema de gestión de incidencias (<a href="http://trac.edgewall.org/">Trac</a>) y un sistema de autenticación compartido, para ello utilizaremos <a href="http://httpd.apache.org/">Apache</a> y alguno de sus métodos de autenticación como por ejemplo <a href="http://es.wikipedia.org/wiki/LDAP">LDAP</a> (válido si es necesario utilizar las cuentas de un <a href="http://es.wikipedia.org/wiki/Directorio_activo">Directorio Activo</a>).</p>
<p>Aunque existen soluciones más elaboradas y más integradas, como el software de <a href="http://sourceforge.net/">SourceForge.net</a>, este planteamiento permite montar un servidor a medida, pudiendo alterar cualquiera de sus elementos, y en mi opinión más sencillo de mantener.</p>
<p>Nos basaremos en una instalación mínima de Ubuntu Server 8.04 (por lo que no disponemos ni de Subversion 1.5 ni de Trac 0.11) con la idea de montar un servidor preparado para mantener varios proyectos.</p>
<h3>Instalación y configuración de Subversion</h3>
<p>Para empezar instalaremos subversion, también es recomendable subversion-tools por los scripts adicionales que incorpora, y preparamos un repositorio de prueba:</p>
<pre># apt-get install subversion subversion-tools
# mkdir /srv/svn
# svnadmin create /srv/svn/proyecto</pre>
<p>Aprovechamos ahora para crear una estructura básica dentro del repositorio, esto nos servirá en las pruebas para ver si realmente podemos acceder al repositorio:</p>
<pre># svn co file:///srv/svn/proyecto
# svn mkdir proyecto/{branches,tags,trunk}
# svn ci -m 'Estructura Inicial' proyecto</pre>
<h3>Instalación y configuración de Trac</h3>
<p>Instalaremos y configuraremos mínimamente un proyecto de Trac para el repositorio que acabamos de crear:</p>
<pre># apt-get install trac
# mkdir /srv/trac
# trac-admin /srv/trac/proyecto initenv
(Opciones sugeridas)
Path to repository [/path/to/repos]&gt; <strong>/srv/svn/proyecto</strong></pre>
<p>Es el momento de comprobar que trac y su unión con el repositorio de subversion funcionan correctamente, para ello lanzaremos el servidor incluido en trac:</p>
<pre># tracd -p 80 /srv/trac/proyecto</pre>
<p>Abriendo la URL http://localhost:80/ deberíamos ver disponible nuestro proyecto, &#8220;<em>My Project</em>&#8220;, y comprobamos que la función de &#8220;<em>Browse Source</em>&#8221; funciona correctamente.</p>
<p>Por el momento nada nuevo, paremos tracd y sigamos.</p>
<h3>Instalación y configuración de Apache</h3>
<p>Optamos por enganchar Trac con <a href="http://www.modpython.org/">mod_python</a> así que lo más sencillo es instalar el paquete de mod_python y que instale apache por sus dependencias:</p>
<pre># apt-get install libapache2-mod-python</pre>
<p>Bien, ahora editamos la configuración para que Apache pase las peticiones que vayan a <strong>/trac</strong> a nuestro conjunto de proyectos en <strong>/srv/trac</strong>. Editando el fichero <strong>/etc/apache2/sites-available/default</strong> añadimos antes del cierre de <em>&lt;/VirtualHost&gt;</em> lo siguiente:</p>
<pre>&lt;Location /trac&gt;
  SetHandler mod_python
  PythonInterpreter main_interpreter
  PythonHandler trac.web.modpython_frontend
  PythonOption TracEnvParentDir /srv/trac
  PythonOption TracUriRoot /trac
&lt;/Location&gt;</pre>
<p>Forzamos la recarga de la configuración de Apache:</p>
<pre># /etc/init.d/apache2 reload</pre>
<p>Hacemos una prueba con el navegador en http://localhost/trac/ que debería mostrarnos un error por falta de permisos de escritura. Como vamos a dejar a Apache como gestor de los proyectos es necesario darle los permisos que necesita:</p>
<pre># chown -R www-data.www-data /srv/trac/proyecto</pre>
<p>Con esto todo debería funcionar exactamente igual que con la prueba realizada con tracd. Vamos ahora a mostrar el repositorio desde Apache.</p>
<p>Subversion trabaja con Apache haciendo uso de <a href="http://es.wikipedia.org/wiki/WebDAV">WebDAV</a> así que instalamos el módulo necesario:</p>
<pre># apt-get install libapache2-svn</pre>
<p>Añadimos la configuración necesaria en el fichero <strong>/etc/apache2/mods-available/dav_svn.conf</strong>, podéis descomentar las opciones si os resulta más cómodo. En cualquier caso la configuración debe quedar de la siguiente manera:</p>
<pre>&lt;Location /svn&gt;
  DAV svn
  SVNParentPath /srv/svn
&lt;/Location&gt;</pre>
<p>De nuevo, forzamos la recarga de la configuración de Apache y comprobamos que http://localhost/svn/proyecto muestra el proyecto y que podemos navegar dentro de él. Si probáis http://localhost/svn/ os dará un error, ya que en este caso no existe un listado de proyectos disponibles como hacía Trac.</p>
<p>Igualmente que en Trac, si Apache es el gestor del repositorio es necesario que tenga permisos de escritura. En este caso vamos a ceder completamente el control a Apache:</p>
<pre># chown -R www-data.www-data /srv/svn/proyecto</pre>
<p>Ahora mismo disponemos de un sistema completamente funcional en el que no se exige ningún tipo de autenticación. En el caso de Trac no se puede hacer login y en el caso de Subversion ni siquiera se pide. Si queréis verlo en podéis hacer la siguiente prueba:</p>
<pre># svn co http://localhost/svn/proyecto/trunk
# touch trunk/README.txt
# svn add trunk/README.txt
# svn ci -m "Fichero leame" trunk</pre>
<p>Si comprobamos el historial, <em>svn log trunk/README.txt</em>, podremos ver que no hay ningún usuario responsable del commit. En ningún momento se nos ha pedido identificarnos, ya que hay permisos de lectura y escritura para todo el mundo, así que podemos bajarnos el contenido del repositorio y los commit son anónimos.</p>
<h3>Autenticando usuarios</h3>
<p>Empecemos con lo más sencillo, usuarios válidos de un fichero htpasswd, podéis leer algo más en otro de mis artículos sobre <a href="http://chernando.eu/doc/apache/">ficheros .htpasswd</a>.</p>
<pre># htpasswd -c /etc/apache2/users.conf chernando</pre>
<p>Editamos Trac para soportar un login centralizado añadiendo un nuevo <em>location</em> a <em>default</em>:</p>
<pre>&lt;Location /trac/*/login&gt;
  AuthType Basic
  AuthName "Trac Projects"
  AuthUserFile /etc/apache2/users.conf
  Require valid-user
&lt;/Location&gt;</pre>
<p>Forzando la recarga de Apache ya disponemos de la función &#8220;login&#8221; en Trac. Para el repositorio vamos a dejar el acceso de lectura para todo el mundo y limitar el acceso de escritura a los usuarios registrados añadiendo a la configuración de WebDAV:</p>
<pre>AuthType Basic AuthName "Subversion Repository"
AuthUserFile /etc/apache2/users.conf
&lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;
  Require valid-user
&lt;/LimitExcept&gt;</pre>
<p>Una vez más recargando Apache ahora podemos bajar y actualizar un repositorio pero necesitaremos identificarnos para subir cambios al repositorio. Probad a añadir un nuevo fichero y comprobaréis que ahora se exige un usuario y password válidos.</p>
<h3>Rizando el rizo, autenticando contra un LDAP</h3>
<p>En el caso de disponer de un sistema de autenticación centralizada, por ejemplo LDAP o un Directorio Activo con el servicio LDAP activo, podemos delegar toda la carga de la gestión de usuarios dejando nuestro servidor de proyectos completamente &#8220;inhabitado&#8221;.</p>
<p>Para ello lo único que necesitamos es cambiar ambas configuraciones. En primer lugar habilitamos los módulos necesarios:</p>
<pre># a2enmod authnz_ldap
(esto debería habilitar el módulo ldap por dependencias)</pre>
<p>Y configuramos ambas secciones de autenticación. Primero eliminamos <em>AuthUserFile</em> que ya no es necesaria y después añadimos:</p>
<pre>AuthBasicProvider "ldap"
AuthLDAPURL "ldap://127.0.0.1/dc=chernando,dc=eu?uid?sub?(objectClass=inetOrgPerson)"
authzldapauthoritative Off</pre>
<p>Podéis ver más detalles en <a href="http://trac.edgewall.org/wiki/TracModPython">http://trac.edgewall.org/wiki/TracModPython</a>.</p>
<h3>Ampliaciones que pueden hacerse a partir de aquí</h3>
<p>En esta entrada he intentado introducir el menor ruido posible, tanto en comandos como software a instalar, por lo que hay ciertas mejoras que se han quedado en el tintero. Por ejemplo:</p>
<ul>
<li>Configurar Apache para hacer uso de SSL, muy necesario ya que hasta el momento todas las negociaciones con Apache van en texto claro.</li>
<li>Establecer limitaciones en el acceso de los repositorios (y en secciones de los mismos) haciendo uso de authz.</li>
<li>Configurar un sistema de correo, que permita notificar todo tipo de eventos: nuevos tickets, cambios en el repositorio&#8230;</li>
<li>Integrar Subversion con Trac, por ejemplo permitir que un commit cierre o añada información a un ticket de Trac.</li>
<li>Utilizar la última versión de Subversion, 1.5, por su mejora en la gestión de merge de ramas.</li>
<li>Utilizar la última versión de Trac, 0.11, por las mejoras en el interfaz y en la gestión del flujo de trabajo asociado a un ticket.</li>
<li>Ampliar el sistema incluyendo otros servicios: listas de correo, servidor de integración continua&#8230;</li>
</ul>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chernando.wordpress.com/43/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chernando.wordpress.com/43/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/43/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=43&subd=chernando&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2008/07/20/subversion-trac-apache-ldap/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chernando</media:title>
		</media:content>
	</item>
		<item>
		<title>svk</title>
		<link>http://blog.chernando.eu/2006/01/26/svk-mas-que-un-subversion-distribuido/</link>
		<comments>http://blog.chernando.eu/2006/01/26/svk-mas-que-un-subversion-distribuido/#comments</comments>
		<pubDate>Thu, 26 Jan 2006 10:21:01 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[Desarrollo Software]]></category>
		<category><![CDATA[control versiones]]></category>
		<category><![CDATA[dcvs]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svk]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://chernando.wordpress.com/2006/01/26/svk-mas-que-un-subversion-distribuido/</guid>
		<description><![CDATA[En la línea de la última entrada voy a comentar brevemente un ejemplo de uso / tutorial de svk. svk está basado en el sistema de ficheros de subversion, está escrito en Perl y cuenta con varias mejoras que le permiten ser un decentralized version control system. Su principal objetivo es permitir a un desarrollador [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=7&subd=chernando&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>En la línea de la <a href="http://chernando.wordpress.com/2006/01/25/sistemas-de-control-de-versiones-distribuidos/">última entrada</a> voy a comentar brevemente un ejemplo de uso / tutorial de  <a href="http://svk.elixus.org/">svk</a>.</p>
<p>svk está basado en el sistema de ficheros de <a href="http://subversion.tigris.org/">subversion</a>, está escrito en Perl y cuenta con varias mejoras que le permiten ser un <em>decentralized version control system</em>. Su principal objetivo es permitir a un desarrollador disponer de sus propias ramas privadas facilitando enormemente el proceso de <em>merge</em>.</p>
<p>La situación es la siguiente: disponemos de un repositorio central con un proyecto en el que estamos trabajando. Mediante svk vamos a hacer una copia del repositorio, vamos a mantenerlo actualizado y vamos a crear nuestra propia rama de trabajo.</p>
<p><span id="more-7"></span></p>
<p><strong>Preparando nuestro entorno</strong></p>
<p>En primer lugar crearemos un repositorio en el que vamos a guardar la copia del repositorio central:</p>
<p><code>svk depotmap --init</code></p>
<blockquote><p>Este comando creará en <tt>~/.svk/local</tt> un repositorio típico de subversion al que podremos acceder cómodamente mediante la ruta <tt>//</tt>.</p></blockquote>
<p>Disponemos de <tt>//</tt> para guardar los proyectos que necesitemos, en este caso realizaremos una copia local de un proyecto externo.</p>
<p><code>svk mirror https://acm.asoc.fi.upm.es/svn/jurix/jailexec/trunk //jailexec</code></p>
<p>y para actualizar su contenido:</p>
<p><code>svk sync //jailexec</code></p>
<blockquote><p>Durante el proceso de este comando veremos como svk descarga todo los commits realizados en el repositorio central y los replica en nuestro repositorio local, de esta forma conseguiremos disponer de una copia local de todo el repositorio (incluido historial y diferencias).</p>
<p><strong>Importante</strong>: resaltar que utilizamos la ruta <tt>//jailexec</tt> para especificar el lugar en el que hacemos la copia.</p></blockquote>
<p>Bien, ya tenemos todo lo necesario. Podemos desconectarnos de la red hasta que necesitemos o bien subir nuevos cambios o bien actualizarnos con los cambios del repositorio central.</p>
<p><strong>El trabajo del día a día</strong></p>
<p>Ahora crearemos nuestra copia local de trabajo, al igual que hacíamos con svn o cvs:</p>
<p><code>svk checkout //jailexec</code></p>
<blockquote><p>Esto creará un directorio <tt>jailexec</tt> en el que tendremos una copia local de trabajo. Un detalle curioso es que no existen directorios especiales <tt>.svk</tt> ya que las copias de trabajo se gestionan internamente.  Hay que tenerlo en cuenta a la hora de eliminar una copia de trabajo, un simple <code>rm -rf proyecto</code> no es recomendable.</p></blockquote>
<p>A partir de aquí el ciclo de trabajo es el mismo. La única diferencia es que estamos trabajando contra un repositorio local &#8211;nuestra copia del repositorio central&#8211; por lo que algunos comandos tendrán comportamientos distintos.</p>
<ul>
<li><tt>commit</tt>: si realizamos un commit contra nuestro repositorio svk forzará automáticamente el envio contra el repositorio central, es transparente al usuario.</li>
<li><tt>update</tt>: actualizaremos respecto a nuestro repositorio, por lo que si no realizamos un <tt>sync</tt> previo (apartado anterior) no tiene mucho sentido.</li>
</ul>
<p><strong>Manejo de ramas</strong></p>
<p>Hasta el momento disponemos de una copia del repositorio central, vamos a trabajar con las ramas privadas:</p>
<p><code>svk cp -p //jailexec //local/jailexec</code></p>
<blockquote><p>La opción <tt>-p</tt> es para crear <tt>//local</tt>.</p></blockquote>
<p>Hemos creado <tt>//local/jailexec</tt> como una rama solamente disponible en nuestro repositorio local, nuestra rama privada.</p>
<p><code>svk checkout //local/jailexec</code><br />
o<br />
<code>svk switch //local/jailexec</code></p>
<p>Nos prepara el entorno de trabajo sobre nuestra rama privada. A partir de ahora los cambios y el historial permaneceran en nuestro repositorio, sin conocimiento alguno del repositorio central.</p>
<p>Supongamos que hemos estado trabajando sobre una rama privada y queremos subir los cambios al repositorio central. Aquí svk nos facilita las cosas:</p>
<p><code>svk smerge //local/jailexec //jailexec</code></p>
<blockquote><p>Este comando juntará ambas ramas de forma automática. No olvidemos que <tt>//jailexec</tt> es una copia del repositorio central por lo que al juntar ambas ramas se forzará el envio al repositorio central.</p></blockquote>
<p>Con un solo comando podemos enviar todos los cambios que hemos realizado en nuestra rama privada <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>La única pega resulta ser la actualización de nuestra rama privada respecto a las actualizaciones del repositorio central:</p>
<p><code>svk sync //jailexec</code><br />
<code>svk smerge //jailexec //local/jailexec</code><br />
<code>svk up</code> (en el directorio de nuestra copia local)</p>
<blockquote><p>Actualizamos nuestro repositorio local y luego juntamos los cambios en nuestra rama local. Por último actualizamos nuestra copia local de trabajo.</p></blockquote>
<p><strong>Resumen</strong></p>
<p>svk nos ofrece una estructura estupenda sobre la que trabajar y/o hacer copias de repositorios (oficialmente soporta Subversion, CVS y Perforcer) con una sintaxis idéntica a la de subversion.</p>
<p>El inconveniente es que el manejo resulta un poco complicado durante los primeros días.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chernando.wordpress.com/7/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chernando.wordpress.com/7/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=7&subd=chernando&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2006/01/26/svk-mas-que-un-subversion-distribuido/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chernando</media:title>
		</media:content>
	</item>
	</channel>
</rss>