Just setup CruiseControl.NET (CC.NET) on a fresh install of Windows 2003 server. It went pretty seamless.
For now, we are only doing continuous integration, but very soon we are going to set it up for NUnit and FxCop too. If you plan on using it, here are the steps I followed. Note that we are using Subversion for our source control and that the box had nothing on it.
1. Download and install Subversion (http://subversion.tigris.org/project_packages.html).2. Create a working directory and get latest from trunk.3. Download CC.NET (http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET).4. Download CC.NET Tray (http://confluence.public.thoughtworks.org/display/CCNET/CCTray).5. Install CC.NET.6. Modify CC.NET Server configuration file to monitor your source control working directory and to call MSBuild.7. Modify CC.NET web dashboard configuration file to show MSBuild output.
CC.NET can provide build updates via email notification or to a utility that you can install on your desktop (CCTray). We decided to go this route rather than have CC.NET email us. The cool thing about the tray utility is that it sits in your system tray and the icon will change when a build starts and the result of the build.
If you have never used CC.NET or the Java version, note that CC.NET has a server application that can be run as an NT Service (named CruiseControl.NET Server). You can configure the service to start automatically via the service control MMC. CC.NET also has a web dashboard that is used to view build outputs. The dashboard application gets installed under Program Files\CruiseControl.NET\webdashboard\. If you use configure CC.NET to call MSBuild, then you'll want to also add an entry to the dashboard.config file to include a link to the MSBuild output.
Most of the setup of CC.NET was easy, the only problem I had was that I working off of an old configuration file and that one was not configured for MSBuild. Here is the server configuration file (ccnet.config), followed by the dashboard config file.
<!-- ************************************************* --><cruisecontrol> <project name="YourAppName"> <!-- after a change is detected, wait 10 mins and then kick off the build--> <schedule type="schedule" sleepSeconds="600" /> <!--set the sourcecontrol type to subversion and point to the subversion exe--> <sourcecontrol type="svn"> <executable>C:\Program Files\Subversion\bin\svn.exe</executable> <workingDirectory>D:\CruiseControl\yourapp\build\checkout</workingDirectory> <trunkUrl>svn://servername/Projects/yourapp/trunk/Source</trunkUrl> <autoGetSource>true</autoGetSource> <username>sayed</username> <password>password</password> </sourcecontrol> <tasks> <!-- Configure MSBuild to compile the updated files --> <msbuild> <executable>C:\WINNT\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable> <workingDirectory>D:\CruiseControl\YOURAPP\build\checkout\Solutions\YourSolution</workingDirectory> <projectFile>YourSolutionFileName.sln</projectFile> <buildArgs>/noconsolelogger /p:Configuration=Debug</buildArgs> <targets></targets> <timeout>15</timeout> <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,ThoughtWorks.CruiseControl.MsBuild.dll</logger> </msbuild> </tasks> <!--Publishers will be done after the build has completed--> <publishers> <xmllogger> <logDir>d:\cruisecontrol\yourapp\logs</logDir> </xmllogger> <email from="alerts@sayedhashimi.com" mailhost="yoursmtp.yourcompany.com" includeDetails="TRUE"> <projectUrl>http://yourservername/ccnet</projectUrl> <users> <user name="Sayed" group="developers" address="sayed@sayedhashimi.com"/> </users> <groups> <group name="developers" notification="always"> </groups> </email> </publishers> <modificationDelaySeconds>10</modificationDelaySeconds> </project>
</cruisecontrol><!-- ************************************************* -->
Here is the dashboard.config file I am using:
<!-- ************************************************* --><?xml version="1.0" encoding="utf-8" ?> <dashboard> <remoteServices> <servers> <!-- Update this list to include all the servers you want to connect to. NB - each server name must be unique --> <server name="local" url="tcp://localhost:21234/CruiseManager.rem" /> </servers> </remoteServices> <plugins> <farmPlugins> <farmReportFarmPlugin /> <cctrayDownloadPlugin /> </farmPlugins> <serverPlugins> <serverReportServerPlugin /> <serverLogServerPlugin /> <serverInformationServerPlugin /> </serverPlugins> <projectPlugins> <projectReportProjectPlugin /> <latestBuildReportProjectPlugin /> <viewAllBuildsProjectPlugin /> </projectPlugins> <buildPlugins> <buildReportBuildPlugin> <xslFileNames> <xslFile>xsl\header.xsl</xslFile> <xslFile>xsl\modifications.xsl</xslFile> <xslFile>xsl\compile.xsl</xslFile> <xslFile>xsl\unittests.xsl</xslFile> <xslFile>xsl\MsTestSummary.xsl</xslFile> <xslFile>xsl\fxcop-summary.xsl</xslFile> <xslFile>xsl\NCoverSummary.xsl</xslFile> <xslFile>xsl\SimianSummary.xsl</xslFile> </xslFileNames> </buildReportBuildPlugin> <buildLogBuildPlugin /> <xslReportBuildPlugin description="MSBuild Output" actionName="MSBuildOutputBuildPlugin" xslFileName="xsl\msbuild.xsl" /> <xslReportBuildPlugin description="NUnit Details" actionName="NUnitDetailsBuildReport" xslFileName="xsl\tests.xsl" /> <xslReportBuildPlugin description="NUnit Timings" actionName="NUnitTimingsBuildReport" xslFileName="xsl\timing.xsl" /> <xslReportBuildPlugin description="FxCop Report" actionName="FxCopBuildReport" xslFileName="xsl\FxCopReport.xsl" /> <!-- <xslReportBuildPlugin description="NAnt Output" actionName="NAntOutputBuildReport" xslFileName="xsl\Nant.xsl" /> <xslReportBuildPlugin description="NAnt Timings" actionName="NAntTimingsBuildReport" xslFileName="xsl\NantTiming.xsl" /> <xslReportBuildPlugin description="NCover Report" actionName="NCoverBuildReport" xslFileName="xsl\NCover.xsl" /> <xslReportBuildPlugin description="Simian Report" actionName="SimianBuildReport" xslFileName="xsl\SimianReport.xsl"/> --> <!-- This is an example of using Project-specific build plugins <xslReportBuildPlugin description="My Report" actionName="MyReport" xslFileName="xsl\MyReport.xsl"> <includedProjects> <projectName>My Project</projectName> </includedProjects> </xslReportBuildPlugin> <xslReportBuildPlugin description="My Other Report" actionName="MyOtherReport" xslFileName="xsl\MyOtherReport.xsl"> <excludedProjects> <projectName>My Project</projectName> </excludedProjects> </xslReportBuildPlugin> --> </buildPlugins> </plugins></dashboard><!-- ************************************************* -->