Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use SVN Revision to label build in CCNET

I am using CCNET on a sample project with SVN as my source control. CCNET is configured to create a build on every check in. CCNET uses MSBuild to build the source code.

I would like to use the latest revision number to generate AssemblyInfo.cs while compiling. How can I retrieve the latest revision from subversion and use the value in CCNET?

Edit: I'm not using NAnt - only MSBuild.

like image 577
hitec Avatar asked Aug 04 '08 11:08

hitec


1 Answers

CruiseControl.Net 1.4.4 has now an Assembly Version Labeller, which generates version numbers compatible with .Net assembly properties.

In my project I have it configured as:

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

(Caveat: assemblyVersionLabeller won't start generating svn revision based labels until an actual commit-triggered build occurs.)

and then consume this from my MSBuild projects with 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 sake of completness, it's just as easy for projects using NAnt instead of 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> 
like image 180
skolima Avatar answered Oct 02 '22 19:10

skolima