2009-10-08 7 views
3

Je ne fais que commencer avec CruiseControl.NET et nAnt et je ne comprends pas vraiment comment fonctionne tout le processus. Nous avons actuellement la plupart de nos solutions dans Visual Source 'Safe', et le serveur de construction Label chaque version automatiquement en utilisant le fichier AssemblyInfo.Utilisation de CruiseControl pour copier le dossier SVN de la tête dans un dossier Release

Nous migrons nos projets VSS en SVN, et avons modifié les fichiers de construction de projet en conséquence pour vérifier et mettre à jour les respositories SVN. Ce que nous voulons réaliser, c'est d'avoir une copie de la source dans le contrôle de source, qui correspond exactement à la version du projet en cours de déploiement.

Notre SVN est configuré ainsi:

svn://solution/ 
    TRUNK/ 
    RELEASES/ 
     1.0.0/ 
     1.2.0/ 
    BRANCHES/ 

Alors, quand on force construire notre solution, avec sa version AssemblyInfo définie comme 1.3.0, nous voulons que le serveur de build pour copier le répertoire trunk, dans les COMMUNIQUES /1.3.0/ répertoire.

La commande SVN est assez simple. svn copy src/répertoire dst/répertoire. Mais où devrais-je mettre cette commande, et comment puis-je obtenir le numéro de version pour la destination?

Sur le serveur de build, ceci est un exemple d'un fichier .xml:

<sourcecontrol type="svn"> 
    <trunkUrl>svn://project/trunk</trunkUrl> 
      <workingDirectory>D:\Builds\project\Src</workingDirectory> 
      <executable>C:\Subversion\bin\svn.exe</executable> 
    <username>sf_service_dev</username> 
    <password>SFx4vi-r</password> 
      <tagOnSuccess>true</tagOnSuccess> 
    <cleanCopy>true</cleanCopy> 
</sourcecontrol> 

Dans le fichier .build du projet, nous avons ce (et beaucoup plus bien sûr):

<target name="Deploy_Release"> 
    <property name="fileandpathformyfile" value="${CCNetWorkingDirectory}\Bin\project.exe"/> 
    <echo message="fileandpathformyfile is ${fileandpathformyfile}."/> 
    <property name="ReleaseNumber" value="${fileversioninfo::get-file-version(fileversioninfo::get-version-info(fileandpathformyfile))}"/> 
    <echo message="ReleaseNumber has been detected to be ${ReleaseNumber}."/> 

    <!--Use version as needed--> 

    <!--Create the release direcory--> 
    <mkdir dir="${CCNetWorkingDirectory}\..\Releases\${ReleaseNumber}"/> 
    <!--Copy stuff to the release directory--> 
    <copy todir="${CCNetWorkingDirectory}\..\Releases\${ReleaseNumber}"> 
    <fileset basedir="${CCNetWorkingDirectory}\bin"> 
     <include name="*.dll" /> 
     <include name="*.exe" /> 
     <include name="*.config" /> 
     <include name="*.xml" /> 
     <include name="*.stp" /> 
    </fileset> 
    </copy> 
</target> 

Maintenant, si je veux exécuter une commande SVN pour copier $ {trunkURL} vers $ {trunkURL} /../ releases/$ {ReleaseNumber}, comment ferais-je cela et dans quel fichier irait-il? Comment je le comprends pour le moment, soit nous devons obtenir le ReleaseNumber du fichier .build, dans le fichier .xml, et exécuter un à partir de là. Ou, nous devons passer par le trunkURL du .XML au .build, et exécuter une commande svn à partir du fichier .build.

Aidez s'il vous plaît!

+0

Avez-vous utilisé nAnt pendant un certain temps ou avez-vous commencé à utiliser CC.Net et nAnt en même temps? Juste curieux de savoir pourquoi vous n'utilisez pas msbuild. – Ryu

+0

J'ai commencé à utiliser les deux en même temps. Pour nos projets plus anciens, nous effectuons une compilation locale, testons sur SOA de production et déployons à partir de là. –

Répondre

5

Une option consiste à étiqueter (alias svn copy) sur chaque build réussi. Il y a en fait une fonctionnalité intégrée pour cela.

je vois que vous avez <tagOnSuccess> a permis vrai

vous devez également définir <tagBaseUrl>svn://project/trunk/Releases</tagBaseUrl> ou <tagBaseUrl>svn://project/trunk/Tags</tagBaseUrl>

Le problème que vous pourriez avoir avec c'est chaque construction réussie, que ce soit forcé ou continue étiquettera. Je suppose que vous ne voulez pas copier pour libérer chaque build.

Ce que vous pouvez faire est

  1. exécuter un fichier batch avec le nAnt exec task
  2. écrire une instruction if vérification %CCNetRequestSource% variable d'environnement pour ForceBuild
  3. exécuter l'opération de ligne de commande svn (CCNetWorkingDirectory sera disponible en environnement variable, vous devrez peut-être passer le numéro de version en tant que paramètre)

Peut également commander la commande ntcontrib, semble avoir svn task

EDIT

Vous pouvez regarder la CC.Net gérer votre version # via un labeller et passant à NANT via CCNetLabel variable d'environnement. De ce que je vous ai lu, vous voulez probablement le File Labeller parce que les autres génèrent automatiquement une étiquette pour vous, j'utilise personnellement l'étiqueteuse d'itération. L'avantage d'utiliser CC.Net labeller pour la gestion des versions est que les courriels de construction montreront la bonne version, et je crois que <tagOnSuccess> utilise l'étiquette pour le nom du répertoire.

+0

Juste pour que vous le sachiez, nous avons des fichiers de configuration CC.NET séparés pour les versions continue et finale sur le serveur de construction. Merci pour votre aide, c'est tellement plus facile que ce que j'avais pensé! Salutations –

+0

Vous pouvez regarder le CC.Net gérer votre version # et le passer à nAnt http://confluence.public.thoughtworks.org/display/CCNET/Labeller+Blocks vous voulez probablement l'étiqueteuse de fichiers – Ryu

+0

l'étiqueteur de fichiers récupère le numéro de version d'un fichier AssemblyInfo? Ou doit-il contenir uniquement un numéro de version? Nous pourrions facilement générer un fichier version.file via ant dans le script .build, mais nous aimerions éviter cela si le travail est déjà fait. –

Questions connexes