Subversion
La SVN (petit nom de SubVersion) a pour but de remplacer la CVS. Pour l'utilisateur lambda, l'utilisation en est quasiment identique, mais les fonctionnalité supplémentaires sont tout de même non négligeables. Cette page explique comment importer la CVS dans SVN proprement et comment configurer les repositories pour que les accès soit limités comme désiré.
Elle est actuellement sur Skinwel pour 2 raisons :
- pour éviter de se retrouver comme la CVS sur Gwennoz auquel trop de personnes ont accès
- parce que skinwel héberge très peu de services
Installation de SVN
Installation du programme
L'installation comporte plusieurs éléments : SubVersion, le viewer Web, le mailer, le script d'import de CVS...
apt-get install subversion subversion-tools cvs2svn websvn svnmailer
Il faut alors créer le compte utilisateur svn
adduser svn mkdir /home/svn chown svn:root /home/svn
Création des repositoires
SVN gérant projet par projet, il faut séparer les projets. On va donc créer un repositoire par projet :
svnadmin create --fs-type fsfs /home/svn/nom_du_projet
Une fois le repositoire créé, il faut réaliser l'import depuis la CVS :
cd /tmp scp -r gwennoz:/home/cvs cvs cvs2svn --existing-svnrepos -s /home/svn/nom_du_projet cvs/nom_du_projet
Il faut répéter l'opération pour tous les projets...
Si un projet a des sous projets importants, il faut vaut mieux créer un repositoire pour chaque sous projet important
Lancement du serveur
SVN utilise son propre serveur. Celui-ci se lance simplement en appelant le daemon svnserver. Pour plus de sécurité, ou pour aussi plus de clarté, on rajoute un chroot :
sudo -u svn svnserve -d -r /home/svn
Configuration des repositoires
La svn sert à stocker différents type de données :
- des projets publics
- des projets privés
- des données de configuration
Il faut donc une configuration spécifique pour chaque type de projet. Les configurations se font via :
- la configuration du repositoire (répertoire /home/svn/projet/conf/)
- les droits d'accès au répertoire.
Projet public
Un projet public est un projet dont les sources sont publiques accessibles à tous. Pour un tel projet on doit avoir :
- un accès anonyme en lecture
- des accès lecture/écriture pour les développeurs
- un accès au websvn
droit d'accès au repositoire
Les droits d'accès par défaut (644 ou 755) sont corrects, le projet étant public. Ils permettent à la fois l'accès via svnserve, web et svn+ssh. Il suffit simplement de donner la propriété du répertoire au bon utilisateur
cd /home/svn chown svn -R nom_du_projet
configuration du serveur svn
Le fichier svnserve.conf doit être de la forme :
# Global Section [general] # Name of the project realm = le nom du projet # Read-only anonyme access anon-access = read # Read/Write access for authentified users auth-access = write # Where to find authorised users list password-db = /home/svn/passwd
Et remplir le fichier de /home/svn/passwd est un fichier partagé par tous les repositories public, et les projets privés. Il doit avoir des droits d'accès restrictifs (600 en svn:root).
# User list [users] name_user1 = password_user1 name_user2 = password_user2 name_user3 = password_user3 ...
configuration du websvn
Le websvn doit afficher se projet, il faut donc l'indiquer. Pour ceci il suffit d'éditer le fichier /etc/websvn/svn_deb_conf.inc et d'ajouter la ligne :
$config->addRepository("nom du projet", "/home/svn/nom_du_projet");
Projets privés
Les projets privés sont des projets internes au BR dont les sources ne sont pas diffusées. Il bénéficie donc d'un accès en lecture/écriture pour les développeurs... et rien d'autre.
droits d'accès au repositoire Il faut bien s'assurer que l'accès au répertoire est limité aux seuls personnes qui ont le droit d'accès... c'est à dire au serveur svn
cd /home/svn chmod g-rwx -R projet chmod o-rwx -R projet chown svn -R projet
Configuration du serveur svn
Le fichier svnserve.conf doit être de la forme :
# Global Section [general] # Name of the project realm = le nom du projet # Only known users can access anon-access = none # Read/Write access for authentified users auth-access = write # Where to find authorised users list password-db = /home/svn/passwd
Et remplir le fichier de /home/svn/passwd est un fichier partagé par tous les repositories public, et les projets privés. Il doit avoir des droits d'accès restrictifs (600 en svn:root).
# User list [users] name_user1 = password_user1 name_user2 = password_user2 name_user3 = password_user3 ...
Fichiers de configuration
Les fichiers de configuration vivent dans un autre monde... dans lequel il faut absolument éviter tout accès pirate à la machine. Pour ceci le mieux est d'utiliser la méthode parano de l'authentification via ssh et du transfert via svn over ssh. La configuration est très simple
droits d'accès
Le svn+ssh utilise le compte de l'utilisateur sur la machine, il faut donc que tous les utilisateurs qui l'utilisent aient un compte sur la machine. Les droits d'accès aux fichiers sont ceux de l'utilisateur. Il faut donc placer les newsmestres dans le group news et les roots dans le groupe adm.
Ensuite :
cd /home/svn chmod o-rwx -R projet chmod g+w -R projet chown svn:news -R news //Dans le cas de la conf des newsgroups chown svn:adm -R projet //Dans le cas des utilitaires root
configuration du serveur svn
# Global Section [general] # Name of the project realm = le nom du projet # Only known users can access anon-access = none # Read/Write access for authentified users auth-access = write # No svn authentificcation... it uses Unix's one # password-db = passwd
Structure d'un projet sur la SVN
Les projets de développement (donc on exclu les modules de configuration) ont tous à peu près la même structure. Cette structure reflette le développement : - trunk : la branche principale du projet. - branches : répertoire qui contient les autres branches sous la forme de sous répertoire - tags : répertoire que contient les versions tagguées sous la forme de sous répertoire.
Ainsi, un exemple concret est qRezix :
svn://swl/qrezix/ + trunk + branches | + qrezix--qt4 | + qrezix--release--1.2 | + qrezix--release--1.6.2 | \ qrezix--release--1.6.3 \ tags + qrezix--1.3 + qrezix--1.6.2 + qrezix--1.6.2-rc1 + qrezix--1.6.2-rc2 \ qrezix--1.6.3
Utilisation de svn
SVN s'utilise aussi simplemennt que CVS avec cependant quelques différences notables, en particulier la checkout utilise une syntaxe différente
Le principe d'une SVN est de centraliser le développement en fournissant un moyen simple de programmer en groupe. Chaque développeur a chez lui une copie personnelle du projet sur laquelle il fait ses modifications. Quand il est satisfait, il valide ses modifications (commit) et tout le monde peut y avoir accès.
La SVN gère également des branches qui permette de continuer à développer sur une branche 'instable' pendant qu'on décide de 'releaser' une version stable.
Chaque projet est appelé un module.
Récupérer un module
La commande diffère selon que le module est accessible via le svnserver ou svn+ssh :
en svn :
svn co svn://[user@]skinwel/nom_du_projet/partie_a_co [destination]
en svn+ssh :
svn co svn+ssh://user@skinwel/home/svn/nom_du_projet/partie_a_co [destination]
Pour la plupart des utilisateurs la partie à co sera trunk, mais ça peut être aussi branches/nom_de_la_branche, ou Tag/nom_du_tag... ou n'importe quel sous répertoire...
Récupérer les modifications des autres
svn up [$fichiers$]
Récupère la dernière copie des fichiers spécifiés. Si aucun fichier n'est récupérer, le programme mettra à jour tout le répertoire et ce récursivement. En cas de modification conflictuelle entre celle du serveur et celle de la copie local, il faut résoudre le conflit.
Valider ses modifications
svn ci [$fichiers$]
Cette commande envoie au serveur les fichiers modifiés. Si aucun conflit n'est détecté la modification est validée.
Il faut toujous updater la copie locale avant de commiter ses modifications.
Annuler ses modification
svn revert [$fichiers$]
Supprime toutes les modifications apportées au fichier spécifié depuis le dernière update.
Cette commande est la seule qui ne soit pas récursive avec SVN. Pour utiliser la commande sur un répertoire de façon récursive, il faut ajouter l'option -R
svn revert -R [$répertoire$]
Ajouter un fichier/répertoire
svn add $fichiers$ svn mkdir $repertoire$
Ajoute les fichiers spécifiés à la CVS. Les répertoires sont ajoutés immédiatement, par contre il faut commiter les fichiers ajoutés pour valider l'ajout. L'utilisation de mkdir nécessite que le répertoire n'existe pas encore.
Supprimer un fichier/répertoire
svn remove $fichiers$ svn rmdir $repertoire$
Supprime un fichier du module. La suppression sera effective après un commit.
Déplacer un fichier/répertoire
svn move $fichier$ $destination$
Déplace le fichier ou répertoire vers sa destination. Ce comporte comme mv.
Créer une version tagguée
Une version tagguée est un snapshot du projet, une photographie à un instant présent. Sur svn, un snapshot est donc une copie de l'instant présent dans l'arborescence. Le plus souvent on utilise un répertoire tag :
svn copy trunk tag/$montag$
Créer une branche
De la même manière que les tags, les branches sont une séparation du projet. C'est donc également une copie, mais celle-ci destinée à évoluer... On stock habituellement les branches dans un répertoire branches :
svn copy trunk branches/$mabranche$
Backporter
Backporter consiste à transposer les modifications d'une branche sur une autre.
svn merge -r version1:version2 $brancheorigine$ [$branchedest$] svn ci
Cette syntaxe applique les modifications de la branche $brancheorigine$ effectuées entre la révision version1 et version2 (dans cet ordre là) ) la branche branchedest. Si branchedest n'est pas spécifié, l'application sera réalisée sur le répertoire courant.
Attention à mettre version1 et version2 dans le bon sens, sinon on supprime les modifications au lieu de les appliquer.
Installation de la SVN sous Windows
Un bon client SVN sous Windows est TortoiseSVN qui s'intègre à l'explorateur Windows et permet de réaliser toutes les comamndes grace au menus contextuels associés aux répertoires.