Bruk SVN Revision å merke bygge i CCNET

stemmer
39

Jeg bruker CCNET på en prøve prosjekt med SVN som min kilde kontroll. CCNET er konfigurert til å skape et bygg på hver innsjekking. CCNET bruker MSBuild å bygge kildekoden.

Jeg ønsker å bruke den nyeste revisjonsnummeret for å generere AssemblyInfo.csmens kompilering. Hvordan kan jeg hente den siste versjonen fra omveltning og bruke verdien i CCNET?

Edit: Jeg bruker ikke Nant - bare MSBuild.

Publisert på 04/08/2008 klokken 11:37
kilden bruker
På andre språk...                            


12 svar

stemmer
44

CruiseControl.Net 1.4.4 har nå en Assembly versjon Labeller , som genererer versjonsnummer som er kompatible med NET montering egenskaper.

I mitt prosjekt har jeg det konfigureres som:

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

(Påminnelse: assemblyVersionLabellervil ikke begynne å generere svn revisjon basert etiketter til en faktisk begår-utløst build oppstår.)

og deretter konsumere dette fra mine MSBuild prosjekter med 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>

For moro skyld completness, er det like enkelt for prosjekter ved hjelp av Nant stedet for 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>
Svarte 10/06/2009 kl. 12:37
kilden bruker

stemmer
14

Du har i utgangspunktet to alternativer. Enten du skriver et enkelt skript som vil starte og analysere utgang fra

svn.exe info --revision HEAD

for å oppnå revisjonsnummer (så genererer AssemblyInfo.cs er stort sett rett frem) eller bare bruke plugin for CCNET. Her er det:

SVN Revisjon Labeller er en plugin for CruiseControl.NET som lar deg generere Cruise etiketter for din bygger, basert på revisjonsnummeret ditt arbeidskopi i Subversion. Dette kan tilpasses med et prefiks og / eller større / mindre versjonsnumre.

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

Jeg foretrekker det første alternativet, fordi det er bare omtrent 20 linjer med kode:

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();
        }
    }
}
Svarte 04/08/2008 kl. 11:56
kilden bruker

stemmer
4

Jeg har skrevet en Nant build-fil som håndterer parsing SVN informasjon og skape egenskaper. Jeg deretter bruke disse eiendomsverdier for en rekke bygge oppgaver, inkludert å sette etiketten på bygge. Jeg bruker dette målet i kombinasjon med SVN Revision Labeller nevnt av Lubos Hasko med gode resultater.

<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>
Svarte 04/08/2008 kl. 13:43
kilden bruker

stemmer
4

Hvis du foretrekker å gjøre det på MSBuildsiden over CCNetconfig, ser ut som MSBuildFellesskapets oppgaver utvidelsens SvnVersionoppgave kan gjøre utslaget.

Svarte 04/08/2008 kl. 12:03
kilden bruker

stemmer
4

Jeg fant dette prosjektet på Google Code. Dette er CCNETplugin for å generere etiketten i CCNET.

Den DLLer testet med CCNET 1.3, men det fungerer med CCNET 1.4meg. Jeg lykkes med denne tilleggsmodulen til å merke min bygge.

Nå går den sendes til MSBuild...

Svarte 04/08/2008 kl. 11:51
kilden bruker

stemmer
3

Jeg er ikke sikker på om dette arbeidet med CCNET eller ikke, men jeg har opprettet en SVN versjon plug-in for Bygg versjon Increment prosjektet på CodePlex. Dette verktøyet er ganske fleksibel og kan settes til å automatisk lage en versjon nummer for deg å bruke svn revisjonen. Det krever ikke å skrive kode eller redigering xml, så yay!

Jeg håper dette er hjelper!

Svarte 12/04/2010 kl. 01:04
kilden bruker

stemmer
3

Tilpasse csproj filer til autogenerere AssemblyInfo.cs
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx

Hver gang lager vi en ny C # prosjekt, setter Visual Studio der AssemblyInfo.cs fil for oss. Filen definerer monterings meta-data som dens versjon, konfigurasjon, eller produsent.

Funnet den ovennevnte teknikk til auto-gen AssemblyInfo.cs hjelp MSBuild. Vil legge prøven innen kort tid.

Svarte 04/08/2008 kl. 13:22
kilden bruker

stemmer
3

Jeg er for tiden "manuelt" gjør det gjennom en prebuild-exec Task, bruker min cmdnetsvnrev verktøy, men hvis noen vet en bedre ccnet integrert måte å gjøre det, vil jeg være glad for å høre :-)

Svarte 04/08/2008 kl. 11:41
kilden bruker

stemmer
2

Ingen anelse om hvor jeg fant dette. Men jeg fant dette på internett "sted".

Dette oppdaterer alle AssemblyInfo.cs filer før byggingen foregår.

Fungerer som en sjarm. Alle mine exe og er DLLer vise seg som 1.2.3.333 (Hvis "333" var SVN revisjonen på den tiden.) (Og den opprinnelige versjonen i AssemblyInfo.cs filen ble oppført som "1.2.3.0")


$ (ProjectDir) (Hvor min .sln filen ligger)

$ (SVNToolPath) (poeng til svn.exe)

er mine egendefinerte variabler, deres erklæringer / definisjoner er ikke definert nedenfor.


http://msbuildtasks.tigris.org/ og / eller https://github.com/loresoft/msbuildtasks har (FileUpdate og SvnVersion) oppgaver.


  <Target Name="SubVersionBeforeBuildVersionTagItUp">

    <ItemGroup>
      <AssemblyInfoFiles Include="$(ProjectDir)\**\*AssemblyInfo.cs" />
    </ItemGroup>

    <SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(SVNToolPath)">
      <Output TaskParameter="Revision" PropertyName="MySubVersionRevision" />
    </SvnVersion>

    <FileUpdate Files="@(AssemblyInfoFiles)"
            Regex="(\d+)\.(\d+)\.(\d+)\.(\d+)"
            ReplacementText="$1.$2.$3.$(MySubVersionRevision)" />
  </Target>

REDIGERE ------------------------------------------------- -

Ovennevnte kan starte sviktende etter SVN revisjonsnummeret når 65 534 eller høyere.

Se:

Slå av varsling CS1607

Her er løsningen.

<FileUpdate Files="@(AssemblyInfoFiles)"
Regex="AssemblyFileVersion\(&quot;(\d+)\.(\d+)\.(\d+)\.(\d+)"
ReplacementText="AssemblyFileVersion(&quot;$1.$2.$3.$(SubVersionRevision)" />

Resultatet av dette bør være:

I Windows / Explorer // Fil / Egenskaper .......

Montering versjon vil være 1.0.0.0.

Fil versjon vil være 1.0.0.333 hvis 333 er SVN revisjon.

Svarte 18/09/2012 kl. 17:18
kilden bruker

stemmer
2

Basert på skolimas løsningen jeg oppdatert Nant manuset til også å oppdatere AssemblyFileVersion. Takk til skolima for koden!

<target name="setversion" description="Sets the version number to current 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();                     
                       // replace assembly version
                       string replacement = "[assembly: AssemblyVersion(\"" + Project.Properties["label"] + "\")]";
                       contents = Regex.Replace(contents, @"\[assembly: AssemblyVersion\("".*""\)\]", replacement);                                        
                       // replace assembly file version
                       replacement = "[assembly: AssemblyFileVersion(\"" + Project.Properties["label"] + "\")]";
                       contents = Regex.Replace(contents, @"\[assembly: AssemblyFileVersion\("".*""\)\]", replacement);                                        
                       StreamWriter writer = new StreamWriter(Project.Properties["filename"], false);
                       writer.Write(contents);
                       writer.Close();
                      }
                     }
                     ]]>
            </code>
        </script>
        <foreach item="File" property="filename">
            <in>
                    <items basedir="${srcDir}">
                            <include name="**\AssemblyInfo.cs"></include>
                    </items>
            </in>
            <do>
                    <setversion-task />
            </do>
        </foreach>
    </target>
Svarte 12/09/2009 kl. 10:03
kilden bruker

stemmer
2

Min tilnærming er å bruke den nevnte plugin for ccnet og nant ekko oppgave å generere en VersionInfo.csfil som inneholder noe annet enn den versjonen attributter. Jeg bare må inkludere VersionInfo.csfilen til build

Ekkoet oppgave utganger bare strengen jeg gi det til en fil.

Hvis det er en lignende MSBuild oppgaven, kan du bruke samme tilnærming. Her er den lille nant oppgaven jeg bruker:

<target name="version" description="outputs version number to VersionInfo.cs">
  <echo file="${projectdir}/Properties/VersionInfo.cs">
    [assembly: System.Reflection.AssemblyVersion("$(CCNetLabel)")]
    [assembly: System.Reflection.AssemblyFileVersion("$(CCNetLabel)")]
  </echo>
</target>

Prøv dette:

<ItemGroup>
    <VersionInfoFile Include="VersionInfo.cs"/>
    <VersionAttributes>
        [assembly: System.Reflection.AssemblyVersion("${CCNetLabel}")]
        [assembly: System.Reflection.AssemblyFileVersion("${CCNetLabel}")]
    </VersionAttributes>
</ItemGroup>
<Target Name="WriteToFile">
    <WriteLinesToFile
        File="@(VersionInfoFile)"
        Lines="@(VersionAttributes)"
        Overwrite="true"/>
</Target>

Vær oppmerksom på at jeg ikke er veldig intim med MSBuild, så min skriptet vil sannsynligvis ikke fungere out-of-the-box og trenger korreksjoner ...

Svarte 03/02/2009 kl. 04:16
kilden bruker

stemmer
1

Vær forsiktig. Den brukes for byggnumrene strukturen er bare en kort slik at du har et tak på hvor høy revisjon kan gå.

I vårt tilfelle har vi allerede overskredet grensen.

Hvis du prøver å sette i build-nummeret 99.99.99.599999, vil filversjonen eiendommen faktisk komme ut som 99.99.99.10175.

Svarte 03/02/2009 kl. 18:34
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more