<?xml version="1.0"?>
<rss version="2.0">
<channel>
  <title>Something Pithy - cm tag</title>
  <link>http://donie.homeip.net:8080/pebble/Steve/tags/cm/</link>
  <description>my geekness knows no bounds</description>
  <language>en</language>
  <copyright>Steve Donie</copyright>
  <lastBuildDate>Thu, 08 May 2008 15:10:56 GMT</lastBuildDate>
  <generator>Pebble (http://pebble.sourceforge.net)</generator>
  <docs>http://backend.userland.com/rss</docs>
  
  
  <item>
    <title>even more FitNesse GoodNesse</title>
    <link>http://donie.homeip.net:8080/pebble/Steve/2006/04/13/1144982429113.html</link>
    
      
        <description>
          &lt;p class=&#034;paragraph&#034;/&gt;We ran into a little hitch not too long ago with our fitnesse tests. We 
are now up to 4 different suites of fitnesse tests, one for each of 4 different 
solutions. The solution have dependencies among themsleves. We had been doing 
work on one solution, doing our TDD red-green-refactor and our fitnesse 
equivalent. Moving along nicely. And then cam a day and we had to do some work 
on a different solution that we hadn&#039;t made any changes to in a few weeks. Made 
some simple changes, checked them in, and (as described &lt;span class=&#034;nobr&#034;&gt;&lt;a href=&#034;in a few&#034;&gt;&amp;#105;n a few&lt;/a&gt;&lt;/span&gt; 
&lt;span class=&#034;nobr&#034;&gt;&lt;a href=&#034;http://codebetter.com/blogs/jeffrey.palermo/archive/2005/09/13/131914.aspx
&#034;&gt;previous 
posts&lt;/a&gt;&lt;/span&gt;) our CC.net build kicked off, followed by the fitnesse tests for that project. 
What surprised us was that the fitnesse tests broke. In a strange place. Turns 
out we had an integration breakage. Changes to project B had caused the fitnesse 
tests in project A to fail, and we hadn&#039;t noticed since those tests hadn&#039;t been 
run in a couple of weeks. So after we got the tests passing, we resolved to set 
up a system to keep us from going that long with breakages we didn&#039;t know about.&lt;p class=&#034;paragraph&#034;/&gt;I set up a new project in my ccnet.config file like this:&lt;p class=&#034;paragraph&#034;/&gt;&lt;div class=&#034;code&#034;&gt;&lt;pre&gt;&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;project name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;nightly_fitnesse&#034;&lt;/span&gt;&amp;#62;&lt;/span&gt;
      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;webURL&amp;#62;&lt;/span&gt;&lt;span class=&#034;nobr&#034;&gt;&lt;a href=&#034;http://buildserver/ccnet/Controller.aspx?_action_ViewProjectReport=true&amp;#38;#38;amp;server=buildserver&amp;#38;#38;amp;project=nightly_fitnesse&#034;&gt;&amp;#104;ttp://buildserver/ccnet/Controller.aspx?_action_ViewProjectReport=true&amp;#38;amp;server=buildserver&amp;#38;amp;project=nightly_fitnesse&lt;/a&gt;&lt;/span&gt;&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/webURL&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;triggers&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;scheduleTrigger time=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;23:30&#034;&lt;/span&gt; buildCondition=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;ForceBuild&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/triggers&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;sourcecontrol type=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;svn&#034;&lt;/span&gt;&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;executable&amp;#62;&lt;/span&gt;c:&amp;#112;rogram files&amp;#115;ubversion&amp;#98;in&amp;#115;vn.exe&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/executable&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;trunkUrl&amp;#62;&lt;/span&gt;svn://codeserver/fitnesse/trunk/&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/trunkUrl&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;tagBaseUrl&amp;#62;&lt;/span&gt;svn://codeserver/fitnesse/tags/&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/tagBaseUrl&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;workingDirectory&amp;#62;&lt;/span&gt;d:&amp;#119;ork&amp;#102;itnesse&amp;#45;trunk&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/workingDirectory&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;tagOnSuccess&amp;#62;&lt;/span&gt;false&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/tagOnSuccess&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;autoGetSource&amp;#62;&lt;/span&gt;true&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/autoGetSource&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;username&amp;#62;&lt;/span&gt;cruisecontrol.net&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/username&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;password&amp;#62;&lt;/span&gt;ccnetpassword&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/password&amp;#62;&lt;/span&gt;
      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/sourcecontrol&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;tasks&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;nant&amp;#62;&lt;/span&gt;
          &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;executable&amp;#62;&lt;/span&gt;D:&amp;#119;ork&amp;#100;ependencies&amp;#45;trunk&amp;#101;xternal&amp;#110;ant&amp;#78;Ant.exe&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/executable&amp;#62;&lt;/span&gt;
          &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;baseDirectory&amp;#62;&lt;/span&gt;d:&amp;#119;ork&amp;#102;itnesse&amp;#45;trunk&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/baseDirectory&amp;#62;&lt;/span&gt;
          &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;buildFile&amp;#62;&lt;/span&gt;AustinNightlyFitnesse.build&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/buildFile&amp;#62;&lt;/span&gt;
          &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;targetList&amp;#62;&lt;/span&gt;
            &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;target&amp;#62;&lt;/span&gt;fit&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/target&amp;#62;&lt;/span&gt;
          &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/targetList&amp;#62;&lt;/span&gt;
          &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;!&amp;#45;&amp;#45; this build timeout is fairly long, since these tests can get long.  &amp;#45;&amp;#45;&amp;#62;&lt;/span&gt;
          &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;buildTimeoutSeconds&amp;#62;&lt;/span&gt;1500&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/buildTimeoutSeconds&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/nant&amp;#62;&lt;/span&gt;
      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/tasks&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;publishers&amp;#62;&lt;/span&gt;
      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;merge&amp;#62;&lt;/span&gt;
          &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;files&amp;#62;&lt;/span&gt;
             &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;file&amp;#62;&lt;/span&gt;D:&amp;#119;ork&amp;#102;itnesse&amp;#45;trunk&amp;#114;esults&amp;#42;.xml&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/file&amp;#62;&lt;/span&gt;
          &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/files&amp;#62;&lt;/span&gt;
      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/merge&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;xmllogger /&amp;#62;&lt;/span&gt;
      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/publishers&amp;#62;&lt;/span&gt;
    &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/project&amp;#62;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class=&#034;paragraph&#034;/&gt;We set up a new build file to run all 4 fitnesse suites - the parts that we call the &#039;regression&#039; suite, which we expect
to always pass. As you can see in the trigger block, it runs every night at 11:30, whether there have been any code changes or not.
The build file is where I think the interesting bits are.&lt;p class=&#034;paragraph&#034;/&gt;&lt;div class=&#034;code&#034;&gt;&lt;pre&gt;&lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;?xml version=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;1.0&#034;&lt;/span&gt; encoding=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;utf&amp;#45;8&#034;&lt;/span&gt; ?&amp;#62;&lt;/span&gt;
  &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;project name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;AustinNightlyFitnesse&#034;&lt;/span&gt; default=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;fit&#034;&lt;/span&gt; xmlns=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;http://nant.sf.net/release/0.85&amp;#45;rc3/nant.xsd&#034;&lt;/span&gt;&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;property name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;fit.server&#034;&lt;/span&gt; value=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;localhost&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;property name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;fit.port&#034;&lt;/span&gt; value=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;8080&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;property name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;results.dir&#034;&lt;/span&gt; value=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;results&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;  
      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;target name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;fit&#034;&lt;/span&gt;	description=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;run fit tests&#034;&lt;/span&gt;&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;property name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;FitRegressionFailureSummary&#034;&lt;/span&gt; value=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;0&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;delete dir=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;$&amp;#123;results.dir&amp;#125;&#034;&lt;/span&gt; failonerror=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;false&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;mkdir dir=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;$&amp;#123;results.dir&amp;#125;&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;property name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;fit.suite&#034;&lt;/span&gt; value=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;GuideEngine.SuiteRegressionTests&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;property name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;fitlibs.dir&#034;&lt;/span&gt; value=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;c:&amp;#102;itnesse&amp;#100;otnet&amp;#71;uideEngine&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;call target=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;runFitSuite&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;property name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;fit.suite&#034;&lt;/span&gt; value=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;LookupWeb.SuiteRegressionTests&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;property name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;fitlibs.dir&#034;&lt;/span&gt; value=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;c:&amp;#102;itnesse&amp;#100;otnet&amp;#76;ookupWeb&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;call target=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;runFitSuite&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;property name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;fit.suite&#034;&lt;/span&gt; value=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;FireFly.SuiteRegressionTests&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;property name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;fitlibs.dir&#034;&lt;/span&gt; value=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;c:&amp;#102;itnesse&amp;#100;otnet&amp;#70;ireFly&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;call target=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;runFitSuite&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;property name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;fit.suite&#034;&lt;/span&gt; value=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;ShareDoc.SuiteRegressionTests&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;property name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;fitlibs.dir&#034;&lt;/span&gt; value=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;c:&amp;#102;itnesse&amp;#100;otnet&amp;#83;hareDoc&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;call target=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;runFitSuite&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;fail message=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;$&amp;#123;FitRegressionFailureSummary&amp;#125; Fitnesse Regression test(s) failed.&#034;&lt;/span&gt;
          if=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;$&amp;#123;int::parse(property::get&amp;#45;value(&#039;FitRegressionFailureSummary&#039;)) != 0&amp;#125;&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/target&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;target name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;runFitSuite&#034;&lt;/span&gt; &amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;!&amp;#45;&amp;#45; same basic steps, but these must all pass, or the build fails &amp;#45;&amp;#45;&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;property name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;fit.testrunner&#034;&lt;/span&gt; value=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;$&amp;#123;fitlibs.dir&amp;#125;&amp;#84;estRunner.exe&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;echo message=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;running fit regression tests at &lt;span class=&#034;nobr&#034;&gt;&lt;a href=&#034;http://$&amp;#38;#123;fit.server&amp;#38;#125;:$&amp;#38;#123;fit.port&amp;#38;#125;/$&amp;#38;#123;fit.suite&amp;#38;#125;&#034;&gt;&amp;#104;ttp://$&amp;#123;fit.server&amp;#125;:$&amp;#123;fit.port&amp;#125;/$&amp;#123;fit.suite&amp;#125;&lt;/a&gt;&lt;/span&gt; using $&amp;#123;fit.testrunner&amp;#125;&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;exec program=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;$&amp;#123;fit.testrunner&amp;#125;&#034;&lt;/span&gt;
              commandline=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;&amp;#45;results $&amp;#123;results.dir&amp;#125;&amp;#70;it&amp;#45;$&amp;#123;fit.suite&amp;#125;.html $&amp;#123;fit.server&amp;#125; $&amp;#123;fit.port&amp;#125; $&amp;#123;fit.suite&amp;#125;&#034;&lt;/span&gt; 
              failonerror=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;false&#034;&lt;/span&gt; resultproperty=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;FitRegressionResult&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;!&amp;#45;&amp;#45; now transform those results from html to xml, and then fail if there were any errors. Fitnesse helpfully returns that as a number. &amp;#45;&amp;#45;&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;exec program=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;java.exe&#034;&lt;/span&gt; 
              commandline=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;&amp;#45;cp bin&amp;#102;itnesse&amp;#102;itnesse.jar fitnesse.runner.FormattingOption $&amp;#123;results.dir&amp;#125;&amp;#70;it&amp;#45;$&amp;#123;fit.suite&amp;#125;.html xml $&amp;#123;results.dir&amp;#125;&amp;#70;it&amp;#45;$&amp;#123;fit.suite&amp;#125;.xml $&amp;#123;fit.server&amp;#125; $&amp;#123;fit.port&amp;#125; $&amp;#123;fit.suite&amp;#125;&#034;&lt;/span&gt; 
              failonerror=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;false&#034;&lt;/span&gt;/&amp;#62;&lt;/span&gt;&lt;p class=&#034;paragraph&#034;/&gt;        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;property name=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;FitRegressionFailureSummary&#034;&lt;/span&gt; 
                            value=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;$&amp;#123;int::parse(property::get&amp;#45;value(&#039;FitRegressionFailureSummary&#039;)) + int::parse(property::get&amp;#45;value(&#039;FitRegressionResult&#039;))&amp;#125;&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;echo message=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;$&amp;#123;FitRegressionResult&amp;#125; Fitnesse Regression test(s) in $&amp;#123;fit.suite&amp;#125; failed.&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
        &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;echo message=&lt;span class=&#034;xml&amp;#45;quote&#034;&gt;&#034;So far, a total of $&amp;#123;FitRegressionFailureSummary&amp;#125; Fitnesse Regression test(s) failed.&#034;&lt;/span&gt; /&amp;#62;&lt;/span&gt;
      &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/target&amp;#62;&lt;/span&gt;
  &lt;span class=&#034;xml&amp;#45;tag&#034;&gt;&amp;#60;/project&amp;#62;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class=&#034;paragraph&#034;/&gt;
Since properties in nAnt are mutable, it makes it pretty easy to do paramaterized targets. The strangest bit about this build file is how it adds up the number of faiures.
Fitnesse TestRunner is nice enough to return an integer that indicates the number of failures and exceptions. When we exec the TestRunner, we set failonerror
to false, and collect the result into a property. As mentioned before, we use the java tools to format the XML output into html. Then, we do a little nAnt
expression voodoo to add up all the failures, so that failing one suite doesn&#039;t prevent the other suites from running. It is only at the very end
of the &#039;fit&#039; target that we fail with a message if there were any failures in any of the suites. Since we already have the fitnesse-details.xsl stylesheet in place,
we can then see what the problems were right in our CC.Net dashboard.&lt;p class=&#034;paragraph&#034;/&gt;Pretty cool.&lt;p class=&#034;paragraph&#034;/&gt;

        </description>
      
      
    
    
    
    <comments>http://donie.homeip.net:8080/pebble/Steve/2006/04/13/1144982429113.html#comments</comments>
    <guid isPermaLink="true">http://donie.homeip.net:8080/pebble/Steve/2006/04/13/1144982429113.html</guid>
    <pubDate>Fri, 14 Apr 2006 02:40:29 GMT</pubDate>
  </item>
  
  <item>
    <title>Derek Cicerone Installing...: heat.exe - making setup easier</title>
    <link>http://installing.blogspot.com/2006/04/heatexe-making-setup-easier.html</link>
    
      
        <description>
          Ran across a cool new tool today! If you are releasing your software on Windows using MSI files, you really ought to know about WiX. And this looks like a most excellent tool to get you started in that direction. &lt;a href=&#034;http://installing.blogspot.com/2006/04/heatexe-making-setup-easier.html&#034;&gt;Derek Cicerone Installing...: heat.exe - making setup easier&lt;/a&gt;

&lt;p&gt;&lt;a href=&#034;http://installing.blogspot.com/2006/04/heatexe-making-setup-easier.html&#034;&gt;Read more...&lt;/a&gt;&lt;/p&gt;
        </description>
      
      
    
    
    
    <comments>http://donie.homeip.net:8080/pebble/Steve/2006/04/05/1144272788000.html#comments</comments>
    <guid isPermaLink="true">http://installing.blogspot.com/2006/04/heatexe-making-setup-easier.html</guid>
    <pubDate>Wed, 05 Apr 2006 21:33:08 GMT</pubDate>
  </item>
  
  <item>
    <title>Installing Subversion Server on Windows</title>
    <link>http://donie.homeip.net:8080/pebble/Steve/2006/02/27/1141079943879.html</link>
    
      
        <description>
          An article in which I describe why you might want to set up a subversion server, and how to go about doing that on a Windows machine. 

&lt;h2&gt;Why should I set up a subversion server anyway?&lt;/h2&gt;

See &lt;a href=&#034;http://www.subversionary.org/&#034;&gt;the subversionary website&lt;/a&gt; for lots of details on why you might want to use subversion. Once you get through that, come on back here to find out how. 

&lt;h2&gt;How to set up a Subversion server on Windows&lt;/h2&gt;
&lt;h3&gt;Part 1 - installing the program and creating a repository&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Install the subversion program - download from &lt;a href=&#034;http://subversion.tigris.org/&#034;&gt;http://subversion.tigris.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;start a command prompt&lt;/li&gt;
&lt;li&gt;type &lt;tt&gt;svnadmin create [directory location]&lt;/tt&gt; where &lt;i&gt;directory location&lt;/i&gt; is something like &lt;tt&gt;d:\svn\projectname&lt;/tt&gt; or just &lt;tt&gt;d:\projectname&lt;/tt&gt;. Depends how you want to set things up. I tend to prefer setting up like &lt;tt&gt;d:\svn\projectname&lt;/tt&gt;, and if you need multiple projects, each goes in its own repository. That also makes it easy to run the svnservice (described below) and just point it at &lt;tt&gt;d:\svn&lt;/tt&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Here is an example of doing that.&lt;br/&gt;
&lt;tt&gt;svnadmin create --fs-type fsfs e:\svn\&amp;lt;projectname&amp;gt;
&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;I tend to use the fsfs filesystem type. Your other option is to use the BDB (Berkely Database) type. When Subversion was first released, BDB was the preferred type. 
Now, they are reccomending fsfs as the preferred type. If you want to read more on that, see &lt;a href=&#034;http://web.mit.edu/ghudson/info/fsfs&#034;&gt;this article comparing fsfs to BDB&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;You should now see a directory structure like&lt;br&gt;&lt;pre &gt;e:\svn\projectname\conf\
                  \dav\
                  \db\
                  \hooks\
                  \locks\
                  \format
                  \README.txt&lt;/pre&gt;&lt;br&gt;
If you want to learn more about those directories and their contents, see &lt;a href=&#034;http://svnbook.red-bean.com/nightly/en/svn.reposadmin.create.html&#034;&gt;the subversion book, chapter 5.&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Part 2 - configuring the server&lt;/h3&gt;

&lt;p&gt;To provide access to your repository from another machine, you have to set up some sort of server &#039;daemon&#039;. One of the cool things about subversion is that is supports several different access 
methods.  They can be used singly, or you can use multiple methods at the same time. The easiest to set up is the built-in &lt;tt&gt;svnserve&lt;/tt&gt; daemon, so I will describe that here. If you want to read more 
on this topic, see &lt;a href=&#034;http://svnbook.red-bean.com/nightly/en/svn.serverconfig.html#svn.serverconfig.overview&#034;&gt;the subversion book, chapter 6&lt;/a&gt;.
&lt;ol&gt;
&lt;li&gt;To configure svnserve, you need to edit &lt;tt&gt;conf\svnserve.conf&lt;/tt&gt; You can pretty much just un-comment the lines that have single # at the beginning, and then change the &#039;realm&#039; to something 
better. Here is a stripped-down sample, with ALL the comments removed.&lt;br&gt;
&lt;pre&gt;[general]
anon-access = read
auth-access = write
password-db = passwd.txt
realm = ProjectName Subversion&lt;/pre&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;The anon-access line says that anybody who knows the URI of the server will be able to read from it - change this to &lt;tt&gt;none&lt;/tt&gt; if you want to keep it private.&lt;/li&gt;
&lt;li&gt;The auth-access line says that people who enter a correct username and password can commit (write) to the repository.&lt;/li&gt;
&lt;li&gt;The password-db line gives the name of a file, relative to this svnserve.conf file, where passwords are kept. Note that only someone with access to the subversion server will be able to edit 
this file, and whoever has that access has the ability to see and change anyone&#039;s password. There is currently no existing way to allow users to change their passwords themselves if you are 
using the svnserve access method. If you do need something better, look into Apache-based web access.&lt;/li&gt;
&lt;li&gt;The realm line is a human-readable name of a &#039;security realm&#039;. It also provides a way for multiple repositories to share a single password file.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;in the conf directory, create passwd.txt (or whatever you named the password-db in the svnserve.conf)&lt;br/&gt;
passwd.txt should look something like this:&lt;br&gt;&lt;pre&gt;[users]
joe.developer=SomeSuperSecretPassword
steve.donie=SomeOtherSecretPassword&lt;/pre&gt;&lt;br&gt;If you use the person&#039;s NT login name as the username, it will make sending email as described below much easier. Depending on how your NT login names are
configured, it should also be easier to interpret who made what changes if you ever look at the history of a file.&lt;/li&gt;
&lt;li&gt;If you want email notifications sent out whenever someone commits (&lt;strong&gt;you should&lt;/strong&gt; - it really enhances communication), do this:&lt;/li&gt;
&lt;ol type=&#034;1&#034;&gt;
&lt;li&gt;install Perl from ActiveState. I used &lt;a href=&#034;http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.6.811-MSWin32-x86-122208.msi&#034; target=&#034;_blank&#034;&gt;ActivePerl-5.8.6.811&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Get copies of these files and copy them to your hooks directory:
&lt;pre&gt;commit-email-win.pl
emails.lst
post-commit.bat&lt;/pre&gt;&lt;br&gt;
I originally found these files in the &lt;a href=&#034;http://www.google.com/search?hl=en&amp;amp;q=email-win.pl&#034; target=&#034;_blank&#034;&gt;subversion-users email list&lt;/a&gt;. You can also go straight to the email that has 
the files by following &lt;a href=&#034;http://svn.haxx.se/users/archive-2004-04/0504.shtml&#034;&gt;this link&lt;/a&gt;. The files are also available in &lt;a href=&#034;http://svn.haxx.se/users/archive-2004-04/att-0766/commit-email-win.zip&#034;&gt;this zip archive&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;edit commit-email-win.pl to tell it where the svnlook program is, where the emails.lst file is, where a temp directory is, the name of the mailserver, and a default from prefix.&lt;/li&gt;
&lt;li&gt;edit post-commit.bat to say where perl is, where the commit-email-win.pl script is, where to keep temp files, and the domain that emails come from.&lt;/li&gt;
&lt;li&gt;edit emails.lst to have a list of email addresses to send to, one per line. One thing we do at my company is I have a little batch file &lt;tt&gt;MakeEmailsLst.bat&lt;/tt&gt;
that will create the emails.lst file for you based on the list of people in the passwd.txt file. This is a &lt;strong&gt;Very Good Thing&lt;/strong&gt; - 
it is my opinion that if you have the privlege of comitting, you also have the responsibility of keeping up with changes to the project.&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;If you want to prevent people from checking in with empty log messages (also a &lt;strong&gt;Very Good Thing&lt;/strong&gt;), take this bit of batch file:&lt;pre&gt;
@echo off

setlocal
set REPOS=%1
set TXN=%2

rem check for an empty log message
svnlook log &#034;%REPOS%&#034; -t &#034;%TXN%&#034; | findstr &#034;.&#034; &gt; nul
if %errorlevel% gtr 0 goto err
exit 0

:err
echo You must provide a log message. 1&gt;&amp;2
exit 1 
&lt;/pre&gt;
and save it as &lt;tt&gt;pre-commit.bat&lt;/tt&gt; in project&#039;s hooks directory.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Part 3 - Making the svnserve process into a Windows Service&lt;/h3&gt;
&lt;p&gt;You will probably want the svnserve server to run all the time, and the best way to do that is to make it a Windows service. No problem: Just download the svnserve service wrapper (a zip 
file) from here: &lt;a href=&#034;http://dark.clansoft.dk/%7Embn/svnservice/&#034; target=&#034;_blank&#034;&gt;http://dark.clansoft.dk/~mbn/svnservice/&lt;/a&gt;, and then 
unzip svnservice.exe to the subversion\bin directory (whereever you installed the original subversion program, back in part 1). Then install the service like this:&lt;br&gt;
&lt;pre&gt;svnservice -install -d -r d:\svn&lt;/pre&gt;

&lt;h3&gt;Part 4 - Checking your work&lt;/h3&gt;
&lt;p&gt;At this point, you should be able to go to a client machine, and use any of several SVN clients to access it. I use three different clients interchangeably, depending on what I am doing 
at the time. They all work together pretty seamlessly.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#034;http://tortoisesvn.tigris.org/&#034; target=&#034;_blank&#034;&gt;TortoiseSVN&lt;/a&gt; is great on Windows - it is a Windows shell extension that adds subversion commands to the right-click menu anywhere
in explorer.&lt;/li&gt;
&lt;li&gt;The command line client (which you get when running the subversion installer on your client, just like in step 1 above) is a great option to have around. Its command set closely mirrors that of CVS, 
so if you&#039;re familiar with that, the transition is pretty smooth.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#034;http://ankhsvn.tigris.org/&#034;&gt;AnkhSVN&lt;/a&gt; is a plugin for Microsoft Developer Studio that integrates very well - you can do nearly anything you need to right in the IDE. It also does things like automatically add new 
files to subversion when you add them in your project.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
The first thing you will want to do in your new repository is set it using the &#039;standard&#039; top level; directories. Typical SVN repositories have three directories named trunk, tags, and branches.
Here is how to do that using the command line. 
&lt;pre&gt;C:\work&gt;svn co svn://servername/myProject c:\work\myProject
Checked out revision 0.

C:\work&gt;cd myProject

C:\work\myProject&gt;md trunk

C:\work\myProject&gt;md tags

C:\work\myProject&gt;md branches

C:\work\myProject&gt;svn add trunk tags branches
A         trunk
A         tags
A         branches

C:\work\myProject&gt;svn ci -m&#034;creating initial repository structure&#034;
Adding         branches
Adding         tags
Adding         trunk

Committed revision 1.
&lt;/pre&gt;
You could do the same thing with TortoiseSVN. I usually keep all my working copies in a directory called &#034;work&#034;, so...
&lt;ol&gt;
&lt;li&gt;Open up Windows Explorer to c:\work, then right click and select
&lt;tt&gt;SVN Checkout...&lt;/tt&gt;. Enter the URI of your repository (svn://servername/myProject) and the directory to check it out to (c:\work\myProject). Click OK. You will get asked whether
you want to create that directory, if it doesn&#039;t already exist, and then it will show you a progress dialog, showing success if you did everything right.&lt;/li&gt;
&lt;li&gt;Change to your new directory and
create the three new folders. Right click again and select &lt;tt&gt;TortoiseSVN -&gt; Add...&lt;/tt&gt;. A dialog with the three directories should pop up, and just press OK.&lt;/li&gt;
&lt;li&gt;Finally, commit the changes by right clicking and selecting &lt;tt&gt;SVN Commit...&lt;/tt&gt;, entering a log message, and pressing OK.&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
If you want to go into more depth, read the &lt;a href=&#034;http://svnbook.red-bean.com/&#034; target=&#034;_blank&#034;&gt;Subversion Book&lt;/a&gt; for more information on all of these topics.&lt;br/&gt;
I hope this has been helpful - please leave comments if not, or if there is anything I can do to clarify things!
&lt;/p&gt;

        </description>
      
      
    
    
    
    <comments>http://donie.homeip.net:8080/pebble/Steve/2006/02/27/1141079943879.html#comments</comments>
    <guid isPermaLink="true">http://donie.homeip.net:8080/pebble/Steve/2006/02/27/1141079943879.html</guid>
    <pubDate>Mon, 27 Feb 2006 22:39:03 GMT</pubDate>
  </item>
  
  <item>
    <title>Taking Continuous Integration to the next level</title>
    <link>http://donie.homeip.net:8080/pebble/Steve/2005/12/28/1135786642478.html</link>
    
      
      
        <description>
          In which I describe a system that allows for build artifacts from one project to automatically propagate to dependent projects, extending Continuous Integration to a new level.&lt;p&gt;&lt;a href=&#034;http://donie.homeip.net:8080/pebble/Steve/2005/12/28/1135786642478.html&#034;&gt;Read more...&lt;/a&gt;&lt;/p&gt;
        </description>
      
    
    
    
    <comments>http://donie.homeip.net:8080/pebble/Steve/2005/12/28/1135786642478.html#comments</comments>
    <guid isPermaLink="true">http://donie.homeip.net:8080/pebble/Steve/2005/12/28/1135786642478.html</guid>
    <pubDate>Wed, 28 Dec 2005 16:17:22 GMT</pubDate>
  </item>
  
  </channel>
</rss>
