Par Jacques Déry
Dans cette présentation je vous ferai part de l'historique des logiciels de contrôle de revision et de l'utilisation des logiciels de contrôle de revision dans le développement du logiciel libre.
Je comparerai les différents logiciels disponibles et l'installation de Subversion.
Je parlerai aussi de la gestion de code source, des astuces, des commandes essentielles en ligne de commande et des outils graphiques disponibles.
Finalement, je demontrerai la mise en place d'un garde source et de quelques commandes.
Il était une fois "rcs" le système de contrôle de révision
RCS
Dates importantes
Pour plus de détail
Développement de logiciel
Outils requis pour le developpement de logiciel:
La cathédrale et le bazar
http://www.linux-france.org/article/these/cathedrale-bazar/cathedrale-ba...
Développement de logiciel
Il y a 2 mondes: Propriétaire et Libre
Propriétaire
Libre
Approche
Logiciel de contrôle de source: Est-ce nécessaire???
Avec un logiciel de contrôle de source:
Type de logiciel de contrôle de source
Vocabulaire
Dans le monde libre on utilise les logiciels de contrôle de version suivant:
cvs:
-Garde-source centralisé
-cvs a été développé pour remplacer rcs qui ne fonctionnait qu'avec des fichiers uniques.
-cvs est capable de gérer des projets et le fait assez bien.
-C'est toujours le standard des logiciels de contrôle de version même si d'autres sont supérieurs.
-Le logiciel a été amélioré mais garde beaucoup de ses déficiences à cause de sa conception initiale
subversion:
-Garde-source centralisé
-Concu pour être un remplacement à cvs.
-Inclus des outils pour convertir un garde-source (repository) cvs à subversion.
-Possibilité d'accès local, protocole svn (subversion) et http (web)
git (www.kernel.org):
-Garde-source décentralisé
-A été développé par Linus Torvald pour faire le développement du noyau de Linux.
-A remplacé "bitkeeper" qui est maintenant propriétaire.
arch (www.gnu.org):
-Garde-source décentralisé
-Développé par GNU.
Subversion par rapport à cvs
svn fait les retours (commit) par transactions, pas cvs.
-Si la transaction est intérompue au milieu, svn laissera le repository en bon état. Pas cvs.
svn gère mieux les changements de nom de fichiers et de répertoires (garde l'historique). Pas cvs.
svn peut copier des fichiers et répertoires en gardant l'historique des changements. Pas cvs
svn permet de gérer les permissions par répertoire. Pas cvs
svn enregistre les deltas, cvs enregistre tout les ficiers
-svn prend moins d'espace disque
svn doit appliquer les deltas avant de récupérer les fichiers. cvs récupère les fichiers directement
-cvs est plus rapide
Installation du paquetage
yum install subversion
apt-get install subversion
Vérification
svn --version
svnadmin (Pour administrer svn)
Taper svnadmin --help
Options importantes
create
dump
help (?, h)
hotcopy
load
setlog
Options avancées
deltify, list-dblogs, list-unused-dblogs, lstxns, recover, rmtxns, verify
Mise en place d'un garde-source
1. Aller en root
2. Créer l'utilisateur svn: useradd svn[Enter]. Ceci créé aussi l'ustilisateur sous le groupe svn
3. Changer le mot de passe de l'usager svn: passwd svn[Enter]
4. Ajouter d'autres utilisateurs au groupe svn:
* usermod -G svn deryj[Enter]
* usermod -G svn usager[Enter] ("usager" est le nom de l'usager que l'on veut ajouter)
* more /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
...
mysql:x:27:
deryj:x:500:
svn:x:501:deryj
5. Quitter la session pour que les nouveaux paramètres d'accès soient reconnus
6. Ouvrir une session avec l'usager svn
7. Changer la permission sur le répertoire /home/svn: chmod 770 /home/svn[Enter]
8. Créer le garde-source: svnadmin create /home/svn/repos[Enter]
9. Quitter root: exit[Enter]
*Accès svn local (file://)
Aller dans notre répertoire
cd[ENTER]
Checkout
svn co file:///home/svn/repos/ copie-de-travail
Ceci va créer le repertoire source dans note répertoire local avec les fichiers du garde-source
Taper svn --help
Options de bases de svn (Mode ligne de commande)
*add
*checkout (co)
*commit (ci)
*copy (cp)
*delete (del, remove, rm)
*diff (di)
*export
*help (?, h)
*import
*log
*merge
*mkdir
*move (mv, rename, ren)
*resolved
*status (stat, st)
*update (up)
Options avancées de svn (Mode ligne de commande)
blame (praise, annotate, ann), cat, cleanup, info, list (ls), propdel (pdel, pd), propedit (pedit, pe), propget (pget, pg), proplist, plist, pl), propset (pset, ps), revert, switch (sw)
Options importantes de svnlook
svnlook info /home/svn/repos/ # Information qui peut être ustilisé dans une script
svnlook tree /home/svn/repos/ # Donne la structure de l'arbre
svnlook log /home/svn/repos/ # Montre la dernière entrée au régistre
svnlook youngest /home/svn/repos/ # Donne la révisiondu garde-source
Autres options de svnlook
author, cat, changed, date, diff, dirs-changed, help (?, h), history, propget (pget, pg), proplist (plist, pl), uuid
*Introduction à la gestion d'un garde-source
*Démonstration: Démarrer et travailler sur un Projet
Situation de départ:
On a un garde source sous /home/svn/repos
On créé les répertoires du projets
svn mkdir file:///home/svn/repos/tronc
svn mkdir file:///home/svn/repos/branches
svn mkdir file:///home/svn/repos/etiquettes
On prend un code source, on l'extrait
cd
tar xvzf ffe-0.1.9.tar.gz
On importe un projet dans le tronc
cd ffe-0.1.9
svn import file:///home/svn/repos/tronc
On fait un retrait (check-out) d'une copie de travail
cd
svn checkout file:///home/svn/repos/tronc ffe-0.1.9
On fait des changement successifs au point ou le code est prêt pour être publié (release)
Modifier le fichier README
(Si on travaille à plusieurs.) On reviens le lendemain matin: On va chercher la dernière version
Login
cd ffe-0.1.9
svn update
On créé une branche de publication (release branch) pour finaliser le code
(Note: M= Majeur, m= mineur)
cd
svn copy file:///home/svn/repos/tronc file:///home/svn/repos/branches/BP-0.2.0
On fait un retrait (check-out) d'une copie de la branche de publication
cd
svn checkout file:///home/svn/repos/branches/BP-0.2.0 BP-0.2.0
On paufine et finalise le code
On publie le code
cd
svn copy file:///home/svn/repos/branches/BP-0.2.0 file:///home/svn/repos/etiquettes/ffe-0.2.0
On exporte le code
cd
svn export file:///home/svn/repos/etiquettes/ffe-0.2.0 ~/Desktop/ffe-0.2.0
On crée un paquetage et on le publie
cd Desktop
tar cvzf ffe-0.2.0.tar.gz ffe-0.2.0
La raison principale pour utiliser svn:
Rendre la vie facile à un développeur
Améliorer la communication entre développeurs
Cycle de travail
Mise-à-jour
svn checkout
svn update
Faire des changements
svn add
svn delete
svn copy
svn move
Examiner les changements
svn status
svn diff
Ajouter les changements des autres
svn update
svn merge
Publier les changements
svn commit
Bonnes Pratiques
Politique appliquée au garde-source
Tronc stable
Tout le développement est fait sur les branches
Les branches sont incorporées au tronc une fois qu'ils ont été démontrées stables.
Tronc instable
Tout le développement se fait sur le tronc
Faire la sauvegarde (commit) au garde-source des changements
Ça peut paraître une évidence mais si les changements que l'on a fait reste dans notre copie de travail,
on ne partage pas son travail avec les autres (pas de collaboration)
on risque d'avoir des conflits en sauvegardant
Sauvegarder au garde-source régulièrement et souvent
Le garde-source est plus sûr que la copie locale (backup)
Moins de chance qu'un autre développeur fasse un changement qui entre en conflit avec votre code
Moins de perte de temps à fusionner
Plus c'est rapide, plus les autres développeurs verront vos changements
Faire de petits changements
Évite de créer un gros bogue qui monopolise tout le monde
Plus facile de voir les différences (svn diff) si bogue il y a
Une fusion de code (merge) est plus facile si le changement est petit
Un petit changement est plus facile à comprendre
Messages de log en disent assez
Changements: Subversion s'occupe du "quoi", il faut le pourquoi
Message incomplet --> On ne peut revenir en arrière pour savoir ce qui a été changé
Si possible inclure la référence au tracker (bogue ou nouvelle fonctionnalité)
Éviter de briser l'arbre
Éviter les changements (Modifications) qui défont la structure de l'arbre (Amène une perte de confiance des développeurs)
Éviter un changement qui empêcherait la compilation journalière ou rendrait le code inutilisable
Soultion: Faire le développement critique sur une branche, fusionner (merge) plus tard.
Créer une branche
C'est facile avec svn (Difficile avec cvs)
Ça permet de travailler sur quelque chose de spécial sans bloquer les autres
Problème:
Ça divise les resources
Fusion peut-être difficile
Autre utilité: Stabiliser le code avant de le publier (release-branch)
Faire en sorte que l'on puisse fusionner facilement
Faire de petits changements sur les branches
Faire des changement sensés: Changer la présentation du code (indenting) va créer des conflits en fusionnant
Faire des fusions plus petites (Faire les fusions rapidement pour éviter que ça soit trop compliqués)
Stratégie:
Fusionner du tronc à la branche, ensuite fusionner de la branche au tronc
Question: Est-ce que le trouble que je me donne en vaut la chandelle?
Outils Graphiques (rapidsvn, kdesvn, turtoisesvn, viewvc)
MANQUE LA DEMONSTRATION DE L'INSTALLATION DE rapidsvn, de viewvc
*Installation d'un serveur avec accès réseau "svn://"
Pour l'installation d'un serveur avec accès svn, il faut utiliser svnserve. svnserve fait partie du paquetage subversion.
Options de svnserve
Valid options:
-d [--daemon] : daemon mode
--listen-port arg : listen port (for daemon mode)
--listen-host arg : listen hostname or IP address (for daemon mode)
--foreground : run in foreground (useful for debugging)
-h [--help] : display this help
--version : show version information
-i [--inetd] : inetd mode
-r [--root] arg : root of directory to serve
-R [--read-only] : deprecated; use repository config file
-t [--tunnel] : tunnel mode
--tunnel-user arg : tunnel username (default is current uid's name)
-T [--threads] : use threads instead of fork
-X [--listen-once] : listen once (useful for debugging)
Contenu de /home/svn/repos/
ll /home/svn/repos
On configure la sécurité (Contenu de /home/svn/repos/conf/svnserve.conf)
[general]
anon-access = read
auth-access = write
password-db = passwd
Le fichier passwd (Contenu de /home/svn/repos/conf/passwd)
[users]
deryj=motdepasse
On lance svnserve en démon
svnserve -d -r /home/svn/repos
Vérification
ps-ef | grep svnserve
netstat -tap
netstat -tan
exit
svn co svn://localhost/branches test
On peut inclure ceci dans uns script de départ ou utiliser /etc/init.d/rc.local
La script de démarrage sera publié sur le site de clo
*Installation d'un serveur avec accès réseau "http://"
NOTE: On assume que Apache 2 est déjà installé
Installer le paquetage manquant
yum install mod_dav_svn
apt-get install libapache2-svn
1. Aller en root: su -[Enter]
2. Aller au répertoire /var/www/svn: cd /var/www/svn[Enter]
3. Créer le garde-source repos: svnadmin create repos[Enter]
4. Ajuster correctement les permissions: chown -R apache.apache repos[Enter]
5. Modifier /etc/httpd/conf/httpd.conf et ajouter ceci:
<Location /svn>
DAV svn
SVNParentPath /var/www/svn
# On limite l'accès aux utilisateurs authentifiés.
<LimitExcept GET PROPFIND OPTIONS REPORT>
# Enlever le # suivant pour forcer l'accès SSL (https)
# SSLRequireSSL
AuthType Basic
AuthName "Autorisation d'Accès"
AuthUserFile /etc/httpd/svnpasswd
Require valid-user
</LimitExcept>
</Location>
6. Créer le fichier d'accès: htpasswd -c /etc/httpd/svnpasswd deryj[Enter]
7. Ajouter l'utilisateur "pierre": htpasswd /etc/httpd/svnpasswd pierre[Enter]
8. Redémarrer Apache: service httpd restart[Enter]
9. Lancer un fureteur et essayer...
*Installation à partir de code source (configure, make, make install)
NOTE: J'ai utilisé un paquetage simple qui ne nécessitait pas de bibliothèque spéciale pour le compiler. Sinon ça peut se compliquer...
1. Aller chercher le paquetage "ffe" sur sourceforge
2. Décompresser l'archive: tar -xvzf ffe.0.1.9.tar.gz[Enter]
3. Aller dans le projet ffe: cd ffe.0.1.9[Enter]
4. Lire les fichiers README et/ou INSTALL
5. Avec l'utilisateur deryj lancer: ./configure[Enter]
6. Lancer make: make[Enter]
7. Aller en root: su[Enter]
8. Lancer make: make install[Enter]