<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>duncanMgunn.com - Build Process</title>
    <link>http://www.duncangunn.me.uk/dasblog/</link>
    <description />
    <language>en-us</language>
    <copyright>Duncan M Gunn</copyright>
    <lastBuildDate>Sat, 20 Feb 2010 00:39:09 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.0.7226.0</generator>
    <managingEditor>dasblog@example.com</managingEditor>
    <webMaster>dasblog@example.com</webMaster>
    <item>
      <trackback:ping>http://www.duncangunn.me.uk/dasblog/Trackback.aspx?guid=1ea8ac29-f3c8-4ed5-9860-3f077b7ea2fd</trackback:ping>
      <pingback:server>http://www.duncangunn.me.uk/dasblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.duncangunn.me.uk/dasblog/PermaLink,guid,1ea8ac29-f3c8-4ed5-9860-3f077b7ea2fd.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://www.duncangunn.me.uk/dasblog/CommentView,guid,1ea8ac29-f3c8-4ed5-9860-3f077b7ea2fd.aspx</wfw:comment>
      <wfw:commentRss>http://www.duncangunn.me.uk/dasblog/SyndicationService.asmx/GetEntryCommentsRss?guid=1ea8ac29-f3c8-4ed5-9860-3f077b7ea2fd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">If you want to decouple your code from
SVN, there are a number of ways to do it, as documented here - <a href="http://vidmar.net/weblog/archive/2007/12/11/subversion-and-tortoisesvn-tips-and-tricks.aspx">http://vidmar.net/weblog/archive/2007/12/11/subversion-and-tortoisesvn-tips-and-tricks.aspx</a><br /><br />
But I think the easiest is Jon Galloway's solution.<br /><br /><span class="Apple-style-span" style="border-collapse: separate; color: rgb(51, 51, 51); font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span class="Apple-style-span" style="font-size: 12px; line-height: 15px; text-align: left;"><p style="margin: 10px 0px;"><font color="#008080" face="Courier New" size="2">Windows Registry Editor Version
5.00</font></p><p style="margin: 10px 0px;"><font color="#008080" face="Courier New" size="2">[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]<br />
@="Delete SVN Folders"</font></p><p style="margin: 10px 0px;"><font color="#008080" face="Courier New" size="2">[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]<br />
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 &amp;&amp; COLOR 9A &amp;&amp; FOR
/r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""</font></p></span></span><br /><br />
The original post is here - <a href="http://weblogs.asp.net/jgalloway/archive/2007/02/24/shell-command-remove-svn-folders.aspx">http://weblogs.asp.net/jgalloway/archive/2007/02/24/shell-command-remove-svn-folders.aspx</a><p></p><img width="0" height="0" src="http://www.duncangunn.me.uk/dasblog/aggbug.ashx?id=1ea8ac29-f3c8-4ed5-9860-3f077b7ea2fd" /></body>
      <title>Remove SVN folders quickly</title>
      <guid isPermaLink="false">http://www.duncangunn.me.uk/dasblog/PermaLink,guid,1ea8ac29-f3c8-4ed5-9860-3f077b7ea2fd.aspx</guid>
      <link>http://www.duncangunn.me.uk/dasblog/2010/02/20/RemoveSVNFoldersQuickly.aspx</link>
      <pubDate>Sat, 20 Feb 2010 00:39:09 GMT</pubDate>
      <description>If you want to decouple your code from SVN, there are a number of ways to do it, as documented here - &lt;a href="http://vidmar.net/weblog/archive/2007/12/11/subversion-and-tortoisesvn-tips-and-tricks.aspx"&gt;http://vidmar.net/weblog/archive/2007/12/11/subversion-and-tortoisesvn-tips-and-tricks.aspx&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
But I think the easiest is Jon Galloway's solution.&lt;br&gt;
&lt;br&gt;
&lt;span class="Apple-style-span" style="border-collapse: separate; color: rgb(51, 51, 51); font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 15px; text-align: left;"&gt;
&lt;p style="margin: 10px 0px;"&gt;
&lt;font color="#008080" face="Courier New" size="2"&gt;Windows Registry Editor Version
5.00&lt;/font&gt;
&lt;/p&gt;
&lt;p style="margin: 10px 0px;"&gt;
&lt;font color="#008080" face="Courier New" size="2"&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]&lt;br&gt;
@="Delete SVN Folders"&lt;/font&gt;
&lt;/p&gt;
&lt;p style="margin: 10px 0px;"&gt;
&lt;font color="#008080" face="Courier New" size="2"&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]&lt;br&gt;
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 &amp;amp;&amp;amp; COLOR 9A &amp;amp;&amp;amp; FOR
/r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""&lt;/font&gt;
&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
The original post is here - &lt;a href="http://weblogs.asp.net/jgalloway/archive/2007/02/24/shell-command-remove-svn-folders.aspx"&gt;http://weblogs.asp.net/jgalloway/archive/2007/02/24/shell-command-remove-svn-folders.aspx&lt;/a&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.duncangunn.me.uk/dasblog/aggbug.ashx?id=1ea8ac29-f3c8-4ed5-9860-3f077b7ea2fd" /&gt;</description>
      <comments>http://www.duncangunn.me.uk/dasblog/CommentView,guid,1ea8ac29-f3c8-4ed5-9860-3f077b7ea2fd.aspx</comments>
      <category>Build Process</category>
    </item>
    <item>
      <trackback:ping>http://www.duncangunn.me.uk/dasblog/Trackback.aspx?guid=f6d9d2f9-21b1-4051-83f8-10507a11772b</trackback:ping>
      <pingback:server>http://www.duncangunn.me.uk/dasblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.duncangunn.me.uk/dasblog/PermaLink,guid,f6d9d2f9-21b1-4051-83f8-10507a11772b.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://www.duncangunn.me.uk/dasblog/CommentView,guid,f6d9d2f9-21b1-4051-83f8-10507a11772b.aspx</wfw:comment>
      <wfw:commentRss>http://www.duncangunn.me.uk/dasblog/SyndicationService.asmx/GetEntryCommentsRss?guid=f6d9d2f9-21b1-4051-83f8-10507a11772b</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">When using SVN, you want to make sure that
people provide (by automatic enforcement) a message with their Commit.<br /><br />
Usually, you would do this using a Pre-commit hook, which would run a bit of script
and validate this for you.<br /><br />
Unfortunately Beanstalk does not support this at the moment, although hopefully this
will be introduced in the future.<br /><br /><a href="http://help.beanstalkapp.com/discussions/questions/141-pre-commit-hook">http://help.beanstalkapp.com/discussions/questions/141-pre-commit-hook</a><br /><p></p><img width="0" height="0" src="http://www.duncangunn.me.uk/dasblog/aggbug.ashx?id=f6d9d2f9-21b1-4051-83f8-10507a11772b" /></body>
      <title>Hosted SVN and Pre-commit Hooks</title>
      <guid isPermaLink="false">http://www.duncangunn.me.uk/dasblog/PermaLink,guid,f6d9d2f9-21b1-4051-83f8-10507a11772b.aspx</guid>
      <link>http://www.duncangunn.me.uk/dasblog/2009/10/01/HostedSVNAndPrecommitHooks.aspx</link>
      <pubDate>Thu, 01 Oct 2009 15:56:07 GMT</pubDate>
      <description>When using SVN, you want to make sure that people provide (by automatic enforcement) a message with their Commit.&lt;br&gt;
&lt;br&gt;
Usually, you would do this using a Pre-commit hook, which would run a bit of script
and validate this for you.&lt;br&gt;
&lt;br&gt;
Unfortunately Beanstalk does not support this at the moment, although hopefully this
will be introduced in the future.&lt;br&gt;
&lt;br&gt;
&lt;a href="http://help.beanstalkapp.com/discussions/questions/141-pre-commit-hook"&gt;http://help.beanstalkapp.com/discussions/questions/141-pre-commit-hook&lt;/a&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.duncangunn.me.uk/dasblog/aggbug.ashx?id=f6d9d2f9-21b1-4051-83f8-10507a11772b" /&gt;</description>
      <comments>http://www.duncangunn.me.uk/dasblog/CommentView,guid,f6d9d2f9-21b1-4051-83f8-10507a11772b.aspx</comments>
      <category>Build Process</category>
    </item>
    <item>
      <trackback:ping>http://www.duncangunn.me.uk/dasblog/Trackback.aspx?guid=5c4dfab2-39dd-448a-b66a-b62c44575032</trackback:ping>
      <pingback:server>http://www.duncangunn.me.uk/dasblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.duncangunn.me.uk/dasblog/PermaLink,guid,5c4dfab2-39dd-448a-b66a-b62c44575032.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://www.duncangunn.me.uk/dasblog/CommentView,guid,5c4dfab2-39dd-448a-b66a-b62c44575032.aspx</wfw:comment>
      <wfw:commentRss>http://www.duncangunn.me.uk/dasblog/SyndicationService.asmx/GetEntryCommentsRss?guid=5c4dfab2-39dd-448a-b66a-b62c44575032</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">Using NANT quite heavily, but I'm disappointed
at the lack of development on this project.  The <a href="http://sourceforge.net/projects/nant/">repository</a> is
active, however there has not been a release since December 2007!  
<br /><br />
The flipside is that it is really easy to implement your own tasks.  Check out <a href="http://randomactsofcoding.blogspot.com/2009/07/writing-custom-nant-task-part-3.html">http://randomactsofcoding.blogspot.com/2009/07/writing-custom-nant-task-part-3.html</a> for
an example.<br /><br />
One reason I would consider using this is to neatly wrap up calls that I have had
problems with, such as SVN and NUnit.<br /><br />
To perform an SVN copy for example, I must perform the following:<br /><br />
            &lt;echo message="Creating
Tag Directory in SVN - ${svn.mkdircommand}..." /&gt;<br />
            &lt;exec program="svn" commandline="mkdir"&gt;<br />
                &lt;arg
value="${svn.tagClassLibUrl}/release-${build.version}" /&gt;<br />
                &lt;arg
value="--parents" /&gt;<br />
                &lt;arg
value="--username" /&gt;<br />
                &lt;arg
value="${svn.username}" /&gt;<br />
                &lt;arg
value="--password" /&gt;<br />
                &lt;arg
value="${svn.password}" /&gt;<br />
                &lt;arg
value="-m" /&gt;<br />
                &lt;arg
value="&amp;quot;new release ${build.version}&amp;quot;" /&gt;<br />
            &lt;/exec&gt;<br />
            &lt;echo message="Creating
Tag..." /&gt;<br />
            &lt;exec program="svn" commandline="copy"&gt;<br />
                &lt;arg
value="${svn.classLibUrl}" /&gt;<br />
                &lt;arg
value="${svn.tagClassLibUrl}/release-${build.version}" /&gt;<br />
                &lt;arg
value="--username" /&gt;<br />
                &lt;arg
value="${svn.username}" /&gt;<br />
                &lt;arg
value="--password" /&gt;<br />
                &lt;arg
value="${svn.password}" /&gt;<br />
                &lt;arg
value="-m" /&gt;<br />
                &lt;arg
value="&amp;quot;new release ${build.version}&amp;quot;" /&gt;<br />
            &lt;/exec&gt;<br /><br /><br />
Ewww.<br /><br /><br /><br /><br /><br /><p></p><img width="0" height="0" src="http://www.duncangunn.me.uk/dasblog/aggbug.ashx?id=5c4dfab2-39dd-448a-b66a-b62c44575032" /></body>
      <title>Writing a Custom NANT Task</title>
      <guid isPermaLink="false">http://www.duncangunn.me.uk/dasblog/PermaLink,guid,5c4dfab2-39dd-448a-b66a-b62c44575032.aspx</guid>
      <link>http://www.duncangunn.me.uk/dasblog/2009/08/18/WritingACustomNANTTask.aspx</link>
      <pubDate>Tue, 18 Aug 2009 16:31:19 GMT</pubDate>
      <description>Using NANT quite heavily, but I'm disappointed at the lack of development on this project.&amp;nbsp; The &lt;a href="http://sourceforge.net/projects/nant/"&gt;repository&lt;/a&gt; is
active, however there has not been a release since December 2007!&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
The flipside is that it is really easy to implement your own tasks.&amp;nbsp; Check out &lt;a href="http://randomactsofcoding.blogspot.com/2009/07/writing-custom-nant-task-part-3.html"&gt;http://randomactsofcoding.blogspot.com/2009/07/writing-custom-nant-task-part-3.html&lt;/a&gt; for
an example.&lt;br&gt;
&lt;br&gt;
One reason I would consider using this is to neatly wrap up calls that I have had
problems with, such as SVN and NUnit.&lt;br&gt;
&lt;br&gt;
To perform an SVN copy for example, I must perform the following:&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;echo message="Creating
Tag Directory in SVN - ${svn.mkdircommand}..." /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;exec program="svn" commandline="mkdir"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="${svn.tagClassLibUrl}/release-${build.version}" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="--parents" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="--username" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="${svn.username}" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="--password" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="${svn.password}" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="-m" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="&amp;amp;quot;new release ${build.version}&amp;amp;quot;" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/exec&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;echo message="Creating
Tag..." /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;exec program="svn" commandline="copy"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="${svn.classLibUrl}" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="${svn.tagClassLibUrl}/release-${build.version}" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="--username" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="${svn.username}" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="--password" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="${svn.password}" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="-m" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;arg
value="&amp;amp;quot;new release ${build.version}&amp;amp;quot;" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/exec&amp;gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Ewww.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.duncangunn.me.uk/dasblog/aggbug.ashx?id=5c4dfab2-39dd-448a-b66a-b62c44575032" /&gt;</description>
      <comments>http://www.duncangunn.me.uk/dasblog/CommentView,guid,5c4dfab2-39dd-448a-b66a-b62c44575032.aspx</comments>
      <category>Build Process</category>
    </item>
    <item>
      <trackback:ping>http://www.duncangunn.me.uk/dasblog/Trackback.aspx?guid=e45bde82-a866-4ff4-9f82-399ccbd7ff11</trackback:ping>
      <pingback:server>http://www.duncangunn.me.uk/dasblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.duncangunn.me.uk/dasblog/PermaLink,guid,e45bde82-a866-4ff4-9f82-399ccbd7ff11.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://www.duncangunn.me.uk/dasblog/CommentView,guid,e45bde82-a866-4ff4-9f82-399ccbd7ff11.aspx</wfw:comment>
      <wfw:commentRss>http://www.duncangunn.me.uk/dasblog/SyndicationService.asmx/GetEntryCommentsRss?guid=e45bde82-a866-4ff4-9f82-399ccbd7ff11</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <a href="http://nant.sourceforge.net/">NANT</a> is
a great build tool.  We used it extensively at my old place - and I mean extensively.<br /><br />
The build scripts were mini-projects in themselves, and we had nothing more than Notepad
(or <a href="http://www.vim.org/">vim</a>) to help us.  Like going on an expedition
to the South Pole with nothing more than a big jacket.<br /><br />
But I have now discovered the recently released <a href="http://www.nantbuilder.com/">NANTBuilder2</a>. 
Very much like FinalBuilder in it's interface - I've been able to rattle up some NANT
goodness in double-quick time.  Check it out.<br /><br /><br /><p></p><img width="0" height="0" src="http://www.duncangunn.me.uk/dasblog/aggbug.ashx?id=e45bde82-a866-4ff4-9f82-399ccbd7ff11" /></body>
      <title>NANT IDE</title>
      <guid isPermaLink="false">http://www.duncangunn.me.uk/dasblog/PermaLink,guid,e45bde82-a866-4ff4-9f82-399ccbd7ff11.aspx</guid>
      <link>http://www.duncangunn.me.uk/dasblog/2009/08/11/NANTIDE.aspx</link>
      <pubDate>Tue, 11 Aug 2009 07:41:39 GMT</pubDate>
      <description>&lt;a href="http://nant.sourceforge.net/"&gt;NANT&lt;/a&gt; is a great build tool.&amp;nbsp; We used
it extensively at my old place - and I mean extensively.&lt;br&gt;
&lt;br&gt;
The build scripts were mini-projects in themselves, and we had nothing more than Notepad
(or &lt;a href="http://www.vim.org/"&gt;vim&lt;/a&gt;) to help us.&amp;nbsp; Like going on an expedition
to the South Pole with nothing more than a big jacket.&lt;br&gt;
&lt;br&gt;
But I have now discovered the recently released &lt;a href="http://www.nantbuilder.com/"&gt;NANTBuilder2&lt;/a&gt;.&amp;nbsp;
Very much like FinalBuilder in it's interface - I've been able to rattle up some NANT
goodness in double-quick time.&amp;nbsp; Check it out.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.duncangunn.me.uk/dasblog/aggbug.ashx?id=e45bde82-a866-4ff4-9f82-399ccbd7ff11" /&gt;</description>
      <comments>http://www.duncangunn.me.uk/dasblog/CommentView,guid,e45bde82-a866-4ff4-9f82-399ccbd7ff11.aspx</comments>
      <category>Build Process</category>
    </item>
    <item>
      <trackback:ping>http://www.duncangunn.me.uk/dasblog/Trackback.aspx?guid=2deb2955-baa5-4dce-9286-94d20805d27b</trackback:ping>
      <pingback:server>http://www.duncangunn.me.uk/dasblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.duncangunn.me.uk/dasblog/PermaLink,guid,2deb2955-baa5-4dce-9286-94d20805d27b.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://www.duncangunn.me.uk/dasblog/CommentView,guid,2deb2955-baa5-4dce-9286-94d20805d27b.aspx</wfw:comment>
      <wfw:commentRss>http://www.duncangunn.me.uk/dasblog/SyndicationService.asmx/GetEntryCommentsRss?guid=2deb2955-baa5-4dce-9286-94d20805d27b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The Build Process is central to the business of delivering software.  In my opinion,
the Build Process IS your business.  It is crucial to the development of high
quality software - from both a developer and end-user perspective.
</p>
        <p>
In our organisation, we have a build pipeline which can effectively be separated into
3 distinct stages:
</p>
        <p>
 
</p>
        <h2>Stage 1 - Development
</h2>
        <p>
          <img src="http://www.duncangunn.me.uk/dasblog/content/binary/Stage11.png" border="0" />
        </p>
        <p>
 
</p>
        <p>
When the Developer starts the build the code is first run through our automated source
analysis tools.  If there are no breaking changes here (the policy can be defined)
then the source is built.  If this successfully builds then the required unit
testing suites are run.  It is important to realise here that we do not build
THE PRODUCT, every time.  We could, but most of the time we will be building
only one specific component of the product.  These can be chained together in
the CI system.  
</p>
        <p>
Note: Most CI processes will commit the source FIRST, then perform Unit Testing. 
While this still has the advantage of catching build errors early if performed regularly,
it still results in broken builds.  The CI system we use, TeamCity, allows us
to perform "Remote Personal Builds", which merges the source to be committed to a
*unique* location.  If there is a build error or unit test failure then the defective
source is NOT committed to VCS.  Therefore there will never be a broken build.
</p>
        <p>
Of course, what this means is that you must set up your build scripts to work with
RELATIVE PATHS ONLY, which could be a considerable change for legacy systems. 
If using SVN, the Externals feature is crucial to this.  I hope you
would agree with me that the result here more than justifies the cost in setting it
up. 
</p>
        <p>
 
</p>
        <h2>Stage 2 - Automated Testing and Deployment
</h2>
        <p>
          <img src="http://www.duncangunn.me.uk/dasblog/content/binary/Stage21.png" border="0" />
        </p>
        <p>
If Stage 1 has been successful, the Installation is built.  Note that we are
talking about A PRODUCT DELIVERABLE in this case (although there can be several of
these that comprise THE PRODUCT).
</p>
        <p>
Virtualisation and Automation are two key foundation stones that a CI system is built
on.  It is always worthwhile to remember that the majority cost of developing
software isn't in the coding, but in the testing.  EVERY test that has to be
performed manually, because it has to be repeated again and again by someone who needs
to be paid, is throwing your money away.  Therefore it is much more prudent to
develop automate as much of the test effort as you can.
</p>
        <p>
The Build Process now deploys the installation to the designated virtual machines. 
These comprise a number of different operating systems with different configurations. 
Again, with the number of different versions of OS on the market, we can get as much
coverage as we desire here with a fraction of the cost involved in doing this manually.
</p>
        <p>
Once this has been deployed, the designated auto-tests are run on each configuration. 
The results log of these tests are linked back into the appropriate build in the CI
system, so it is fully traceable.  The final task of this stage is to roll back
the virtual machines to their pre-test state - this allows anyone who wants to look
at that particular install do so without having to install it themselves.
</p>
        <h2>Stage 3 - QA
</h2>
        <p>
          <img src="http://www.duncangunn.me.uk/dasblog/content/binary/Stage31.png" border="0" />
        </p>
        <p>
Because we have automated so much of the 'grunt work' we can concentrate on the elements
of the system which cannot easily be automated, if at all.  
</p>
        <p>
Any manual QA is performed here, along with Design Reviews of the product.  This
can give the goal donor and other stakeholders insight into the product at every stage
in its delivery, and of course the earlier that change is managed the easier it is
to inject into the product.
</p>
        <p>
 
</p>
        <p>
 
</p>
        <p>
There are so many benefits from setting up a successful build pipeline, and it really
must be done at the start, not half-way, and certainly not at the end, to get the
most out of it.  
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://www.duncangunn.me.uk/dasblog/aggbug.ashx?id=2deb2955-baa5-4dce-9286-94d20805d27b" />
      </body>
      <title>Continous Integration - Build Process Overview</title>
      <guid isPermaLink="false">http://www.duncangunn.me.uk/dasblog/PermaLink,guid,2deb2955-baa5-4dce-9286-94d20805d27b.aspx</guid>
      <link>http://www.duncangunn.me.uk/dasblog/2008/12/17/ContinousIntegrationBuildProcessOverview.aspx</link>
      <pubDate>Wed, 17 Dec 2008 21:13:56 GMT</pubDate>
      <description>&lt;p&gt;
The Build Process is central to the business of delivering software.&amp;nbsp; In my opinion,
the Build Process IS your business.&amp;nbsp; It is crucial to the development of high
quality software - from both a developer and end-user perspective.
&lt;/p&gt;
&lt;p&gt;
In our organisation, we have a build pipeline which can effectively be separated into
3 distinct stages:
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Stage 1 - Development
&lt;/h2&gt;
&lt;p&gt;
&lt;img src="http://www.duncangunn.me.uk/dasblog/content/binary/Stage11.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
When the Developer starts the build the code is first run through our automated source
analysis tools.&amp;nbsp; If there are no breaking changes here (the policy can be defined)
then the source is built.&amp;nbsp; If this successfully builds then the required unit
testing suites are run.&amp;nbsp; It is important to realise here that we do not build
THE PRODUCT, every time.&amp;nbsp; We could, but most of the time we will be building
only one specific component of the product.&amp;nbsp; These can be chained together in
the CI system.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Note: Most CI processes will commit the source FIRST, then perform Unit Testing.&amp;nbsp;
While this still has the advantage of catching build errors early if performed regularly,
it still results in broken builds.&amp;nbsp; The CI system we use, TeamCity, allows us
to perform "Remote Personal Builds", which merges the source to be committed to a
*unique* location.&amp;nbsp; If there is a build error or unit test failure then the defective
source is NOT committed to VCS.&amp;nbsp; Therefore there will never be a broken build.
&lt;/p&gt;
&lt;p&gt;
Of course, what this means is that you must set up your build scripts to work with
RELATIVE PATHS ONLY, which could be a considerable change for legacy systems.&amp;nbsp;
If using SVN,&amp;nbsp;the Externals feature is crucial to&amp;nbsp;this.&amp;nbsp; I hope you
would agree with me that the result here more than justifies the cost in setting it
up.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Stage 2 - Automated Testing and Deployment
&lt;/h2&gt;
&lt;p&gt;
&lt;img src="http://www.duncangunn.me.uk/dasblog/content/binary/Stage21.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
If Stage 1 has been successful, the Installation is built.&amp;nbsp; Note that we are
talking about A PRODUCT DELIVERABLE in this case (although there can be several of
these that comprise THE PRODUCT).
&lt;/p&gt;
&lt;p&gt;
Virtualisation and Automation are two key foundation stones that a CI system is built
on.&amp;nbsp; It is always worthwhile to remember that the majority cost of developing
software isn't in the coding, but in the testing.&amp;nbsp; EVERY test that has to be
performed manually, because it has to be repeated again and again by someone who needs
to be paid, is throwing your money away.&amp;nbsp; Therefore it is much more prudent to
develop automate as much of the test effort as you can.
&lt;/p&gt;
&lt;p&gt;
The Build Process now deploys the installation to the designated virtual machines.&amp;nbsp;
These comprise a number of different operating systems with different configurations.&amp;nbsp;
Again, with the number of different versions of OS on the market, we can get as much
coverage as we desire here with a fraction of the cost involved in doing this manually.
&lt;/p&gt;
&lt;p&gt;
Once this has been deployed, the designated auto-tests are run on each configuration.&amp;nbsp;
The results log of these tests are linked back into the appropriate build in the CI
system, so it is fully traceable.&amp;nbsp; The final task of this stage is to roll back
the virtual machines to their pre-test state - this allows anyone who wants to look
at that particular install do so without having to install it themselves.
&lt;/p&gt;
&lt;h2&gt;Stage 3 - QA
&lt;/h2&gt;
&lt;p&gt;
&lt;img src="http://www.duncangunn.me.uk/dasblog/content/binary/Stage31.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Because we have automated so much of the 'grunt work' we can concentrate on the elements
of the system which cannot easily be automated, if at all.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Any manual QA is performed here, along with Design Reviews of the product.&amp;nbsp; This
can give the goal donor and other stakeholders insight into the product at every stage
in its delivery, and of course the earlier that change is managed the easier it is
to inject into the product.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
There are so many benefits from setting up a successful build pipeline, and it really
must be done at the start, not half-way, and certainly not at the end, to get the
most out of it.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.duncangunn.me.uk/dasblog/aggbug.ashx?id=2deb2955-baa5-4dce-9286-94d20805d27b" /&gt;</description>
      <comments>http://www.duncangunn.me.uk/dasblog/CommentView,guid,2deb2955-baa5-4dce-9286-94d20805d27b.aspx</comments>
      <category>Build Process</category>
    </item>
    <item>
      <trackback:ping>http://www.duncangunn.me.uk/dasblog/Trackback.aspx?guid=622a34b3-7fe7-426a-9d92-4a69f55fd766</trackback:ping>
      <pingback:server>http://www.duncangunn.me.uk/dasblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.duncangunn.me.uk/dasblog/PermaLink,guid,622a34b3-7fe7-426a-9d92-4a69f55fd766.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://www.duncangunn.me.uk/dasblog/CommentView,guid,622a34b3-7fe7-426a-9d92-4a69f55fd766.aspx</wfw:comment>
      <wfw:commentRss>http://www.duncangunn.me.uk/dasblog/SyndicationService.asmx/GetEntryCommentsRss?guid=622a34b3-7fe7-426a-9d92-4a69f55fd766</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When it's time to start implementing a new project, where do you begin?  Once
the requirements have been gathered and the first Sprint planned, it's time to start
coding, right?  
</p>
        <p>
I'm not so sure.
</p>
        <p>
Something that has dawned on me over a number of projects, is the seemingly
back-to-front mantra of <strong><em>start at the end.</em></strong></p>
        <p>
By this, I mean that you should always start at your build process.  Examine
it, and make sure that before Feature One has been committed to source control, you
have a fully functioning build system in operation.  That is, there should be
a fully automated system in place that will build the latest sources, create any necessary
installation files and deploy to pre-designated release locations, complete with versioning. 
And this should be in place before you've got anything more than a single form in
your application.
</p>
        <p>
The reason for this is simple - the build process is critical to the success of your
project.  It is too easy to underestimate the amount of work that has to go in
to making a release of software.  You can lose days tangled up in build scripts
when someone adds a new component, or worse - maybe there is a wrong version of an
assembly being referenced.  A number of years ago, I remember we used to do product
release builds inside the IDE, and then manually copy the files to a location on the
network.  Thankfully those days are well behind us!
</p>
        <p>
Of course, the other reason is that the build scripts can get very complicated
- <em>very quickly</em>.  Like other, non-functional requirements of software
such as exception management, localization and documentation - if you don't keep on
top of them you will lose control.  
</p>
        <p>
Key to the build process is the concept of Continuous Integration.  This is the
idea that changes are integrated into the main build continously - we no longer wait
on kicking off builds manually.  Builds are usually triggered as a result of
source files being committed to the repository, or on hourly schedules.  The
thinking behind this is that the earlier we catch an error, the easier it will be
to fix.  Like most good ideas regarding software development - this is just common
sense.
</p>
        <p>
          <img src="http://www.duncangunn.me.uk/dasblog/content/binary/ouroboros-full.jpg" border="0" />
        </p>
        <p>
However, you don't get it for free.  But there are tools which take on a lot
of this burden, and it's really up to you how complex you want your build process
to be.  Do you want automatic code reviews to be run (such as FxCop), Unit Test
coverage reports, automated deployment to virtual machines for automated testing? 
Or else your build process could simply consist of a source control fetch followed
by a build, followed by a copy to a location on the network entitled 'Releases'. 
Still better than doing it yourself!
</p>
        <p>
Over the next few weeks I'll be documenting my ideal approach that I believe would
lead to the successful and timely delivery of software projects.  
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://www.duncangunn.me.uk/dasblog/aggbug.ashx?id=622a34b3-7fe7-426a-9d92-4a69f55fd766" />
      </body>
      <title>Continuous Integration</title>
      <guid isPermaLink="false">http://www.duncangunn.me.uk/dasblog/PermaLink,guid,622a34b3-7fe7-426a-9d92-4a69f55fd766.aspx</guid>
      <link>http://www.duncangunn.me.uk/dasblog/2008/12/06/ContinuousIntegration.aspx</link>
      <pubDate>Sat, 06 Dec 2008 19:57:19 GMT</pubDate>
      <description>&lt;p&gt;
When it's time to start implementing a new project, where do you begin?&amp;nbsp; Once
the requirements have been gathered and the first Sprint planned, it's time to start
coding, right?&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
I'm not so sure.
&lt;/p&gt;
&lt;p&gt;
Something that has dawned on me over&amp;nbsp;a&amp;nbsp;number of projects, is the seemingly
back-to-front mantra of &lt;strong&gt;&lt;em&gt;start at the end.&lt;/em&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
By this, I mean that you should always start at your build process.&amp;nbsp; Examine
it, and make sure that before Feature One has been committed to source control, you
have a fully functioning build system in operation.&amp;nbsp; That is, there should be
a fully automated system in place that will build the latest sources, create any necessary
installation files and deploy to pre-designated release locations, complete with versioning.&amp;nbsp;
And this should be in place before you've got anything more than a single form in
your application.
&lt;/p&gt;
&lt;p&gt;
The reason for this is simple - the build process is critical to the success of your
project.&amp;nbsp; It is too easy to underestimate the amount of work that has to go in
to making a release of software.&amp;nbsp; You can lose days tangled up in build scripts
when someone adds a new component, or worse - maybe there is a wrong version of an
assembly being referenced.&amp;nbsp; A number of years ago, I remember we used to do product
release builds inside the IDE, and then manually copy the files to a location on the
network.&amp;nbsp; Thankfully those days are well behind us!
&lt;/p&gt;
&lt;p&gt;
Of&amp;nbsp;course, the other reason is that the build scripts can get very complicated
- &lt;em&gt;very quickly&lt;/em&gt;.&amp;nbsp; Like other, non-functional requirements of software
such as exception management, localization and documentation - if you don't keep on
top of them you will lose control.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Key to the build process is the concept of Continuous Integration.&amp;nbsp; This is the
idea that changes are integrated into the main build continously - we no longer wait
on kicking off builds manually.&amp;nbsp; Builds are usually triggered as a result of
source files being committed to the repository, or on hourly schedules.&amp;nbsp; The
thinking behind this is that the earlier we catch an error, the easier it will be
to fix.&amp;nbsp; Like most good ideas regarding software development - this is just common
sense.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.duncangunn.me.uk/dasblog/content/binary/ouroboros-full.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
However, you don't get it for free.&amp;nbsp; But there are tools which take on a lot
of this burden, and it's really up to you how complex you want your build process
to be.&amp;nbsp; Do you want automatic code reviews to be run (such as FxCop), Unit Test
coverage reports, automated deployment to virtual machines for automated testing?&amp;nbsp;
Or else your build process could simply consist of a source control fetch followed
by a build, followed by a copy to a location on the network entitled 'Releases'.&amp;nbsp;
Still better than doing it yourself!
&lt;/p&gt;
&lt;p&gt;
Over the next few weeks I'll be documenting my ideal approach that I believe would
lead to the successful and timely delivery of software projects.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.duncangunn.me.uk/dasblog/aggbug.ashx?id=622a34b3-7fe7-426a-9d92-4a69f55fd766" /&gt;</description>
      <comments>http://www.duncangunn.me.uk/dasblog/CommentView,guid,622a34b3-7fe7-426a-9d92-4a69f55fd766.aspx</comments>
      <category>Build Process</category>
    </item>
  </channel>
</rss>