41 votes

Utiliser la révision SVN pour étiqueter le build dans CCNET

J'utilise CCNET sur un projet type avec SVN comme contrôle de source. CCNET est configuré pour créer un build à chaque check-in. CCNET utilise MSBuild pour construire le code source.

Je voudrais utiliser le dernier numéro de révision pour générer AssemblyInfo.cs lors de la compilation. Comment puis-je récupérer la dernière révision de subversion et utiliser la valeur dans CCNET ?

Edit : Je n'utilise pas NAnt - seulement MSBuild.

45voto

skolima Points 12221

CruiseControl.Net 1.4.4 a maintenant une Version d'assemblage Étiqueteuse qui génère des numéros de version compatibles avec les propriétés des assemblages .Net.

Dans mon projet, je l'ai configuré comme :

<labeller type="assemblyVersionLabeller" incrementOnFailure="true" major="1" minor="2"/>

(Mise en garde : assemblyVersionLabeller ne commencera pas à générer des étiquettes basées sur la révision svn avant qu'une construction réelle déclenchée par un commit ne se produise).

et ensuite consommer ceci depuis mes projets MSBuild avec MSBuildCommunityTasks.AssemblyInfo :

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
<Target Name="BeforeBuild">
  <AssemblyInfo Condition="'$(CCNetLabel)' != ''" CodeLanguage="CS" OutputFile="Properties\AssemblyInfo.cs" 
  AssemblyTitle="MyTitle" AssemblyCompany="MyCompany" AssemblyProduct="MyProduct"
  AssemblyCopyright="Copyright ©  2009" ComVisible="false" Guid="some-random-guid"
  AssemblyVersion="$(CCNetLabel)" AssemblyFileVersion="$(CCNetLabel)"/>
</Target>

Par souci d'exhaustivité, c'est tout aussi facile pour les projets utilisant NAnt au lieu de MSBuild :

<target name="setversion" description="Sets the version number to CruiseControl.Net label.">
    <script language="C#">
        <references>
            <include name="System.dll" />
        </references>
        <imports>
            <import namespace="System.Text.RegularExpressions" />
        </imports>
        <code><![CDATA[
             [TaskName("setversion-task")]
             public class SetVersionTask : Task
             {
              protected override void ExecuteTask()
              {
               StreamReader reader = new StreamReader(Project.Properties["filename"]);
               string contents = reader.ReadToEnd();
               reader.Close();
               string replacement = "[assembly: AssemblyVersion(\"" + Project.Properties["CCNetLabel"] + "\")]";
               string newText = Regex.Replace(contents, @"\[assembly: AssemblyVersion\("".*""\)\]", replacement);
               StreamWriter writer = new StreamWriter(Project.Properties["filename"], false);
               writer.Write(newText);
               writer.Close();
              }
             }
             ]]>
        </code>
    </script>
    <foreach item="File" property="filename">
        <in>
            <items basedir="..">
                <include name="**\AssemblyInfo.cs"></include>
            </items>
        </in>
        <do>
            <setversion-task />
        </do>
    </foreach>
</target>

14voto

lubos hasko Points 13669

Vous avez essentiellement deux options. Soit vous écrivez un simple script qui va démarrer et analyser la sortie de

svn.exe info --revision HEAD

pour obtenir le numéro de révision (la génération de AssemblyInfo.cs est alors assez simple) ou utilisez simplement le plugin pour CCNET. Le voici :

Étiquetteuse de révisions SVN est un plugin pour CruiseControl.NET qui vous permet de générer des étiquettes CruiseControl pour vos builds, en fonction du numéro de révision de votre copie de travail Subversion. Ce peut être personnalisé avec un préfixe et/ou un des numéros de version majeurs/mineurs.

http://code.google.com/p/svnrevisionlabeller/

Je préfère la première option car elle ne représente qu'environ 20 lignes de code :

using System;
using System.Diagnostics;

namespace SvnRevisionNumberParserSample
{
    class Program
    {
        static void Main()
        {
            Process p = Process.Start(new ProcessStartInfo()
                {
                    FileName = @"C:\Program Files\SlikSvn\bin\svn.exe", // path to your svn.exe
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    Arguments = "info --revision HEAD",
                    WorkingDirectory = @"C:\MyProject" // path to your svn working copy
                });
            // command "svn.exe info --revision HEAD" will produce a few lines of output
            p.WaitForExit();

            // our line starts with "Revision: "
            while (!p.StandardOutput.EndOfStream)
            {
                string line = p.StandardOutput.ReadLine();
                if (line.StartsWith("Revision: "))
                {
                    string revision = line.Substring("Revision: ".Length);
                    Console.WriteLine(revision); // show revision number on screen                       
                    break;
                }
            }
            Console.Read();
        }
    }
}

4voto

hitec Points 824

J'ai trouvé este projet sur google code. Ceci est CCNET pour générer l'étiquette en CCNET .

El DLL est testé avec CCNET 1.3 mais il fonctionne avec CCNET 1.4 pour moi. J'utilise avec succès ce plugin pour étiqueter ma construction.

Il faut maintenant le passer à MSBuild ...

4voto

Rytmis Points 15848

Si vous préférez le faire sur le MSBuild côté sur le CCNet config, ressemble à la MSBuild Extension des tâches communautaires SvnVersion pourrait faire l'affaire.

4voto

Justin Walgran Points 552

J'ai écrit un fichier de construction NAnt qui gère l'analyse des informations SVN et la création des propriétés. J'utilise ensuite les valeurs de ces propriétés pour diverses tâches de construction, notamment pour définir l'étiquette de la construction. J'utilise cette cible combinée avec le SVN Revision Labeller mentionné par lubos hasko avec d'excellents résultats.

<target name="svninfo" description="get the svn checkout information">    <property name="svn.infotempfile" value="${build.directory}\svninfo.txt" />    <exec program="${svn.executable}" output="${svn.infotempfile}">        <arg value="info" />    </exec>    <loadfile file="${svn.infotempfile}" property="svn.info" />    <delete file="${svn.infotempfile}" />    <property name="match" value="" />    <regex pattern="URL: (?'match'.*)" input="${svn.info}" />    <property name="svn.info.url" value="${match}"/>    <regex pattern="Repository Root: (?'match'.*)" input="${svn.info}" />    <property name="svn.info.repositoryroot" value="${match}"/>    <regex pattern="Revision: (?'match'\d+)" input="${svn.info}" />    <property name="svn.info.revision" value="${match}"/>    <regex pattern="Last Changed Author: (?'match'\w+)" input="${svn.info}" />    <property name="svn.info.lastchangedauthor" value="${match}"/>    <echo message="URL: ${svn.info.url}" />    <echo message="Repository Root: ${svn.info.repositoryroot}" />    <echo message="Revision: ${svn.info.revision}" />    <echo message="Last Changed Author: ${svn.info.lastchangedauthor}" /></target>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X