Microsoft .NET - Tips and Tricks



Tuesday, March 20, 2007
Configuring CruiseControl .Net to work with multiple Subversion repositories
What is this article about?

CruiseControl.NET (CCNet) is an Automated Continuous Integration server, implemented using the Microsoft .NET Framework. This article will not explain what continuous integration is and how CruiseControl .Net works and will assume that readers already have a basic knowledge of the system. In this article I’ll write about how CruiseControl .Net should be configured in order to work with Subversion when more subversion providers should be used.

Prerequisites

Next list shows the software that should be installed on machine running CruiseControl .Net server:
     1. FxCop version 1.35 should be installed on machine.
     2. NUnit version 2.2.8 or later should be installed on machine.
     3. NCover and NCoverExplorer should be installed on machine.
     4. SVN (svn-win32-1.4.3) should be installed on machine and access to Subversion from that machine must be enabled

Configuring CruiseControl .Net

This example will show you how to configure CCNet for solution consisting of projects hosted on different repositories.

The first thing you should do is to create a msbuild configuration and file structure on local file system that will hold the temporary files and results of build.

After you have all the folders and files ready (msbuild, fxcop, ndpend, etc) you should edit your ccnet.config file and follow next steps:
1. Under <cruisecontrol> section add new <project> section like this:
     <cruisecontrol>
          <project name="PrjName" workingdirectory="C:\CCNet\PrjName\">
          </project>
     </cruisecontrol>

2. Replace PrjName with the name of your project and set the correct path to the folder where your configuration files are located.

3. Under <project> tag add a sourcecontrol tag with attribute type set to multi:
     <sourcecontrol type="multi">
     </sourcecontrol>

4. Now add a sourceControls tag with autoGetSource attribute set to true:
     <sourcecontrols autogetsource="true">
     </sourcecontrols>

5. For each of the projects located on different subversions add a new svn section like this:
     <svn>
          <executable>c:\program files\svn-win32-1.4.3\bin\svn.exe</executable>
          <trunkurl>svn://server/trunk/folder1/prj1/</trunkurl>
          <tagonsuccess>false</tagonsuccess>
          <username>username</username>
          <password>password</password>
          <workingdirectory>C:\CCNet\PrjName\Code\folder1\prj1</workingdirectory>
          <autogetsource>true</autogetsource>
     </svn>

6. Set “trunkUrl”, “username”, “password” and “workingDirectory” parameters to right values.

7. Add <tasks>, <publishers> and <triggers> sections to your ccnet.config file and save the file.


The whole configuration file should now look like this:

<cruisecontrol>
  <project name="PrjName" workingdirectory="C:\CCNet\PrjName\">
    <sourcecontrol type="multi">
      <sourcecontrols autogetsource="true">
        <svn>
          <executable>c:\program files\svn-win32-1.4.3\bin\svn.exe</executable>
          <trunkurl>svn://server/trunk/folder1/prj1/</trunkurl>
          <tagonsuccess>false</tagonsuccess>
          <username>username</username>
          <password>password</password>
          <workingdirectory>C:\CCNet\PrjName\Code\folder1\prj1\</workingdirectory>
          <autogetsource>true</autogetsource>
        </svn>
        <svn>
          <executable>c:\program files\svn-win32-1.4.3\bin\svn.exe</executable>
          <trunkurl>svn://server/trunk/folder1/prj1/</trunkurl>
          <tagonsuccess>false</tagonsuccess>
          <username>username</username>
          <password>password</password>
          <workingdirectory>C:\CCNet\PrjName\Code\folder1\prj1\</workingdirectory>
          <autogetsource>true</autogetsource>
        </svn>
        <svn>
          <executable>c:\program files\svn-win32-1.4.3\bin\svn.exe</executable>
          <trunkurl>svn://server/trunk/folder1/prj1/</trunkurl>
          <tagonsuccess>false</tagonsuccess>
          <username>username</username>
          <password>password</password>
          <workingdirectory>C:\CCNet\PrjName\Code\folder1\prj1\</workingdirectory>
          <autogetsource>true</autogetsource>
        </svn>
        <svn>
          <executable>c:\program files\svn-win32-1.4.3\bin\svn.exe</executable>
          <trunkurl>svn://server/trunk/folder1/prj1/</trunkurl>
          <tagonsuccess>false</tagonsuccess>
          <username>username</username>
          <password>password</password>
          <workingdirectory>C:\CCNet\PrjName\Code\folder1\prj1\</workingdirectory>
          <autogetsource>true</autogetsource>
        </svn>
      </sourcecontrols>
    </sourcecontrol>
    <tasks>
      <msbuild>
        <executable>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>
        <projectfile>PrjName.msbuild</projectfile>
        <buildargs>/noconsolelogger /p:Configuration=Debug</buildargs>
        <targets>BuildAll</targets>
        <timeout>400</timeout>
        <logger>C:\Program Files\CruiseControl.NET\webdashboard\bin\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
      </msbuild>
    </tasks>
    <publishers>
      <merge>
        <files>
          <file>nunit-results.xml</file>
          <file>Coverage.xml</file>
          <file>CoverageReport.xsl</file>
          <file>PrjName.FxCop.xml</file>
          <file>NDependOut\ApplicationMetrics.xml</file>
          <file>NDependOut\AssembliesBuildOrder.xml</file>
          <file>NDependOut\AssembliesDependencies.xml</file>
          <file>NDependOut\AssembliesMetrics.xml</file>
          <file>NDependOut\InfoWarnings.xml</file>
          <file>NDependOut\NDependMain.xml</file>
          <file>NDependOut\TypesDependencies.xml</file>
          <file>NDependOut\TypesMetrics.xml</file>
        </files>
      </merge>
      <xmllogger>
      </publishers>
    <triggers>
      <!-- Check for modifications each 30 minutes -->
      <intervaltrigger seconds="1800" buildcondition="IfModificationExists">
      </triggers>
  </project>
</cruisecontrol>

For all the problems you might have check the ccnet.log file in CCNet\server folder.

posted by Popovic Sasa
 

2 Comments:

At 3/22/2007, Blogger exortech said...
two comments:
i) autogetsource="true" doesn't belong on the sourcecontrols element. also, as of ccnet 1.2, it is the default value for all sourcecontrols so you don't need to specify it at all.
ii) there is an open issue with using multiple svn blocks in the same project:
http://jira.public.thoughtworks.org/browse/CCNET-785   At 3/23/2007, Blogger Popovic Sasa said...
Hello exortech,

Thank you for your comments. Here are my comments to your comments:

i) I read that autogetsource is set to "true" by default but my files were just not retrieved from Subversion before I add "autogetsource" element and autogetsource attribute to sourcecontrols element.
ii) I don't see how that issue relates to multiple svn blocks? It is about VSS.  
Post a Comment
+ Blog Home
 

Links

Get the Levi9 RSS Feed
Levi9 Global Sourcing

Previous Posts

Sharing cookies between sub-domains

Archives

February 2007
March 2007
April 2007
January 2008
February 2008

Powered by Blogger
Levi9 Global Sourcing | Jan van Goyenkade 8 | 1075 HP Amsterdam | The Netherlands | +31(0)72 58 210 55 | info@levi9.com
Copyright © Levi 9 | Design by A36