<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Haugerns Development Escapades &#187; nant</title>
	<atom:link href="http://www.haugern.net/blog/category/nant/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.haugern.net/blog</link>
	<description>Morten Haug on development and other curiosities</description>
	<lastBuildDate>Sun, 31 May 2009 21:56:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SQL Server CE up and running with NHibernate &amp; NAnt</title>
		<link>http://www.haugern.net/blog/sql-server-ce-up-and-running-with-nhibernate-nant/</link>
		<comments>http://www.haugern.net/blog/sql-server-ce-up-and-running-with-nhibernate-nant/#comments</comments>
		<pubDate>Tue, 22 Jan 2008 22:32:34 +0000</pubDate>
		<dc:creator>haugern</dc:creator>
				<category><![CDATA[compact edition]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[nant]]></category>
		<category><![CDATA[nhibernate]]></category>
		<category><![CDATA[sql server]]></category>

		<guid isPermaLink="false">http://www.haugern.net/blog/sql-server-ce-up-and-running-with-nhibernate-nant/</guid>
		<description><![CDATA[I&#8217;ve been working to get SQL CE to work with our application lately. This is a great step towards a more painless desktop deployment model for us.
It turned out to be a multi step process, and first out was discovering how to make a SQL CE file. 
Creating the SQL Server CE .sdf file
There are [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working to get SQL CE to work with our application lately. This is a great step towards a more painless desktop deployment model for us.</p>
<p>It turned out to be a multi step process, and first out was discovering how to make a SQL CE file. </p>
<h3>Creating the SQL Server CE .sdf file</h3>
<p>There are two alternatives as I see it:</p>
<ol>
<li>Create an empty database with ie SQL Enterprise Manager, and copy it for new deployment
<li><a href="http://blogs.msdn.com/stevelasker/archive/2007/03/31/creating-your-sql-server-compact-edition-database-and-schema-in-code.aspx" target="_blank">Create it programmatically at runtime</a>.</li>
</ol>
<p>We already have a solution folder and a setup for sql-script templates, so we went with #1.</p>
<h3>Using NHibernate hbm2ddl NAnt task for the schema</h3>
<p>NHibernate has built in support for SQL Server CE, and what you have to do is the following:</p>
<ol>
<li>Set the connection.connection_string property.
<li>Set the connection.driver_class property.
<li>Set the dialect property.</li>
</ol>
<p>Our current NAnt build file has had support for SQL Express 2005 &amp; SQL Developer Edition 2005, and our schema target have been doing a great job at creating the proper schema. The hbm2ddl task has been called with the following attributes:</p>
<pre class="code"><span style="color: rgb(0,0,255)"><font size="2">&lt;</font></span><font size="2"><span style="color: rgb(163,21,21)">hbm2ddl
</span><span style="color: rgb(255,0,0)">   connectionstring</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.nhibernate.connection}</span>"
<span style="color: rgb(0,0,255)">   </span><span style="color: rgb(255,0,0)">droponly</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">false</span>"
<span style="color: rgb(0,0,255)">   </span><span style="color: rgb(255,0,0)">exportonly</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">true</span>"</font><font size="2"><span style="color: rgb(0,0,255)">&gt;
   &lt;</span><span style="color: rgb(163,21,21)">assemblies</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
      &lt;</span><span style="color: rgb(163,21,21)">include</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${directory.build}\ISY.Domain.dll</span>"<span style="color: rgb(0,0,255)">&gt;&lt;/</span><span style="color: rgb(163,21,21)">include</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
      &lt;</span><span style="color: rgb(163,21,21)">include</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${directory.build}\ISY.Infrastructure.dll</span>"<span style="color: rgb(0,0,255)">&gt;&lt;/</span><span style="color: rgb(163,21,21)">include</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
      &lt;</span><span style="color: rgb(163,21,21)">include</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${directory.build}\ISY.Repository.dll</span>"<span style="color: rgb(0,0,255)">&gt;&lt;/</span><span style="color: rgb(163,21,21)">include</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
   &lt;/</span><span style="color: rgb(163,21,21)">assemblies</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
&lt;/</span><span style="color: rgb(163,21,21)">hbm2ddl</span><span style="color: rgb(0,0,255)">&gt;</span></font></pre>
<p>So I go ahead and set the connectionstring attribute <a href="http://www.connectionstrings.com/?carrier=sqlserver2005ce" target="_blank">with the correct settings</a>. And it fails miserably:</p>
<p><em>NHibernate.HibernateException: An error has occurred while establishing a connection to the server.&nbsp; When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 &#8211; Error Locating Server/Instance Specified) &#8212;&gt; System.Data.SqlClient.SqlException: An error has occurred while establishing a connection to the server.&nbsp; When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 &#8211; Error Locating Server/Instance Specified)</em> </p>
<p>&nbsp;
<p>Ok, that&#8217;s not good. It seems it cannot connect to the server. Checking the ins and outs of the my <em>sql.nhibernate.connection</em> property, I find that it should be pointing to the right file. After some investigation I find out that I miss #2 &amp; #3; setting the correct dialect and driver_class. The hbm2ddl task had default values for dialect and driver_class which works great with both our previously two supported databases. So, I set them both like this:</p>
<pre class="code"><span style="color: rgb(0,0,255)"><font size="2">&lt;</font></span><font size="2"><span style="color: rgb(163,21,21)">hbm2ddl
</span><span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">connectionstring</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.nhibernate.connection}</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">dialect</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.dialect}</span>"</font><font size="2"><span style="color: rgb(0,0,255)">
  </span><span style="color: rgb(255,0,0)">connectiondriverclass</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.driver}</span>"</font><font size="2"><span style="color: rgb(0,0,255)">
  </span><span style="color: rgb(255,0,0)">droponly</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">false</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">exportonly</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">true</span>"</font><font size="2"><span style="color: rgb(0,0,255)">&gt;
  &lt;</span><span style="color: rgb(163,21,21)">assemblies</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
</span></font><font size="2"><span style="color: rgb(0,0,255)">    &lt;</span><span style="color: rgb(163,21,21)">include</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${directory.build}\ISY.Domain.dll</span>"<span style="color: rgb(0,0,255)">&gt;&lt;/</span><span style="color: rgb(163,21,21)">include</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
    &lt;</span><span style="color: rgb(163,21,21)">include</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${directory.build}\ISY.Infrastructure.dll</span>"<span style="color: rgb(0,0,255)">&gt;&lt;/</span><span style="color: rgb(163,21,21)">include</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
    &lt;</span><span style="color: rgb(163,21,21)">include</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${directory.build}\ISY.Repository.dll</span>"<span style="color: rgb(0,0,255)">&gt;&lt;/</span><span style="color: rgb(163,21,21)">include</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
  &lt;/</span><span style="color: rgb(163,21,21)">assemblies</span></font><font size="2"><span style="color: rgb(0,0,255)">&gt;
&lt;/</span><span style="color: rgb(163,21,21)">hbm2ddl</span></font><span style="color: rgb(0,0,255)"><font size="2">&gt;</font></span></pre>
<p>Where:</p>
<pre class="code"><font size="2"><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(163,21,21)">property</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">sql.driver</span>"<span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">value</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">NHibernate.Driver.SqlServerCeDriver</span>"</font><font size="2"><span style="color: rgb(0,0,255)"> /&gt;
&lt;</span><span style="color: rgb(163,21,21)">property</span><span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">sql.dialect</span>"<span style="color: rgb(0,0,255)"> </span><span style="color: rgb(255,0,0)">value</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">NHibernate.Dialect.MsSqlCeDialect</span>"<span style="color: rgb(0,0,255)">/&gt;</span></font></pre>
<p>And we&#8217;re there with the hbm2ddl. </p>
<p><strong>PS! Don&#8217;t forget to add the SQL CE dll into your folder with NAnt, or else it can&#8217;t find the right driver with the above settings (an easy to understand error message will tell you).</strong></p>
<h3>Populate the database with default data</h3>
<p>After the schema is in place, we populate some tables with default system data from sql script files. For this we use the <a href="http://nantcontrib.sourceforge.net/release/latest/help/tasks/sql.html" target="_blank">NAntContrib sql task</a> like this:</p>
<pre class="code"><span style="color: rgb(0,0,255)"><font size="2">&lt;</font></span><font size="2"><span style="color: rgb(163,21,21)">sql
</span><span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">connstring</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.connectionstring}</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">delimiter</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">GO</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">delimstyle</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">Line</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">source</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${target}</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">transaction</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.usetransactions}</span>"</font><font size="2"><span style="color: rgb(0,0,255)">&gt;
&lt;/</span><span style="color: rgb(163,21,21)">sql</span></font><span style="color: rgb(0,0,255)"><font size="2">&gt;</font>
</span></pre>
<p>First, the <em>sql.connectionstring</em> needs to reflect that I am talking to a SQL CE database, and <a href="http://www.connectionstrings.com/?carrier=sqlserver2005ce" target="_blank">ConnectionStrings.com comes to the rescue once more</a>.</p>
<p>The first obstacle when running the first sql script file is this error:</p>
<p><em>Error while executing SQL statement.<br />&nbsp;&nbsp;&nbsp; There was an error parsing the query. [Token line number,Token line offset,,Token in error,,]</em> </p>
<p>Yes, very enlightening indeed! (Note to self: remember good error messages!). In my search for answers, this seems to be &#8220;the be all, know it all&#8221; error message.</p>
<p>Finally, it dawned upon me; SQL CE doesn&#8217;t support stored procs. And for that reason, why would it understand a script which practically could be a stored proc? Luckily, all our default data is inserted with &#8220;ordinary&#8221; statements, and the sql task does have an attribute called batch which defaults to true. With SQL CE you need to set it to false and you&#8217;re good to go with this setup (where the<em> sql.batch</em> property depends on which database is being used):</p>
<pre class="code"><span style="color: rgb(0,0,255)"><font size="2">&lt;</font></span><font size="2"><span style="color: rgb(163,21,21)">sql
</span><span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">connstring</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.connectionstring}</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">delimiter</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">GO</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">delimstyle</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">Line</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">source</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${target}</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">batch</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.batch}</span>"
<span style="color: rgb(0,0,255)">  </span><span style="color: rgb(255,0,0)">transaction</span><span style="color: rgb(0,0,255)">=</span>"<span style="color: rgb(0,0,255)">${sql.usetransactions}</span>"</font><font size="2"><span style="color: rgb(0,0,255)">&gt;
&lt;/</span><span style="color: rgb(163,21,21)">sql</span></font><span style="color: rgb(0,0,255)"><font size="2">&gt;</font>
</span></pre>
<p>&nbsp;</p>
<h3>Conclusion and further work</h3>
<p>All in all, the effort to investigate and include the SQL CE to our array of supported databases is well worth. It will make a one off deployment issues a lot easier with no extra installation, and it is a champ when it comes to our database unit testing and integration testing.</p>
<p>What&#8217;s still missing is a script which populates our database with test data. The existing script is not easily split into single statements. We&#8217;ll dig into it and I&#8217;ll explain it all in a later post!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.haugern.net/blog/sql-server-ce-up-and-running-with-nhibernate-nant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automatic versioning with CruiseControl.Net and NAnt</title>
		<link>http://www.haugern.net/blog/automatic-versioning-with-cruisecontrolnet-and-nant/</link>
		<comments>http://www.haugern.net/blog/automatic-versioning-with-cruisecontrolnet-and-nant/#comments</comments>
		<pubDate>Fri, 11 Jan 2008 18:53:22 +0000</pubDate>
		<dc:creator>haugern</dc:creator>
				<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[cruisecontrol.net]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[nant]]></category>
		<category><![CDATA[source control]]></category>
		<category><![CDATA[tfs]]></category>

		<guid isPermaLink="false">http://www.haugern.net/blog/automatic-versioning-with-cruisecontrolnet-and-nant/</guid>
		<description><![CDATA[I&#8217;ve created a similar setup as David Donald Belcham (a.k.a. igloocoder) mentions in this post for our current project at NOIS.
When I mean similar, we&#8217;re using the exact same tools for the job, with NAnt (asminfo task) &#38; CC.NET. But there&#8217;s a couple of differences.
New labeller for CC.NET
The first, and minor difference is the labeller. [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve created a similar setup as <strike>David</strike> Donald Belcham (a.k.a. igloocoder)<a href="http://igloocoder.com/archive/2008/01/04/versioning-applications-using-nant-and-cruisecontrol.net.aspx" target="_blank"> mentions in this post</a> for our current project at <a href="http://www.nois.no" target="_blank">NOIS</a>.</p>
<p>When I mean similar, we&#8217;re using the exact same tools for the job, with <a href="http://nant.sourceforge.net/" target="_blank">NAnt</a> (<a href="http://nant.sourceforge.net/release/0.85/help/tasks/asminfo.html" target="_blank">asminfo task</a>) &amp; <a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET" target="_blank">CC.NET</a>. But there&#8217;s a couple of differences.</p>
<h3>New labeller for CC.NET</h3>
<p>The first, and minor difference is the <a href="http://confluence.public.thoughtworks.org/display/CCNET/Labeller+Blocks" target="_blank">labeller</a>. I wanted the versions to work almost as the <a href="http://nantcontrib.sourceforge.net/release/latest/help/tasks/version.html" target="_blank">NAntContrib version task</a> with the automatic build &amp; revision based on day of year and time of day respectively. As most people were running the traditional ymmdd-format for the build, this effectively had to stop at the beginning of 07; 16 bit for the build number breaks that setup. So I settled for an algorithm which won&#8217;t break until the year 2066. The major &amp; minor numbers is set manually.</p>
<p>I couldn&#8217;t seem to find such a labeller <a href="http://www.google.com" target="_blank">out there</a>, and as I wanted the same number in the CC.NET build-number, and in the assemblies (and in the source control system as well, I&#8217;ll get back to that), CC.NET needed to be master. Not finding what I wanted, I created my own labeller for CC.NET, which gives me the build-numbering scheme I wanted.</p>
<p>With the <a href="http://confluence.public.thoughtworks.org/display/CCNET/Custom+Builder+Plug-in" target="_blank">extensibility-points in CC.NET</a> it was great fun, and real easy to deploy my own. Here&#8217;s the whole thing:</p>
<p><!--<br />
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red0\green0\blue0;\red43\green145\blue175;\red163\green21\blue21;}??\fs20 \cf1 using\cf0  System;\par ??\cf1 using\cf0  Exortech.NetReflector;\par ??\cf1 using\cf0  ThoughtWorks.CruiseControl.Core;\par ??\par ??\cf1 namespace\cf0  Haugern.Util.CCNet\par ??\{\par ??    [\cf4 ReflectorType\cf0 (\cf5 "versionLabeller"\cf0 )]\par ??    \cf1 public\cf0  \cf1 class\cf0  \cf4 VersionLabeller\cf0  : \cf4 ILabeller\par ??\cf0     \{\par ??        [\cf4 ReflectorProperty\cf0 (\cf5 "major"\cf0 , Required = \cf1 true\cf0 )] \par ??        \cf1 public\cf0  \cf1 int\cf0  Major;\par ??        [\cf4 ReflectorProperty\cf0 (\cf5 "minor"\cf0 , Required = \cf1 true\cf0 )] \par ??        \cf1 public\cf0  \cf1 int\cf0  Minor;\par ??\par ??        \cf1 public\cf0  \cf1 string\cf0  Generate(\cf4 IIntegrationResult\cf0  integrationResult)\par ??        \{\par ??            \cf1 if\cf0 (integrationResult == \cf1 null\cf0 )\par ??                \cf1 throw\cf0  \cf1 new\cf0  \cf4 ArgumentNullException\cf0 (\cf5 "integrationResult"\cf0 );\par ??\par ??            \cf4 DateTime\cf0  now = \cf4 DateTime\cf0 .Now;\par ??            \cf1 return\cf0  Major + \cf5 "."\cf0  + Minor + \cf5 "."\cf0  + ComputeBuild(now) + \cf5 "."\cf0  + ComputeRelease(now);\par ??        \}\par ??\par ??        \cf1 private\cf0  \cf1 static\cf0  \cf1 string\cf0  ComputeRelease(\cf4 DateTime\cf0  now)\par ??        \{\par ??            \cf1 return\cf0  \cf4 Math\cf0 .Round((now.TimeOfDay.TotalSeconds/10)).ToString();\par ??        \}\par ??\par ??        \cf1 private\cf0  \cf1 static\cf0  \cf1 string\cf0  ComputeBuild(\cf4 DateTime\cf0  now)\par ??        \{\par ??            \cf1 return\cf0  now.ToString(\cf5 "yy"\cf0 ) + now.DayOfYear.ToString(\cf5 "000"\cf0 );\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf1 void\cf0  Run(\cf4 IIntegrationResult\cf0  result)\par ??        \{\par ??            result.Label = Generate(result);\par ??        \}\par ??    \}\par ??\}}<br />
-->
<div style="font-size: small; background: white; color: black; font-family: courier new">
<p style="margin: 0px"><font size="2"><span style="color: blue">using</span> System;</font></p>
<p style="margin: 0px"><font size="2"><span style="color: blue">using</span> Exortech.NetReflector;</font></p>
<p style="margin: 0px"><font size="2"><span style="color: blue">using</span> ThoughtWorks.CruiseControl.Core;</font></p>
<p style="margin: 0px"><font size="2">&nbsp;</font></p>
<p style="margin: 0px"><font size="2"><span style="color: blue">namespace</span> Haugern.Util.CCNet</font></p>
<p style="margin: 0px"><font size="2">{</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp; [<span style="color: #2b91af">ReflectorType</span>(<span style="color: #a31515">"versionLabeller"</span>)]</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">VersionLabeller</span> : <span style="color: #2b91af">ILabeller</span></font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp; {</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: #2b91af">ReflectorProperty</span>(<span style="color: #a31515">"major"</span>, Required = <span style="color: blue">true</span>)] </font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">int</span> Major;</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: #2b91af">ReflectorProperty</span>(<span style="color: #a31515">"minor"</span>, Required = <span style="color: blue">true</span>)] </font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">int</span> Minor;</font></p>
<p style="margin: 0px"><font size="2">&nbsp;</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">string</span> Generate(<span style="color: #2b91af">IIntegrationResult</span> integrationResult)</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span>(integrationResult == <span style="color: blue">null</span>)</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">throw</span> <span style="color: blue">new</span> <span style="color: #2b91af">ArgumentNullException</span>(<span style="color: #a31515">&#8220;integrationResult&#8221;</span>);</font></p>
<p style="margin: 0px"><font size="2">&nbsp;</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #2b91af">DateTime</span> now = <span style="color: #2b91af">DateTime</span>.Now;</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> Major + <span style="color: #a31515">&#8220;.&#8221;</span> + Minor + <span style="color: #a31515">&#8220;.&#8221;</span> + ComputeBuild(now) + <span style="color: #a31515">&#8220;.&#8221;</span> + ComputeRelease(now);</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="margin: 0px"><font size="2">&nbsp;</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> <span style="color: blue">static</span> <span style="color: blue">string</span> ComputeRelease(<span style="color: #2b91af">DateTime</span> now)</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #2b91af">Math</span>.Round((now.TimeOfDay.TotalSeconds/10)).ToString();</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="margin: 0px"><font size="2">&nbsp;</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span> <span style="color: blue">static</span> <span style="color: blue">string</span> ComputeBuild(<span style="color: #2b91af">DateTime</span> now)</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> now.ToString(<span style="color: #a31515">&#8220;yy&#8221;</span>) + now.DayOfYear.ToString(<span style="color: #a31515">&#8220;000&#8243;</span>);</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="margin: 0px"><font size="2">&nbsp;</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">void</span> Run(<span style="color: #2b91af">IIntegrationResult</span> result)</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.Label = Generate(result);</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="margin: 0px"><font size="2">&nbsp;&nbsp;&nbsp; }</font></p>
<p style="margin: 0px"><font size="2">}</font></p>
</div>
<h3>Consistent Build Number</h3>
<p>The second difference (well, in his defence, it&#8217;s not even mentioned), is that the exact same label should be set back into the source control system. In our case, we&#8217;re using TFS Source Control, and <a href="http://confluence.public.thoughtworks.org/display/CCNET/Visual+Studio+Team+Foundation+Server+Plugin" target="_blank">with the standard plugin it was easy</a> to apply it there as well.</p>
<p>Now we got this great setup where we can track everything that happens back to the build-number as it is the same across the whole environment:</p>
<p>Application &lt;-&gt; Build server &lt;-&gt; Source Control</p>
<p>Consistent build number across the production line also means every build is a candidate for release.</p>
<p>Should some bug find it way through our thorough unit-testing &amp; qa-scheme into the hands of our customers, finding the right version to search for it will not be a problem!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.haugern.net/blog/automatic-versioning-with-cruisecontrolnet-and-nant/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
