<?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>Rash thoughts about .NET, C#, F# and Dynamics NAV. &#187; Continuous Integration</title>
	<atom:link href="http://www.navision-blog.de/tag/continuous-integration/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.navision-blog.de</link>
	<description>This Blog is about Microsoft Dynamics NAV (f.k.a Navision incl. C/SIDE and C/AL), C#, F# and .NET in general.</description>
	<lastBuildDate>Wed, 14 Jul 2010 11:12:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>&#8220;FAKE &#8211; F# Make&#8221; 0.29 released &#8211; Ready for F# February 2010 CTP and .NET 4.0 RC</title>
		<link>http://www.navision-blog.de/2010/02/14/fake-f-make-0-29-released-ready-for-f-february-2010-ctp-and-net-4-0-rc/</link>
		<comments>http://www.navision-blog.de/2010/02/14/fake-f-make-0-29-released-ready-for-f-february-2010-ctp-and-net-4-0-rc/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 16:56:07 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[English posts]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[FAKE - F# Make]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[F-sharp Make]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2010/02/14/fake-f-make-0-29-released-ready-for-f-february-2010-ctp-and-net-4-0-rc/</guid>
		<description><![CDATA[Last week I released version 0.29 of my build automation tool “FAKE – F# Make”. The new version comes along with a couple of changes which I will now describe. F# February 2010 CTP and .NET 4.0 RC “FAKE – F# Make” should be completely compatible with both, the F# February 2010 CTP and the [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I released version 0.29 of my build automation tool “FAKE – F# Make”. The new version comes along with a couple of changes which I will now describe.</p>
<h5>F# February 2010 CTP and .NET 4.0 RC</h5>
<p>“FAKE – F# Make” should be completely compatible with both, the <a href="http://go.microsoft.com/fwlink/?LinkId=151924">F# February 2010 CTP</a> and the F# version which is included in <a href="http://go.microsoft.com/fwlink/?LinkId=151923">Visual Studio 2010 RC</a>.</p>
<h5>FAKE self build and binaries on teamcity.codebetter.com</h5>
<p>Since “FAKE – F# Make” is a build automation tool, it was always used for it’s own build process. Now this build process could be moved to an open CI server at <a href="http://teamcity.codebetter.com/viewType.html?buildTypeId=bt114&amp;tab=buildTypeStatusDiv">teamcity.codebetter.com</a>. If you login as a guest you can download the latest “FAKE – F# Make” binaries from there.</p>
<h5>FAKE on build servers without F#</h5>
<p>With the new F# CTP there is no longer a need for installing F# on the build agents. In fact FAKE itself was built on build agents which don’t have a F# installation. </p>
<p>If you want to create such build scripts you have to do the following:</p>
<ol>
<li>Download the standalone zip file of the <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ba52e650-4e77-4b0b-b987-9f9ecd3bab3b&amp;displaylang=en">F# CTP</a> </li>
<li>Put the bin subfolder into your project tree </li>
<li>Modify the FSIPath value in the FAKE.exe.config file to match your FSharp bin folder
<ol>
<li>If you copy the contents the F# bin folder into ./tools/FSharp/ it should just work. </li>
</ol>
</li>
</ol>
<p>If you have F# projects you also need to modify your .fsproj files like this:</p>
<p>&lt;PropertyGroup&gt;    <br />&#160;&#160; ….     <br />&#160; &lt;FscToolPath&gt;..\..\..\tools\FSharp\&lt;/FscToolPath&gt;     <br />&lt;/PropertyGroup&gt;     <br />…     <br />&lt;Import Project=&quot;..\..\..\tools\FSharp\Microsoft.FSharp.Targets&quot; /&gt;</p>
<p>This modifications should take care that MSBuild will use the F# compiler from your tools paths.</p>
<h5>Generate your documentations with “docu”</h5>
<blockquote><p><strong>“What&#8217;s a docu?</strong> A documentation generator for .Net that isn&#8217;t complicated, awkward, or difficult to use. Given an assembly and the XML that&#8217;s generated by Visual Studio, docu can produce an entire website of documentation with a single command.” [<a href="http://docu.jagregory.com/">docu Homepage</a>]</p>
</blockquote>
<p>“FAKE – F# Make” 0.29 is bundled with this new documentation tool which can easily convert your xml-Documentation into some nice html pages. You can use the tool with the new Docu task like this:</p>
<div style="font-family: courier new; background: white; color: black; font-size: 10pt">
<p style="margin: 0px">Target? GenerateDocumentation &lt;-</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: blue">fun</span> _ <span style="color: blue">-&gt;</span></p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; Docu (<span style="color: blue">fun</span> p <span style="color: blue">-&gt;</span></p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {p <span style="color: blue">with</span></p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ToolPath = <span style="color: maroon">@&quot;.\tools\FAKE\docu.exe&quot;</span></p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TemplatesPath = <span style="color: maroon">@&quot;.\tools\FAKE\templates&quot;</span></p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; OutputPath = docDir })</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (buildDir + <span style="color: maroon">&quot;MyAssembly.dll&quot;</span>)</p>
</p></div>
<p>You will also need the docu templates, which you can download from the product homepage. I’m planning to bundle some basic templates with the next version of FAKE.</p>
<h5>What’s next?</h5>
<p>At the moment I’m working on <a href="http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx">ILMerge</a> task for FAKE. I hope to release this with the next version. There are also some open issues with the Mono support but since teamcity.codebetter.com is getting a mono build agent I hope to make some progress here too.</p>
<p>If you have any questions or ideas for new features please contact me.</p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2010/02/14/fake-f-make-0-29-released-ready-for-f-february-2010-ctp-and-net-4-0-rc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Integrating a &#8220;FAKE &#8211; F# Make&#8221; build script into CruiseControl.NET</title>
		<link>http://www.navision-blog.de/2009/10/14/integrating-a-fake-f-make-build-script-into-cruisecontrol-net/</link>
		<comments>http://www.navision-blog.de/2009/10/14/integrating-a-fake-f-make-build-script-into-cruisecontrol-net/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 08:38:55 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[F#]]></category>
		<category><![CDATA[FAKE - F# Make]]></category>
		<category><![CDATA[CC.NET]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[CruiseControl]]></category>
		<category><![CDATA[CruiseControl.NET]]></category>
		<category><![CDATA[F-sharp Make]]></category>
		<category><![CDATA[Fake]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2009/10/14/integrating-a-fake-f-make-build-script-into-cruisecontrol-net/</guid>
		<description><![CDATA[Since version 0.12 the FAKE build system provides an easy way to setup build configurations for CruiseControl.NET. “CruiseControl.NET is an Automated Continuous Integration server, implemented using the Microsoft .NET Framework.” [thoughtworks.org] In this article I will show you how you can set up a FAKE build script in CruiseControl.NET. We will use the CalculatorSample which [...]]]></description>
			<content:encoded><![CDATA[<p>Since version 0.12 the <a href="http://code.google.com/p/fake/">FAKE build system</a> provides an easy way to setup build configurations for <a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET">CruiseControl.NET</a>.</p>
<blockquote><p><strong>“CruiseControl.NET</strong> is an Automated Continuous Integration server, implemented using the Microsoft .NET Framework.”</p>
<p align="right">[<a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET">thoughtworks.org</a>] </p>
</blockquote>
<p>In this article I will show you how you can set up a FAKE build script in CruiseControl.NET. We will use the CalculatorSample which you can download from the <a href="http://code.google.com/p/fake/downloads/list">FAKE Download page</a>.</p>
<p>If you want to know how this build script works and how you could create one for your own projects please read the <a href="http://www.navision-blog.de/2009/04/01/getting-started-with-fake-a-f-sharp-make-tool/">“Getting started with FAKE”-tutorial</a>.</p>
<p>If you want to set up “FAKE – F# Make” build configurations in TeamCity please read <a href="http://www.navision-blog.de/2009/04/15/integrate-a-fake-f-make-build-script-into-teamcity/">“Integrating a &quot;FAKE – F# Make&quot; build script into TeamCity</a>”.</p>
<h5>Installing CruiseControl.NET</h5>
<p>You can download CruiseControl.NET from <a href="http://confluence.public.thoughtworks.org/display/CCNET/Download">thoughtworks.org</a>. After the installation process (<a href="http://confluence.public.thoughtworks.org/display/CCNET/Basic+Installation">further instructions</a>) you should see an empty dashboard:</p>
<p><a href="http://www.navision-blog.de/images/IntegratingaFAKEFMakebuildscriptinto.net_7967/image.png"><img class="bordered" title="CruiseControl.NET Dashboard" border="0" alt="CruiseControl.NET Dashboard" src="http://www.navision-blog.de/images/IntegratingaFAKEFMakebuildscriptinto.net_7967/image_thumb.png" width="500" height="231" /></a> </p>
<h5>Installing Subversion</h5>
<p>The CalculatorSample is using Subversion (SVN) for <a href="http://en.wikipedia.org/wiki/Revision_control">SourceControl</a>, so we need to download SVN from <a title="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100" href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100">subversion.tigris.org</a>. I’m using the “Windows MSI installer with the basic win32 binaries” and installed them under “c:\Program Files (x86)\Subversion\”.</p>
<h5>Installing FxCop</h5>
<p>The CalculatorSample is using <a href="http://msdn.microsoft.com/en-us/library/bb429476%28VS.80%29.aspx">FxCop</a>, so we need to <a href="http://www.microsoft.com/downloads/details.aspx?familyid=9AEAA970-F281-4FB0-ABA1-D59D7ED09772&amp;displaylang=en">download</a> and install it next.</p>
<blockquote><p>“FxCop is an application that analyzes managed code assemblies (code that targets the .NET Framework common language runtime) and reports information about the assemblies, such as possible design, localization, performance, and security improvements. Many of the issues concern violations of the programming and design rules set forth in the <a href="http://go.microsoft.com/fwlink/?LinkId=70287">Design Guidelines</a> for Class Library Developers, which are the Microsoft guidelines for writing robust and easily maintainable code by using the .NET Framework.”</p>
<p align="right">[<a href="http://msdn.microsoft.com/en-us/library/bb429476%28VS.80%29.aspx">MSDN</a>]</p>
</blockquote>
<h5>Creating a FAKE Project</h5>
<p>Now create a new folder for the CalculatorSample sources. I’m using “<strong>d:\Calculator\</strong>” for the rest of the article.</p>
<p>The next step is to modify the CruiseControl.NET config file (“c:\Program Files (x86)\CruiseControl.NET\server\ccnet.config” on my machine):</p>
<div style="font-family: courier new; background: white; color: black; font-size: 7pt">
<p style="margin: 0px"><span style="color: blue">&lt;</span><span style="color: #a31515">cruisecontrol</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160; &lt;</span><span style="color: #a31515">project</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160; &lt;</span><span style="color: #a31515">name</span><span style="color: blue">&gt;</span>CalculatorExample<span style="color: blue">&lt;/</span><span style="color: #a31515">name</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160; &lt;</span><span style="color: #a31515">triggers</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">intervalTrigger</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">continuous</span>&quot;<span style="color: blue"> </span><span style="color: red">seconds</span><span style="color: blue">=</span>&quot;<span style="color: blue">30</span>&quot;<span style="color: blue"> </span><span style="color: red">initialSeconds</span><span style="color: blue">=</span>&quot;<span style="color: blue">30</span>&quot;<span style="color: blue">/&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160; &lt;/</span><span style="color: #a31515">triggers</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160; &lt;</span><span style="color: #a31515">sourcecontrol</span><span style="color: blue"> </span><span style="color: red">type</span><span style="color: blue">=</span>&quot;<span style="color: blue">svn</span>&quot;<span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">executable</span><span style="color: blue">&gt;</span>c:\Program Files (x86)\Subversion\bin\svn.exe<span style="color: blue">&lt;/</span><span style="color: #a31515">executable</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">workingDirectory</span><span style="color: blue">&gt;</span>d:\Calculator\<span style="color: blue">&lt;/</span><span style="color: #a31515">workingDirectory</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">trunkUrl</span><span style="color: blue">&gt;</span>http://fake.googlecode.com/svn/trunk/Samples/Calculator/<span style="color: blue">&lt;/</span><span style="color: #a31515">trunkUrl</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160; &lt;/</span><span style="color: #a31515">sourcecontrol</span><span style="color: blue">&gt;&#160;&#160;&#160; </span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160; &lt;</span><span style="color: #a31515">tasks</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">exec</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">executable</span><span style="color: blue">&gt;</span>d:\Calculator\tools\Fake\Fake.exe<span style="color: blue">&lt;/</span><span style="color: #a31515">executable</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">baseDirectory</span><span style="color: blue">&gt;</span>d:\Calculator\<span style="color: blue">&lt;/</span><span style="color: #a31515">baseDirectory</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">buildArgs</span><span style="color: blue">&gt;</span>completeBuild.fsx<span style="color: blue">&lt;/</span><span style="color: #a31515">buildArgs</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160; &lt;/</span><span style="color: #a31515">exec</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160; &lt;/</span><span style="color: #a31515">tasks</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160; &lt;</span><span style="color: #a31515">publishers</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">merge</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">files</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">file</span><span style="color: blue">&gt;</span>d:\Calculator\test\FXCopResults.xml<span style="color: blue">&lt;/</span><span style="color: #a31515">file</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">file</span><span style="color: blue">&gt;</span>d:\Calculator\test\TestResults.xml<span style="color: blue">&lt;/</span><span style="color: #a31515">file</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">file</span><span style="color: blue">&gt;</span>d:\Calculator\output\Results.xml<span style="color: blue">&lt;/</span><span style="color: #a31515">file</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/</span><span style="color: #a31515">files</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160; &lt;/</span><span style="color: #a31515">merge</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">xmllogger</span><span style="color: blue"> /&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160; &lt;/</span><span style="color: #a31515">publishers</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160; &lt;/</span><span style="color: #a31515">project</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&lt;/</span><span style="color: #a31515">cruisecontrol</span><span style="color: blue">&gt;</span></p>
</p></div>
<p>In this configuration I set up a trigger which checks every 30 sec. for changes in my CalculatorSample project. </p>
<p>If SVN finds changes FAKE.exe is called with my build script (completeBuild.fsx). </p>
<p>After the build I want to merge the FxCop and NUnit output files with my build results to create a build report.</p>
<h5>Configuring the dashboard</h5>
<p>In order to provide a nicer output on the dashboard we need to modify the BuildPlugins section in the dashboard.config file (“c:\Program Files (x86)\CruiseControl.NET\webdashboard\dashboard.config” on my machine):</p>
<div style="font-family: courier new; background: white; color: black; font-size: 10pt">
<p style="margin: 0px"><span style="color: blue">&lt;</span><span style="color: #a31515">buildPlugins</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160; &lt;</span><span style="color: #a31515">buildReportBuildPlugin</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160; &lt;</span><span style="color: #a31515">xslFileNames</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">xslFile</span><span style="color: blue">&gt;</span>xsl\header.xsl<span style="color: blue">&lt;/</span><span style="color: #a31515">xslFile</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">xslFile</span><span style="color: blue">&gt;</span>xsl\modifications.xsl<span style="color: blue">&lt;/</span><span style="color: #a31515">xslFile</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">xslFile</span><span style="color: blue">&gt;</span>xsl\NCoverSummary.xsl<span style="color: blue">&lt;/</span><span style="color: #a31515">xslFile</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">xslFile</span><span style="color: blue">&gt;</span>xsl\fxcop-summary_1_36.xsl<span style="color: blue">&lt;/</span><span style="color: #a31515">xslFile</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">xslFile</span><span style="color: blue">&gt;</span>xsl\unittests.xsl<span style="color: blue">&lt;/</span><span style="color: #a31515">xslFile</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160;&#160; &lt;</span><span style="color: #a31515">xslFile</span><span style="color: blue">&gt;</span>xsl\nant.xsl<span style="color: blue">&lt;/</span><span style="color: #a31515">xslFile</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160; &lt;/</span><span style="color: #a31515">xslFileNames</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160; &lt;/</span><span style="color: #a31515">buildReportBuildPlugin</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160; &lt;</span><span style="color: #a31515">buildLogBuildPlugin</span><span style="color: blue"> /&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160; &lt;</span><span style="color: #a31515">xslReportBuildPlugin</span><span style="color: blue"> </span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160; </span><span style="color: red">description</span><span style="color: blue">=</span>&quot;<span style="color: blue">NCover Report</span>&quot;<span style="color: blue"> </span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160; </span><span style="color: red">actionName</span><span style="color: blue">=</span>&quot;<span style="color: blue">NCoverBuildReport</span>&quot;<span style="color: blue"> </span></p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160; </span><span style="color: red">xslFileName</span><span style="color: blue">=</span>&quot;<span style="color: blue">xsl\NCover.xsl</span>&quot;<span style="color: blue">&gt;&lt;/</span><span style="color: #a31515">xslReportBuildPlugin</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160; &lt;</span><span style="color: #a31515">xslReportBuildPlugin</span><span style="color: blue"> </span><span style="color: red">description</span><span style="color: blue">=</span>&quot;<span style="color: blue">FxCop Report</span>&quot;</p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160; </span><span style="color: red">actionName</span><span style="color: blue">=</span>&quot;<span style="color: blue">FxCopBuildReport</span>&quot;</p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160; </span><span style="color: red">xslFileName</span><span style="color: blue">=</span>&quot;<span style="color: blue">xsl\fxcop-report_1_36.xsl</span>&quot;<span style="color: blue"> /&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&#160; &lt;</span><span style="color: #a31515">xslReportBuildPlugin</span><span style="color: blue"> </span><span style="color: red">description</span><span style="color: blue">=</span>&quot;<span style="color: blue">NUnit Report</span>&quot;</p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160; </span><span style="color: red">actionName</span><span style="color: blue">=</span>&quot;<span style="color: blue">NUnitBuildReport</span>&quot;</p>
<p style="margin: 0px"><span style="color: blue">&#160;&#160;&#160;&#160; </span><span style="color: red">xslFileName</span><span style="color: blue">=</span>&quot;<span style="color: blue">xsl\tests.xsl</span>&quot;<span style="color: blue"> /&gt;</span></p>
<p style="margin: 0px"><span style="color: blue">&lt;/</span><span style="color: #a31515">buildPlugins</span><span style="color: blue">&gt;</span></p>
</p></div>
<p>As you can see we use the nant.xsl to transform the FAKE output to HTML.</p>
<h5>Starting the build</h5>
<p>Now if everything is configured correctly, you can tell CruiseControl.NET to run your build (press “Start” for your build project on the dashboard):</p>
<p><img class="bordered" title="Press Start on the dashboard" alt="Press Start on the dashboard" src="http://www.navision-blog.de/images/IntegratingaFAKEFMakebuildscriptinto.net_7967/image_3.png" width="500" height="106" /> </p>
<p>Now CruiseControl.NET should use SVN to checkout the CalculatorSample sources and run the build. The output on the project page for build 1 should look like this:</p>
<p><a href="http://www.navision-blog.de/images/IntegratingaFAKEFMakebuildscriptinto.net_7967/image_4.png"><img class="bordered" title="Build output" alt="Build output" src="http://www.navision-blog.de/images/IntegratingaFAKEFMakebuildscriptinto.net_7967/image_thumb_3.png" width="500" height="388" /></a> </p>
<p><a href="http://www.navision-blog.de/images/IntegratingaFAKEFMakebuildscriptinto.net_7967/image_5.png"><img class="bordered" title="Build output 2" border="0" alt="Build output 2" src="http://www.navision-blog.de/images/IntegratingaFAKEFMakebuildscriptinto.net_7967/image_thumb_4.png" width="500" height="388" /></a> </p>
<p>You can also inspect the NUnit and FxCop results:</p>
<p>&#160;<a href="http://www.navision-blog.de/images/IntegratingaFAKEFMakebuildscriptinto.net_7967/image_6.png"><img class="bordered" title="NUnit zest results" border="0" alt="NUnit zest results" src="http://www.navision-blog.de/images/IntegratingaFAKEFMakebuildscriptinto.net_7967/image_thumb_5.png" width="500" height="236" /></a> </p>
<p><a href="http://www.navision-blog.de/images/IntegratingaFAKEFMakebuildscriptinto.net_7967/image_7.png"><img class="bordered" title="FxCop results" border="0" alt="FxCop results" src="http://www.navision-blog.de/images/IntegratingaFAKEFMakebuildscriptinto.net_7967/image_thumb_6.png" width="500" height="249" /></a></p>
<p>Please feel free to give feedback if you have any problems with this article.</p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2009/10/14/integrating-a-fake-f-make-build-script-into-cruisecontrol-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integrating a &#8220;FAKE &#8211; F# Make&#8221; build script into TeamCity</title>
		<link>http://www.navision-blog.de/2009/04/15/integrate-a-fake-f-make-build-script-into-teamcity/</link>
		<comments>http://www.navision-blog.de/2009/04/15/integrate-a-fake-f-make-build-script-into-teamcity/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 09:00:12 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[F#]]></category>
		<category><![CDATA[FAKE - F# Make]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Code Quality]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[F-sharp Make]]></category>
		<category><![CDATA[Fake]]></category>
		<category><![CDATA[FxCop]]></category>
		<category><![CDATA[nunit]]></category>
		<category><![CDATA[TeamCity]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2009/04/15/integrate-a-fake-f-make-build-script-into-teamcity/</guid>
		<description><![CDATA[Easy TeamCity integration is one of the major goals for the FAKE build system. “TeamCity is a Java-based build management and continuous integration server from JetBrains, creators of IntelliJ IDEA and ReSharper.” [Wikipedia] In this article I will show you how you can set up a FAKE build script in TeamCity. We will use the [...]]]></description>
			<content:encoded><![CDATA[<p>Easy <a href="http://www.jetbrains.com/teamcity/">TeamCity</a> integration is one of the major goals for the <a href="http://code.google.com/p/fake/">FAKE build system</a>.</p>
<blockquote><p><b>“TeamCity</b> is a <a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29">Java</a>-based <a href="http://en.wikipedia.org/wiki/Software_build">build</a> management and <a href="http://en.wikipedia.org/wiki/Continuous_integration">continuous integration</a> server from <a href="http://en.wikipedia.org/wiki/JetBrains">JetBrains</a>, creators of <a href="http://en.wikipedia.org/wiki/IntelliJ_IDEA">IntelliJ IDEA</a> and <a href="http://en.wikipedia.org/wiki/ReSharper">ReSharper</a>.”</p>
<p align="right">[<a href="http://en.wikipedia.org/wiki/TeamCity">Wikipedia</a>] </p>
</blockquote>
<p>In this article I will show you how you can set up a FAKE build script in TeamCity. We will use the CalculatorSample which you can download from the <a href="http://code.google.com/p/fake/downloads/list">FAKE Download page</a>. If you want to know how this build script works read the <a href="http://www.navision-blog.de/2009/04/01/getting-started-with-fake-a-f-sharp-make-tool/">“Getting started with FAKE”-tutorial</a>.</p>
<h5>Installing TeamCity</h5>
<p>You can download the free professional edition of TeamCity from <a href="http://www.jetbrains.com/teamcity/">http://www.jetbrains.com/teamcity/</a>. After the installation process (<a href="http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-ii-continuous-integration-server/">further instructions</a>) you should be ready to configure your first build:</p>
<p><img style="display: inline" class="bordered" title="Create project on your TeamCity Server" alt="Create project on your TeamCity Server" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_AD6B/image_4.png" width="500" height="350" /></p>
<h5>Creating a FAKE Project</h5>
<p>Now create a new project and add a build configuration:</p>
<p><img class="bordered" title="Create Calculator project" alt="Create Calculator project" src="http://www.navision-blog.de/images/IntegrateaFAKEFMakebuildscriptintoTeamCi_9A95/image.png" width="500" height="188" /></p>
<p><img class="bordered" title="General Settings" alt="General Settings" src="http://www.navision-blog.de/images/IntegrateaFAKEFMakebuildscriptintoTeamCi_9A95/image_3.png" width="500" height="475" /></p>
<h5>Attach a VCS root</h5>
<p>The next step is to attach a VCS root. For this sample we will use the Calculator SVN root at <a href="http://fake.googlecode.com/svn/trunk/Samples/Calculator/">http://fake.googlecode.com/svn/trunk/Samples/Calculator/</a>.</p>
<p>[The only issue with this setting is, that you can’t change the path to the F# compiler. It is fixed to <em>c:\Program Files (x86)\FSharp-1.9.6.2\bin\.</em> If your path is different just reinstall F# to this location or use your own Version Control System.]</p>
<p><img class="bordered" title="VCS root" alt="VCS root" src="http://www.navision-blog.de/images/IntegrateaFAKEFMakebuildscriptintoTeamCi_9A95/image_4.png" width="500" height="430" /></p>
<p><img class="bordered" title="Test connection" alt="Test connection" src="http://www.navision-blog.de/images/IntegrateaFAKEFMakebuildscriptintoTeamCi_9A95/image_5.png" width="500" height="506" /></p>
<h5>Choosing a build runner</h5>
<p>We can use the Command Line build runner to start the completeBuild.fsx build script via Fake.exe. As the build provides NUnit test results we instruct TeamCity to import them:</p>
<p><img class="bordered" title="Choosing build runner" alt="Choosing build runner" src="http://www.navision-blog.de/images/IntegrateaFAKEFMakebuildscriptintoTeamCi_9A95/image_6.png" width="500" height="446" /></p>
<p>If you want you could also add a build trigger to your build script:</p>
<p><img class="bordered" title="Enable triggering when files are checked into VCS" alt="Enable triggering when files are checked into VCS" src="http://www.navision-blog.de/images/IntegrateaFAKEFMakebuildscriptintoTeamCi_9A95/image_7.png" width="500" height="411" /></p>
<h5>Running the build</h5>
<p>Now if everything is configured correctly, you can run your build and the output should look like:</p>
<p><img class="bordered" title="Running first FAKE build script in TeamCity" alt="Running first FAKE build script in TeamCity" src="http://www.navision-blog.de/images/IntegrateaFAKEFMakebuildscriptintoTeamCi_9A95/image_8.png" width="500" height="164" /></p>
<p>You can also inspect the NUnit and FxCop results:</p>
<p><img class="bordered" title="NUnit test results" alt="NUnit test results" src="http://www.navision-blog.de/images/IntegrateaFAKEFMakebuildscriptintoTeamCi_9A95/image_9.png" width="500" height="105" /> </p>
<p><img class="bordered" title="FxCop results" alt="FxCop results" src="http://www.navision-blog.de/images/IntegrateaFAKEFMakebuildscriptintoTeamCi_9A95/image_10.png" width="500" height="223" /></p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2009/04/15/integrate-a-fake-f-make-build-script-into-teamcity/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How I do Continuous Integration with my C# / F# projects &#8211; part IV: Adding a documentation</title>
		<link>http://www.navision-blog.de/2009/01/11/how-i-do-continuous-integration-part-iv-adding-a-documentation/</link>
		<comments>http://www.navision-blog.de/2009/01/11/how-i-do-continuous-integration-part-iv-adding-a-documentation/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 11:46:51 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[English posts]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[GhostDoc]]></category>
		<category><![CDATA[JetBrains]]></category>
		<category><![CDATA[NDoc]]></category>
		<category><![CDATA[Sandcastle]]></category>
		<category><![CDATA[Sandcastle Help File Build]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[TeamCity]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>
		<category><![CDATA[Visual Studio SDK]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2009/01/11/how-i-do-continuous-integration-part-iv-adding-a-documentation/</guid>
		<description><![CDATA[In the last 3 posts I show how to set up a Continuous Integration environment for F# or C# projects with Subversion (part I), TeamCity (part II) and NUnit (part III). This time I want to show how we can set up an automated documentation build. Installing and using GhostDoc “GhostDoc is a free add-in [...]]]></description>
			<content:encoded><![CDATA[<p>In the last 3 posts I show how to set up a Continuous Integration environment for F# or C# projects with Subversion (<a href="http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-i-setting-up-source-control/">part I</a>), TeamCity (<a href="http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-ii-continuous-integration-server/">part II</a>) and NUnit (<a href="http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-3-running-automated-unittests/">part III</a>).</p>
<p>This time I want to show how we can set up an automated documentation build.</p>
<h5>Installing and using GhostDoc</h5>
<blockquote><p>“GhostDoc is a free add-in for Visual Studio that automatically generates XML documentation comments for C#. Either by using existing documentation inherited from base classes or implemented interfaces, or by deducing comments from name and type of e.g. methods, properties or parameters.”</p>
<p align="right">[<a href="http://www.roland-weigelt.de/ghostdoc/">product website</a>]</p>
</blockquote>
<p>GhostDoc is one of my favorite Visual Studio plugins. It allows me to generate comments for nearly all my C# functions. Of course these generated comments aren’t sufficient in every case – but they are a very good start.</p>
<p><em>Unfortunately GhostDoc doesn’t work for F# <img src='http://www.navision-blog.de/blog/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  – the actual version works for C# and the support for VB.Net is called &#8220;experimental&#8221;.</em></p>
<p>Download and install <a title="http://www.roland-weigelt.de/ghostdoc/" href="http://www.roland-weigelt.de/ghostdoc/">http://www.roland-weigelt.de/ghostdoc/</a>.</p>
<p>Now you should be able to generate XML-based comments directly in your C# code:</p>
<p><img class="bordered" style="display: inline" title="Using GhostDoc" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_CE61/image.png" alt="Using GhostDoc" width="500" height="165" /></p>
<p><img class="bordered" style="display: inline" title="Generated XML-comment" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_CE61/image_3.png" alt="Generated XML-comment" width="500" height="194" /></p>
<p>The next step is to activate the xml-documentation in your Visual Studio build settings:</p>
<p><img class="bordered" style="display: inline" title="image" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_CE61/image_4.png" alt="image" width="500" height="206" /></p>
<p>Commiting these changes and adjusting the build artifacts will produce the input for the documentation build:</p>
<p><img class="bordered" style="display: inline" title="Adjust the build artifacts" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_CE61/image_5.png" alt="Adjust the build artifacts" width="500" height="297" /></p>
<p><img class="bordered" style="display: inline" title="Build artifacts" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_CE61/image_6.png" alt="Build artifacts" width="500" height="171" /></p>
<h5>Using Sandcastle to generate a documentation</h5>
<blockquote><p>“Sandcastle produces accurate, MSDN style, comprehensive documentation by reflecting over the source assemblies and optionally integrating XML Documentation Comments. Sandcastle has the following key features:</p>
<ul>
<li>Works with or without authored comments</li>
<li>Supports Generics and .NET Framework 2.0</li>
<li>Sandcastle has 2 main components (MrefBuilder and Build Assembler)</li>
<li>MrefBuilder generates reflection xml file for Build Assembler</li>
<li>Build Assembler includes syntax generation, transformation..etc</li>
<li><strong>Sandcastle is used internally to build .Net Framework documentation</strong>”</li>
</ul>
<p align="right">[<a href="http://www.microsoft.com/downloads/details.aspx?familyid=E82EA71D-DA89-42EE-A715-696E3A4873B2&amp;displaylang=en">Microsoft.com</a>]</p>
</blockquote>
<p>Download and install “Sandcastle &#8211; Documentation Compiler for Managed Class Libraries” from <a href="http://www.microsoft.com/downloads/details.aspx?familyid=E82EA71D-DA89-42EE-A715-696E3A4873B2&amp;displaylang=en">Mircosoft’s downloadpage</a> or <a title="http://www.codeplex.com/Sandcastle" href="http://www.codeplex.com/Sandcastle">http://www.codeplex.com/Sandcastle</a>.</p>
<p>For .chm generation you also have to install the &#8220;<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/hwMicrosoftHTMLHelpDownloads.asp">HTML Help Workshop</a>&#8220;. If you want fancy HTMLHelp 2.x style (like MSDN has) you need “Innovasys HelpStudio Lite” which is part of the <a href="http://www.microsoft.com/downloads/details.aspx?familyid=59EC6EC3-4273-48A3-BA25-DC925A45584D&amp;displaylang=en">Visual Studio 2008 SDK</a>.</p>
<blockquote><p>“HelpStudio Lite is offered with the Visual Studio SDK as an installed component that integrates with Visual Studio. HelpStudio Lite provides a set of authoring tools you use to author and build Help content, create and manage Help projects, and compile Help files that can be integrated with the Visual Studio Help collection.”</p>
<p align="right">[<a href="http://msdn.microsoft.com/en-us/library/bb165613(VS.80).aspx">MSDN</a>]</p>
</blockquote>
<p>Last but not least I recommend to install the <a href="http://www.codeplex.com/SHFB">Sandcastle Help File Builder (SHFB)</a> – this tool gives you a GUI and helps to automate the Sandcastle process.</p>
<blockquote><p>“Sandcastle, created by Microsoft, is a tool used for creating MSDN-style documentation from .NET assemblies and their associated XML comments files. The current version is the May 2008 release. It is command line based and has no GUI front-end, project management features, or an automated build process like those that you can find in NDoc. The <strong>Sandcastle Help File Builder</strong> was created to fill in the gaps, provide the missing NDoc-like features that are used most often, and provide graphical and command line based tools to build a help file in an automated fashion.”</p>
<p align="right">[<a href="http://www.codeplex.com/SHFB">product homepage</a>]</p>
</blockquote>
<p>After the installation process start SHFB to generate a documentation project:</p>
<p><img class="bordered" style="display: inline" title="Sandcastle Help File Builder" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_CE61/image_7.png" alt="Sandcastle Help File Builder" width="500" height="374" /></p>
<p>Add the TestCITestLib.dll to your project and add nunit.framework.dll as a dependency. Now try to compile your help project – if everything is fine the output should look something like this:</p>
<p><img class="bordered" style="display: inline" title="Generated Help" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_CE61/image_8.png" alt="Generated Help" width="500" height="193" /></p>
<h5>Setting up the documentation build</h5>
<p>One of the main principles of Continuous Integration is “<a href="http://martinfowler.com/articles/continuousIntegration.html#KeepTheBuildFast">Keep the Build Fast</a>” – so I am working with staged builds here. The documentation build should only be started if the first build was successful and all UnitTests are positive. <em>For most projects it is enough to generate the documentation daily or even weekly.</em></p>
<p>First of all we have to create a simple MSBuild file which executes the SHFB project:</p>
<pre class="code"><span style="color: blue;">&lt;</span><span style="color: #a31515;">Project </span><span style="color: red;">ToolsVersion</span><span style="color: blue;">=</span>"<span style="color: blue;">3.5</span>" <span style="color: red;">xmlns</span><span style="color: blue;">=</span>"<span style="color: blue;"><a href="http://schemas.microsoft.com/developer/msbuild/2003">http://schemas.microsoft.com/developer/msbuild/2003</a></span><a href="http://schemas.microsoft.com/developer/msbuild/2003">"<span style="color: blue;">&gt;
</span></a>  &lt;!-- <span style="color: green;">3rd Party Program Settings </span><span style="color: blue;">--&gt;
  &lt;</span><span style="color: #a31515;">PropertyGroup</span><span style="color: blue;">&gt;
    &lt;</span><span style="color: #a31515;">SandCastleHFBPath</span><span style="color: blue;">&gt;</span>c:\Program Files (x86)\EWSoftware\Sandcastle Help File Builder\<span style="color: blue;">&lt;/</span><span style="color: #a31515;">SandCastleHFBPath</span><span style="color: blue;">&gt;
    &lt;</span><span style="color: #a31515;">SandCastleHFBCmd</span><span style="color: blue;">&gt;</span>$(SandCastleHFBPath)SandcastleBuilderConsole.exe<span style="color: blue;">&lt;/</span><span style="color: #a31515;">SandCastleHFBCmd</span><span style="color: blue;">&gt;
    &lt;</span><span style="color: #a31515;">SandCastleHFBProject</span><span style="color: blue;">&gt;</span>HelpProject.shfb<span style="color: blue;">&lt;/</span><span style="color: #a31515;">SandCastleHFBProject</span><span style="color: blue;">&gt;
  &lt;/</span><span style="color: #a31515;">PropertyGroup</span><span style="color: blue;">&gt;

  &lt;</span><span style="color: #a31515;">Target </span><span style="color: red;">Name</span><span style="color: blue;">=</span>"<span style="color: blue;">BuildDocumentation</span>"<span style="color: blue;">&gt;
    &lt;!-- </span><span style="color: green;">Build source code docs </span><span style="color: blue;">--&gt;
    &lt;</span><span style="color: #a31515;">Exec </span><span style="color: red;">Command</span><span style="color: blue;">=</span>"<span style="color: blue;">%22$(SandCastleHFBCmd)%22 %22$(SandCastleHFBProject)%22</span>" <span style="color: blue;">/&gt;
  &lt;/</span><span style="color: #a31515;">Target</span><span style="color: blue;">&gt;
&lt;/</span><span style="color: #a31515;">Project</span><span style="color: blue;">&gt;</span></pre>
<p>Add this build file and the SHFB project to your Visual Studio solution folder and commit these changes.</p>
<p><img class="bordered" style="display: inline" title="Put the build settings into the solution folder" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_CE61/image_9.png" alt="Put the build settings into the solution folder" width="240" height="328" /></p>
<p>Now we can create a new TeamCity build configuration:</p>
<p><img class="bordered" style="display: inline" title="Create a new build configuration" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_CE61/image_10.png" alt="Create a new build configuration" width="500" height="425" /></p>
<p>Take the same Version Control Settings like in the first build but use MSBuild as the build runner:</p>
<p><img class="bordered" style="display: inline" title="Take the MSBuild runner" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_CE61/image_11.png" alt="Take the MSBuild runner" width="500" height="392" /></p>
<p>We want the documentation to be generated after a successful main build so we add a “dependency build trigger”:</p>
<p><img class="bordered" style="display: inline" title="image" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_CE61/image_12.png" alt="image" width="500" height="217" /></p>
<p>Now we need the artifacts from the main build as the input for our documentation build:</p>
<p><img class="bordered" style="display: inline" title="Set up artifacts dependencies" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_CE61/image_13.png" alt="Set up artifacts dependencies" width="500" height="326" /></p>
<p>Be sure you copy the artifacts to the right directory as given in your .shfb-project. Now run the DocumentationBuild – if everything is fine the DocumentationBuild should give you the Documentation.chm as a new artifact:</p>
<p><img class="bordered" style="display: inline" title="image" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_CE61/image_14.png" alt="image" width="500" height="110" /></p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2009/01/11/how-i-do-continuous-integration-part-iv-adding-a-documentation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How I do Continuous Integration with my C# / F# projects &#8211; part III: Running automated UnitTests</title>
		<link>http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-3-running-automated-unittests/</link>
		<comments>http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-3-running-automated-unittests/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 18:13:36 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[English posts]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[JetBrains]]></category>
		<category><![CDATA[MSTest]]></category>
		<category><![CDATA[nunit]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[TeamCity]]></category>
		<category><![CDATA[UnitTest]]></category>
		<category><![CDATA[UnitTesting]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-3-running-automated-unittests/</guid>
		<description><![CDATA[In the last two posts I showed how to set up a Subversion (part I: Setting up Source Control) and a TeamCity server (part II: Setting up a Continuous Integration Server). This time I will show how we can integrate NUnit to run automated test at each build. TeamCity supports all major Testing Frameworks (including [...]]]></description>
			<content:encoded><![CDATA[<p>In the last two posts I showed how to set up a Subversion (<a href="http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-i-setting-up-source-control/">part I: Setting up Source Control</a>) and a TeamCity server (<a href="http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-ii-continuous-integration-server/">part II: Setting up a Continuous Integration Server</a>). </p>
<p>This time I will show how we can integrate <a href="http://www.nunit.org/index.php">NUnit</a> to run automated test at each build. <em>TeamCity supports all major Testing Frameworks (including MS Test) but I will concentrate on NUnit here.</em></p>
<blockquote><p>&quot;NUnit is a unit-testing framework for all .Net languages. Initially ported from <a href="http://www.junit.org">JUnit</a>, the current production release, version 2.4, is the fifth major release of this xUnit based unit testing tool for Microsoft .NET. It is written entirely in C# and has been completely redesigned to take advantage of many .NET language features, for example custom attributes and other reflection related capabilities. NUnit brings xUnit to all .NET languages.&quot;</p>
<p align="right">[<a href="http://www.nunit.org">product homepage</a>] </p>
</blockquote>
<h5>Creating a TestProject</h5>
<p>First of all download and install NUnit 2.4.8 (or higher) from <a title="http://www.nunit.org/index.php" href="http://www.nunit.org/.">http://www.nunit.org/.</a></p>
<p>Now we add a small function to our F# source code:</p>
<pre class="code"><span style="color: blue">let rec </span>factorial = <span style="color: blue">function
  </span>| 0 <span style="color: blue">-&gt; </span>1
  | n <span style="color: blue">when </span>n &gt; 0 <span style="color: blue">-&gt; </span>n * factorial (n-1)
  | _ <span style="color: blue">-&gt; </span>invalid_arg <span style="color: maroon">&quot;Argument not valid&quot;</span></pre>
<p>This is the function we want to test. We add a new C# class library to our solution (e.g. “TestCITestLib” <img src='http://www.navision-blog.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ) and add a reference to <em>nunit.framework</em>. Inside this new TestLibrary we add a TestClass with the following code:</p>
<pre class="code"><span style="color: blue">namespace </span>TestCITestLib
{
    <span style="color: blue">using </span>NUnit.Framework;

    [<span style="color: #2b91af">TestFixture</span>]
    <span style="color: blue">public class </span><span style="color: #2b91af">FactorialTest
    </span>{
        [<span style="color: #2b91af">Test</span>]
        <span style="color: blue">public void </span>TestFactorial()
        {
            <span style="color: #2b91af">Assert</span>.AreEqual(1, <span style="color: #2b91af">Program</span>.factorial(0));
            <span style="color: #2b91af">Assert</span>.AreEqual(1, <span style="color: #2b91af">Program</span>.factorial(1));
            <span style="color: #2b91af">Assert</span>.AreEqual(120, <span style="color: #2b91af">Program</span>.factorial(5));
        }

        [<span style="color: #2b91af">Test</span>]
        <span style="color: blue">public void </span>TestFactorialException()
        {
            <span style="color: #2b91af">Program</span>.factorial(-1);
        }
    }
}</pre>
<p>To ensure the build runner is able to compile our solution we put the nunit.framework.dll near to our TestProject and commit our changes.</p>
<p><img class="bordered" title="Adding Nunit.framework.dll" style="display: inline" height="513" alt="Adding Nunit.framework.dll" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_F40E/image.png" width="500" /></p>
<h5>Configure TeamCity for UnitTesting</h5>
<p>The next step is to tell TeamCity that the build runner should run our UnitTests:</p>
<p><img class="bordered" title="Configure build runner for NUnit" style="display: inline" height="450" alt="Configure build runner for NUnit" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_F40E/image_3.png" width="500" /></p>
<p>If we now run the build we should get the following error:</p>
<p><img class="bordered" title="UnitTest error during automated build" style="display: inline" height="188" alt="UnitTest error during automated build" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_F40E/image_4.png" width="500" /></p>
<p>Our second test function failed, because we didn’t expect the <em>System.ArgumentException</em>. We can fix this issue by adding the corresponding attribute to the Testfunction:</p>
<pre class="code">[<span style="color: #2b91af">Test</span>,
 <span style="color: #2b91af">ExpectedException</span>(<span style="color: blue">typeof</span>(System.<span style="color: #2b91af">ArgumentException</span>))]
<span style="color: blue">public void </span>TestFactorialException()
{
    <span style="color: #2b91af">Program</span>.factorial(-1);
}0</pre>
<p><img class="bordered" title="Tests passed" style="display: inline" height="75" alt="Tests passed" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_F40E/image_5.png" width="500" /></p>
<h5>Configure the build output</h5>
<p>At this point we have a minimalistic Continuous Integration infrastructure. Every time someone performs a Commit on our repository a automated build will be started and the sources will be tested against the given UnitTests. Now we should concentrate on getting our build output – the artifacts. The term artifact is usually used to refer to files or directories produced during a build. Examples of such artifacts are:</p>
<ul>
<li>Binaries (*.exe, *.dll) </li>
<li>Software packages and installers (*.zip, *.msi) </li>
<li>Documentation files (e.g. help files) </li>
<li>Reports (test reports, coverage reports, …) </li>
</ul>
<p>At this time we are only interested in the binaries (this means CITestLib.dll). We can add the following artifact definition to our TeamCity project:</p>
<p><img class="bordered" title="Configure artifacts in TeamCity" style="display: inline" height="293" alt="Configure artifacts in TeamCity" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_F40E/image_6.png" width="500" /></p>
<p>If we now rebuild our solution the build runner collects the configured artifacts and stores them with all build information:</p>
<p><img class="bordered" title="Collected artifacts" style="display: inline" height="329" alt="Collected artifacts" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_F40E/image_7.png" width="500" /></p>
<p>Next time I will show how we can add more artifacts – e.g. an automated documentation.</p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-3-running-automated-unittests/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How I do Continuous Integration with my C# / F# projects &#8211; part II: Setting up a Continuous Integration Server</title>
		<link>http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-ii-continuous-integration-server/</link>
		<comments>http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-ii-continuous-integration-server/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 13:50:42 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[English posts]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[JetBrains]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[TeamCity]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-with-my-c-sharp-or-f-sharp-projects-part-ii-continuous-integration-server/</guid>
		<description><![CDATA[In the last post I showed how easy it is to install Subversion and how it can be integrated into Visual Studio 2008 via AnkhSVN. This time we will set up a Continuous Integration server and configure a build runner. As a Continuous Integration Server I recommend JetBrains TeamCity. You can download the free professional [...]]]></description>
			<content:encoded><![CDATA[<p>In the <a href="http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-i-setting-up-source-control/">last post</a> I showed how easy it is to install Subversion and how it can be integrated into Visual Studio 2008 via AnkhSVN. This time we will set up a Continuous Integration server and configure a build runner.</p>
<p>As a Continuous Integration Server I recommend JetBrains TeamCity. You can download the free professional edition at <a title="http://www.jetbrains.com/teamcity/" href="http://www.jetbrains.com/teamcity/">http://www.jetbrains.com/teamcity/</a>.</p>
<h5>Installing TeamCity</h5>
<p>During the installation process TeamCity wants to get a port number. Be sure that there will be no conflict with other web applications on your server. I chose port 8085 – and my first build agent got this default settings:</p>
<p><img class="bordered" title="Configure a Build Agent" style="display: inline" height="371" alt="Configure a Build Agent" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_AD6B/image.png" width="500" /> </p>
<p>In the next step you have to sign the License Agreement and to create an administrator account:</p>
<p><img class="bordered" title="Set up administrator account" style="display: inline" height="204" alt="Set up administrator account" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_AD6B/image_3.png" width="350" /> </p>
<h5>Creating a Project</h5>
<p>Now you can create your project and set up the build configuration:</p>
<p><img class="bordered" title="Create project on your TeamCity Server" style="display: inline" height="350" alt="Create project on your TeamCity Server" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_AD6B/image_4.png" width="500" /> </p>
<p><img class="bordered" title="Create CITest project " style="display: inline" height="208" alt="Create CITest project " src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_AD6B/image_5.png" width="500" /> </p>
</p>
<p><img class="bordered" title="Create Build Configuration" height="467" alt="Create Build Configuration" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_AD6B/image_6.png" width="500" border="0" /> </p>
<p><img class="bordered" title="Set up version control root" style="display: inline; margin-left: 0px; margin-right: 0px" height="381" alt="Set up version control root" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_AD6B/image_7.png" width="500" /> </p>
<h5>Setting up a build runner</h5>
<p>For setting up specific build runners see the <a href="http://www.jetbrains.com/teamcity/documentation/index.html">TeamCity documentation</a>. For now I will use the “sln2008”-Build runner (the Runner for Microsoft Visual Studio 2008 solution files).</p>
<p><img class="bordered" title="Runner for Microsoft Visual Studio 2008 solution files" style="display: inline" height="260" alt="Runner for Microsoft Visual Studio 2008 solution files" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_AD6B/image_8.png" width="500" /> </p>
<p>Now add a build trigger. Whenever someone performs a Commit on the Subversion repository the server has to start a build.</p>
<p><img class="bordered" title="Build trigger" style="display: inline" height="190" alt="Build trigger" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_AD6B/image_9.png" width="500" /></p>
<h5>Testing the build runner</h5>
<p>After this step we have two options to start a build. The first one is by clicking the “Run”-button on the project website and the second is doing a checkin:</p>
<p><img class="bordered" title="Triggering the build running with a checkin" style="display: inline" height="392" alt="Triggering the build running with a checkin" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_AD6B/image_10.png" width="500" /> </p>
<p>After performing the Commit the pending build appears on the project website:</p>
<p><img class="bordered" title="Pending build" style="display: inline" height="246" alt="Pending build" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_AD6B/image_11.png" width="500" />&#160; </p>
<p>After 60 seconds (see my configuration above) the build is starting. After the build is complete one can see the results in different ways. The simplest is via the project website:</p>
<p><img class="bordered" title="View build results" style="display: inline" height="229" alt="View build results" src="http://www.navision-blog.de/images/HowIdoContinuousIntegrationwithmyCFproje_AD6B/image_12.png" width="500" /> </p>
</p>
<p>Of cause TeamCity gives you a lot of different notification and monitoring possibilities including mail, RSS feeds or System Tray Notifications.</p>
<p><a href="http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-3-running-automated-unittests/">Next time</a> I will show how we can integrate UnitTesting in our automated build scenario.</p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-ii-continuous-integration-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How I do Continuous Integration with my C# / F# projects &#8211; part I: Setting up Source Control</title>
		<link>http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-i-setting-up-source-control/</link>
		<comments>http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-i-setting-up-source-control/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 13:31:40 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[English posts]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[AnkhSVN]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Source Control]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>
		<category><![CDATA[VisualSVN]]></category>
		<category><![CDATA[WinMerge]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-with-my-c-sharp-or-f-sharp-projects-part-i-setting-up-source-control/</guid>
		<description><![CDATA[In this post series I will show how one can easily set up a Continuous Integration scenario for F# or C# projects with completely free products. “Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily &#8211; leading to multiple integrations per [...]]]></description>
			<content:encoded><![CDATA[<p>In this post series I will show how one can easily set up a <a href="http://martinfowler.com/articles/continuousIntegration.html">Continuous Integration</a> scenario for F# or C# projects with completely free products.</p>
<blockquote><p>“Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily &#8211; leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible.”</p>
<p align="right">[<a href="http://martinfowler.com/articles/continuousIntegration.html">Martin Fowler</a>]</p>
</blockquote>
<p>The first step for Continuous Integration is to set up a <a href="http://en.wikipedia.org/wiki/Revision_control">Source Control</a> environment. For many good reasons I choose Subversion &#8211; some of them are:</p>
<ul>
<li>Atomic commits</li>
<li>Rename/Move/Copy actions preserve the revision history</li>
<li>Directories are versioned</li>
<li>Multiple repository access protocols including HTTP and HTTPS</li>
<li>There is a nice Visual Studio integration (see below)</li>
<li>Last but not least: it is completely free <img src='http://www.navision-blog.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ul>
<h5>Source code version control with Subversion</h5>
<p>All you need for setting up a complete Subversion environment is to download and install VisualSVN Server from <a title="http://www.visualsvn.com/" href="http://www.visualsvn.com/">http://www.visualsvn.com/</a>.</p>
<blockquote><p>“VisualSVN Server is a package that contains everything you need to install, configure and manage <strong>Subversion server</strong> for your team on <strong>Windows platform.</strong> It includes Subversion, Apache and a management console.”</p>
<p align="right">[<a href="http://www.visualsvn.com/server/">product homepage</a>]</p>
</blockquote>
<p>Now you can create user accounts and a repository ”CITest” in the VisualSVN Server management console.</p>
<p><img class="bordered" style="display: inline" title="Create a repository" src="http://www.navision-blog.de/images/ContinuousIntegration_8D99/image.png" alt="Create a repository" width="404" height="220" /></p>
<p><img class="bordered" style="display: inline" title="VisualSVN Server management console" src="http://www.navision-blog.de/images/ContinuousIntegration_8D99/image_3.png" alt="VisualSVN Server management console" width="500" height="340" /></p>
<h5>Subversion integration in Visual Studio 2008</h5>
<p>Download and install AnkhSVN 2.0.x from <a title="http://ankhsvn.open.collab.net/" href="http://ankhsvn.open.collab.net/">http://ankhsvn.open.collab.net/</a>.</p>
<blockquote><p>“AnkhSVN is a Subversion SourceControl Provider for Visual Studio. The software allows you to perform the most common version control operations directly from inside the Microsoft Visual Studio IDE. With AnkhSVN you no longer need to leave your IDE to perform tasks like viewing the status of your source code, updating your Subversion working copy and committing changes. You can even browse your repository and you can plug-in your favorite diff tool.”</p>
<p align="right">[<a href="http://ankhsvn.open.collab.net/">product homepage</a>]</p>
</blockquote>
<p>Now you can add your C#/F#-solution to your CITest-repository:</p>
<ul>
<li>Open the solution in Visual Studio 2008</li>
<li>Open “View/Repository Explorer” and add your repository to AnkhSVN
<ul>
<li>You can copy the URL from the VisualSVN Server management console (In my case this is <a title="https://omega:8443/svn/CITest/" href="https://omega:8443/svn/CITest/">https://omega:8443/svn/CITest/</a>)</li>
<li>You also have to give AnkhSVN your Subversion login</li>
</ul>
</li>
<li>Now click the right mouse button on your solution in the Solution Explorer and choose “Add Solution to Subversion”</li>
</ul>
<p><img class="bordered" style="display: inline" title="Add Solution to Subversion" src="http://www.navision-blog.de/images/ContinuousIntegration_8D99/image_4.png" alt="Add Solution to Subversion" width="342" height="368" /></p>
<p><img class="bordered" style="display: inline" title="Don't forget to specify a Log Message" src="http://www.navision-blog.de/images/ContinuousIntegration_8D99/image_5.png" alt="Don't forget to specify a Log Message" width="342" height="203" /></p>
<p>Now we can modify our solution and commit our changes via “Commit solution changes” in the Solution Explorer:</p>
<p><img class="bordered" style="display: inline" title="Commit Solution Changes" src="http://www.navision-blog.de/images/ContinuousIntegration_8D99/image_6.png" alt="Commit Solution Changes" width="500" height="390" /></p>
<p>We can easily control our changes via AnkhSVN’s “Repository Explorer” and “History Viewer” in Visual Studio 2008:</p>
<p><a href="http://www.navision-blog.de/images/ContinuousIntegration_8D99/image_7.png"><img class="bordered" style="display: inline" title="Repository Explorer and History Viewer" src="http://www.navision-blog.de/images/ContinuousIntegration_8D99/image_thumb.png" alt="Repository Explorer and History Viewer" width="500" height="283" /></a></p>
<p>If we do any changes in the Program.fs file, we can see a diff via the “Show changes” functionality:</p>
<p><img class="bordered" style="display: inline" title="Diff with AnkhSVN" src="http://www.navision-blog.de/images/ContinuousIntegration_8D99/image_8.png" alt="Diff with AnkhSVN" width="500" height="246" /></p>
<p>If you don’t like the default Diff tool you might try <a href="http://winmerge.org/">WinMerge</a>.</p>
<p><a href="http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-ii-continuous-integration-server/">Next time</a> I will show how to set up a Continuous Integration server.</p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2009/01/08/how-i-do-continuous-integration-part-i-setting-up-source-control/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
