Mettre en place son environnement de développement .NET par Laurent Desmons (ldesmonsmcsd@hotmail.com)

Introduction

Aucun doute, les IDE actuels comme Visual Studio .NET sont des outils formidables. Toutefois, dès qu'il s'agit de vouloir faire du développement sérieux en équipe, il est nécessaire de les compléter en utilisant au quotidien des outils bien pratiques voire indispensables, qui plus est totalement gratuits.

Cet article se propose donc de guider le lecteur à travers la mise en oeuvre d'un environnement de développement rigoureux, stable et assez souple pour pouvoir être utilisé lors de projets de plus ou moins grande envergure.

Tout chef de projet qui se respecte devrait ainsi songer à intégrer les outils suivants dans le cycle de développement des projets dont il a la charge :

Ces outils sont tous complémentaires. Libre au lecteur de choisir tel ou tel outil pour chacune de ces catégories. Dans cet article je présenterai les outils que j'utilise personnellement au quotidien, les motivations qui me poussent à les utiliser, ainsi que leur mise en oeuvre détaillée, tout cela au travers d'un exemple très simple. L'intégration de ces outils sera progressive.

J'espère ainsi démontrer au lecteur que l'investissement de départ nécessaire à la domestication de ces outils n'est rien du tout comparé aux bénéfices qu'ils apportent tout au long de la réalisation du projet. 

Présentation de la solution NetEnvDev

Pour les besoins de cet article je vais me baser sur une solution Visual Studio .NET appelée "NetEnvDev" comportant les projets C# suivants :

Le principe de cette application est le suivant :

  Figure 1 : l'application NetEnvDev

Figure 1 : l'application NetEnvDev

Simplissime et inutile, n'est-ce-pas ?? C'est le but recherché, afin de ne pas nous encombrer de code applicatif et de nous concentrer sur les détails d'intégration de chaque outil.

Cette solution est prise en charge par plusieurs développeurs qui travaillent sur des machines différentes. Conformément aux bonnes pratiques en vigueur, un serveur séparé fait office de machine de build de référence.

Même pour ce projet minuscule, une première remarque s'impose alors : pour éviter tout problème il est fortement recommandé d'adopter la même structure de répertoires sur chaque poste de développement ainsi que sur le serveur de build, aussi bien pour les sources applicatives que pour les assembly externes dont dépend chaque projet. En effet, Visual Studio .NET stocke les références des assembly locales sous la forme d'un chemin relatif dans le fichier du projet, dans la section <references> et l'attribut HintPath. Vous n'aurez pas de soucis si vous n'avez que des références par projet, mais dès que vous ajoutez des références par fichier sur une assembly externe, le chemin d'accès est relatif au projet, et risque donc de ne plus correspondre sur une autre machine, si vous n'avez pas adopté une structure de répertoires identique. 

Comme chaque développeur partage le même code source de référence, il est indispensable de mettre en oeuvre des outils de contrôle de ce code source, dès le début du projet, afin d'éviter tout conflit potentiel et de gérer les versions (bien sûr, pour les toutes petites équipes de développement, on peut s'en passer, mais au-delà de 2 développeurs on peut difficilement se permettre d'aller au devant de grandes difficultés de maintenance et de souplesse au quotidien). 

Notez bien au passage que cela ne se réduit pas au code source : on peut également contrôler les versions de la documentation, les fichiers de configuration, les fichiers de projet pour les outils, le fichiers de clés ".snk" pour signer les assembly avec des noms forts, les scripts SQL pour les bases de données, etc... 

Contrôleur de code source : Visual SourceSafe (VSS)

Le choix le plus immédiat se porte naturellement vers Visual SourceSafe 6.0d de Microsoft, car il est livré avec Visual Studio .NET. Cet outil a des défauts (le pire de tous étant sans doute sa mauvaise adaptation à Internet et ses performances parfois nettement dégradées avec la taille des projets) mais il est facile d'emploi et de mise en oeuvre, et intimement intégré à Visual Studio .NET. Remarque importante: pour des raisons qui apparaîtront claires plus tard, il faut utiliser la version anglaise de VSS et non pas la version française.......

Une alternative fiable et éprouvée consiste à utiliser un serveur CVS dans sa version Windows (CVSNT) et à intégrer un client CVS à VS .NET en passant par un plug-in SCC comme Igloo ou (bien mieux) le CVS SCC proxy plug-in de PushOK. On peut également faire appel à Perforce, qui est peut-être ce qui se fait de mieux en la matière, mais qui n'est pas gratuit.

L'utilisation d'un outil de contrôle de code source peut se résumer à des principes assez simples :

Ces principes sont valables quel que soit l'outil de contrôle de code source. L'intérêt de VSS ici est que toutes ces opérations peuvent être effectuées directement depuis Visual Studio .NET, avec un simple clic de souris (en pratique, il est même vivement conseillé de ne pas se servir de l'interface graphique livrée avec Visual SourceSafe pour ces opérations liées aux fichiers d'une solution). 

On voit tout de suite que l'utilisation d'un tel outil réclame une bonne dose de discipline de la part des développeurs, du moins au début. Ensuite, l'habitude est vite prise, à comparer aux sources locales maintenues manuellement et mises à jour sur un répertoire partagé entre plusieurs utilisateurs à grands coups hasardeux de WinDiff...

Dans la mesure du possible, il est recommandé de :

Dans notre cas, pour faire simple, le serveur de build fait également office de serveur de base VSS et maintient donc les sources de référence.

Mise en oeuvre de Visual SourceSafe

Il est très facile de mettre en oeuvre VSS ici (rappelons qu'on doit utiliser la version en anglais!) :

La procédure est la même pour les projets plus importants. Il faut simplement noter que dans le cas où on a affaire à des applications Web, il est recommandé que :

A ce stade, il faut remarquer deux choses :

Figure 2 :fichiers contrôlés par VSS dans Visual Studio .NET

Figure 2 :fichiers contrôlés par VSS dans Visual Studio .NET

Figure 3 :fichiers contrôlés par VSS dans Visual SourceSafe Explorer

Figure 3 :fichiers contrôlés par VSS dans Visual SourceSafe Explorer

Dans Visual Studio .NET, il est possible d'archiver chaque fichier extrait individuellement depuis l'Explorateur de Solutions (en y apposant également un commentaire), ou bien d'utiliser la fenêtre "Archivages en attente" qui permet à la fois d'avoir une vision sur l'ensemble des fichiers extraits et également de tous les archiver d'un coup. 

Au quotidien, il n'est d'ailleurs pas vraiment conseillé de laisser les fichiers en attente d'archivage trop longtemps, d'autant plus que cela va à l'encontre des principes dits de "l'intégration continue", que je présenterai en fin d'article:

Figure 4 :archivages en attente dans Visual Studio .NET

Figure 4 :archivages en attente dans Visual Studio .NET

Pour un travail de développement en équipe, les bénéfices de ce genre d'outil sont immédiats (et durables) et il me semble donc inutile d'insister plus avant. Pour une vision plus globale et approfondie on se reportera à l'excellent article suivant: Team development with Visual Studio .NET and Visual SourceSafe.

Maintenant que nous sommes dans le code source, attardons-nous donc un peu sur les outils qui permettent de l'écrire un peu plus proprement.

Vérificateur de code source : FxCop

N'importe quel développeur .NET sait écrire du code C#, mais pas forcément du code sécurisé, performant, facilement maintenable, extensible, en harmonie avec les autres développeurs, avec des règles de nommage uniformes et strictes, la prise en compte de la culture, etc.. . le chef de projet doit savoir imposer des règles de développement de façon à ce que son projet soit le plus homogène possible.

Au niveau des projets, répertoires, architectures, Visual Studio .NET propose les Enterprise Templates (sur lesquels je ne reviendrai pas, car ils forment le sujet d'autres articles par ailleurs, comme par exemple celui-ci). En matière de code source, je propose l'outil gratuit FxCop

Sur le principe, rien de bien compliqué : FxCop se base sur un ensemble de règles pour analyser le code source d'un EXE ou d'une DLL. En cas de violation, l'outil précise la règle, la violation correspondante dans le code source, ainsi que les moyens exhaustifs d'y remédier (exemples à l'appui). Il est bien entendu possible de désactiver une règle en particulier, ou tout un ensemble de règles d'un coup.

Ces règles sont regroupées en ensembles fonctionnels (des assembly) à la manière de plug-ins : règles de nommage, de design, de globalisation, d'usage.... actuellement FxCop prend en charge plusieurs centaines de règles, classées selon différents niveaux de gravité. Les violations les plus graves ne devraient jamais être ignorées.

L'intérêt d'un tel outil ? Hormis quelques considérations qui devraient apparaitre évidentes (nommer les variables en accord avec les recommandations usuelles, adopter de bonnes attitudes et de bons réflexes de design), je considère que l'intérêt principal d'un tel outil est d'attirer l'attention du développeur sur telle ou telle pratique reconnue comme "bonne", afin que non seulement il y soit sensibilisé, et ne prenne donc pas le risque de l'oublier (ou, mieux, prenne l'habitude de l'adopter!) mais que également il soit capable de justifier pourquoi une règle a été volontairement violée ou ignorée, et ce en toute connaissance de cause. 

Il s'agit donc bien de responsabiliser l'auteur du code source, et non pas de le "policer". Il faut faire en sorte que l'outil se plie aux besoins du code source, et pas l'inverse.

Il est bien évident qu'il est ensuite entièrement de la responsabilité du chef de projet de décider d'adopter telle ou telle règle, et d'en ignorer d'autres. Mais il faut bien se rendre compte que ces règles sont le plus souvent fondées sur de bons principes, par ailleurs éprouvés. Pour ma part, en utilisant cet outil je cherche avant tout à éviter les erreurs les plus graves, et à comprendre le pourquoi de certaines erreurs plus bénignes. L'expérience en ce domaine montre qu'avec l'habitude il devient beaucoup plus facile de ne plus commettre beaucoup de violations de règles. Il s'agit donc bien à terme d'un moyen comme un autre de mieux maîtriser le Framework .NET.

Mise en oeuvre de FxCop

FxCop se présente sous deux formes différentes : une interface graphique appelée "FxCop" et un utilitaire en mode console appelé "FxCopCmd". Tous deux offrent les mêmes fonctionnalités. Sur les postes de développement nous allons utiliser FxCop; nous reviendrons sur FxCopCmd plus tard, quand nous aborderons le serveur de build.

Pour mettre en oeuvre FxCop dans notre exemple :

Figure 5 : le projet FxCop NetEnvDev  

Figure 5 : le projet FxCop NetEnvDev  

Figure 6 : le projet NetEnvDev.FxCop intégré dans VSS

Figure 6 : le projet NetEnvDev.FxCop intégré dans VSS

Figure 7 : Première analyse par FxCop

Figure 7 : Première analyse par FxCop

Concrètement maintenant, le travail consiste à éliminer le plus possible de violations, et à lancer l'analyse à chaque génération de code. Le résultat peut être sauvegardé sous la forme d'un fichier au format XML "FxCop Report". Notez toutefois que FxCop (en anglais) peut détecter à tort une erreur liée au dictionnaire associé à certaines règles dites de "spelling" que nous autres Français pouvons ignorer sans risques; ces règles se trouvent dans le package "UsageRules.dll" et sont toutes celles qui sont relatives au dictionnaire (ex : "Member names should consist of correctly spelled words").

Pour ma part, dans notre exemple, après corrections il ne me reste plus que le Warning :

Figure 8 : FxCop montre que toutes les erreurs ont été corrigées

Figure 8 : FxCop montre que toutes les erreurs ont été corrigées

Remarques importantes :

Générateur de documentation : NDoc

Soyons clairs d'emblée : je veux parler ici uniquement de la documentation du code source. Certains trouveront sans doute étrange que je mentionne la documentation à ce stade. On pourrait s'attendre à ce qu'elle soit générée tout à la fin du cycle de vie d'un projet... il s'agit là d'une erreur bien lourde, sans cesse répétée, et motivée par des raisons souvent révélatrices de problèmes plus graves par ailleurs ("je n'ai pas le temps maintenant", "le code change tout le temps, la documentation aussi", "je ne connais pas encore les méthodes ou l'interface de cette classe, alors la documentation hein...", etc...). 

C'est en effet oublier bien vite que plus le code source est documenté tôt, et plus il sera proprement écrit, réfléchi, solide (et plus les tests unitaires seront également bien écrits, mais je reviendrai sur ce point au chapitre suivant). Une bonne documentation prend du temps à être rédigée, c'est vrai, mais bien plus de temps encore en fin de projet qu'au début. Il s'agit encore et toujours de réflexes à acquérir, ce qui passe par une bonne discipline initiale. Ensuite, on n'y pense pratiquement plus et on l'écrit machinalement au moment de la création de la classe ou de ses méthodes ou propriétés (surtout si Visual Studio .NET répète inlassablement les mêmes genres de warnings à chaque compilation !). C'est d'autant plus vrai que normalement les classes et leurs attributs ou méthodes sont déjà spécifiées par ailleurs (par exemple dans des diagrammes UML) et qu'il est donc fort probable que la documentation de code source soit d'emblée (presque) définitive.

Hormis cela, l'intérêt de bien documenter en même temps qu'on rédige le code source est triple :

L'outil que je propose ici s'appelle NDoc, un freeware dont la fonction est de regrouper les fichiers XML produit par Visual Studio .NET pour les compiler ensemble en un fichier d'aide au format standard CHM.

Ajoutons tout de même qu'en fonction de la taille du projet, cette génération de documentation pourra être réservée à une configuration bien précise (release uniquement par exemple), voire même un poste bien précis (comme sur le serveur de build uniquement) : encore une fois, c'est au chef de projet de décider de ce qu'il veut faire de l'outil.

Mise en oeuvre de NDoc

Il suffit de suivre les étapes suivantes pour mettre en oeuvre NDoc:

Figure 9  : la documentation de code source dans Visual Studio .NET

Figure 9  : la documentation de code source dans Visual Studio .NET

Figure 10 : le projet NetEnvDev.ndoc 

Figure 10 : le projet NetEnvDev.ndoc 

Figure 11 : La documentation NDoc pour NetEnvDev

Figure 11 : La documentation NDoc pour NetEnvDev

Avoir un code source bien écrit et documenté n'est qu'une étape parmi d'autres: il faut s'assurer en même temps qu'il répond correctement aux tests unitaires, et ce à n'importe quelle étape de son développement.

Tests unitaires automatisés : NUnit

La méthodologie appelée Test-Driven Development consiste, pour chaque classe, à écrire les tests unitaires correspondants avant d'écrire le code. On peut adhérer pleinement à cette technique (tout droit issue des principes de l'Extreme Programming) ou la considérer comme irréaliste, mais force est de reconnaître qu'elle a le mérite de mettre l'accent sur les tests unitaires (un peu à l'image du chapitre précédent sur la documentation de code).

Une des conditions de qualité des tests unitaires est d'être reproductibles, et donc théoriquement re-déroulés à chaque modification du code associé. Le faire manuellement est illusoire et peu fiable, et il s'agit donc d'automatiser le déroulement des tests unitaires en utilisant des outils adaptés. Je vous présente donc NUnit, un freeware (basé sur JUnit) permettant de créer des tests unitaires associés à chaque classe développée pour ensuite les exécuter autant de fois qu'on le désire.

Bien évidemment, l'écriture de tests unitaires a un coût, et il s'agit de les rendre les plus simples et les plus exhaustifs possibles. Ils ne sont pas non plus la panacée, ni garants de la totale fiabilité du code. Mais ils sont indispensables pour tout projet sérieux. A ce sujet, on se reportera sur des articles publiés par ailleurs, comme le très intéressant Tests unitaires en pratique. Mon propos est simplement de montrer comment les mettre en oeuvre.

Le principe de fonctionnement de NUnit est relativement simple :

Mise en oeuvre de NUnit

Une fois compris les principes de NUnit, sa mise en oeuvre est directe sans toutefois être immédiate :

Figure 12 : la classe MainClassTest

Figure 12 : la classe MainClassTest

 

Figure 13: la méthode AddTest()

Figure 13: la méthode AddTest()

Figure 14 : les tests unitaires ont réussi

Figure 14 : les tests unitaires ont réussi

 

  Figure 15 : les tests unitaires ont échoué

Figure 15 : les tests unitaires ont échoué

  Ceci n'est bien sûr qu'un résumé succinct des possibilités de NUnit, que je vous encourage vivement à approfondir.

Avant d'aller plus loin...

Pour résumer, un développeur qui aborde un cycle d'écriture de code devrait respecter (au moins) les principes suivants:

Une règle d'or à observer en effet est qu'il ne faut jamais archiver dans le référentiel du code qui n'a pas été vérifié, ni documenté, et encore moins testé.  

Il faut bien se rendre compte cependant que l'utilisation systématique de ces outils finit par être répétitive et, du coup, rébarbative. Il s'agit d'aider le développeur dans son travail de tous les jours, et non pas de le retarder avec des outils fastidieux qu'il va s'empresser de négliger ! L'idéal donc serait de pouvoir automatiser cet enchaînement de tâches et de laisser au développeur le soin de se concentrer sur l'écriture de son code, et les corrections éventuelles à apporter. 

Or Visual Studio .NET par exemple ne permet *que* de compiler. De plus il est prévu de ne pas l'installer sur le serveur de build (le SDK uniquement doit suffire à compiler).

Il s'agit donc de pouvoir dénicher un outil de build automatique qui permet de compiler, vérifier le code source, documenter et effectuer les tests unitaires, le tout par une simple ligne de commande lancée manuellement sur chaque poste de développement, à chaque fois qu'une modification est effectuée sur le code source extrait localement, et avant qu'il ne soit réintégré dans le référentiel. Bien entendu, le développeur continue toujours à utiliser toujours Visual Studio .NET pour compiler plusieurs fois, comme à son habitude, et procéder régulièrement à une génération plus complète avec l'outil de build, localement, afin de déceler des erreurs ou simplement de vérifier et de tester le code produit.

Un tel outil est donc déjà précieux sur chaque poste de développement, mais répétons qu'il n'est pas nécessaire car chaque développeur dispose des interfaces graphiques de chaque outil sur son poste, et peut donc les utiliser pour effectuer le même travail que l'outil de build, mais manuellement, s'il le désire.

La mise en oeuvre d'un outil de build se révèle par contre totalement indispensable dans le cas du serveur de build, qui fait office de référence pour tout ce qui concerne les exécutables produits et qui doit donc avoir été passé au crible de tous nos outils (qui vont alors s'exécuter en mode console).

Bonne nouvelle : un tel outil de build existe, il est gratuit, solide et simple, et il s'appelle NAnt.

Outil de build : NAnt

Il suffit d'essayer une fois avec succès un outil de build pour ne plus jamais pouvoir s'en passer. Avec le freeware NAnt (issu de la version Ant du monde Java) les services rendus sont considérables, alors que les principes de base sont excessivement simples (même si parfois on est confrontés à quelques petits casse-têtes de configuration, en fonction de la taille du projet) :

                <target name="build" />
                <target name="tests" depends="build"/>

En somme, NAnt n'est ni plus ni moins qu'un "make" très évolué, destiné à l'environnement .NET. Pour l'exploiter il s'agit donc de créer un projet de configuration NAnt qui va effectuer les tâches suivantes dans l'ordre :

Il faut noter l'existence de l'utilitaire NAntContrib, qui regroupe un ensemble de tâches non prises en charge par NAnt (comme l'extraction VSS par exemple). Il suffit d'installer NAntContrib dans le répertoire de NAnt pour avoir accès à ces tâches supplémentaires.

Tâches NAnt ou NAntContrib courantes

Les tâches suivantes sont très courantes :

<target name="clean" />
    <delete file="myfile.txt" />
</target>

<target name="vss" depends="clean" />
    <vssget
        user="build"
        password="******"
        localpath="G:\DotNet\Projets\DotNetGuru\NetEnvDev"
        recursive="true"
        replace="true"
        writable="true"
        dbpath="G:\DotNet\VSS\srcsafe.ini"
        path="$/NetEnvDev/NetEnvDev"
    />
</target>

<target name="build" depends="vss" />
    <solution configuration="release" solutionfile="NetEnvDev.sln" />
</target>

   <target name="fxcop" depends="build" description="Analyse du code source par FxCop">
        <exec basedir="C:\program files\Microsoft FxCop 1.23"
              workingdir="${build.dir}"
              program="FxCopCmd.exe"
              commandline="/project:NetEnvDev.FxCop /out:${FxCopResultFile}"
              failonerror="false"
        />
    </target>

<target name="tests" depends="build" />
   <nunit2> 
    <formatter type="Plain" /> 
    <test assemblyname="MainLibTest.dll"/> 
  </nunit2>
</target>

Mise en oeuvre de NAnt sur le serveur de build

NAnt génère des fichiers résultats au format XML, et ne passe à une nouvelle étape que si l'étape précédente n'a pas généré d'erreurs. 

Un cycle de build avec NAnt consiste à :

Afin de mettre en oeuvre NAnt dans notre environnement de développement, il suffit de :

                     <platform name="win32" default="net-1.1">

<?xml version="1.0" ?>
    <project name="NetEnvDev" default="go" basedir=".">

        <property name = "build.dir" value = "." />
        <property name = "FxCopResultFile" value = "${build.dir}\BuildResults\FxCopResult.xml" />

        <target name="go" depends = "vss,build,fxcop,ndoc,test">
        </target>

        <target name="vss" description="Extraction des fichiers depuis VSS">
            <vssget
                user="build"
                password="******"
                localpath="G:\DotNet\Projets\DotNetGuru\NetEnvDev"
                recursive="true"
                replace="true"
                writable="true"
                dbpath="G:\DotNet\VSS\srcsafe.ini"
                path="$/NetEnvDev/NetEnvDev"
           />
        </target>

        <target name="build" depends="vss" description="Build general de la solution">
            <solution solutionfile="NetEnvDev.sln" configuration="release"/>
        </target>

        <target name="fxcop" depends="build" description="Analyse du code source par FxCop">
            <exec  
                basedir="C:/program files/Microsoft FxCop 1.23"
                workingdir="${build.dir}"
                program="FxCopCmd.exe"
                commandline="/project:NetEnvDev.fxCop /update /out:${FxCopResultFile}"
                failonerror="false"
            />
        </target>

        <target name="ndoc" depends="fxcop" description="Generation de la documentation par NDoc">
            <exec
                basedir="C:\program files\NDoc 2.1\bin\.net-1.1"
                workingdir="${build.dir}"
                program="NDocConsole.exe"
                commandline="-project=NetEnvDev.NDoc"
                failonerror="true"
            />
        </target>

        <target name="test" depends="build" description="Tests unitaires sur la solution par NUnit">
            <nunit2>
                <formatter type="Xml" usefile="false" extension=".xml" outputdir="${build.dir}\BuildResults"/>
                <test assemblyname="${build.dir}\MainLib\MainLibTest\bin\release\MainLibTest.dll" />
            </nunit2>
        </target>

    </project>

Processus de build

Après tous ces efforts, nous disposons maintenant sur le serveur de build d'un build complet et reproductible! Il manque encore, cependant, l'automatisation nécessaire pour compléter notre environnement et le rendre véritablement puissant et exploitable, à savoir :

En bref, il nous faut un outil capable de travailler avec NAnt pour contrôler ce qu'on appelle un processus de build.

Processus de build : CruiseControl .NET

Il existe un logiciel qui remplit toutes ces fonctions (et même plus encore), gratuitement de surcroît : j'ai nommé CruiseControl .NET. Il est développé par la société ThoughtWorks, dans laquelle officie un personnage bien connu appelé Martin Fowler, qui est l'un des chefs de file d'une méthodologie en vogue appelée Intégration Continue, qui part du principe bien-fondé selon lequel :

On est ainsi amenés à effectuer des builds généraux tout au long d'une journée de travail, selon la cadence des archivages de fichiers effectués. D'où la nécessité impérative pour les développeurs de s'assurer au préalable que le code qu'ils archivent est propre. La référence est le build effectué par NAnt sur le serveur de build, en se basant sur les dernières archives effectuées.

Ces builds généraux automatiques et journaliers (on peut en compter plus d'une douzaine par jour, pourquoi pas) garantissent qu'on dispose toujours d'une version exécutable, propre, documentée, et ayant passé avec succès les tests unitaires. Il reste ensuite à gérer les archivages de version des exécutables pour disposer au final d'un environnement de développement solide et automatisé au maximum.

CruiseControl .NET se présente sous la forme soit d'un utilitaire en mode console, soit d'un service. Il s'exécute continuellement, et repose lui aussi sur un fonctionnement très simple :

Remarque : la raison pour laquelle il faut installer la version anglaise de VSS se trouve ici : pour analyser si le référentiel VSS a été modifié, CruiseControl .NET analyse la sortie au format texte de la commande "history" de VSS... or cette sortie doit être formatée en anglais sinon CruiseControl .NET ne détecte aucune modification dans le référentiel, comme c'est le cas si on utilise la version française de VSS !

Le fichier de configuration de CruiseControl .NET

Le fichier "ccnet.config" doit être créé sur le serveur de build au même niveau que le fichier de build de NAnt. Je vais me contenter de vous livrer ce fichier en m'attardant sur certaines sections essentielles du fichier (je vous renvoie à la documentation de CruiseControl .NET pour plus de précisions) :

                <schedule type="schedule" sleepSeconds="300"</schedule>

<sourcecontrol type="vss">
   <executable>"C:\Program Files\Microsoft Visual Studio\VSS\win32\SS.EXE"</executable>
   <project>$/NetEnvDev</project>
   <username>build</username>
   <password>******</password>
   <ssdir>G:\DotNet\VSS</ssdir>
</sourcecontrol>

<build type="nant">
      <executable>c:\program files\NAnt 0.84\bin\Nant.exe</executable>
      <baseDirectory>G:\DotNet\Projets\DotNetGuru\NetEnvDev</baseDirectory>
      <buildFile>NetEnvDev.build</buildFile>
      <buildTimeoutSeconds>300</buildTimeoutSeconds>
</build>

<publishers>
    <xmllogger>
        <logDir>C:\program files\CruiseControl .NET\web\log</logDir>
        <mergeFiles>
            <file>G:\DotNet\Projets\DotNetGuru\NetEnvDev\BuildResults\FxCopResult.xml</file>
            <file>G:\DotNet\Projets\DotNetGuru\NetEnvDev\BuildResults\*-results.xml</file>
        </mergeFiles>
    </xmllogger>
</publishers>

Le fichier ccnet.config pour notre application NetEnvDev est alors le suivant:

<cruisecontrol>
    <project name="NetEnvDev">
        <schedule type="schedule" sleepSeconds="300"></schedule>
        <modificationDelaySeconds>10</modificationDelaySeconds>
        <sourcecontrol type="vss">
            <executable>"C:\program files\Microsoft Visual Studio\VSS\win32\SS.EXE"</executable>
            <project>$\NetEnvDev</project>
            <username>build</username>
            <password>******</password>
            <ssdir>G:\DotNet\VSS</ssdir>
        </sourcecontrol>
        <build type="nant">
            <executable>"C:\program files\Nant 0.84\bin\Nant.exe"</executable>
            <baseDirectory>G:\DotNet\Projets\DotNetGuru\NetEnvDev</baseDirectory>
            <buildFile>NetEnvDev.build</buildFile>
            <buildTimeoutSeconds>300</buildTimeoutSeconds>
        </build>
        <publishers>
            <xmllogger>
                <logDir>C:\program files\CruiseControl .NET\web\log</logDir>
                <mergeFiles>
                    <file>G:\DotNet\Projets\DotNetGuru\NetEnvDev\BuildResults\FxCopResult.xml</file>
                    <file>G:\DotNet\Projets\DotNetGuru\NetEnvDev\BuildResults\*-results.xml</file>
                </mergeFiles>
            </xmllogger>
        </publishers>
    </project>
</cruisecontrol>

Il suffit ensuite de lancer CruiseControl .NET en ligne de commande au niveau du répertoire où se trouve ce fichier. Si tout est bien configuré il n'y a qu'à modifier un fichier source dans VSS depuis un poste de développement, puis archiver le fichier dans VSS pour déclencher un build par CCNET sur le serveur de build :

Figure 16 : un build automatique effectué par CruiseControl .NET

Figure 16 : un build automatique effectué par CruiseControl .NET

L'interface Web de CruiseControl .NET

Pouvoir effectuer des builds automatiques sur détection de changement dans le code source, c'est bien, pouvoir visualiser les résultats de tous les builds à travers une interface Web, c'est mieux ! Dans notre exemple nous allons faire en sorte que le serveur de build puisse exposer les résultats de ses builds automatiques via un site Web consultable depuis n'importe quel poste sur le réseau, et pour cela il faut :

<webURL>http://localhost/CCNETWebApp/</webURL>

Figure 17 : l'interface Web de CruiseControl .NET

Figure 17 : l'interface Web de CruiseControl .NET

Et ensuite ?

Nous sommes arrivés au terme de notre petit tour d'horizon des outils indispensables à la mise en place d'un environnement de développement homogène, solide et fiable.

Mais nous sommes bien sûr très loin d'avoir fait tour de tous les outils existants ! Hormis le fait que certains outils que j'ai présenté peuvent être entièrement remplacés par d'autres, il y a des parties du cycle de développement d'un logiciel que je n'ai pas évoqué : par exemple les tests fonctionnels automatiques sur les interfaces ASP.NET, qui peuvent être pris en charge par exemple par NUnitASP, etc...

Pour être complet, il manque également un outil de gestion des versions des builds, inspiré par exemple d'un logiciel comme BuildIt.

Cela fera peut-être l'occasion d'un prochain article... 

 

Auteur : Laurent Desmons 

Copyright © Mai 2004


Qui est Laurent Desmons ?

Laurent a 36 ans, il vit en Alsace, près de Mulhouse, où il travaille en tant que chef de projet depuis 8 ans pour une SSII spécialisée dans la supervision de processus industriels.

Ses clients sont de grands comptes de la métallurgie et sidérurgie (Péchiney, Arcelor) et il est amené à développer essentiellement des applications client/serveur de plus ou moins grande envergure, en environnement Windows. Des développements réalisés en C++/C# pour la partie processus et en VB/C++/MFC/C# pour la partie IHM.

Il pratique l'informatique depuis que son père l'a initié aux joies du Z80 et du C64. L'arrivée du Framework .NET a été une révélation. Il s'y est investi fébrilement, avant de devenir certifié MCSD .NET depuis très peu (Avril 2004).

 

Ressources

Site officiel de Visual SourceSafe : http://msdn.microsoft.com/vstudio/previous/ssafe/

FAQ Visual SourceSafe : http://www.michaelis.net/SourceSafe/Faq.htm

Un document essentiel :  Team development with Visual Studio .NET and Visual SourceSafe

CVSNT Wiki : http://www.cvsnt.org/wiki/

Igloo : http://www.jalindi.com/igloo/

PushOK : http://www.pushok.com/

Site officiel de Perforce : http://www.perforce.com/

Un article sur les Enterprise Templates : http://www.15seconds.com/issue/030122.htm

Site officiel de FxCop : http://www.gotdotnet.com/team/fxcop/

Site officiel de NDoc: http://sourceforge.net/projects/ndoc/

Test-driven development : http://c2.com/cgi/wiki?TestDrivenDevelopment

Une présentation de l'Extreme Programming (XP) : http://www.xprogramming.com/xpmag/whatisxp.htm

Site officiel de NUnit : http://www.nunit.org/

Mise en oeuvre de NUnit : http://www.xprogramming.com/xpmag/acsUsingNUnit.htm

Un article sur les tests unitaires:  http://www.dotnetguru.org/articles/dossiers/testunitaires/UnitTest.htm

Site officiel de NAnt : http://nant.sourceforge.net/

Un article sur NAnt sur TheServerSide .NET : Managing .NET development with NAnt

Site officiel de NAntContrib : http://nantcontrib.sourceforge.net/

Site officiel de CruiseControl .NET : http://ccnet.thoughtworks.com/

L'article de référence de Martin Fowler : Continuous Integration

Le site officiel de BuildIt .NET : http://www.microsoft.com/downloads/details.aspx?FamilyId=B32497B0-77F7-4831-9C55-58BF3962163E&displaylang=en