<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/29"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/29/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/29/atom/feed</id>
  <updated>2008-05-30T23:12:50+02:00</updated>
  <entry>
    <title>Mise en oeuvre d&#039;un serveur SubVersion</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/29" />
    <id>http://artisan.karma-lab.net/node/29</id>
    <published>2008-05-30T16:18:05+02:00</published>
    <updated>2008-05-30T23:12:50+02:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Outils" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
  L'objectif est ici de mettre en place un serveur SubVersion comprenant la mise en place du dépôt, la configuration d'apache et le paramétrage des messages de notifications. 
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
  L'objectif est ici de mettre en place un serveur SubVersion comprenant la mise en place du dépôt, la configuration d'apache et le paramétrage des messages de notifications. 
</p>
<!--break-->

	<a name='chapter_1'></a>
  <h2>Création du repository</h2>
	
<p>
  Pour créer le dépôt, nous utilisons la commande <kbd>svnadmin</kbd> comme suit :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>root#</span>svnadmin create  --fs-type fsfs /svnroot</div><div class='command'><span class='prompt'>root#</span>ls /svnroot</div><div class='result'>conf/  dav/  db/  format  hooks/  locks/  README.txt</div><div class='command'><span class='prompt'>root#</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  Une fois la commande exécutée, le dépôt est préparé et n'attend plus que nos fichiers. Le paramètre <kbd>--fs-type fsfs</kbD> est indispensable si l'on ne veut pas se retrouver avec un dépôt utilisant le calamiteux BerkleyDB. Avec cette option, subversion va utiliser le système de fichier standard pour stocker ces données en toute sécurité. 
</p>
<p>
  Dans la mesure où c'est apache qui va devoir gérer ce dépôt, il est important de lui donner les droits sur le dossier <kbd>/svnroot</kbd>. 

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/chown"><span class="kw2">chown</span></a> apache:apache <span class="sy0">/</span>svnroot -Rc
  </div>
  
  </div>
</p>

    

	<a name='chapter_2'></a>
  <h2>Configuration d'apache</h2>
	
<p> 
   Dans ce qui suit Apache est considré comme installé et opérationnel. Mais pour permettre l'utilisation de Subversion, il nous faut cependant quelques modules supplémentaires : <kbd>apache-mod_dav</kbd> et <kbd>apache-mod_dav_svn</kbd>. En effet, 
  <a target='_blank' href='http://fr.wikipedia.org/wiki/WebDav'>
  WebDav
  </a> est le protocole utilisé par subversion pour communiquer à travers le WEB. Le premier module va donc ajouter le protocole <wp>webdav</kbd> à Apache, et le second d'étendre se protocole pour gérer spécifiquement les dépôts subversion. 
</p>
<p>
  Ensuite, il nous faut modifier le fichier de configuration d'apache <kbd>/etc/httpd/conf/httpd2.conf</kbd> en ajoutant le bloc suivant:
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="sc3"><span class="re1">&lt;Location</span> /subversion<span class="re2">&gt;</span></span><br />
&nbsp; DAV svn<br />
&nbsp; SVNPath /svnroot<br />
&nbsp; AuthzSVNAccessFile /svnroot/droits<br />
<span class="sc3"><span class="re1">&lt;/Location<span class="re2">&gt;</span></span></span>
  </div>
  
  </div>
</p>
<p>
   Cela a pour résultat d'ajouter à Apache une URL <kbd>http://mon_site/subversion</kbd> permettant l'accès au dépôt situé en <kbd>/svnroot</kbd>. L'option <kbd>AuthzSVNAccessFile</kbd> indique quant à elle le chemin vers un fichier texte contenant les droits associés au dépôt. 

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="re0"><span class="br0">&#91;</span>/<span class="br0">&#93;</span></span><br />
* <span class="sy0">=</span> r<br />
<span class="re1">robert</span> &nbsp;<span class="sy0">=</span><span class="re2"> rw</span><br />
<br />
<span class="re0"><span class="br0">&#91;</span>/un_projet<span class="br0">&#93;</span></span><br />
<span class="re1">gaston</span> <span class="sy0">=</span><span class="re2"> rw</span><br />
<span class="re1">ginette</span> <span class="sy0">=</span><span class="re2"> r</span>
  </div>
  <div class='caption'>exemple de fichier de droits subversion</div>
  </div>
</p>
<p>
  Tels qu'on a défini les droits, Robert a un accès complet en lecture et écriture à tous les projets. Gaston a un accès en lecture/écriture au projet <kbd>un_projet</kbD> et Ginette (sexisme !!) n'a accès qu'en lecture à ce même projet. 
</p>
<p>
  Maintenant pour que cela fonctionne, il faudrait qu'Apache ait le login de l'utilisateur. Il est donc nécessaire d'ajouter un bloc d'authentification à notre section <kbd>location</kbd>. Dans ce domaine, c'est à chacun de choisir : fichier apache, shadow, apache. jetez un œil <a class='external' target='_blank' href='/node/22' >ici</a> pour avoir des idées sur quel système utiliser. 
</p>

<p>
  Une fois que tout est en place, il suffit de relancer apache et d'aller à l'URL <kbd>http://mon_site/subversion</kbd>. En effet, Subversion fonctionne aussi bien en WebDav qu'en HTTP. Dans le second cas il est possible, si l'on a les bon droits, d'explorer le dépôt en lecture seule. Le premier cas, il faut utiliser un client subversion comme celui d'Eclipse. 
</p>
    

	<a name='chapter_3'></a>
  <h2>Import d'un projet CVS existant</h2>
	
<p>
  Si vous désirez garder l'historique des commit CVS, l'utilitaire à utiliser est cvs2svn. Il est suffisamment efficace pour avoir permis la migration d'un "petit projet" comme KDE... Sinon, vous pouvez utiliser le script suivant dont la syntaxe est :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  convert module_cvs module_svn
  </div>
  
  </div>
</p>
<p>
  Le code source du script <kbd>convert</kbd> est à modifier pour correspondre à vos emplacements :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0">#! /bin/sh</span><br />
<br />
&nbsp; <span class="kw3">export</span> <span class="re2">CVSROOT=</span><span class="st0">&quot;:pserver:user@serveur:/my_cvsroot&quot;</span><br />
&nbsp; <span class="kw3">export</span> <span class="re2">SVNROOT=</span><span class="st0">&quot;http://serveur/my_svnroot/trunk/$2&quot;</span><br />
&nbsp; <span class="co0"># Checkout du projet venant de cvs</span><br />
&nbsp; cvs -d :pserver:yoran<span class="sy0">@</span>nehia:<span class="sy0">/</span>cvsroot <a target="blank" href="http://pwet.fr/man/linux/commandes/co"><span class="kw2">co</span></a> $<span class="nu0">1</span><br />
<br />
&nbsp; <span class="co0"># Enlever les éléments de controle CVS</span><br />
&nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/find"><span class="kw2">find</span></a> $<span class="nu0">1</span><span class="sy0">/</span> -name <span class="st0">&quot;CVS&quot;</span> -exec <a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf <span class="br0">&#123;</span><span class="br0">&#125;</span> \;<br />
&nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/find"><span class="kw2">find</span></a> $<span class="nu0">1</span><span class="sy0">/</span> -name <span class="st0">&quot;.cvsignore&quot;</span> -exec <a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf <span class="br0">&#123;</span><span class="br0">&#125;</span> \;<br />
<br />
&nbsp; <span class="co0"># Création du dossier projet</span><br />
&nbsp; svn <a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> <span class="re1">$SVNROOT</span> -m <span class="st0">'Création du projet'</span><br />
<br />
&nbsp; <span class="co0"># Import initial du projet vers SVN</span><br />
&nbsp; svn import $<span class="nu0">1</span><span class="sy0">/</span> <span class="re1">$SVNROOT</span> -m <span class="st0">'import initial'</span><br />
<br />
&nbsp; <span class="co0"># suppression du checkout cvs temporaire et checkout de la version svn</span><br />
&nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf $<span class="nu0">1</span>
  </div>
  
  </div>
</p>


	<a name='chapter_4'></a>
  <h2>Rajouter des scripts de notification</h2>
	
<p>
  Un aspect très sympathique de subversion est la facilité avec laquelle il est possible d'ajouter des actions sur les divers événements générés dans un dépôt. 
</p>
<p>
  Subversion a normalement créé un dossier <kbd>hooks</kbd> dans votre dossier <kbd>/svnroot</kbd>. Ce dossier contient déjà les modèles des cinq événements qu'il est capable de prendre en charge. Par défaut ces fichiers ont l'extension <kbd>.tmpl</kbd> ce qui les rends innactifs. Il faut donc ôter cette extension sur chacun des fichiers que vous désirez utiliser :
<ul>
<li>post-commit, appelé après un commit. </li>
<li>post-lock, appelé après un lock. </li> 
<li>pre-lock, appelé avant un lock.</li>
<li>pre-unlock, appelé avant un unlock.</li>
<li>post-revprop, appelé après un changement de révision.</li>
<li>pre-commit, appelé avant la fin du commit.</li>
<li>start-commit,appelé avant le commit.</li>
<li>pre-revprop-change, appelé avant un changement de révision.</li>
</ul>
</p>
<p>
  Comme exemple, imaginons que nous voulons envoyer un courriel aux développeurs d'un projet à chaque commit dans le dépôt. Pour cela nous allons créer un fichier <kbd>/svnroot/hoks/post-commit</kbd> :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0">#! /bin/sh</span><br />
<br />
<span class="re2">REPOS=</span><span class="st0">&quot;$1&quot;</span><br />
<span class="re2">REV=</span><span class="st0">&quot;$2&quot;</span><br />
<br />
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span>svnnotify -r <span class="re1">$REV</span> -C -d -H HTML::ColorDiff -p <span class="re1">$REPOS</span> -x gaston<span class="sy0">@</span>mon_site.<span class="re2">com=</span>projet1 --from no-reply<span class="sy0">@</span>mon_site.com --reply-to no-reply<span class="sy0">@</span>mon_site.com
  </div>
  
  </div>
</p>
<p>
  <kbd>svnnotify</kbd> fait partie du projet <kbd><a class='external' target='_blank' href='http://search.cpan.org/dist/SVN-Notify/lib/SVN/Notify.pm' >perl-svn-notify</a></kbd> qu'il faut donc installer. Pas la peine d'aller le télécharger, il est sûrement inclus dans les dépôts de votre distribution. 
</p>
<p>
  Une fois installé, il faut changer les droits sur ce hook pour permettre à apache de l'exécuter. Le plus simple est de relancer la commande <kbd>chmod</kbd> que nous avions utilisé au début pour tout le dépôt :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/chown"><span class="kw2">chown</span></a> apache:apache <span class="sy0">/</span>svnroot -Rc
  </div>
  
  </div>
</p>
<p>
  Maintenant à chaque commit, si ce dernier appartient au projet <kbd>projet1</kbd>, cela provoquera un envoi de courriel à gaston. On peut spécifier plusieurs arguments <kbd>-x</kbd> ainsi que plusieurs adresses séparées par des virgules.  Par exemple <kbd>-x toto@mondomaine,tutu@mondomain=mon_module</kbd>. 
</p>



	<a name='chapter_5'></a>
  <h2>Erreur \"502 Bad Gateway\"</h2>
	
<p>
Si vous avez droit un jour à un <kbd>svn: COPY of package.sh: 502 Bad Gateway (https://mondomaine.subversion.com/dev)</kbd>, il est probable que vous ayez tenté une copie/déplacement à travers un accès HTTPS au dépôt subversion. Hors dans le cas du https, un cas qui pose problème, celui de l'utilisation de reverse proxy sur le serveur cible (la cible est une machine apache A qui est accédée via HTTPS et qui relaye les requêtes sur une machine apache B qui gère le dépôt), ou alors de mauvaise définition du nom de serveur au niveau de la cible (le servername du vhost est mal configuré). Bref, pas beaucoup de solutions là dessus, juste de ne pas le faire <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> . Cela ne pose problème que sur les commande COPY et MOVE, assez rare donc. Dans ces deux cas, préférez un accès plus proche du serveur de dépôt en HTTP ou en SVN. 
</p>


	<a name='chapter_6'></a>
  <h2>Conclusion</h2>
	
<p>
  Voilà, c'est tout. Votre dépôt subversion est maintenant pleinement opérationnel. Enfin j'espère <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/> .
</p>    ]]></content>
  </entry>
</feed>
