Accueil > Développement > Le suivi des versions de projet avec CVS

Le suivi des versions de projet avec CVS

Le système collaboratif de gestion des versions (Concurrent Versions System, en anglais) est un outil open-source puissant pour la maintenance du code source d’un projet collaboratif. Il est fourni avec le CD des Outils de Développement qui accompagne Mac OS X ou fait partie des Outils de Développement de Mac OS X disponibles en ligne. Cet article couvre les fonctionnalités les plus couramment utilisées de CVS, avec un accent mis sur son utilisation avec des fichiers web statiques et interprétés (HTML, PHP, Perl, etc…).

CVS Vue d’ensemble et Terminologie

Avant de commencer, prenez un moment pour passer en revue quelques appellations communes de CVS. Un repository (dépôt) est un endroit où CVS garde les copies maîtresses (master) de tous les fichiers qu’il connaît, y compris les informations relatives aux évolutions de ces fichiers. Un project ou module est un ensemble de fichiers qui appartiennent au même ensemble, comme tous les fichiers qui composent un site Web particulier. Pour faire un checkout d’un projet, il faut faire une copie locale de tous les fichiers liés de manière à pouvoir effectuer des changements, et les tester sur votre propre système, sans affecter le travail des autres. Faire un commit (engagement) revient à sauvegarder vos changements sur le repository, où ils seront alors disponibles aux autres (ou à vous, dans le cas où vous souhaiteriez revenir à une version précédente).

Démarrage

CVS est compris dans Mac OS X, vous n’avez donc rien de nouveau à installer si vous avez installé les programmes qui sont sur le CD des Outils de Développement ou si vous les avez téléchargés sur http://developer.apple.com/tools/.

Pour commencer, créez un nouveau répertoire pour votre dépôt CVS en passant sous l’utilisateur root :

liz@localhost:~> sudo sh
Password:
root@localhost:~> mkdir /usr/local/cvsrep

Maintenant, regardez le propriétaire et le groupe positionnés par défaut sur le répertoire que vous venez juste de créer :

root@localhost:~> ls -ld /usr/local/cvsrep
drwxr-xr-x  3 root  wheel  58 Dec 9 21:30 /usr/local/cvsrep

Comme vous le voyez ci-dessus, le nouveau répertoire appartient à l’utilisateur root et au groupe wheel. Vous devez vous assurer que vous pourrez écrire dans ce répertoire même quand vous ne travaillerez pas sous l’utilisateur root. Vous voudrez probablement faire en sorte que votre répertoire CVS soit accessible à l’utilisateur primaire de votre système. Lors de mon installation de Mac OS X, Liz fut le premier compte créé et, par défaut, Mac OS X a attribué Liz au groupe wheel et à d’autres groupes administratifs :

root@localhost:~> groups liz
staff wheel admin

Les instructions qui suivent marchent sur la plupart des installations Mac OS X à utilisateur unique. Vous pouvez aussi en savoir plus sur le CVS en mode multiposte ici.

D’abord vous devez changer les permissions du répertoire récemment créé pour que l’utilisateur par défaut du système puisse y lire et y écrire.

root@localhost:~> chmod g+w /usr/local/cvsrep
root@localhost:~> exit
liz@localhost:~>

Créez maintenant la variable d’environnement shell CVSROOT. Cette variable indique à CVS où réside le repository (dépôt). (Note : si vous ne connaissez pas le shell que vous employez, c’est probablement tcsh).

Sous bash ou sh, la commande est :

liz@localhost:~> export CVSROOT=/usr/local/cvsrep

Ou, sous tcsh :

liz@localhost:~> setenv CVSROOT "/usr/local/cvsrep"

Une autre variable d’environnement que j’aime aussi changer est : CVSEDITOR, de manière à tout le temps utiliser mon éditeur de texte préféré, emacs. Si vous préférez vi (par défaut), vous pouvez ignorer cette variable. Si vous êtes novice dans le monde Unix, vous souhaiterez plutôt utiliser un programme simple comme pico. Plus tard dans cet article vous verrez comment employer CVS avec BBEDIT.

liz@localhost:~> export CVSEDITOR=emacs

Ou, dans tcsh:

liz@localhost:~> setenv CVSEDITOR "emacs"

Maintenant, vous êtes prêt à créer votre dépôt CVS avec la commande cvs init :

liz@localhost:~> cvs init
liz@localhost:~>

Dès que vous fermerez la fenêtre terminale courante, vous perdrez la variable d’environnement CVSROOT. Cela signifie, que la prochaine fois que vous essayerez d’utiliser CVS, vous verrez un message d’erreur dans ce style :

cvs import: No CVSROOT specified!  Please use the `-d' option
cvs [import aborted]: or set the CVSROOT environment variable.

Il y a trois façons d’éviter cette erreur. Vous pouvez régler manuellement les variables CVSROOT (et éventuellement CVSEDITOR) à chaque fois que vous voulez employer CVS. Ou, vous pouvez ajouter le commutateur -d /usr/local/cvsrep à vos commandes CVS. Cependant, l’option la plus facile à la longue est d’insérer la commande export ou la commande setenv précédente dans votre fichier de démarrage shell. Voir la page man de votre shell par défaut en tapant, par exemple, man sh ou man tcsh, si vous ne savez pas comment créer un fichier de démarrage.

Création de votre premier projet

Une fois que vous avez initialisé CVS, vous pouvez créer un nouveau projet. D’abord, créez un répertoire appelé “myproj” sous votre répertoire domestique (~):

liz@localhost:quelquepart> cd ~
liz@localhost:~> mkdir myproj
liz@localhost:~> cd myproj

Maintenant vous pouvez créer un nouveau fichier appartenant à votre projet. En guise d’essai, créez un fichier HTML appelé ~/myproj/index.html avec quelque ligne de texte basique :

<html><head><title>First</title></head>
<body bgcolor="white">

<h1>Premier fichier du premier projet CVS</h1>

</body>
</html>

Maintenant vous pouvez ajouter ce nouveau projet à votre dépôt CVS en employant la commande import :

liz@localhost:myproj>cvs import -m "My First Project"
  myproj vendor-tag start

N myproj/index.html

No conflicts created by this import
liz@localhost:myproj>

Vous pouvez en apprendre plus sur le vendor-tag facultatif ici.

Création de copies vivantes d’un Projet

Maintenant que vous avez créé un nouveau projet CVS contenant un simple fichier, vous (ainsi que d’autres personnes) pouvez employer la commande checkout pour faire des copies vivantes du projet. Vous pouvez ainsi apporter des changements au projet et les tester. Puis, une fois que vous serez satisfait des modifications, remettez les changements au dépôt principal.

Un lieu sensible pour tester les copies de projets web est votre répertoire Web individuel. Par défaut, ce répertoire est /home/username/Sites/. En supposant qu’Apache fonctionne sur votre machine Mac OS X, les fichiers placés dans ce répertoire peuvent être vus dans un navigateur Internet via l’adresse http://localhost/~utilisateur.

C’est ainsi que je vérifie la nouvelle copie d’un projet dans mon répertoire ~/Sites :

liz@localhost:~> cd ~/Sites
liz@localhost:Sites> cvs checkout myproj
cvs checkout: Updating myproj
U myproj/index.html

liz@localhost:Sites> cd myproj

Vous pouvez maintenant voir cette page dans votre navigateur :

Browsesr Copie d'écran

À ce point, vous pouvez supprimer le fichier original du projet de votre répertoire domestique (~/myproj/index.html) si vous le souhaitez. Le fichier est maintenant dans le dépôt CVS et vous pouvez le tester chaque fois que vous le désirez.

Effectuer des Changements

Maintenant vous pouvez apporter quelques changements à votre copie locale de myproj/index.html, qui se trouve dans le répertoire ~/Sites. Par exemple, vous pourriez ajouter une ligne de texte :

<html><head><title>First</title></head>
<body bgcolor="white">
<h1>Le Premier Fichier du Premier Projet de CVS </h1>

J'ai ajouté ce texte au fichier.

</Body > < / HTML >

Une fois que vous avez effectué les changements, remettez le fichier mis à jour au dépôt. CVS s’attend à ce que vous fournissiez un commentaire avec votre remise dont le but est de récapituler le travail que vous avez fait. Si vous ne fournissez pas de commentaire en employant l’option -m, CVS vous ménera dans un éditeur de texte (voir CVSEDITOR ci-dessus) et attendra que vous tapiez et sauvegardiez un commentaire avant de procéder à la mise à jour.

liz@localhost:myproj> cvs commit -m "updated index.html" index.html
Checking in index.html;
/usr/local/cvsrep/myproj/index.html,v  <--  index.html
new revision: 1.2; previous revision: 1.1
done

Ajout et suppression de fichiers

Quand il devient opportun d’ajouter de nouveaux fichiers à votre projet, vous pouvez les créer dans le répertoire ~/Sites/myproj/ et les importer en employant la commande CVS add :

liz@localhost:myproj> cvs add another.html
cvs add: scheduling file `another.html' for addition
cvs add: use 'cvs commit' to add this file permanently
liz@localhost:myproj>

liz@localhost:myproj> cvs commit -m "added another.html"
cvs commit: Examining .
RCS file: /usr/local/cvsrep/myproj/another.html,v
done
Checking in another.html;
/usr/local/cvsrep/myproj/another.html,v  <--  another.html
initial revision: 1.1
done

Si vous voulez enlever un fichier d’un projet, supprimez d’abord le fichier lui-même, et dites ensuite à CVS qu’il a été supprimé :

liz@localhost:myproj> rm another.html
liz@localhost:myproj> cvs remove another.html
cvs remove: scheduling `another.html' for removal
cvs remove: use 'cvs commit' to remove this file permanently

liz@localhost:myproj> cvs commit -m "removed another.html"
cvs commit: Examining .
Removing another.html;
/usr/local/cvsrep/myproj/another.html,v  <--  another.html
new revision: delete; previous revision: 1.1
done
liz@localhost:myproj>

Reconstitution d’une version précédente

Si vous voulez retrouver l’état d’un projet à un instant donnée dans le passé, vous pouvez employer l’option -D. Par exemple, pour retrouver l’état du projet à une certaine date et une certaine heure, créer un nouveau répertoire (ou déplacer ou supprimer vos fichiers existants) et tapez cvs checkout -D date project. Par exemple :

liz@localhost:Sites> cvs checkout -D "2001-11-29 18:00" myproj
cvs checkout: Updating myproj
U myproj/index.html

Travailler avec des projets multiples

Votre dépôt CVS peut contenir autant de projets que la capacité de votre disque dur le permettra. Vous n’avez qu’à créer des nouveaux projets avec la commande cvs import. Quand vous voulez vérifier la version d’un projet, faites cd vers le répertoire local de votre projet et lancez une commande CVS commit, add, remove, etc. En réalité, il n’y a aucune raison qui vous empêche d’avoir plusieurs dépôts CVS. Vous pouvez spécifier des dépôts différents en employant l’option -d ou en changeant la variable d’environnement CVSROOT. Tous les exemples de cet article, cependant, supposent qu’il n’y a qu’un seul dépôt local.

Utilisation de CVS avec BBEDIT 6.5

Traditionnellement, les développeurs Internet Mac emploient BBEDIT pour développer des fichiers en local, puis les transmettent par FTP vers un serveur éloigné. Mais BBEDIT 6.5 tourne nativement sur Mac OS X et il supporte les scripts UNIX en mode intégré. Cela signifie que vous pouvez écrire des scripts shell simples pour avoir accès à CVS sans quitter BBEDIT.

Pour lancer un script shell Unix à l’intérieur BBEDIT 6.5 ou supérieur, vous emploierez l’option de menu intitulée #! (souvent prononcée “shebang”). D’abord, créez un répertoire pour y mettre vos scripts.

liz@localhost:~> mkdir scripts

Maintenant vous pouvez créer un fichier appelé, par exemple, “commit” dans ~/scripts. Si vous envisagez de travailler avec des projets multiples, vous pouvez donner au fichier un nom plus spécifique, comme”myproj_commit“. Le fichier aurait le contenu suivant :

#!/bin/sh
cd ~/Sites/myproj
cvs -d /usr/local/cvsrep commit

Pour lancer votre nouveau script, choisissez Run File à partir du menu shebang de BBEDIT. La première fois que vous le lancez, vous devez indiquer à BBEDIT où se trouve le script. A l’avenir, BBEdit se rappellera des scripts récemment exécutés et vous les proposera.

Utilisation des branches CVS

Les branches peuvent être utiles même pour la plus simple des applications web. Par exemple, vous pouvez publier la version d’un site tandis que vous travaillez sur la version suivante. Avec des branches CVS, non seulement vous pouvez garder la trace de publications multiples, mais vous pouvez aussi facilement référencer vos différentes versions, faire des corrections et de la maintenance beaucoup plus facilement. Vous pouvez créer des branches en employant l’option -b de la commande cvs tag.

liz@localhost:myproj> cvs tag -b phase_one
cvs tag: Tagging myproj
T myproj/index.html

Maintenant que vous avez étiqueté le projet pour la première fois, vous devez passer à l’étape suivante : publiez votre répertoire de travail courant et soumettre une nouvelle copie du projet, en spécifiant le nouveau nom de branche (l’option -d supprime les fichiers en cours d’utilisation) :

liz@localhost:Sites> cvs release -d myproj
You have [0] altered files in this repository.
Are you sure you want to release (and delete) directory `myproj': y

liz@localhost:Sites> cvs checkout -r phase_one myproj
cvs checkout: Updating myproj
U myproj/index.html

Publication de Code avec CVS

Si vous regardez votre répertoire projet dans ~/Sites/myproj, vous verrez que vos fichiers source ne sont pas les seuls présents. Il y a aussi des fichiers CVS administratifs et des répertoires :

liz@localhost:myproj>ls -l
total 8
drwxr-xr-x  5 liz  staff  264 Dec 11 23:23 CVS
-rw-r--r--  1 liz  staff  125 Dec 12 17:19 index.html

Ceux-ci sont nécessaires quand vous travaillez sur un projet, mais vous ne souhaiterez pas vraiment qu’ils fassent partie de votre site Web au moment de sa publication. Pour obtenir la copie d’un projet sans données CVS additionnelles, vous pouvez employer la commande export de CVS. Par exemple, voici comment j’exporterais mon projet web vers la racine de mon serveur Apache. Note : je spécifie now comme date parce que l’exportation attend soit un libellé de branche soit une date.

liz@localhost:~> cd /Library/WebServer/Documents
liz@localhost:Documents> cvs export -D "now" myproj
cvs export: Updating myproj
U myproj/index.html

liz@localhost:Documents> cd myproj
liz@localhost:myproj>ls -l
total 8
-rw-r--r--  1 liz  staff  186 Dec 12 20:29 index.html

Utilisation de CVS avec plusieurs développeurs

CVS permet à plusieurs personnes de travailler sur le même fichier en même temps. En fait, si deux personnes font des changements sur le même fichier et le soumettent, CVS essayera de mixer les deux changements. Si CVS ne peut pas mixer vos changements (par exemple, deux personnes ont toutes les deux changé le même secteur du même fichier), il vous indiquera que vous avez besoin d’éditer manuellement le fichier - et probablement communiquer avec l’autre développeur - pour résoudre le conflit.

Si beaucoup de personnes ont accès au même dépôt CVS sur la même machine, il permet de créer un nouveau groupe de connexion CVS pour que tous les développeurs puissent avoir accès en écriture au dépôt.

Pour créer un nouveau groupe sous Mac OS X, lancez l’application NetInfo Manager située dans /Applications/Utilities et suivez ces étapes :

  • Cliquez sur l’icône de cadenas et entrez votre mot de passe administrateur pour effectuer les changements.
  • Cliquez sur “groups” dans le navigateur de répertoires pour afficher les groupes.
  • Vous allez faire une copie d’un groupe existant et le rebaptiser. Cliquez d’abord sur “deamon”.
  • Cliquez sur l’icône “Dupliquer le répertoire sélectionné” (l’image constituée de deux dossiers).
  • Cliquez sur le nom du nouveau groupe dans la colonne “Valeurs” et changez son nom en “cvs-user”.
  • Changez l’id du groupe (gid) avec un numéro qui n’a pas été encore employé, comme 501.
  • Mettez en évidence le champ “users” dans la colonne “Propriété(s)”.
  • Pour chaque utilisateur que vous voudrez associer à ce groupe, choisissez “Insérer une valeur” du menu “Répertoire”. Double cliquez sur la valeur nouvellement insérée et attribuez lui le nom court de l’utilisateur à associer au groupe.

Quand vous avez fini, vous devez voir une fenêtre ressemblant à celle ci-dessous (”liz” et “jay” sont les deux utilisateurs que j’ai associés au groupe “cvs-user”) :
NetInfo Copie d'écran

Une fois fini, vous pouvez retourner dans le shell pour confirmer que les utilisateurs “liz” et “jay” sont les membres du groupe cvs-user :

liz@localhost:~groups liz
staff wheel admin cvs-user

liz@localhost:~>groups jay
staff cvs-user

Finalement, changez la propriété de groupe de votre dépôt CVS pour que les membres de votre nouveau groupe cvs-user puissent y avoir accès :

liz@localhost:~>sudo chgrp cvs-user /usr/local/cvsrep
Password:

CVS propose plusieurs commandes utiles pour la collaboration multi-développeur. Parmis celles-ci, cvs status affiche des informations sur des fichiers que vous avez changés et qui ont aussi été changés par d’autres, cvs release indique à CVS que vous avez fini de travailler sur un projet, et cvs update qui met à jour la copie du projet sur laquelle vous travaillez pour refléter les changements effectués par d’autres. Pour en savoir plus sur celles-ci allez voir les suggestions pour des lectures approfondies (en anglais).

Utilisation de CVS au travers d’un réseau

Jusqu’ici, vous avez appris à manipuler des dépôts et des projets stockés sur votre machine locale Mac OS X. CVS vous permet aussi de manipuler des dépôts situés sur d’autres machines sur Internet, à condition qu’elles aient lancé quelques services.

Pservers CVS

Vous pouvez prendre contrôle de fichiers situés sur un dépôt distant en ayant accès à un pserver CVS public (serveur de mot de passe). Beaucoup de pservers, particulièrement ceux pour des projets open-source, permettent un accès en lecture seule sous l’identifiant “anonymous” avec le mot de passe “anonymous”. Vous pouvez avoir accès à un serveur distant (indiqué avec l’option -d) en utilisant d’abord la commande login, suivie par la commande checkout.

liz@localhost:Sites> cvs -d :pserver:anonymous@
  remote_server:/path/to/repository login
CVS password: anonymous

liz@localhost:Sites> cvs -d :pserver:anonymous@remote_server:
  /path/to/repository checkout module_name

Il y a cependant un inconvénient significatif à l’utilisation de cette méthode pour des accès autres qu’anonymes. Les pservers CVS transmettent le nom d’identifiant de la connexion et le mot de passe de manière non chiffrée. Les fichiers de module sont transmis en clair aussi. Cela signifie que n’importe quelle personne mal intentionnée qui peut se brancher sur réseau a un accès total non seulement aux informations d’établissement de la connexion, mais aussi à vos données.

Il y existe des manières pour ne paramétrer que les identifiants et mots de passe cvs (voir les suggestions pour des lectures approfondies pour cela), mais il serait peut être mieux, à mon avis, de se servir de CVS au travers d’une connexion entièrement chiffrée. Pour cela, vous pouvez employer ssh (le shell sécurisé).

Sécurisez CVS via ssh

Il est simple d’employer entièrement CVS sous ssh. Si vous réglez la variable d’environnement CVS_RSH (CVS Remote Shell) sur “ssh“, vous pouvez lancer des commandes CVS sans crainte au travers d’Internet, comme si vous les lanciez en local. Les utilisateurs Mac OS X 10.1 disposent de ssh et scp (copie sécurisée) par défaut. Si vous employez une version précédente de Mac OS X, vous pouvez visiter http://www.openssh.com/ pour obtenir ssh.

Si vous voulez utiliser ssh sans devoir taper votre mot de passe à chaque fois (utile si vous avez accès à CVS via un script shell dans BBEDIT, par exemple), vous pouvez créer une paire clef publique/privée avec la commande ssh-keygen. L’avantage cette méthode consiste dans le fait que vos scripts pourront être lancés sans intervention humaine. L’inconvénient est que toute personne ayant accès à votre compte Mac OS X local sera aussi capable d’avoir accès aux serveurs distants qui ont stocké votre clef publique.

Les commandes exactes à entrer pour utiliser ssh-keygen dépendent de la version de ssh que vous possédez (1 ou 2). Si vous vous servez de la version 1, entrez les commandes suivantes. (Note : si vous frappez retour quand on vous demande une “phrase mot de passe” le processus s’arrêtera avec cette “phrase mot de passe” vide.)

liz@localhost:~> cd  ~/.ssh
liz@localhost:> ssh-keygen -t rsa1
Generating public/private rsa1 key pair.
Enter file in which to save the key (/Users/liz/.ssh/identity):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/liz/.ssh/identity.
Your public key has been saved in /Users/liz/.ssh/identity.pub.
The key fingerprint is:

liz@localhost:.ssh>ls
identity     identity.pub

Et pour la version 2, faites ceci :

liz@localhost:~> ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/Users/liz/.ssh/id_dsa):
Created directory '/Users/liz/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/liz/.ssh/id_dsa.
Your public key has been saved in /Users/liz/.ssh/id_dsa.pub.
The key fingerprint is:

liz@localhost:~>cd ~/.ssh
liz@localhost:~> ls
id_dsa     id_dsa.pub

Une fois que vous avez créé vos clefs privées et publiques, vous devez placer votre clef publique en un lieu de l’hôte distant où ssh et scp pourront le reconnaître. Employez ssh pour vous connecter à l’hôte distant sur lequel vous voulez publier vos projets. Ajoutez alors le contenu de votre fichier ~/.ssh/identity.pub ou id_dsa.pub à un fichier de votre répertoire distant ~/.ssh appelé “authorized_keys” (si vous n’en avez pas, vous pouvez le créer).

Que vous ayez ou pas placé votre clef publique sur le serveur distant, vous pouvez lancer CVS en toute sécurité via ssh :

liz@localhost:Sites> export CVSROOT=":ext:your_login@
your_remote_server:/path/to/repository"

liz@localhost:Sites> export CVS_RSH="ssh"

liz@localhost:Sites> cvs checkout remote_module_name

Conclusion et Suggestions pour d’autres lectures

Dans cet article vous avez vu comment créer des dépôts et des projets CVS, ajouter et extraire des fichiers, faire des changements et les remettre et, avoir accès à CVS sur des serveurs autres que le propre. Il y a beaucoup d’autres fonctionnalités dans CVS que vous pourriez explorer et je vous encourage à suivre les liens ci-dessous pour en apprendre plus.

Pour plus d’informations sur CVS, visitez http://www.cvshome.org/. Le Manuel CVS Officiel est d’un intérêt particulier. Sur votre système Mac OS X local, vous trouverez aussi la documentation standard de CVS, quand vous tapez “man cvs“. Enfin, il y a aussi le livre de poche pratique CVS la Référence de Poche, écrit par Gregor N. Purdy et publié par O’Reilly.

Textes originaux en anglais sur developer.apple.com : Version Control with CVS on Mac OS X

© Juillet 2002 - Thierry pour Project:Omega

Thierry Développement , ,

  1. Pas encore de commentaire
  1. Pas encore de trackbacks
Vous devez être identifié pour poster un commentaire