<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Code Smart Not Hard - Team Foundation Server</title>
    <link>http://codesmartnothard.com/</link>
    <description>Team Foundation Server, Frameworks, and Code Generation</description>
    <language>en-us</language>
    <copyright>Michael Douglas</copyright>
    <lastBuildDate>Fri, 16 Jul 2010 08:43:00 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>mike@doitconsultants.com</managingEditor>
    <webMaster>mike@doitconsultants.com</webMaster>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=6546ff6b-b4ef-4641-8270-60ccb61ea3cb</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,6546ff6b-b4ef-4641-8270-60ccb61ea3cb.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,6546ff6b-b4ef-4641-8270-60ccb61ea3cb.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=6546ff6b-b4ef-4641-8270-60ccb61ea3cb</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
One of my Team Foundation Server 2010 test servers had TFS 2010, VS 2010, and Team
Explorer 2010. Installed the TFS 2010 Power tools to utilize some of the cmdlets and
the tfpt.exe utility to create a team project. After I did this I also needed to test
the <a href="http://tfsadmin.codeplex.com/" target="_blank">TFS Administration Tool</a> 2.0
for TFS 2010. This is a great and free tool for managing the permissions of TFS users
across TFS, SSRS, and SharePoint. This works with TFS 2010 but it is written against
the TFS 2008 object model. This required
</p>
        <ul>
          <li>
Team Explorer 2008 
</li>
          <li>
Visual Studio 2008 SP1 
</li>
          <li>
Visual Studio 2008 SP1 Forward Compatibility Hotfix 
</li>
        </ul>
        <p>
I installed these pre-requisites and the TFS Admin Tool. Today I got a request to
add some additional email alerts to a TFS 2008 team project. Since I already had Team
Explorer 2008, I installed the TFS 2008 Power tools to get the alerts feature (The
TFS 2010 Power tools doesn’t have this feature)..
</p>
        <p>
I went back to work on my script for automated team project creation.
</p>
        <p>
I ran my script 
</p>
        <blockquote>
          <p>
tfpt createteamproject /collection:<a href="http://dlvrn2010md:8080/tfs/defaultcollection">http://dlvrn2010md:8080/tfs/defaultcollection</a> /teamproject:"testauto5"
/processtemplate:"MSF for Agile Software Development v5.0" /sourcecontrol:New
</p>
        </blockquote>
        <p>
Then I get the following error:
</p>
        <blockquote>
          <p>
            <strong>TFPT.exe : Unrecognized command option 'collection'.</strong>
          </p>
        </blockquote>
        <p>
I realized the TFPT command is now pointing to the TFS 2008 Power tool version and
obviously doesn’t know what a Team Project Collection is. I looked in the Environment
Variables. The Path variable showed a reference to the TFSPowerToolsDir variable.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/FixTFS2010powertoolsafterinstallingTFS20_1410D/image_2.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/FixTFS2010powertoolsafterinstallingTFS20_1410D/image_thumb.png" width="344" height="228" />
          </a>
        </p>
        <p>
Next, I checked the TFSPowerToolDir variable and it was pointing to the 2008 Power
Tools.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/FixTFS2010powertoolsafterinstallingTFS20_1410D/image_4.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/FixTFS2010powertoolsafterinstallingTFS20_1410D/image_thumb_1.png" width="344" height="258" />
          </a>
        </p>
        <p>
I changed this to "C:\Program Files (x86)\Microsoft Team Foundation Server 2010 Power
Tools\". I reopened the PowerShell ISE, executed the script, and it worked again. 
</p>
        <p>
This is a unique situation, but it happened to me so it could happen to you :)
</p>
        <p>
This is also posted at <a href="http://www.deliveron.com/blog/post/Fix-TFS-2010-Power-Tools-after-installing-TFS-2008-Power-Tools.aspx">http://www.deliveron.com/blog/post/Fix-TFS-2010-Power-Tools-after-installing-TFS-2008-Power-Tools.aspx</a></p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=6546ff6b-b4ef-4641-8270-60ccb61ea3cb" />
      </body>
      <title>Fix TFS 2010 Power Tools after installing TFS 2008 Power Tools</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,6546ff6b-b4ef-4641-8270-60ccb61ea3cb.aspx</guid>
      <link>http://codesmartnothard.com/FixTFS2010PowerToolsAfterInstallingTFS2008PowerTools.aspx</link>
      <pubDate>Fri, 16 Jul 2010 08:43:00 GMT</pubDate>
      <description>&lt;p&gt;
One of my Team Foundation Server 2010 test servers had TFS 2010, VS 2010, and Team
Explorer 2010. Installed the TFS 2010 Power tools to utilize some of the cmdlets and
the tfpt.exe utility to create a team project. After I did this I also needed to test
the &lt;a href="http://tfsadmin.codeplex.com/" target="_blank"&gt;TFS Administration Tool&lt;/a&gt; 2.0
for TFS 2010. This is a great and free tool for managing the permissions of TFS users
across TFS, SSRS, and SharePoint. This works with TFS 2010 but it is written against
the TFS 2008 object model. This required
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Team Explorer 2008 
&lt;/li&gt;
&lt;li&gt;
Visual Studio 2008 SP1 
&lt;/li&gt;
&lt;li&gt;
Visual Studio 2008 SP1 Forward Compatibility Hotfix 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I installed these pre-requisites and the TFS Admin Tool. Today I got a request to
add some additional email alerts to a TFS 2008 team project. Since I already had Team
Explorer 2008, I installed the TFS 2008 Power tools to get the alerts feature (The
TFS 2010 Power tools doesn’t have this feature)..
&lt;/p&gt;
&lt;p&gt;
I went back to work on my script for automated team project creation.
&lt;/p&gt;
&lt;p&gt;
I ran my script 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
tfpt createteamproject /collection:&lt;a href="http://dlvrn2010md:8080/tfs/defaultcollection"&gt;http://dlvrn2010md:8080/tfs/defaultcollection&lt;/a&gt; /teamproject:"testauto5"
/processtemplate:"MSF for Agile Software Development v5.0" /sourcecontrol:New
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Then I get the following error:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;TFPT.exe : Unrecognized command option 'collection'.&lt;/strong&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I realized the TFPT command is now pointing to the TFS 2008 Power tool version and
obviously doesn’t know what a Team Project Collection is. I looked in the Environment
Variables. The Path variable showed a reference to the TFSPowerToolsDir variable.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/FixTFS2010powertoolsafterinstallingTFS20_1410D/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/FixTFS2010powertoolsafterinstallingTFS20_1410D/image_thumb.png" width="344" height="228" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Next, I checked the TFSPowerToolDir variable and it was pointing to the 2008 Power
Tools.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/FixTFS2010powertoolsafterinstallingTFS20_1410D/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/FixTFS2010powertoolsafterinstallingTFS20_1410D/image_thumb_1.png" width="344" height="258" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
I changed this to "C:\Program Files (x86)\Microsoft Team Foundation Server 2010 Power
Tools\". I reopened the PowerShell ISE, executed the script, and it worked again. 
&lt;/p&gt;
&lt;p&gt;
This is a unique situation, but it happened to me so it could happen to you :)
&lt;/p&gt;
&lt;p&gt;
This is also posted at &lt;a href="http://www.deliveron.com/blog/post/Fix-TFS-2010-Power-Tools-after-installing-TFS-2008-Power-Tools.aspx"&gt;http://www.deliveron.com/blog/post/Fix-TFS-2010-Power-Tools-after-installing-TFS-2008-Power-Tools.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=6546ff6b-b4ef-4641-8270-60ccb61ea3cb" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,6546ff6b-b4ef-4641-8270-60ccb61ea3cb.aspx</comments>
      <category>Team Foundation Server;TFS 2010</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=4d763950-5662-4d9f-ae2e-5472c8f8bb4b</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,4d763950-5662-4d9f-ae2e-5472c8f8bb4b.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,4d763950-5662-4d9f-ae2e-5472c8f8bb4b.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=4d763950-5662-4d9f-ae2e-5472c8f8bb4b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today I have released Team Deploy 2010 for Team Foundation Server 2010.  In this
post, I am going to give a quick overview of Team Deploy if you haven’t used it before,
explain this release and upcoming releases, compare it to Lab Management 2010, and
give a walkthrough for setting it up and uninstalling it.
</p>
        <h4>What is Team Deploy?
</h4>
        <p>
Team Deploy is a set of custom build activities used to deploy MSIs to multiple client
PCs and/or deploy services to servers.  This activities include the ability to
kill processes, start/stop services, pass in arguments to the MSIs, provide the service
username/password, and uninstall previous versions.  Team Deploy uses SysInternal’s
PSTools to remotely execute MSIEXEC to install the MSIs and PSKill to kill processes. 
By using Team Deploy, development teams can create automated build and deploy processes
for better configuration management.  Deployments can be done on demand or scheduled
just like any other build in Team Build.  If you are using Team Foundation Server
2008, Team Deploy 2.1 is the current release to download.  Team Deploy is open
source and free to use.  It can be downloaded from <a href="http://teamdeploy.codeplex.com">http://teamdeploy.codeplex.com</a></p>
        <h4>This Release and Future Plans
</h4>
        <p>
I am calling this version of Team Deploy 2010, Release 1.  This release is a
1 for 1 port of the MSBuild tasks to Workflow custom activities.  I wanted to
release this version without any additional enhancements so development teams can
upgrade their build definitions to workflow.  I have a lot ideas for future versions. 
Lab Management 2010 has given me some ideas (see comparison below) and there are several
other things I want to do.  Here is a list of some:
</p>
        <ul>
          <li>
            <strong>MSI Package for Team Deploy 2010</strong> – For custom build tasks, deployments
are easy.  Basically just copy the Dll to the MSBuilds folder and use that path
in the build definitions.  For Team Build custom activities, it is a little more
complicated.  As you will see in the Setup Walkthrough below, there are several
steps that are fairly easy to do manually but are going to be more difficult to do
with a custom task.  I have begun working on this but it wasn’t ready for this
release.</li>
          <li>
            <strong>Breakout Deploy activity into Workflow</strong> – Currently the Deploy activity
does all the work and calls the other activities within code.  I want to create
an additional workflow with all of these steps in a workflow.</li>
          <li>
            <strong>PowerShell capabilities</strong> – PowerShell 2.0 has the ability to be run
on remote machines.  I want to research this functionality and see if it makes
sense to create an addition set of activities that use PowerShell instead of PSTools.</li>
          <li>
            <strong>Custom Build Definition Screen </strong>– Display screen to create the deployment
options through the UI instead of creating it in XML today.</li>
          <li>
            <strong>Change the Threadpool to .Net 4 Tasks</strong> for deploying to multiple machines
at the same time.</li>
          <li>
            <strong>Team Deploy build definition to call another definition</strong> to 
do the build and deploy (Similar to Lab Management)</li>
        </ul>
        <h4>Team Deploy and Lab Management
</h4>
        <p>
Visual Studio 2010 introduces an additional product for Team Foundation Server 2010
called Lab Management 2010.  This product allows virtual environments be created,
quickly provisioned, used for manual and automated testing.  Lab Management also
includes a new build definition type and activities.  With the build definition
type, it allows you to revert the virtual environment to a baseline snapshot, build
the application, deploy the application, run the automated tests, and capture the
results.  So Lab Management can do what Team Deploy can do and a lot more.  
The one area that I have seen Team Deploy used where Lab Management would not be used
is for deploying applications to QA and Production.  I have worked with several
companies that use Team Deploy to deploy to all of their environments for a consistent
deployment process.
</p>
        <h4>Team Deploy Setup
</h4>
        <p>
Here are the steps to install Team Deploy and create a simple build.
</p>
        <p>
1. The TeamDeploy2010_R1.zip file contains the following 4 files that are used to
install the application.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_2.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb.png" width="230" height="130" />
          </a>
        </p>
        <p>
2. Copy TeamDeploy.Activities.* to a location in source control and check in.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_4.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_1.png" width="404" height="101" />
          </a>
        </p>
        <p>
3. Add TeamDeploy.Activities.dll to the GAC using Gacutil.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_6.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_2.png" width="504" height="264" />
          </a>
        </p>
        <p>
4. Add source control location of custom assemblies to build controller.  ($/TestBuilds/CustomActivities
in this example)
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_8.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_3.png" width="504" height="466" />
          </a>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
5. Copy DeployTemplate.xaml to source control in the BuildProcessTemplates folder.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_10.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_4.png" width="504" height="129" />
          </a>
        </p>
        <p>
6. Create a new build definition.  In the Process Step click on “New” Template
and add the existing DeployTemplate.xaml template that was added to source control. 
Click OK.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_12.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_5.png" width="404" height="410" />
          </a>
        </p>
        <p>
7. Set the build properties to where the PSTools is installed and where the deployment
XML is located. Click Save.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_14.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_6.png" width="404" height="286" />
          </a>
        </p>
        <p>
8. Rename and edit SampleDeployScript.xml to specify applications to install and machines
to deploy to.  See <a href="http://teamdeploy.codeplex.com">http://teamdeploy.codeplex.com</a> website
for full list of options available. If you open the DeployTemplate.xaml.  It
should look like this.  
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_16.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_7.png" width="504" height="239" />
          </a> 
</p>
        <p>
If there is an error for the deploy activity.  Delete the AgentScope activity.
</p>
        <p>
1.  Add Team Deploy 2010 Activities by right clicking in the toolbox and select
“Choose Items…”. Make sure System.Activities Components tab is selected and select
“Browse…” to find the location of the TeamDeploy.Activities.dll and choose it.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_18.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_8.png" width="504" height="350" />
          </a>
        </p>
        <p>
  2. Once you have added the TeamDeploy.Activities.dll, you will see the activities
selected.  Click Ok.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_20.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_9.png" width="504" height="366" />
          </a>
        </p>
        <p>
        </p>
        <p>
3. Clicking Ok will add the activities to the toolbox. Drag the Deploy activity to
the AgentScope container.  The required properties will cause a red error icon
to display.  Fill out the properties to where you have the deployment script
and PSTools installed. (Sometimes the designer won’t let you drag the Deploy activity
to the canvas.  Save the workflow, exit Visual Studio 2010, and reopen the workflow. 
It should then.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_22.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_10.png" width="504" height="239" />
          </a>
        </p>
        <h4>Uninstalling or Updating Team Deploy 2010
</h4>
        <p>
1. Close Visual Studio 2010
</p>
        <p>
2. Stop the Visual Studio Team Foundation Build Service Host service.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_24.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_11.png" width="504" height="212" />
          </a>
        </p>
        <p>
3. To remove Team Deploy from the GAC, browse to c:\windows\microsoft.net\assembly\gac_msil
and delete the TeamDeploy.Activities folder.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_26.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_12.png" width="504" height="304" />
          </a>
        </p>
        <h4>Build Log of Deploy activity in Team Build 2010
</h4>
        <p>
Here is an example of the build log for the Deploy activity.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_28.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_13.png" width="504" height="246" />
          </a>
        </p>
        <p>
I hope you enjoy!  Let me know if you have any ideas or run into problems.
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=4d763950-5662-4d9f-ae2e-5472c8f8bb4b" />
      </body>
      <title>Team Deploy 2010 is released</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,4d763950-5662-4d9f-ae2e-5472c8f8bb4b.aspx</guid>
      <link>http://codesmartnothard.com/TeamDeploy2010IsReleased.aspx</link>
      <pubDate>Fri, 28 May 2010 05:36:00 GMT</pubDate>
      <description>&lt;p&gt;
Today I have released Team Deploy 2010 for Team Foundation Server 2010.&amp;#160; In this
post, I am going to give a quick overview of Team Deploy if you haven’t used it before,
explain this release and upcoming releases, compare it to Lab Management 2010, and
give a walkthrough for setting it up and uninstalling it.
&lt;/p&gt;
&lt;h4&gt;What is Team Deploy?
&lt;/h4&gt;
&lt;p&gt;
Team Deploy is a set of custom build activities used to deploy MSIs to multiple client
PCs and/or deploy services to servers.&amp;#160; This activities include the ability to
kill processes, start/stop services, pass in arguments to the MSIs, provide the service
username/password, and uninstall previous versions.&amp;#160; Team Deploy uses SysInternal’s
PSTools to remotely execute MSIEXEC to install the MSIs and PSKill to kill processes.&amp;#160;
By using Team Deploy, development teams can create automated build and deploy processes
for better configuration management.&amp;#160; Deployments can be done on demand or scheduled
just like any other build in Team Build.&amp;#160; If you are using Team Foundation Server
2008, Team Deploy 2.1 is the current release to download.&amp;#160; Team Deploy is open
source and free to use.&amp;#160; It can be downloaded from &lt;a href="http://teamdeploy.codeplex.com"&gt;http://teamdeploy.codeplex.com&lt;/a&gt;
&lt;/p&gt;
&lt;h4&gt;This Release and Future Plans
&lt;/h4&gt;
&lt;p&gt;
I am calling this version of Team Deploy 2010, Release 1.&amp;#160; This release is a
1 for 1 port of the MSBuild tasks to Workflow custom activities.&amp;#160; I wanted to
release this version without any additional enhancements so development teams can
upgrade their build definitions to workflow.&amp;#160; I have a lot ideas for future versions.&amp;#160;
Lab Management 2010 has given me some ideas (see comparison below) and there are several
other things I want to do.&amp;#160; Here is a list of some:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MSI Package for Team Deploy 2010&lt;/strong&gt; – For custom build tasks, deployments
are easy.&amp;#160; Basically just copy the Dll to the MSBuilds folder and use that path
in the build definitions.&amp;#160; For Team Build custom activities, it is a little more
complicated.&amp;#160; As you will see in the Setup Walkthrough below, there are several
steps that are fairly easy to do manually but are going to be more difficult to do
with a custom task.&amp;#160; I have begun working on this but it wasn’t ready for this
release.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Breakout Deploy activity into Workflow&lt;/strong&gt; – Currently the Deploy activity
does all the work and calls the other activities within code.&amp;#160; I want to create
an additional workflow with all of these steps in a workflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PowerShell capabilities&lt;/strong&gt; – PowerShell 2.0 has the ability to be run
on remote machines.&amp;#160; I want to research this functionality and see if it makes
sense to create an addition set of activities that use PowerShell instead of PSTools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Build Definition Screen &lt;/strong&gt;– Display screen to create the deployment
options through the UI instead of creating it in XML today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change the Threadpool to .Net 4 Tasks&lt;/strong&gt; for deploying to multiple machines
at the same time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team Deploy build definition to call another definition&lt;/strong&gt; to&amp;#160;
do the build and deploy (Similar to Lab Management)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Team Deploy and Lab Management
&lt;/h4&gt;
&lt;p&gt;
Visual Studio 2010 introduces an additional product for Team Foundation Server 2010
called Lab Management 2010.&amp;#160; This product allows virtual environments be created,
quickly provisioned, used for manual and automated testing.&amp;#160; Lab Management also
includes a new build definition type and activities.&amp;#160; With the build definition
type, it allows you to revert the virtual environment to a baseline snapshot, build
the application, deploy the application, run the automated tests, and capture the
results.&amp;#160; So Lab Management can do what Team Deploy can do and a lot more.&amp;#160;&amp;#160;
The one area that I have seen Team Deploy used where Lab Management would not be used
is for deploying applications to QA and Production.&amp;#160; I have worked with several
companies that use Team Deploy to deploy to all of their environments for a consistent
deployment process.
&lt;/p&gt;
&lt;h4&gt;Team Deploy Setup
&lt;/h4&gt;
&lt;p&gt;
Here are the steps to install Team Deploy and create a simple build.
&lt;/p&gt;
&lt;p&gt;
1. The TeamDeploy2010_R1.zip file contains the following 4 files that are used to
install the application.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb.png" width="230" height="130" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
2. Copy TeamDeploy.Activities.* to a location in source control and check in.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_1.png" width="404" height="101" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
3. Add TeamDeploy.Activities.dll to the GAC using Gacutil.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_2.png" width="504" height="264" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
4. Add source control location of custom assemblies to build controller.&amp;#160; ($/TestBuilds/CustomActivities
in this example)
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_3.png" width="504" height="466" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
5. Copy DeployTemplate.xaml to source control in the BuildProcessTemplates folder.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_10.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_4.png" width="504" height="129" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
6. Create a new build definition.&amp;#160; In the Process Step click on “New” Template
and add the existing DeployTemplate.xaml template that was added to source control.&amp;#160;
Click OK.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_12.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_5.png" width="404" height="410" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
7. Set the build properties to where the PSTools is installed and where the deployment
XML is located. Click Save.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_14.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_6.png" width="404" height="286" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
8. Rename and edit SampleDeployScript.xml to specify applications to install and machines
to deploy to.&amp;#160; See &lt;a href="http://teamdeploy.codeplex.com"&gt;http://teamdeploy.codeplex.com&lt;/a&gt; website
for full list of options available. If you open the DeployTemplate.xaml.&amp;#160; It
should look like this.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_16.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_7.png" width="504" height="239" /&gt;&lt;/a&gt;&amp;#160;
&lt;/p&gt;
&lt;p&gt;
If there is an error for the deploy activity.&amp;#160; Delete the AgentScope activity.
&lt;/p&gt;
&lt;p&gt;
1.&amp;#160; Add Team Deploy 2010 Activities by right clicking in the toolbox and select
“Choose Items…”. Make sure System.Activities Components tab is selected and select
“Browse…” to find the location of the TeamDeploy.Activities.dll and choose it.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_18.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_8.png" width="504" height="350" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; 2. Once you have added the TeamDeploy.Activities.dll, you will see the activities
selected.&amp;#160; Click Ok.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_20.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_9.png" width="504" height="366" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
3. Clicking Ok will add the activities to the toolbox. Drag the Deploy activity to
the AgentScope container.&amp;#160; The required properties will cause a red error icon
to display.&amp;#160; Fill out the properties to where you have the deployment script
and PSTools installed. (Sometimes the designer won’t let you drag the Deploy activity
to the canvas.&amp;#160; Save the workflow, exit Visual Studio 2010, and reopen the workflow.&amp;#160;
It should then.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_22.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_10.png" width="504" height="239" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h4&gt;Uninstalling or Updating Team Deploy 2010
&lt;/h4&gt;
&lt;p&gt;
1. Close Visual Studio 2010
&lt;/p&gt;
&lt;p&gt;
2. Stop the Visual Studio Team Foundation Build Service Host service.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_24.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_11.png" width="504" height="212" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
3. To remove Team Deploy from the GAC, browse to c:\windows\microsoft.net\assembly\gac_msil
and delete the TeamDeploy.Activities folder.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_26.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_12.png" width="504" height="304" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h4&gt;Build Log of Deploy activity in Team Build 2010
&lt;/h4&gt;
&lt;p&gt;
Here is an example of the build log for the Deploy activity.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_28.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TeamDeploy2010isreleased_13DA0/image_thumb_13.png" width="504" height="246" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
I hope you enjoy!&amp;#160; Let me know if you have any ideas or run into problems.
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=4d763950-5662-4d9f-ae2e-5472c8f8bb4b" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,4d763950-5662-4d9f-ae2e-5472c8f8bb4b.aspx</comments>
      <category>Team Build;Team Build 2010;Team Foundation Server;TFS 2010;Visual Studio 2010</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=42e349fa-fd1f-462f-849c-463524243ab7</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,42e349fa-fd1f-462f-849c-463524243ab7.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,42e349fa-fd1f-462f-849c-463524243ab7.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=42e349fa-fd1f-462f-849c-463524243ab7</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Thanks everyone for coming on Tuesday to the Omaha Team System User Group meeting
to see my presentation on <strong>What’s New for Testing in Visual Studio 2010 and
TFS 2010.</strong> It was a great turnout and there were a lot of great dialog and
questions asked. 
</p>
        <p>
Here’s the slides from the presentation. 
<br /><a title="http://www.codesmartnothard.com/content/binary/Whats_New_for_Testing_in_Visual_Studio_2010.zip" href="http://www.codesmartnothard.com/content/binary/Whats_New_for_Testing_in_Visual_Studio_2010.zip">http://www.codesmartnothard.com/content/binary/Whats_New_for_Testing_in_Visual_Studio_2010.zip</a></p>
        <p>
If you missed it or know anyone else that wants to see it, I’m doing this presentation
again on a Webcast on April 14th at 11:00 (central time). Here’s the link: 
<br /><a title="https://www.clicktoattend.com/invitation.aspx?code=146828" href="https://www.clicktoattend.com/invitation.aspx?code=146828">https://www.clicktoattend.com/invitation.aspx?code=146828</a></p>
        <p>
Contact us below if you would like more information about implementing Team Foundation
Server and/or Visual Studio Lab Management 2010.
</p>
        <p>
Thanks, 
<br />
Mike
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SlidedeckfromWhatsNewforTestinginVisualS_CBEF/deliveron_banner_2.gif">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="deliveron_banner" border="0" alt="deliveron_banner" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SlidedeckfromWhatsNewforTestinginVisualS_CBEF/deliveron_banner_thumb.gif" width="472" height="64" />
          </a>
        </p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=42e349fa-fd1f-462f-849c-463524243ab7" />
      </body>
      <title>Slide Deck from Whats New for Testing in Visual Studio 2010 and TFS 2010</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,42e349fa-fd1f-462f-849c-463524243ab7.aspx</guid>
      <link>http://codesmartnothard.com/SlideDeckFromWhatsNewForTestingInVisualStudio2010AndTFS2010.aspx</link>
      <pubDate>Thu, 25 Mar 2010 19:30:09 GMT</pubDate>
      <description>&lt;p&gt;
Thanks everyone for coming on Tuesday to the Omaha Team System User Group meeting
to see my presentation on &lt;strong&gt;What’s New for Testing in Visual Studio 2010 and
TFS 2010.&lt;/strong&gt; It was a great turnout and there were a lot of great dialog and
questions asked. 
&lt;/p&gt;
&lt;p&gt;
Here’s the slides from the presentation. 
&lt;br /&gt;
&lt;a title="http://www.codesmartnothard.com/content/binary/Whats_New_for_Testing_in_Visual_Studio_2010.zip" href="http://www.codesmartnothard.com/content/binary/Whats_New_for_Testing_in_Visual_Studio_2010.zip"&gt;http://www.codesmartnothard.com/content/binary/Whats_New_for_Testing_in_Visual_Studio_2010.zip&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
If you missed it or know anyone else that wants to see it, I’m doing this presentation
again on a Webcast on April 14th at 11:00 (central time). Here’s the link: 
&lt;br /&gt;
&lt;a title="https://www.clicktoattend.com/invitation.aspx?code=146828" href="https://www.clicktoattend.com/invitation.aspx?code=146828"&gt;https://www.clicktoattend.com/invitation.aspx?code=146828&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Contact us below if you would like more information about implementing Team Foundation
Server and/or Visual Studio Lab Management 2010.
&lt;/p&gt;
&lt;p&gt;
Thanks, 
&lt;br /&gt;
Mike
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SlidedeckfromWhatsNewforTestinginVisualS_CBEF/deliveron_banner_2.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="deliveron_banner" border="0" alt="deliveron_banner" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SlidedeckfromWhatsNewforTestinginVisualS_CBEF/deliveron_banner_thumb.gif" width="472" height="64" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=42e349fa-fd1f-462f-849c-463524243ab7" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,42e349fa-fd1f-462f-849c-463524243ab7.aspx</comments>
      <category>Deliveron;Lab Management;Team Build;Team Build 2010;Team Foundation Server;TFS 2010</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=c6e1208a-2116-47c6-ae58-6a158d757d14</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,c6e1208a-2116-47c6-ae58-6a158d757d14.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,c6e1208a-2116-47c6-ae58-6a158d757d14.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c6e1208a-2116-47c6-ae58-6a158d757d14</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I’m excited to be speaking 3 times in the next month on the new testing capabilities
in Visual Studio 2010 and TFS 2010.  Two events are listed below.  The third
event is full.  I hope you can make one of them.
</p>
        <p>
Sign up for the <a href="http://www.deliveron.com/newsletters.htm" target="_blank">Deliveron
Newsletter</a> to be notified about future presentations.
</p>
        <h4>Presentation Overview
</h4>
        <p>
Visual Studio 2010 introduces Lab Management 2010 and Test Professional 2010 to remove
the silos between QA professionals and developers to establish a more cohesive development
and testing process.  Together these products include tools and features for
creating test plans, creating and running manual tests, automated UI testing, creating
test virtual environments, recording manual tests, and collecting diagnostic and error
data to easily include with bugs.  See how everyone on your development and testing
teams can take advantage of these improvements
</p>
        <h4>Omaha Team System User Group Meeting
</h4>
        <p>
March 23, 2010 at 6:00pm 
<br />
Farm Credit Services of America 
<br />
5015 S 118th St 
<br />
Omaha, NE 68137 
<br /><a href="http://www.funwith.net/Events.aspx?ID=72" target="_blank">Register here</a></p>
        <h4>Deliveron April Webcast
</h4>
        <p>
April 14th, 2010 at 11:00am Central Time 
<br /><a href="https://www.clicktoattend.com/invitation.aspx?code=146828" target="_blank">Register
here</a></p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=c6e1208a-2116-47c6-ae58-6a158d757d14" />
      </body>
      <title>What&amp;rsquo;s New for Testing in Visual Studio 2010 and TFS 2010 Presentations</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,c6e1208a-2116-47c6-ae58-6a158d757d14.aspx</guid>
      <link>http://codesmartnothard.com/WhatrsquosNewForTestingInVisualStudio2010AndTFS2010Presentations.aspx</link>
      <pubDate>Mon, 22 Mar 2010 22:40:00 GMT</pubDate>
      <description>&lt;p&gt;
I’m excited to be speaking 3 times in the next month on the new testing capabilities
in Visual Studio 2010 and TFS 2010.&amp;#160; Two events are listed below.&amp;#160; The third
event is full.&amp;#160; I hope you can make one of them.
&lt;/p&gt;
&lt;p&gt;
Sign up for the &lt;a href="http://www.deliveron.com/newsletters.htm" target="_blank"&gt;Deliveron
Newsletter&lt;/a&gt; to be notified about future presentations.
&lt;/p&gt;
&lt;h4&gt;Presentation Overview
&lt;/h4&gt;
&lt;p&gt;
Visual Studio 2010 introduces Lab Management 2010 and Test Professional 2010 to remove
the silos between QA professionals and developers to establish a more cohesive development
and testing process.&amp;#160; Together these products include tools and features for
creating test plans, creating and running manual tests, automated UI testing, creating
test virtual environments, recording manual tests, and collecting diagnostic and error
data to easily include with bugs.&amp;#160; See how everyone on your development and testing
teams can take advantage of these improvements
&lt;/p&gt;
&lt;h4&gt;Omaha Team System User Group Meeting
&lt;/h4&gt;
&lt;p&gt;
March 23, 2010 at 6:00pm 
&lt;br /&gt;
Farm Credit Services of America 
&lt;br /&gt;
5015 S 118th St 
&lt;br /&gt;
Omaha, NE 68137 
&lt;br /&gt;
&lt;a href="http://www.funwith.net/Events.aspx?ID=72" target="_blank"&gt;Register here&lt;/a&gt;
&lt;/p&gt;
&lt;h4&gt;Deliveron April Webcast
&lt;/h4&gt;
&lt;p&gt;
April 14th, 2010 at 11:00am Central Time 
&lt;br /&gt;
&lt;a href="https://www.clicktoattend.com/invitation.aspx?code=146828" target="_blank"&gt;Register
here&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=c6e1208a-2116-47c6-ae58-6a158d757d14" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,c6e1208a-2116-47c6-ae58-6a158d757d14.aspx</comments>
      <category>Team Build 2010;Team Foundation Server;TFS 2010;Visual Studio 2010</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=aafe4ba2-ebc5-474e-974f-4e548637f9b9</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,aafe4ba2-ebc5-474e-974f-4e548637f9b9.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,aafe4ba2-ebc5-474e-974f-4e548637f9b9.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=aafe4ba2-ebc5-474e-974f-4e548637f9b9</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This is Part 4 of my Deployments with TFS series. It has been awhile since I started
putting this information together but I haven’t found time to finish this.  
A question about building ClickOnce deployments with Team Build 2008 on the MSDN forums
was just what I needed to get this posted.
</p>
        <h3>What is ClickOnce?
</h3>
        <p>
ClickOnce is a deployment technology that enables you to create self-updating windows
based applications that can be installed and run with minimal user interaction. 
For a complete overview of ClickOnce, please visit this the <a href="http://msdn.microsoft.com/en-us/library/142dbbz4.aspx" target="_blank">ClickOnce
Deployment Overview</a> article on MSDN.
</p>
        <h3>Our Requirements
</h3>
        <p>
Our requirements contained a couple items that made our deployment more complicated. 
The first one is one a configuration management issue that I strongly pushed. 
Basically there were two environments, Test and Production.  The ClickOnce was
to be built and deployed to the Test server, tested and accepted, and finally pushed
to production.  The problem is that Test used different config files than Production. 
The thing we didn't want to do is to have to rebuild the application to update the
config files, recreate the manifest, and publish to the production.  This had
the potential to introduce something different than was tested.Fortunately our Production
Release build script was able to copy in the new config files and recreate the manifest
and push to production.  The helped ensure the same version of the assemblies
tested.  Of course nothing is perfect, we could have still had problems in our
config files. :)
</p>
        <p>
The next issue is that we wanted to run Test and Production at the same time to compare
if there were problems.  ClickOnce thought these were the same applications so
we were unable to run them both.  The solution for this was to use a different
key for each environment.  In Test we used a test certificate key that we created,
in Production, we used our issued certificate key.  With this, the assemblies
could be the same or different versions and ClickOnce treated them as two separate
applications.
</p>
        <h3>The Solution
</h3>
        <p>
The solution consisted of 4 build scripts
</p>
        <ol>
          <li>
Build and Stage to Test – This builds the application, creates the ClickOnce manifest,
and then publishes it to a folder share, ready to be deployed to Test (but not yet). 
</li>
          <li>
Deploy to Test – This script copies the ClickOnce application to the web server so
the application is available to the testers.  This script also deployed a WCF
Windows service. 
</li>
          <li>
Stage to Production – This script copied the production config file into the manifest
folder, recreated the manifest (with production certificate), and copied the ClickOnce
application to a staging folder on a production (so it could be deployed at a later
time). 
</li>
          <li>
Deploy to Production – This script copies the ClickOnce application from the production
staging folder to the production web server. 
</li>
        </ol>
        <p>
The “staging” builds could be combined with the “deployment” builds but I believe
by separating these it offers the most flexibility.  I will now highlight some
of the unique things I had to do to get this all to work.  Unfortunately it wasn’t
as simple as using the MSBUILD task.  I think this would work for a demo or simple
scenario but not a real world scenario.  There wasn’t any way to change any of
the settings.  This offers more options.
</p>
        <h4>Build and Stage To Test
</h4>
        <p>
The first part is the properties.  Here I set all of the ClickOnce properties
that will be used later on in the build.
</p>
        <blockquote>
          <p>
&lt;PropertyGroup&gt; 
<br />
  &lt;TF&gt;&amp;quot;$(TeamBuildRefPath)\..\tf.exe&amp;quot;&lt;/TF&gt; 
<br />
  &lt;PublishUrl&gt;\\myserver\deployments\coolapp\current\ClickOnceStage\&lt;/PublishUrl&gt; 
<br />
  &lt;ClickOnceAppName&gt;MyCompany.CoolApp&lt;/ClickOnceAppName&gt; 
<br />
  &lt;ClickOnceExeFile&gt;MyCompany.CoolApp.exe&lt;/ClickOnceExeFile&gt; 
<br />
  &lt;ClickOnceProduct&gt;Cool Application&lt;/ClickOnceProduct&gt; 
<br />
  &lt;Company&gt;My Company&lt;/Company&gt; 
<br />
  &lt;ClickOnceDescription&gt;&lt;/ClickOnceDescription&gt; 
<br />
  &lt;ClickOnceUrl&gt;<a href="http://testserver.mycompany.com/">http://testserver.mycompany.com/</a>&lt;/ClickOnceUrl&gt; 
<br />
  &lt;SigningCert&gt;$(SolutionRoot)\MyCompany.CoolApp\CoolApp_1_TemporaryKey.pfx&lt;/SigningCert&gt; 
<br />
  &lt;SigningCertPassword&gt;1234&lt;/SigningCertPassword&gt; 
<br />
&lt;/PropertyGroup&gt;
</p>
        </blockquote>
        <p>
The first trick is to edit project file and update the publish url.   This
allows the build to edit it but not check out the file and need to check it in. 
Do this before the build by overriding the BeforeCompile target.
</p>
        <blockquote>
          <p>
&lt;Target Name ="BeforeCompile"&gt; 
<br />
  &lt;Message Text="Making csproj file writable"/&gt; 
<br />
  &lt;Exec Command="attrib -R &amp;quot;$(SolutionRoot)\MyCompany.CoolApp\MyCompany.CoolApp.csproj&amp;quot;"/&gt; 
</p>
          <p>
  &lt;Message Text="Replacing PublishUrl"/&gt; 
<br />
  &lt;File.RegEx 
<br />
    Path="$(SolutionRoot)\MyCompany.CoolApp\MyCompany.CoolApp.csproj" 
<br />
    RegularExpression="&amp;lt;PublishUrl&amp;gt;(.*?)&amp;lt;/PublishUrl&amp;gt;" 
<br />
    NewValue="&amp;lt;PublishUrl&amp;gt;$(PublishUrl)&amp;lt;/PublishUrl&amp;gt;" 
<br />
     /&gt; 
<br />
&lt;/Target&gt;
</p>
        </blockquote>
        <p>
Take the publish.htm file from a manual ClickOnce publish change the version to a
tag that can be replaced by the updated version number and check it in to the solution. 
After the compile, use the modified version of the publish.htm file copy it to the
staging location and then replace it with the version.  MaxVersion is the variable
the represents the new version.  I like to keep the assembly version the same
as the ClickOnce version.
</p>
        <blockquote>
          <p>
&lt;Target Name="AfterCompile" Condition="'$(IsDesktopBuild)'!='true'"&gt; 
<br />
  &lt;!-- Copy modified publish htm file to staging publish location --&gt; 
<br />
  &lt;Copy SourceFiles="$(SolutionRoot)\publish.htm" DestinationFolder="$(PublishUrl)"
/&gt; 
</p>
          <p>
  &lt;ItemGroup&gt; 
<br />
    &lt;WebPage Include="$(PublishUrl)\publish.htm" /&gt; 
<br />
  &lt;/ItemGroup&gt; 
</p>
          <p>
  &lt;RegEx 
<br />
    Condition="Exists(@(WebPage))" 
<br />
    Path="@(WebPage)" 
<br />
    RegularExpression="#VERSION#" 
<br />
    NewValue="$(MaxVersion)" 
<br />
    Force="true"/&gt; 
<br />
&lt;/Target&gt;
</p>
        </blockquote>
        <p>
Next, I used a couple of custom tasks I created.  The first was to get the framework
version.  I couldn’t figure out a way to do this.  Basically this just returns
the .net framework path so I can call Mage.exe.  The second one takes the name
of the app and the version to create the manifest folder.  Then it does the heavy
lifting to create the ClickOnce application.  We have to do each step to make
this work.  There is one thing you will probably noticed is that the setup.exe
is renamed to CoolAppSetup.exe.  This was done because there was a policy that
users couldn’t run setup.exe. I left out the copying of the files to the staging location
before running all of this below.  I had to copy the files individually because
this build script also built the WCF service.  You will need to add the appropriate
process to copy these.
</p>
        <ol>
          <li>
Generate the application manifest 
</li>
          <li>
Sign the application manifest 
</li>
          <li>
Rename the source files to .deploy 
</li>
          <li>
Generate the deployment manifest 
</li>
          <li>
Sign the application manifest (one more time) 
</li>
          <li>
Create the bootstrapper 
</li>
        </ol>
        <blockquote>
          <p>
&lt;Target Name="AfterEndToEndIteration"&gt; 
<br />
  &lt;GetFrameworkPath&gt; 
<br />
    &lt;Output TaskParameter="FrameworkPath" PropertyName="FrameworkPath"
/&gt; 
<br />
  &lt;/GetFrameworkPath&gt; 
<br />
  &lt;CreateManifestName ExecutableName="MyCompany.CoolApp" ExecutableVersion="$(MaxVersion)"&gt; 
<br />
    &lt;Output TaskParameter="ManifestName" PropertyName="ManifestName"
/&gt; 
<br />
  &lt;/CreateManifestName&gt; 
<br />
  &lt;PropertyGroup&gt; 
<br />
    &lt;ClickOnceApplicationUrl&gt;$(ClickOnceUrl)$(ClickOnceAppName).application&lt;/ClickOnceApplicationUrl&gt; 
<br />
    &lt;PublishDir&gt;$(PublishUrl)&lt;/PublishDir&gt; 
<br />
    &lt;AppPublishDir&gt;$(PublishDir)Application Files\$(ManifestName)&lt;/AppPublishDir&gt; 
<br />
    &lt;SdkPath&gt;$(FrameworkPath)\&lt;/SdkPath&gt; 
<br />
    &lt;VersionNumber&gt;$(MaxVersion)&lt;/VersionNumber&gt; 
<br />
  &lt;/PropertyGroup&gt; 
</p>
          <p>
  &lt;Message Text="FrameworkPath = $(FrameworkPath)" /&gt; 
<br />
  &lt;BuildStep 
<br />
    TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
<br />
    BuildUri="$(BuildUri)" 
<br />
    Message="Building $(ClickOnceAppName) ClickOnce version: $(VersionNumber)"&gt; 
<br />
    &lt;Output TaskParameter="Id" PropertyName="StepId"
/&gt; 
<br />
  &lt;/BuildStep&gt; 
</p>
          <p>
  &lt;!-- 
<br />
************************************************ 
<br />
Generate application manifest 
<br />
************************************************ 
<br />
--&gt; 
<br />
  &lt;Exec 
<br />
  Command="mage.exe -New Application -TrustLevel FullTrust -ToFile &amp;quot;$(AppPublishDir)\$(ClickOnceExeFile).manifest&amp;quot;
-Name &amp;quot;$(ClickOnceAppName)&amp;quot; -Version &amp;quot;$(VersionNumber)&amp;quot;
-FromDirectory &amp;quot;$(AppPublishDir)" 
<br />
  WorkingDirectory="$(SdkPath)"/&gt; 
</p>
          <p>
  &lt;!-- 
<br />
************************************************ 
<br />
Sign application manifest 
<br />
************************************************ 
<br />
--&gt; 
<br />
  &lt;!--&lt;Exec Condition="'$(SigningCertPassword)'==''" 
<br />
    Command="mage.exe -Sign &amp;quot;$(AppPublishDir)\$(ClickOnceExeFile).manifest&amp;quot;
-CertFile &amp;quot;$(SigningCert)&amp;quot;" 
<br />
    WorkingDirectory="$(SdkPath)"  /&gt;--&gt; 
</p>
          <p>
  &lt;Exec Condition="'$(SigningCertPassword)'!=''" 
<br />
      Command="mage.exe -Sign &amp;quot;$(AppPublishDir)\$(ClickOnceExeFile).manifest&amp;quot;
-CertFile &amp;quot;$(SigningCert)&amp;quot; -Password &amp;quot;$(SigningCertPassword)&amp;quot;" 
<br />
      WorkingDirectory="$(SdkPath)"/&gt; 
</p>
          <p>
  &lt;!-- 
<br />
************************************************ 
<br />
Rename source files to .deploy 
<br />
************************************************ 
<br />
--&gt; 
<br />
  &lt;ItemGroup&gt; 
<br />
    &lt;SourceFilesToRename Include="$(AppPublishDir)\**\*.*" 
<br />
                        
Exclude="$(AppPublishDir)\*.manifest;$(AppPublishDir)\*.htm"/&gt; 
<br />
    &lt;SourceFilesToDelete Include="$(AppPublishDir)\**\*.*" 
<br />
                        
Exclude="$(AppPublishDir)\*.application;$(AppPublishDir)\*.manifest;$(AppPublishDir)\*.htm"/&gt; 
<br />
  &lt;/ItemGroup&gt; 
</p>
          <p>
  &lt;Copy 
<br />
      SourceFiles="@(SourceFilesToRename)" 
<br />
      DestinationFiles="@(SourceFilesToRename-&gt;'$(AppPublishDir)\%(RecursiveDir)%(Filename)%(Extension).deploy')" 
<br />
      /&gt; 
</p>
          <p>
  &lt;Delete Files="@(SourceFilesToDelete)"/&gt; 
</p>
          <p>
  &lt;!-- 
<br />
************************************************ 
<br />
Generate deployment manifest 
<br />
************************************************ 
<br />
--&gt; 
<br />
  &lt;CreateItem Include="$(AppPublishDir)\$(ClickOnceExeFile).manifest"
AdditionalMetadata="TargetPath=Application Files\$(ManifestName)\$(ClickOnceExeFile).manifest"&gt; 
<br />
    &lt;Output TaskParameter="Include" ItemName="ApplicationManifest"/&gt; 
<br />
  &lt;/CreateItem&gt; 
</p>
          <p>
  &lt;Message Text="@(ApplicationManifest)" /&gt; 
</p>
          <p>
  &lt;GenerateDeploymentManifest 
<br />
    MapFileExtensions="true" 
<br />
    AssemblyName="$(ClickOnceAppName).application" 
<br />
    AssemblyVersion="$(VersionNumber)" 
<br />
    Description="$(ClickOnceDescription)" 
<br />
    Product="$(ClickOnceProduct)" 
<br />
    Publisher="$(Company)" 
<br />
    SupportUrl="$(SupportUrl)" 
<br />
    EntryPoint="@(ApplicationManifest)" 
<br />
    Install="false" 
<br />
    UpdateEnabled="true" 
<br />
    UpdateInterval="7" 
<br />
    UpdateMode="Foreground" 
<br />
    OutputManifest="$(PublishDir)\$(ClickOnceAppName).application"/&gt; 
</p>
          <p>
  &lt;!-- 
<br />
************************************************ 
<br />
Sign application manifest 
<br />
************************************************ 
<br />
--&gt; 
<br />
  &lt;!--&lt;Exec Condition="'$(SigningCertPassword)'==''" 
<br />
      Command="mage.exe -Sign &amp;quot;$(PublishDir)\$(ClickOnceAppName).application&amp;quot;
-CertFile &amp;quot;$(SigningCert)&amp;quot;" 
<br />
      WorkingDirectory="$(SdkPath)"/&gt;--&gt; 
<br />
  &lt;Exec Condition="'$(SigningCertPassword)'!=''" 
<br />
      Command="mage.exe -Sign &amp;quot;$(PublishDir)\$(ClickOnceAppName).application&amp;quot;
-CertFile &amp;quot;$(SigningCert)&amp;quot; -Password &amp;quot;$(SigningCertPassword)&amp;quot;" 
<br />
      WorkingDirectory="$(SdkPath)"/&gt; 
</p>
          <p>
  &lt;!-- 
<br />
************************************************ 
<br />
Generate Bootstrapper 
<br />
************************************************ 
<br />
--&gt; 
<br />
  &lt;ItemGroup&gt; 
<br />
    &lt;BootstrapperFile Include="Microsoft.Net.Framework.3.5"&gt; 
<br />
      &lt;ProductName&gt;Microsoft .NET Framework 3.5&lt;/ProductName&gt; 
<br />
    &lt;/BootstrapperFile&gt; 
<br />
    &lt;BootstrapperFile Include="Microsoft.Windows.Installer.3.1"&gt; 
<br />
      &lt;ProductName&gt;Windows Installer 3.1&lt;/ProductName&gt; 
<br />
    &lt;/BootstrapperFile&gt; 
<br />
  &lt;/ItemGroup&gt; 
</p>
          <p>
  &lt;GenerateBootstrapper 
<br />
    ApplicationFile="$(ClickOnceAppName).application" 
<br />
    ApplicationName="$(ClickOnceAppName)" 
<br />
    ApplicationUrl="$(ClickOnceUrl)" 
<br />
    BootstrapperItems="@(BootstrapperFile)" 
<br />
    Culture="en" 
<br />
    FallbackCulture="en-US" 
<br />
    CopyComponents="true" 
<br />
    Validate="false" 
<br />
    OutputPath="$(PublishDir)"/&gt; 
</p>
          <p>
  &lt;Copy SourceFiles="$(PublishDir)\Setup.exe" DestinationFiles="$(PublishDir)\CoolAppSetup.exe"
/&gt; 
<br />
  &lt;Delete Files="$(PublishDir)\Setup.exe" /&gt; 
</p>
          <p>
  &lt;BuildStep 
<br />
    TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
<br />
    BuildUri="$(BuildUri)" 
<br />
    Id="$(StepId)" 
<br />
    Status="Succeeded"/&gt; 
</p>
          <p>
  &lt;OnError ExecuteTargets="MarkBuildStepAsFailed" /&gt; 
<br />
&lt;/Target&gt; 
</p>
          <p>
&lt;!-- 
<br />
************************************************ 
<br />
Mark the buildstep as failed 
<br />
************************************************ 
<br />
--&gt; 
<br />
&lt;Target Name="MarkBuildStepAsFailed"&gt; 
<br />
  &lt;BuildStep 
<br />
    TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
<br />
    BuildUri="$(BuildUri)" 
<br />
    Id="$(StepId)" 
<br />
    Status="Failed"/&gt; 
<br />
&lt;/Target&gt; 
</p>
        </blockquote>
        <p>
The Deploy Builds are simply a Copy task to copy the files to the web server. 
Do this by creating a share to the same location so you can use a UNC.  The production
stage build is basically all of the above again but with the production certificate
key and copy the new config file(s) to the production stage location.
</p>
        <p>
Looking back on this it seems complex but this is what the publish wizard is doing
behind the scenes and offers complete customizing to fit your needs.  I sliced,
diced, and renamed items in the scripts above.  I tried to make sure everything
is correct.  If there is a typo or something missing, please let me know and
will update it.
</p>
        <p>
Enjoy!
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=aafe4ba2-ebc5-474e-974f-4e548637f9b9" />
      </body>
      <title>Building and Deploying ClickOnce Applications with TFS 2008</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,aafe4ba2-ebc5-474e-974f-4e548637f9b9.aspx</guid>
      <link>http://codesmartnothard.com/BuildingAndDeployingClickOnceApplicationsWithTFS2008.aspx</link>
      <pubDate>Thu, 04 Mar 2010 17:20:00 GMT</pubDate>
      <description>&lt;p&gt;
This is Part 4 of my Deployments with TFS series. It has been awhile since I started
putting this information together but I haven’t found time to finish this.&amp;#160;&amp;#160;
A question about building ClickOnce deployments with Team Build 2008 on the MSDN forums
was just what I needed to get this posted.
&lt;/p&gt;
&lt;h3&gt;What is ClickOnce?
&lt;/h3&gt;
&lt;p&gt;
ClickOnce is a deployment technology that enables you to create self-updating windows
based applications that can be installed and run with minimal user interaction.&amp;#160;
For a complete overview of ClickOnce, please visit this the &lt;a href="http://msdn.microsoft.com/en-us/library/142dbbz4.aspx" target="_blank"&gt;ClickOnce
Deployment Overview&lt;/a&gt; article on MSDN.
&lt;/p&gt;
&lt;h3&gt;Our Requirements
&lt;/h3&gt;
&lt;p&gt;
Our requirements contained a couple items that made our deployment more complicated.&amp;#160;
The first one is one a configuration management issue that I strongly pushed.&amp;#160;
Basically there were two environments, Test and Production.&amp;#160; The ClickOnce was
to be built and deployed to the Test server, tested and accepted, and finally pushed
to production.&amp;#160; The problem is that Test used different config files than Production.&amp;#160;
The thing we didn't want to do is to have to rebuild the application to update the
config files, recreate the manifest, and publish to the production.&amp;#160; This had
the potential to introduce something different than was tested.Fortunately our Production
Release build script was able to copy in the new config files and recreate the manifest
and push to production.&amp;#160; The helped ensure the same version of the assemblies
tested.&amp;#160; Of course nothing is perfect, we could have still had problems in our
config files. :)
&lt;/p&gt;
&lt;p&gt;
The next issue is that we wanted to run Test and Production at the same time to compare
if there were problems.&amp;#160; ClickOnce thought these were the same applications so
we were unable to run them both.&amp;#160; The solution for this was to use a different
key for each environment.&amp;#160; In Test we used a test certificate key that we created,
in Production, we used our issued certificate key.&amp;#160; With this, the assemblies
could be the same or different versions and ClickOnce treated them as two separate
applications.
&lt;/p&gt;
&lt;h3&gt;The Solution
&lt;/h3&gt;
&lt;p&gt;
The solution consisted of 4 build scripts
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Build and Stage to Test – This builds the application, creates the ClickOnce manifest,
and then publishes it to a folder share, ready to be deployed to Test (but not yet). 
&lt;/li&gt;
&lt;li&gt;
Deploy to Test – This script copies the ClickOnce application to the web server so
the application is available to the testers.&amp;#160; This script also deployed a WCF
Windows service. 
&lt;/li&gt;
&lt;li&gt;
Stage to Production – This script copied the production config file into the manifest
folder, recreated the manifest (with production certificate), and copied the ClickOnce
application to a staging folder on a production (so it could be deployed at a later
time). 
&lt;/li&gt;
&lt;li&gt;
Deploy to Production – This script copies the ClickOnce application from the production
staging folder to the production web server. 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
The “staging” builds could be combined with the “deployment” builds but I believe
by separating these it offers the most flexibility.&amp;#160; I will now highlight some
of the unique things I had to do to get this all to work.&amp;#160; Unfortunately it wasn’t
as simple as using the MSBUILD task.&amp;#160; I think this would work for a demo or simple
scenario but not a real world scenario.&amp;#160; There wasn’t any way to change any of
the settings.&amp;#160; This offers more options.
&lt;/p&gt;
&lt;h4&gt;Build and Stage To Test
&lt;/h4&gt;
&lt;p&gt;
The first part is the properties.&amp;#160; Here I set all of the ClickOnce properties
that will be used later on in the build.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&amp;lt;PropertyGroup&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;TF&amp;gt;&amp;amp;quot;$(TeamBuildRefPath)\..\tf.exe&amp;amp;quot;&amp;lt;/TF&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;PublishUrl&amp;gt;\\myserver\deployments\coolapp\current\ClickOnceStage\&amp;lt;/PublishUrl&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;ClickOnceAppName&amp;gt;MyCompany.CoolApp&amp;lt;/ClickOnceAppName&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;ClickOnceExeFile&amp;gt;MyCompany.CoolApp.exe&amp;lt;/ClickOnceExeFile&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;ClickOnceProduct&amp;gt;Cool Application&amp;lt;/ClickOnceProduct&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;Company&amp;gt;My Company&amp;lt;/Company&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;ClickOnceDescription&amp;gt;&amp;lt;/ClickOnceDescription&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;ClickOnceUrl&amp;gt;&lt;a href="http://testserver.mycompany.com/"&gt;http://testserver.mycompany.com/&lt;/a&gt;&amp;lt;/ClickOnceUrl&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;SigningCert&amp;gt;$(SolutionRoot)\MyCompany.CoolApp\CoolApp_1_TemporaryKey.pfx&amp;lt;/SigningCert&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;SigningCertPassword&amp;gt;1234&amp;lt;/SigningCertPassword&amp;gt; 
&lt;br /&gt;
&amp;lt;/PropertyGroup&amp;gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The first trick is to edit project file and update the publish url.&amp;#160;&amp;#160; This
allows the build to edit it but not check out the file and need to check it in.&amp;#160;
Do this before the build by overriding the BeforeCompile target.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&amp;lt;Target Name =&amp;quot;BeforeCompile&amp;quot;&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;Message Text=&amp;quot;Making csproj file writable&amp;quot;/&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;Exec Command=&amp;quot;attrib -R &amp;amp;quot;$(SolutionRoot)\MyCompany.CoolApp\MyCompany.CoolApp.csproj&amp;amp;quot;&amp;quot;/&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;Message Text=&amp;quot;Replacing PublishUrl&amp;quot;/&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;File.RegEx 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Path=&amp;quot;$(SolutionRoot)\MyCompany.CoolApp\MyCompany.CoolApp.csproj&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; RegularExpression=&amp;quot;&amp;amp;lt;PublishUrl&amp;amp;gt;(.*?)&amp;amp;lt;/PublishUrl&amp;amp;gt;&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; NewValue=&amp;quot;&amp;amp;lt;PublishUrl&amp;amp;gt;$(PublishUrl)&amp;amp;lt;/PublishUrl&amp;amp;gt;&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; /&amp;gt; 
&lt;br /&gt;
&amp;lt;/Target&amp;gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Take the publish.htm file from a manual ClickOnce publish change the version to a
tag that can be replaced by the updated version number and check it in to the solution.&amp;#160;
After the compile, use the modified version of the publish.htm file copy it to the
staging location and then replace it with the version.&amp;#160; MaxVersion is the variable
the represents the new version.&amp;#160; I like to keep the assembly version the same
as the ClickOnce version.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&amp;lt;Target Name=&amp;quot;AfterCompile&amp;quot; Condition=&amp;quot;'$(IsDesktopBuild)'!='true'&amp;quot;&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;!-- Copy modified publish htm file to staging publish location --&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;Copy SourceFiles=&amp;quot;$(SolutionRoot)\publish.htm&amp;quot; DestinationFolder=&amp;quot;$(PublishUrl)&amp;quot;
/&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;ItemGroup&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;WebPage Include=&amp;quot;$(PublishUrl)\publish.htm&amp;quot; /&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;/ItemGroup&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;RegEx 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Condition=&amp;quot;Exists(@(WebPage))&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Path=&amp;quot;@(WebPage)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; RegularExpression=&amp;quot;#VERSION#&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; NewValue=&amp;quot;$(MaxVersion)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Force=&amp;quot;true&amp;quot;/&amp;gt; 
&lt;br /&gt;
&amp;lt;/Target&amp;gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Next, I used a couple of custom tasks I created.&amp;#160; The first was to get the framework
version.&amp;#160; I couldn’t figure out a way to do this.&amp;#160; Basically this just returns
the .net framework path so I can call Mage.exe.&amp;#160; The second one takes the name
of the app and the version to create the manifest folder.&amp;#160; Then it does the heavy
lifting to create the ClickOnce application.&amp;#160; We have to do each step to make
this work.&amp;#160; There is one thing you will probably noticed is that the setup.exe
is renamed to CoolAppSetup.exe.&amp;#160; This was done because there was a policy that
users couldn’t run setup.exe. I left out the copying of the files to the staging location
before running all of this below.&amp;#160; I had to copy the files individually because
this build script also built the WCF service.&amp;#160; You will need to add the appropriate
process to copy these.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Generate the application manifest 
&lt;/li&gt;
&lt;li&gt;
Sign the application manifest 
&lt;/li&gt;
&lt;li&gt;
Rename the source files to .deploy 
&lt;/li&gt;
&lt;li&gt;
Generate the deployment manifest 
&lt;/li&gt;
&lt;li&gt;
Sign the application manifest (one more time) 
&lt;/li&gt;
&lt;li&gt;
Create the bootstrapper 
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&amp;lt;Target Name=&amp;quot;AfterEndToEndIteration&amp;quot;&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;GetFrameworkPath&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;Output TaskParameter=&amp;quot;FrameworkPath&amp;quot; PropertyName=&amp;quot;FrameworkPath&amp;quot;
/&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;/GetFrameworkPath&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;CreateManifestName ExecutableName=&amp;quot;MyCompany.CoolApp&amp;quot; ExecutableVersion=&amp;quot;$(MaxVersion)&amp;quot;&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;Output TaskParameter=&amp;quot;ManifestName&amp;quot; PropertyName=&amp;quot;ManifestName&amp;quot;
/&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;/CreateManifestName&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;PropertyGroup&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;ClickOnceApplicationUrl&amp;gt;$(ClickOnceUrl)$(ClickOnceAppName).application&amp;lt;/ClickOnceApplicationUrl&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;PublishDir&amp;gt;$(PublishUrl)&amp;lt;/PublishDir&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;AppPublishDir&amp;gt;$(PublishDir)Application Files\$(ManifestName)&amp;lt;/AppPublishDir&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;SdkPath&amp;gt;$(FrameworkPath)\&amp;lt;/SdkPath&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;VersionNumber&amp;gt;$(MaxVersion)&amp;lt;/VersionNumber&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;/PropertyGroup&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;Message Text=&amp;quot;FrameworkPath = $(FrameworkPath)&amp;quot; /&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;BuildStep 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; TeamFoundationServerUrl=&amp;quot;$(TeamFoundationServerUrl)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; BuildUri=&amp;quot;$(BuildUri)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Message=&amp;quot;Building $(ClickOnceAppName) ClickOnce version: $(VersionNumber)&amp;quot;&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;Output TaskParameter=&amp;quot;Id&amp;quot; PropertyName=&amp;quot;StepId&amp;quot;
/&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;/BuildStep&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;!-- 
&lt;br /&gt;
************************************************ 
&lt;br /&gt;
Generate application manifest 
&lt;br /&gt;
************************************************ 
&lt;br /&gt;
--&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;Exec 
&lt;br /&gt;
&amp;#160; Command=&amp;quot;mage.exe -New Application -TrustLevel FullTrust -ToFile &amp;amp;quot;$(AppPublishDir)\$(ClickOnceExeFile).manifest&amp;amp;quot;
-Name &amp;amp;quot;$(ClickOnceAppName)&amp;amp;quot; -Version &amp;amp;quot;$(VersionNumber)&amp;amp;quot;
-FromDirectory &amp;amp;quot;$(AppPublishDir)&amp;quot; 
&lt;br /&gt;
&amp;#160; WorkingDirectory=&amp;quot;$(SdkPath)&amp;quot;/&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;!-- 
&lt;br /&gt;
************************************************ 
&lt;br /&gt;
Sign application manifest 
&lt;br /&gt;
************************************************ 
&lt;br /&gt;
--&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;!--&amp;lt;Exec Condition=&amp;quot;'$(SigningCertPassword)'==''&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Command=&amp;quot;mage.exe -Sign &amp;amp;quot;$(AppPublishDir)\$(ClickOnceExeFile).manifest&amp;amp;quot;
-CertFile &amp;amp;quot;$(SigningCert)&amp;amp;quot;&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; WorkingDirectory=&amp;quot;$(SdkPath)&amp;quot;&amp;#160; /&amp;gt;--&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;Exec Condition=&amp;quot;'$(SigningCertPassword)'!=''&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Command=&amp;quot;mage.exe -Sign &amp;amp;quot;$(AppPublishDir)\$(ClickOnceExeFile).manifest&amp;amp;quot;
-CertFile &amp;amp;quot;$(SigningCert)&amp;amp;quot; -Password &amp;amp;quot;$(SigningCertPassword)&amp;amp;quot;&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WorkingDirectory=&amp;quot;$(SdkPath)&amp;quot;/&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;!-- 
&lt;br /&gt;
************************************************ 
&lt;br /&gt;
Rename source files to .deploy 
&lt;br /&gt;
************************************************ 
&lt;br /&gt;
--&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;ItemGroup&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;SourceFilesToRename Include=&amp;quot;$(AppPublishDir)\**\*.*&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
Exclude=&amp;quot;$(AppPublishDir)\*.manifest;$(AppPublishDir)\*.htm&amp;quot;/&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;SourceFilesToDelete Include=&amp;quot;$(AppPublishDir)\**\*.*&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
Exclude=&amp;quot;$(AppPublishDir)\*.application;$(AppPublishDir)\*.manifest;$(AppPublishDir)\*.htm&amp;quot;/&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;/ItemGroup&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;Copy 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SourceFiles=&amp;quot;@(SourceFilesToRename)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DestinationFiles=&amp;quot;@(SourceFilesToRename-&amp;gt;'$(AppPublishDir)\%(RecursiveDir)%(Filename)%(Extension).deploy')&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;Delete Files=&amp;quot;@(SourceFilesToDelete)&amp;quot;/&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;!-- 
&lt;br /&gt;
************************************************ 
&lt;br /&gt;
Generate deployment manifest 
&lt;br /&gt;
************************************************ 
&lt;br /&gt;
--&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;CreateItem Include=&amp;quot;$(AppPublishDir)\$(ClickOnceExeFile).manifest&amp;quot;
AdditionalMetadata=&amp;quot;TargetPath=Application Files\$(ManifestName)\$(ClickOnceExeFile).manifest&amp;quot;&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;Output TaskParameter=&amp;quot;Include&amp;quot; ItemName=&amp;quot;ApplicationManifest&amp;quot;/&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;/CreateItem&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;Message Text=&amp;quot;@(ApplicationManifest)&amp;quot; /&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;GenerateDeploymentManifest 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; MapFileExtensions=&amp;quot;true&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; AssemblyName=&amp;quot;$(ClickOnceAppName).application&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; AssemblyVersion=&amp;quot;$(VersionNumber)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Description=&amp;quot;$(ClickOnceDescription)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Product=&amp;quot;$(ClickOnceProduct)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Publisher=&amp;quot;$(Company)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; SupportUrl=&amp;quot;$(SupportUrl)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; EntryPoint=&amp;quot;@(ApplicationManifest)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Install=&amp;quot;false&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; UpdateEnabled=&amp;quot;true&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; UpdateInterval=&amp;quot;7&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; UpdateMode=&amp;quot;Foreground&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; OutputManifest=&amp;quot;$(PublishDir)\$(ClickOnceAppName).application&amp;quot;/&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;!-- 
&lt;br /&gt;
************************************************ 
&lt;br /&gt;
Sign application manifest 
&lt;br /&gt;
************************************************ 
&lt;br /&gt;
--&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;!--&amp;lt;Exec Condition=&amp;quot;'$(SigningCertPassword)'==''&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Command=&amp;quot;mage.exe -Sign &amp;amp;quot;$(PublishDir)\$(ClickOnceAppName).application&amp;amp;quot;
-CertFile &amp;amp;quot;$(SigningCert)&amp;amp;quot;&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WorkingDirectory=&amp;quot;$(SdkPath)&amp;quot;/&amp;gt;--&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;Exec Condition=&amp;quot;'$(SigningCertPassword)'!=''&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Command=&amp;quot;mage.exe -Sign &amp;amp;quot;$(PublishDir)\$(ClickOnceAppName).application&amp;amp;quot;
-CertFile &amp;amp;quot;$(SigningCert)&amp;amp;quot; -Password &amp;amp;quot;$(SigningCertPassword)&amp;amp;quot;&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WorkingDirectory=&amp;quot;$(SdkPath)&amp;quot;/&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;!-- 
&lt;br /&gt;
************************************************ 
&lt;br /&gt;
Generate Bootstrapper 
&lt;br /&gt;
************************************************ 
&lt;br /&gt;
--&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;ItemGroup&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;BootstrapperFile Include=&amp;quot;Microsoft.Net.Framework.3.5&amp;quot;&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ProductName&amp;gt;Microsoft .NET Framework 3.5&amp;lt;/ProductName&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/BootstrapperFile&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;BootstrapperFile Include=&amp;quot;Microsoft.Windows.Installer.3.1&amp;quot;&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ProductName&amp;gt;Windows Installer 3.1&amp;lt;/ProductName&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/BootstrapperFile&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;/ItemGroup&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;GenerateBootstrapper 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; ApplicationFile=&amp;quot;$(ClickOnceAppName).application&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; ApplicationName=&amp;quot;$(ClickOnceAppName)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; ApplicationUrl=&amp;quot;$(ClickOnceUrl)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; BootstrapperItems=&amp;quot;@(BootstrapperFile)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Culture=&amp;quot;en&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; FallbackCulture=&amp;quot;en-US&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; CopyComponents=&amp;quot;true&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Validate=&amp;quot;false&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; OutputPath=&amp;quot;$(PublishDir)&amp;quot;/&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;Copy SourceFiles=&amp;quot;$(PublishDir)\Setup.exe&amp;quot; DestinationFiles=&amp;quot;$(PublishDir)\CoolAppSetup.exe&amp;quot;
/&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;Delete Files=&amp;quot;$(PublishDir)\Setup.exe&amp;quot; /&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;BuildStep 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; TeamFoundationServerUrl=&amp;quot;$(TeamFoundationServerUrl)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; BuildUri=&amp;quot;$(BuildUri)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Id=&amp;quot;$(StepId)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Status=&amp;quot;Succeeded&amp;quot;/&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;OnError ExecuteTargets=&amp;quot;MarkBuildStepAsFailed&amp;quot; /&amp;gt; 
&lt;br /&gt;
&amp;lt;/Target&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;lt;!-- 
&lt;br /&gt;
************************************************ 
&lt;br /&gt;
Mark the buildstep as failed 
&lt;br /&gt;
************************************************ 
&lt;br /&gt;
--&amp;gt; 
&lt;br /&gt;
&amp;lt;Target Name=&amp;quot;MarkBuildStepAsFailed&amp;quot;&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;BuildStep 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; TeamFoundationServerUrl=&amp;quot;$(TeamFoundationServerUrl)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; BuildUri=&amp;quot;$(BuildUri)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Id=&amp;quot;$(StepId)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Status=&amp;quot;Failed&amp;quot;/&amp;gt; 
&lt;br /&gt;
&amp;lt;/Target&amp;gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The Deploy Builds are simply a Copy task to copy the files to the web server.&amp;#160;
Do this by creating a share to the same location so you can use a UNC.&amp;#160; The production
stage build is basically all of the above again but with the production certificate
key and copy the new config file(s) to the production stage location.
&lt;/p&gt;
&lt;p&gt;
Looking back on this it seems complex but this is what the publish wizard is doing
behind the scenes and offers complete customizing to fit your needs.&amp;#160; I sliced,
diced, and renamed items in the scripts above.&amp;#160; I tried to make sure everything
is correct.&amp;#160; If there is a typo or something missing, please let me know and
will update it.
&lt;/p&gt;
&lt;p&gt;
Enjoy!
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=aafe4ba2-ebc5-474e-974f-4e548637f9b9" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,aafe4ba2-ebc5-474e-974f-4e548637f9b9.aspx</comments>
      <category>ClickOnce;Team Build;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=2fb0b2ea-0953-4c38-9af6-99038dbb37dd</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,2fb0b2ea-0953-4c38-9af6-99038dbb37dd.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,2fb0b2ea-0953-4c38-9af6-99038dbb37dd.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=2fb0b2ea-0953-4c38-9af6-99038dbb37dd</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In previous versions of Team Foundation Server there was not a way to install and
configure TFS to be run in a completely high available environment.  TFS 2008
supports the data tier running in a SQL Server Cluster.  If the TFS application
tier server crashed, there could be a “warm standby” configured to take over but required
a manual process to do this.   TFS 2010 supports running multiple Application
tier servers using Network Load Balancing (NLB).  Last year I first heard of
topology improvements in TFS 2010 in Brian Harry’s post about the <a href="http://blogs.msdn.com/bharry/archive/2009/04/30/tfs-2010-admin-operations-setup-improvements.aspx" target="_blank">Administrator,
Operations,and Setup Improvements in Team Foundation Server 2010</a>.  I think
this is an extremely important feature as companies are utilizing more features in
Team Foundation Server and expecting these services to always be available.
</p>
        <p>
In this post I am going to explain:
</p>
        <ul>
          <li>
Configuring the second TFS application tier</li>
          <li>
Enabling and configuring Network Load Balancing in Windows Server 2008 R2</li>
          <li>
Testing TFS using the NLB Application tier severs</li>
          <li>
Lessons learned 
</li>
        </ul>
        <p>
 
</p>
        <h3>Team Foundation Server 2010 Farm Network Topology Diagram
</h3>
        <p>
This is a diagram shows the topology of the TFS configuration I created to demonstrate
the NLB option.
</p>
        <p>
 
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/image_6.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/image_thumb_2.png" width="600" height="243" />
          </a>
        </p>
        <p>
 
</p>
        <p>
I set up this environment on a laptop.  I installed Windows Server 2008 R2 x64
on the laptop as the host OS to utilize Hyper-V.   I added Active Directory
Domain Services (ADDS) and DNS to this machine and configured it as the domain controller. 
I installed SQL Server 2008 R2 x64 on it also to be the data tier for the TFS installation. 
Both TFS Application Tier Servers were created as Hyper-V virtual machines with Windows
2008 R2 x64.  To make this configuration 100% redundant I would have needed to
install the reporting services on both of the TFS Servers, used a SharePoint 2007
Farm for the portal, and a SQL Server cluster for the data tier.  In fact, now
that I have all of this working, I am going to uninstall everything and try to get
WSS and SSRS installed on both application tiers also utilizing the NLB.  This
would allow for 100% redundant and high availability for all of the TFS 2010 Components
with only 4 servers (creating a 2 server SQL Server Cluster). I will post a follow
up on how this goes..
</p>
        <p>
 
</p>
        <h3>Team Foundation Server Installation
</h3>
        <p>
The TFS installation and configuration for the first server (TFS2010A) was done just
as if it was going to be the only server.  Here are the settings after I installed
the first server.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/oneserver_apptiersettings_2.jpg">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="oneserver_apptiersettings" border="0" alt="oneserver_apptiersettings" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/oneserver_apptiersettings_thumb.jpg" width="454" height="182" />
          </a>
        </p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/oneserver_datatiersettings_2.jpg">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="oneserver_datatiersettings" border="0" alt="oneserver_datatiersettings" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/oneserver_datatiersettings_thumb.jpg" width="454" height="109" />
          </a>
        </p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/oneserver_reportingserversettings_2.jpg">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="oneserver_reportingserversettings" border="0" alt="oneserver_reportingserversettings" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/oneserver_reportingserversettings_thumb.jpg" width="454" height="79" />
          </a>
        </p>
        <p>
 
</p>
        <p>
For the second server (TFS2010B), the only pre-requisites that were required were
IIS 7 and SQL Client connectivity tools.    Below are the steps for
configuring the second TFS Server.
</p>
        <p>
In the TFS configuration, choose the “Application-Tier Only” installation option. 
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly_2.jpg">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly" border="0" alt="configure_apptieronly" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly_thumb.jpg" width="454" height="342" />
          </a>
        </p>
        <p>
The first step was the Welcome step.  There were no options on this step. 
The next step is to specify the configuration database that was created when the first
server was configured.  
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly3_2.jpg">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly3" border="0" alt="configure_apptieronly3" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly3_thumb.jpg" width="454" height="342" />
          </a>
        </p>
        <p>
Next, specify the service account for the the new application tier.  I chose
to use the same domain account that I used for the first server.
</p>
        <p>
 <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly4_2.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly4" border="0" alt="configure_apptieronly4" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly4_thumb.jpg" width="454" height="342" /></a></p>
        <p>
This screen shows the summary of the settings that were chosen before the verification
is run.
</p>
        <p>
 <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly5_2.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly5" border="0" alt="configure_apptieronly5" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly5_thumb.jpg" width="454" height="342" /></a></p>
        <p>
After the first time I ran the verification I received two errors.  One was that
.Net 3.5sp1 wasn’t installed.  I’m not sure why I reported this error. 
When I checked it, it was installed.  It could be related to other error. 
The other error, TF255040, was that I didn’t have Reporting Services or SQL Server
Connectivity tools installed.
</p>
        <p>
 <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly6_error_2.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly6_error" border="0" alt="configure_apptieronly6_error" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly6_error_thumb.jpg" width="454" height="342" /></a></p>
        <p>
I installed the connectivity tools and reran the verification process and it passed
this time.
</p>
        <p>
 <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly7_2.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly7" border="0" alt="configure_apptieronly7" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly7_thumb.jpg" width="454" height="342" /></a></p>
        <p>
The configuration completed successfully.
</p>
        <p>
 <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly9_2.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly9" border="0" alt="configure_apptieronly9" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly9_thumb.jpg" width="454" height="342" /></a></p>
        <p>
The TFS administrative console now shows both application tier servers.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly10_2.jpg">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly10" border="0" alt="configure_apptieronly10" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly10_thumb.jpg" width="454" height="278" />
          </a> 
</p>
        <p>
 
</p>
        <h3>Setting up Network Load Balancing in Windows 2008 R2 and Hyper-V
</h3>
        <p>
Now that both servers are installed and configured correctly, the next step is to
set up Network Load Balancing (NLB).  This will allows users to connect to TFS
through a single endpoint and allow NLB to balance the traffic and route all of the
traffic to one server if the other is unavailable.  This provides high availability
in the event of an outage or when the servers need to be updated.
</p>
        <p>
The first thing to do before setting up NLB is to pick a static IP address and create
a DNS (A) Record for the shared name.  In this example, TFS2010 is the endpoint
that clients such as Visual Studio 2010.  Here is a snapshot of the A records.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_nlb5_2.jpg">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="configure_nlb5" border="0" alt="configure_nlb5" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_nlb5_thumb.jpg" width="454" height="85" />
          </a>
        </p>
        <p>
 
</p>
        <p>
Here is an article I used to help enable and configure NLB in Windows Server 2008
R2.  Below are the steps I performed to configure it. 
<br /><a title="http://technet.microsoft.com/en-us/library/cc731695.aspx" href="http://technet.microsoft.com/en-us/library/cc731695.aspx">http://technet.microsoft.com/en-us/library/cc731695.aspx</a></p>
        <p>
For each TFS Application Tier server, install Network Load Balancing by going to Server
Manager &gt; Features &gt; Add Features &gt; Network Load Balancing
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_nlb_2.jpg">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="configure_nlb" border="0" alt="configure_nlb" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_nlb_thumb.jpg" width="454" height="336" />
          </a>
        </p>
        <p>
Once NLB is installed on all of the App Tiers, run the Network Load Balancing Manager
by typing <strong>nlbmgr</strong> at the command prompt.  Then connect to one
of the hosts.  I chose <strong>TFS2010a</strong> first.  Right click on
the Network Load Balance node and choose “Add New Cluster”.  Add the current
server to the node by walking through the wizard.  You should be able to leave
the defaults unless you want to limit the NLB to just port 8080. The last step of
the wizard is to assign the Cluster a shared IP Address.  This IP Address is
how all of the clients will access and see it.  Make sure this is different than
the IP addresses of the any of the nodes in the cluster.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_nlb2_2.jpg">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="configure_nlb2" border="0" alt="configure_nlb2" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_nlb2_thumb.jpg" width="454" height="353" />
          </a> 
</p>
        <p>
Next, add the other host to the cluster by right clicking on the cluster and choosing
“Add Host to Cluster”.  Enter the name of the Host to be added to the cluster.
</p>
        <p>
Here is what the Cluster looks like when it is configured.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/nlb_configured_2.jpg">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="nlb_configured" border="0" alt="nlb_configured" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/nlb_configured_thumb.jpg" width="504" height="114" />
          </a>
        </p>
        <p>
 
</p>
        <h3>Connect to TFS from Visual Studio 2010
</h3>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/connect_tfs_nlb_2.jpg">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="connect_tfs_nlb" border="0" alt="connect_tfs_nlb" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/connect_tfs_nlb_thumb.jpg" width="454" height="298" />
          </a>
        </p>
        <p>
 
</p>
        <h3>Testing the high availability servers
</h3>
        <p>
To test the high availability configuration, I am going to take down one of the TFS
application tier servers and then both.  First I created the team project while
both servers were available.
</p>
        <p>
Then I created a C# windows project, checked it in, and then checked out one of the
files.
</p>
        <p>
Next, I disabled the NIC on TFS2010a.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/disabled_tfs2010a_nic_2.jpg">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="disabled_tfs2010a_nic" border="0" alt="disabled_tfs2010a_nic" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/disabled_tfs2010a_nic_thumb.jpg" width="304" height="209" />
          </a>
        </p>
        <p>
I did a Undo checkout on the file
</p>
        <p>
NLB rerouted the traffic to TFS2010B and it worked perfect.
</p>
        <p>
Next, I Disabled the NIC on TFS2010b so now both are disabled and it should error.
</p>
        <p>
Tried to check out a file and got a TFS not available error as expected.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/both_tfs_servers_nic_disabled_2.jpg">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="both_tfs_servers_nic_disabled" border="0" alt="both_tfs_servers_nic_disabled" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/both_tfs_servers_nic_disabled_thumb.jpg" width="454" height="236" />
          </a> 
</p>
        <p>
Last, I re-enabled the NIC on TFS2010A
</p>
        <p>
I performed the check out again and worked perfect.
</p>
        <p>
The NLB worked as expected.
</p>
        <p>
 
</p>
        <h3>Lessons Learned
</h3>
        <p>
I’m a developer.  I started my IT career as a server and desktop administrator
but that was a long time ago.  So setting up a domain to test this scenario was
fun but I ran into a few unexpected problems.   Here are a couple things
that slowed me down.
</p>
        <ul>
          <li>
Installed DHCP and DNS with dynamic IP.  Make sure you assign a static IP address
to the virtual internal network card on the DC.  Actually now that I have assigned
static IP addresses to both of the TFS Servers, DHCP doesn’t even need to be installed. 
</li>
          <li>
I couldn’t reach SQL Server 2008 R2 from the TFS Servers.  I got an TF255049
error in the TFS configuration.  I installed the SQL Server Management Studio
and couldn’t connect using that.  I set up aliases and toggled named pipes on
and off.  Still couldn’t connect.  Finally I stumbled upon the network protocol
configuration for SQL.  TCP and Named Pipes were disabled.   Seems
very strange but probably a security precaution.  I enabled TCP/IP and it worked
perfect. 
</li>
        </ul>
        <p>
 
</p>
        <p>
          <strong>NLB Issue</strong>
        </p>
        <p>
I ran into an issue trying to configure NLB on Windows Server 2008 R2 using Hyper-V
</p>
        <blockquote>
          <p>
“The interface is misconfigured”
</p>
          <p>
Cluster IP address (IP) not added to TCPIP properties
</p>
          <p>
Dedicated IP address (IP) not added to TCPIP properties
</p>
        </blockquote>
        <p>
Fix is to enable MAC spoofing in the settings of each VM in Hyper-V.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/enable_mac_spoofing_2.jpg">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="enable_mac_spoofing" border="0" alt="enable_mac_spoofing" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/enable_mac_spoofing_thumb.jpg" width="354" height="212" />
          </a>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
Enjoy!
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=2fb0b2ea-0953-4c38-9af6-99038dbb37dd" />
      </body>
      <title>Setting up a Team Foundation Server 2010 Farm using NLB</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,2fb0b2ea-0953-4c38-9af6-99038dbb37dd.aspx</guid>
      <link>http://codesmartnothard.com/SettingUpATeamFoundationServer2010FarmUsingNLB.aspx</link>
      <pubDate>Sun, 28 Feb 2010 02:04:00 GMT</pubDate>
      <description>&lt;p&gt;
In previous versions of Team Foundation Server there was not a way to install and
configure TFS to be run in a completely high available environment.&amp;#160; TFS 2008
supports the data tier running in a SQL Server Cluster.&amp;#160; If the TFS application
tier server crashed, there could be a “warm standby” configured to take over but required
a manual process to do this.&amp;#160;&amp;#160; TFS 2010 supports running multiple Application
tier servers using Network Load Balancing (NLB).&amp;#160; Last year I first heard of
topology improvements in TFS 2010 in Brian Harry’s post about the &lt;a href="http://blogs.msdn.com/bharry/archive/2009/04/30/tfs-2010-admin-operations-setup-improvements.aspx" target="_blank"&gt;Administrator,
Operations,and Setup Improvements in Team Foundation Server 2010&lt;/a&gt;.&amp;#160; I think
this is an extremely important feature as companies are utilizing more features in
Team Foundation Server and expecting these services to always be available.
&lt;/p&gt;
&lt;p&gt;
In this post I am going to explain:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Configuring the second TFS application tier&lt;/li&gt;
&lt;li&gt;
Enabling and configuring Network Load Balancing in Windows Server 2008 R2&lt;/li&gt;
&lt;li&gt;
Testing TFS using the NLB Application tier severs&lt;/li&gt;
&lt;li&gt;
Lessons learned 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;Team Foundation Server 2010 Farm Network Topology Diagram
&lt;/h3&gt;
&lt;p&gt;
This is a diagram shows the topology of the TFS configuration I created to demonstrate
the NLB option.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/image_thumb_2.png" width="600" height="243" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
I set up this environment on a laptop.&amp;#160; I installed Windows Server 2008 R2 x64
on the laptop as the host OS to utilize Hyper-V.&amp;#160;&amp;#160; I added Active Directory
Domain Services (ADDS) and DNS to this machine and configured it as the domain controller.&amp;#160;
I installed SQL Server 2008 R2 x64 on it also to be the data tier for the TFS installation.&amp;#160;
Both TFS Application Tier Servers were created as Hyper-V virtual machines with Windows
2008 R2 x64.&amp;#160; To make this configuration 100% redundant I would have needed to
install the reporting services on both of the TFS Servers, used a SharePoint 2007
Farm for the portal, and a SQL Server cluster for the data tier.&amp;#160; In fact, now
that I have all of this working, I am going to uninstall everything and try to get
WSS and SSRS installed on both application tiers also utilizing the NLB.&amp;#160; This
would allow for 100% redundant and high availability for all of the TFS 2010 Components
with only 4 servers (creating a 2 server SQL Server Cluster). I will post a follow
up on how this goes..
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;Team Foundation Server Installation
&lt;/h3&gt;
&lt;p&gt;
The TFS installation and configuration for the first server (TFS2010A) was done just
as if it was going to be the only server.&amp;#160; Here are the settings after I installed
the first server.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/oneserver_apptiersettings_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="oneserver_apptiersettings" border="0" alt="oneserver_apptiersettings" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/oneserver_apptiersettings_thumb.jpg" width="454" height="182" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/oneserver_datatiersettings_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="oneserver_datatiersettings" border="0" alt="oneserver_datatiersettings" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/oneserver_datatiersettings_thumb.jpg" width="454" height="109" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/oneserver_reportingserversettings_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="oneserver_reportingserversettings" border="0" alt="oneserver_reportingserversettings" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/oneserver_reportingserversettings_thumb.jpg" width="454" height="79" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
For the second server (TFS2010B), the only pre-requisites that were required were
IIS 7 and SQL Client connectivity tools.&amp;#160;&amp;#160;&amp;#160; Below are the steps for
configuring the second TFS Server.
&lt;/p&gt;
&lt;p&gt;
In the TFS configuration, choose the “Application-Tier Only” installation option. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly" border="0" alt="configure_apptieronly" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly_thumb.jpg" width="454" height="342" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
The first step was the Welcome step.&amp;#160; There were no options on this step.&amp;#160;
The next step is to specify the configuration database that was created when the first
server was configured.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly3_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly3" border="0" alt="configure_apptieronly3" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly3_thumb.jpg" width="454" height="342" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Next, specify the service account for the the new application tier.&amp;#160; I chose
to use the same domain account that I used for the first server.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly4_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly4" border="0" alt="configure_apptieronly4" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly4_thumb.jpg" width="454" height="342" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
This screen shows the summary of the settings that were chosen before the verification
is run.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly5_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly5" border="0" alt="configure_apptieronly5" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly5_thumb.jpg" width="454" height="342" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
After the first time I ran the verification I received two errors.&amp;#160; One was that
.Net 3.5sp1 wasn’t installed.&amp;#160; I’m not sure why I reported this error.&amp;#160;
When I checked it, it was installed.&amp;#160; It could be related to other error.&amp;#160;
The other error, TF255040, was that I didn’t have Reporting Services or SQL Server
Connectivity tools installed.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly6_error_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly6_error" border="0" alt="configure_apptieronly6_error" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly6_error_thumb.jpg" width="454" height="342" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
I installed the connectivity tools and reran the verification process and it passed
this time.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly7_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly7" border="0" alt="configure_apptieronly7" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly7_thumb.jpg" width="454" height="342" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The configuration completed successfully.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly9_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly9" border="0" alt="configure_apptieronly9" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly9_thumb.jpg" width="454" height="342" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
The TFS administrative console now shows both application tier servers.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly10_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="configure_apptieronly10" border="0" alt="configure_apptieronly10" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_apptieronly10_thumb.jpg" width="454" height="278" /&gt;&lt;/a&gt;&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;Setting up Network Load Balancing in Windows 2008 R2 and Hyper-V
&lt;/h3&gt;
&lt;p&gt;
Now that both servers are installed and configured correctly, the next step is to
set up Network Load Balancing (NLB).&amp;#160; This will allows users to connect to TFS
through a single endpoint and allow NLB to balance the traffic and route all of the
traffic to one server if the other is unavailable.&amp;#160; This provides high availability
in the event of an outage or when the servers need to be updated.
&lt;/p&gt;
&lt;p&gt;
The first thing to do before setting up NLB is to pick a static IP address and create
a DNS (A) Record for the shared name.&amp;#160; In this example, TFS2010 is the endpoint
that clients such as Visual Studio 2010.&amp;#160; Here is a snapshot of the A records.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_nlb5_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="configure_nlb5" border="0" alt="configure_nlb5" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_nlb5_thumb.jpg" width="454" height="85" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Here is an article I used to help enable and configure NLB in Windows Server 2008
R2.&amp;#160; Below are the steps I performed to configure it. 
&lt;br /&gt;
&lt;a title="http://technet.microsoft.com/en-us/library/cc731695.aspx" href="http://technet.microsoft.com/en-us/library/cc731695.aspx"&gt;http://technet.microsoft.com/en-us/library/cc731695.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
For each TFS Application Tier server, install Network Load Balancing by going to Server
Manager &amp;gt; Features &amp;gt; Add Features &amp;gt; Network Load Balancing
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_nlb_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="configure_nlb" border="0" alt="configure_nlb" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_nlb_thumb.jpg" width="454" height="336" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Once NLB is installed on all of the App Tiers, run the Network Load Balancing Manager
by typing &lt;strong&gt;nlbmgr&lt;/strong&gt; at the command prompt.&amp;#160; Then connect to one
of the hosts.&amp;#160; I chose &lt;strong&gt;TFS2010a&lt;/strong&gt; first.&amp;#160; Right click on
the Network Load Balance node and choose “Add New Cluster”.&amp;#160; Add the current
server to the node by walking through the wizard.&amp;#160; You should be able to leave
the defaults unless you want to limit the NLB to just port 8080. The last step of
the wizard is to assign the Cluster a shared IP Address.&amp;#160; This IP Address is
how all of the clients will access and see it.&amp;#160; Make sure this is different than
the IP addresses of the any of the nodes in the cluster.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_nlb2_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="configure_nlb2" border="0" alt="configure_nlb2" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/configure_nlb2_thumb.jpg" width="454" height="353" /&gt;&lt;/a&gt;&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Next, add the other host to the cluster by right clicking on the cluster and choosing
“Add Host to Cluster”.&amp;#160; Enter the name of the Host to be added to the cluster.
&lt;/p&gt;
&lt;p&gt;
Here is what the Cluster looks like when it is configured.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/nlb_configured_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="nlb_configured" border="0" alt="nlb_configured" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/nlb_configured_thumb.jpg" width="504" height="114" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;Connect to TFS from Visual Studio 2010
&lt;/h3&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/connect_tfs_nlb_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="connect_tfs_nlb" border="0" alt="connect_tfs_nlb" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/connect_tfs_nlb_thumb.jpg" width="454" height="298" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;Testing the high availability servers
&lt;/h3&gt;
&lt;p&gt;
To test the high availability configuration, I am going to take down one of the TFS
application tier servers and then both.&amp;#160; First I created the team project while
both servers were available.
&lt;/p&gt;
&lt;p&gt;
Then I created a C# windows project, checked it in, and then checked out one of the
files.
&lt;/p&gt;
&lt;p&gt;
Next, I disabled the NIC on TFS2010a.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/disabled_tfs2010a_nic_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="disabled_tfs2010a_nic" border="0" alt="disabled_tfs2010a_nic" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/disabled_tfs2010a_nic_thumb.jpg" width="304" height="209" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
I did a Undo checkout on the file
&lt;/p&gt;
&lt;p&gt;
NLB rerouted the traffic to TFS2010B and it worked perfect.
&lt;/p&gt;
&lt;p&gt;
Next, I Disabled the NIC on TFS2010b so now both are disabled and it should error.
&lt;/p&gt;
&lt;p&gt;
Tried to check out a file and got a TFS not available error as expected.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/both_tfs_servers_nic_disabled_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="both_tfs_servers_nic_disabled" border="0" alt="both_tfs_servers_nic_disabled" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/both_tfs_servers_nic_disabled_thumb.jpg" width="454" height="236" /&gt;&lt;/a&gt;&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Last, I re-enabled the NIC on TFS2010A
&lt;/p&gt;
&lt;p&gt;
I performed the check out again and worked perfect.
&lt;/p&gt;
&lt;p&gt;
The NLB worked as expected.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;Lessons Learned
&lt;/h3&gt;
&lt;p&gt;
I’m a developer.&amp;#160; I started my IT career as a server and desktop administrator
but that was a long time ago.&amp;#160; So setting up a domain to test this scenario was
fun but I ran into a few unexpected problems.&amp;#160;&amp;#160; Here are a couple things
that slowed me down.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Installed DHCP and DNS with dynamic IP.&amp;#160; Make sure you assign a static IP address
to the virtual internal network card on the DC.&amp;#160; Actually now that I have assigned
static IP addresses to both of the TFS Servers, DHCP doesn’t even need to be installed. 
&lt;/li&gt;
&lt;li&gt;
I couldn’t reach SQL Server 2008 R2 from the TFS Servers.&amp;#160; I got an TF255049
error in the TFS configuration.&amp;#160; I installed the SQL Server Management Studio
and couldn’t connect using that.&amp;#160; I set up aliases and toggled named pipes on
and off.&amp;#160; Still couldn’t connect.&amp;#160; Finally I stumbled upon the network protocol
configuration for SQL.&amp;#160; TCP and Named Pipes were disabled.&amp;#160;&amp;#160; Seems
very strange but probably a security precaution.&amp;#160; I enabled TCP/IP and it worked
perfect. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;NLB Issue&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
I ran into an issue trying to configure NLB on Windows Server 2008 R2 using Hyper-V
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
“The interface is misconfigured”
&lt;/p&gt;
&lt;p&gt;
Cluster IP address (IP) not added to TCPIP properties
&lt;/p&gt;
&lt;p&gt;
Dedicated IP address (IP) not added to TCPIP properties
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Fix is to enable MAC spoofing in the settings of each VM in Hyper-V.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/enable_mac_spoofing_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="enable_mac_spoofing" border="0" alt="enable_mac_spoofing" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SettingupaTeamFoundationServer2010Farmwi_EB10/enable_mac_spoofing_thumb.jpg" width="354" height="212" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Enjoy!
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=2fb0b2ea-0953-4c38-9af6-99038dbb37dd" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,2fb0b2ea-0953-4c38-9af6-99038dbb37dd.aspx</comments>
      <category>SQL Server 2008;Team Foundation Server;TFS 2010;Visual Studio 2010</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=7004c120-d3f4-48df-8177-3ada3b03ef2d</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,7004c120-d3f4-48df-8177-3ada3b03ef2d.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,7004c120-d3f4-48df-8177-3ada3b03ef2d.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=7004c120-d3f4-48df-8177-3ada3b03ef2d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We have a lot of exciting things going on at Deliveron Consulting Services. I wanted
to post a few of the updates.
</p>
        <h3>Get Social with Deliveron 
</h3>
        <p>
          <a href="http://www.facebook.com/pages/Deliveron-Consulting-Services/92712059791" target="_blank">
            <img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="Deliveron Consulting Services on FaceBook" src="http://www.deliveron.com/Images/facebook_logo.png" width="32" height="32" />
          </a> 
Become a Facebook fan of Deliveron: <a title="http://www.facebook.com/pages/Deliveron-Consulting-Services/92712059791" href="http://www.facebook.com/pages/Deliveron-Consulting-Services/92712059791">http://www.facebook.com/pages/Deliveron-Consulting-Services/92712059791</a></p>
        <p>
          <a href="http://www.twitter.com/deliveron" target="_blank">
            <img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="" src="http://twitter-badges.s3.amazonaws.com/t_logo-a.png" width="32" height="32" />
          </a> 
Follow Deliveron on Twitter: <a href="http://www.twitter.com/deliveron">http://www.twitter.com/deliveron</a></p>
        <p>
 <a href="http://www.linkedin.com/groups?about=&amp;gid=2573249" target="_blank"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="Linked In" src="http://www.deliveron.com/Images/LinkedIn.png" /></a> 
Join the LinkedIn <a href="http://www.linkedin.com/groups?about=&amp;gid=2573249" target="_blank">Deliveron
Consulting Services Network</a> group.
</p>
        <p>
 
</p>
        <h3>Deliveron Website Updates
</h3>
        <p>
We have implemented a few website updates.  These include:
</p>
        <ul>
          <li>
            <a href="http://www.deliveron.com/consulting_services_jumpstart.htm" target="_blank">Deliveron
Jumpstart Solutions</a> including the TFS Jumpstart information and flyer. (I am very
excited about this!!) 
</li>
          <li>
            <a href="http://www.deliveron.com/about_us_thestory.htm" target="_blank">“The Deliveron
Story”</a>
          </li>
          <li>
            <a href="http://www.deliveron.com/consulting_services_focus.htm" target="_blank">Areas
of Expertise</a>
          </li>
          <li>
            <a href="http://www.deliveron.com/about_us_partners.htm" target="_blank">Our Partners</a> and <a href="http://www.deliveron.com/about_us_memberships.htm" target="_blank">Memberships</a></li>
        </ul>
        <p>
View the first edition of the <a href="http://www.deliveron.com/newsletters.htm" target="_blank">Deliveron
Monthly Newsletter</a>.  Sign up on the website to receive future newsletters
and announcements.
</p>
        <p>
 
</p>
        <h3>Upcoming Events
</h3>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
          <strong>2/3</strong> – Omaha <em>SQL/BI User Group</em> - Solution Consultant Moe
Elatta from Deliveron will be presenting on <strong>SQL Server Reporting Services
2008 scale-out configuration and new charting enhancements</strong>. <a href="http://www.omahamtg.com/Default.aspx">Register
here...</a></p>
        <p>
          <strong>2/18</strong> - <em>MSDN Webinar</em> - <strong>Enhancing the Business Process
Automation Capabilities of SharePoint</strong><a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032441157&amp;EventCategory=4&amp;culture=en-US&amp;CountryCode=US">Register
here...</a></p>
        <p>
          <strong>2/25</strong> - <em>Lunch and Learn</em> - <strong>SharePoint Features You
Need</strong><a href="http://ant.to/training/event-registration/">Register here...</a></p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=7004c120-d3f4-48df-8177-3ada3b03ef2d" />
      </body>
      <title>Deliveron Updates &amp;ndash; January 2010</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,7004c120-d3f4-48df-8177-3ada3b03ef2d.aspx</guid>
      <link>http://codesmartnothard.com/DeliveronUpdatesNdashJanuary2010.aspx</link>
      <pubDate>Sat, 30 Jan 2010 06:23:00 GMT</pubDate>
      <description>&lt;p&gt;
We have a lot of exciting things going on at Deliveron Consulting Services. I wanted
to post a few of the updates.
&lt;/p&gt;
&lt;h3&gt;Get Social with Deliveron 
&lt;/h3&gt;
&lt;p&gt;
&lt;a href="http://www.facebook.com/pages/Deliveron-Consulting-Services/92712059791" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="Deliveron Consulting Services on FaceBook" src="http://www.deliveron.com/Images/facebook_logo.png" width="32" height="32" /&gt;&lt;/a&gt;&amp;#160;
Become a Facebook fan of Deliveron: &lt;a title="http://www.facebook.com/pages/Deliveron-Consulting-Services/92712059791" href="http://www.facebook.com/pages/Deliveron-Consulting-Services/92712059791"&gt;http://www.facebook.com/pages/Deliveron-Consulting-Services/92712059791&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.twitter.com/deliveron" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="" src="http://twitter-badges.s3.amazonaws.com/t_logo-a.png" width="32" height="32" /&gt;&lt;/a&gt;&amp;#160;
Follow Deliveron on Twitter: &lt;a href="http://www.twitter.com/deliveron"&gt;http://www.twitter.com/deliveron&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&lt;a href="http://www.linkedin.com/groups?about=&amp;amp;gid=2573249" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="Linked In" src="http://www.deliveron.com/Images/LinkedIn.png" /&gt;&lt;/a&gt;&amp;#160;
Join the LinkedIn &lt;a href="http://www.linkedin.com/groups?about=&amp;amp;gid=2573249" target="_blank"&gt;Deliveron
Consulting Services Network&lt;/a&gt; group.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;Deliveron Website Updates
&lt;/h3&gt;
&lt;p&gt;
We have implemented a few website updates.&amp;#160; These include:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.deliveron.com/consulting_services_jumpstart.htm" target="_blank"&gt;Deliveron
Jumpstart Solutions&lt;/a&gt; including the TFS Jumpstart information and flyer. (I am very
excited about this!!) 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.deliveron.com/about_us_thestory.htm" target="_blank"&gt;“The Deliveron
Story”&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.deliveron.com/consulting_services_focus.htm" target="_blank"&gt;Areas
of Expertise&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.deliveron.com/about_us_partners.htm" target="_blank"&gt;Our Partners&lt;/a&gt; and &lt;a href="http://www.deliveron.com/about_us_memberships.htm" target="_blank"&gt;Memberships&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
View the first edition of the &lt;a href="http://www.deliveron.com/newsletters.htm" target="_blank"&gt;Deliveron
Monthly Newsletter&lt;/a&gt;.&amp;#160; Sign up on the website to receive future newsletters
and announcements.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;Upcoming Events
&lt;/h3&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;2/3&lt;/strong&gt; – Omaha &lt;em&gt;SQL/BI User Group&lt;/em&gt; - Solution Consultant Moe
Elatta from Deliveron will be presenting on &lt;strong&gt;SQL Server Reporting Services
2008 scale-out configuration and new charting enhancements&lt;/strong&gt;. &lt;a href="http://www.omahamtg.com/Default.aspx"&gt;Register
here...&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;2/18&lt;/strong&gt; - &lt;em&gt;MSDN Webinar&lt;/em&gt; - &lt;strong&gt;Enhancing the Business Process
Automation Capabilities of SharePoint&lt;/strong&gt; &lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032441157&amp;amp;EventCategory=4&amp;amp;culture=en-US&amp;amp;CountryCode=US"&gt;Register
here...&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;2/25&lt;/strong&gt; - &lt;em&gt;Lunch and Learn&lt;/em&gt; - &lt;strong&gt;SharePoint Features You
Need&lt;/strong&gt; &lt;a href="http://ant.to/training/event-registration/"&gt;Register here...&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=7004c120-d3f4-48df-8177-3ada3b03ef2d" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,7004c120-d3f4-48df-8177-3ada3b03ef2d.aspx</comments>
      <category>Biztalk;Deliveron;SharePoint;SQL Server 2008;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=be3fbe67-01ea-4f75-8a0a-ad14d9ddd302</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,be3fbe67-01ea-4f75-8a0a-ad14d9ddd302.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,be3fbe67-01ea-4f75-8a0a-ad14d9ddd302.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=be3fbe67-01ea-4f75-8a0a-ad14d9ddd302</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
To me there has always been a feeling a of excitement to be able to build an application
and then deliver it to someone that wants it. When I first started programming over
20 years ago with GW-BASIC on my Tandy 1000 EX, it was limiting that what I built
could only be run within GW-BASIC since it was an interpreted language environment
and not compiled. When I bought Quick Basic 4.5, I could finally compile my applications
into an EXE and run them outside of the interpreter. Then I felt like I hit the big
time when I was able to build my first setup package in Visual Basic 4. I remember
I built a Hello World caliber application and created a setup package that took 3
or 4 floppy disks. I didn’t think it could get any better than this :) Over the years
the the excitement about delivering applications became more from the what was built
and not how it would be delivered. Visual Studio has always included functional, no
frills setup projects. 3rd Party vendors have created easier to use and more power
tools for creating deployment projects such as InstallShield. Developers who didn’t
purchase a 3rd Party tool were limited to using the OOB (out of the box) setup projects
within Visual Studio. While this is functional, the developer has to know where and
how to do things and the usability is not very intuitive. It requires many steps to
creating a MSI that I have blogged about in <a href="http://codesmartnothard.com/DeploymentsWithTFSPart2HowToCreateAnAutomatedDeploymentMSI.aspx" target="_blank">Deployments
with TFS Part 2: How to create an automated deployment MSI</a>. In Visual Studio 2010
there is finally an easy to solution without purchasing an additional production.
</p>
        <p>
Last week I saw this post from Somasegar on <a href="http://blogs.msdn.com/somasegar/archive/2009/12/14/building-setup-and-deployment-packages-in-vs-2010.aspx" target="_blank">Building
setup and deployment packages in VS 2010</a>. Microsoft has partnered with Flexera,
makers of InstallShield to create InstallShield Limited Edition for Visual Studio
2010. This brings the InstallShield graphical interface to Visual Studio. In addition
to providing a highly intuitive interface for building setup packages, this product
allows setup packages to be built from with TFS Team Builds. This has been a major
pain point for automated deployments and SCM (Software Configuration Management) processes.
I downloaded and installed InstallShield 2010 LE and here is a walkthrough of the
tool.
</p>
        <h3>Download and Installation
</h3>
        <p>
Read Somasegar’s blog post on how to download and install it. (see link above)
</p>
        <p>
        </p>
        <h3>InstallShield 2010 LE Setup project
</h3>
        <p>
Once it is installed and you create a InstallShield Setup project, the Project Assignment
view is the default view. As you can see, the graphic is a guide that explains the
parts of the MSI and the steps to create the package. At the bottom of the screen
are the steps to the installation project. In addition to the steps at the bottom
of the guide, there are also intuitive steps to the right that keep all of the package
settings cleanly organized. 
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_2.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb.png" width="804" height="479" />
          </a>
        </p>
        <p>
This first step is to fill out the basic information about the application that is
going to be deployed.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_6.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_2.png" width="804" height="481" />
          </a>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
In the second step, required operating systems and prerequisite applications can be
specified and enforced when installing the application. Custom prerequisites can be
defined by choosing “Create a custom software condition” under “More Options”.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_10.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_4.png" width="804" height="481" />
          </a>
        </p>
        <p>
The installation Architecture section step is disabled in the Limited Edition. In
the other editions different features can be defined for users to choose what sections
they want installed.
</p>
        <p>
        </p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_12.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_5.png" width="804" height="481" />
          </a>
        </p>
        <p>
The next step is the Application Files. Here the application’s files can be added
to the installation. The “Add Project Outputs” is the primary button for adding the
application files. I found this dialog window to be a lot easier to use than the Visual
Studio setup project.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_14.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_6.png" width="804" height="481" />
          </a>
        </p>
        <p>
        </p>
        <p>
The Application Shortcuts step is where desktop and start menu shortcuts can be defined. 
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_18.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_8.png" width="804" height="481" />
          </a>
        </p>
        <p>
If the application requires any registry entries, they can be defined in the Application
Registry step.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_20.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_9.png" width="804" height="481" />
          </a>
        </p>
        <p>
The last step is the Installation Interview. This step asks a series of questions
that drive what dialogs the user running the installation will see. Custom dialogs
are not supported in the InstallShield Limited Edition. Custom dialogs are supported
in the Visual Studio setup projects. For the automated deployment MSIs, I create a
dialog that allows the user to specify the environment.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_22.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_10.png" width="804" height="481" />
          </a>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
Custom Actions are non-standard activities that can be performed at different points
of the installation process. The Limited Edition supports VBScript, JScript, and Exe
custom actions. However, as shown in the following image, there are only a couple
points in the process where custom actions can be defined. The Premier and Professional
editions also support InstallScript, a powerful scripting tool to create more advanced
customizations to the installation process.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_26.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_12.png" width="804" height="481" />
          </a>
        </p>
        <p>
After I built the MSI, I ran package to install it. Users will see this message box
that the installation was created with a beta version of InstallShield. 
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_23.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_1.png" width="404" height="152" />
          </a>
        </p>
        <h3>InstallShield 2010 LE for Visual Studio 2008
</h3>
        <p>
The InstallShield 2010 LE Installation also installs a version that works within Visual
Studio 2008. This interface looks the same in Visual Studio 2008 as it does in Visual
Studio 2010.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_15.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_3.png" width="640" height="484" />
          </a>
        </p>
        <h3>
        </h3>
        <h3>Building MSIs with Team Build 2010
</h3>
        <p>
This is the feature I am most looking forward to in InstallShield 2010 LE. Standard
Visual Studio 2008 setup projects can not be built within Team Build without some
tricks. Unfortunately TFS Source Control and Team Build integration is not available
in this beta version. I verified this with Flexera. They are currently working on
it. As soon as an updated version is available with this enabled I will do a follow
up post detailing the TFS Source Control and Team Build experience. I’m interested
to see the following in action:
</p>
        <ul>
          <li>
Triggering a build and having the MSI compile with the updated assemblies.</li>
          <li>
Curious to see if the InstallShield Setup project build can detect new dependencies
added. My tests will include adding a reference to the primary output application.
Then do a new build to see if the MSI will automatically include it. It might be expecting
too much but this would be very beneficial.</li>
        </ul>
        <p>
        </p>
        <p>
        </p>
        <h3>Overall
</h3>
        <ul>
          <li>
The Project Assistant is a very simple to use series of steps to create a complete
setup project. As users feel more comfortable with the too, they will probably jump
to the specific screens they are looking for in the navigation pane on the right.
Both are highly intuitive and significant improvements over the the standard Visual
Studio setup projects. 
</li>
          <li>
Most things that are supported in the standard Visual Studio setup project can be
accomplished with InstallShield 2010 Limited Edition. For most installation packages,
these limitations will not be problem. However, I will not be able to create automated
deployment MSIs because of the limitations of no custom dialogs and not being able
to create custom properties. 
</li>
          <li>
Being able to rebuild the MSIs during each Team Build is a huge benefit. Once this
feature is available, I think it will become my favorite feature. 
</li>
          <li>
I believe Microsoft and Flexera will both win with this product. Microsoft’s Visual
Studio 2010 will include an improved tool for creating installation packages without
having to reinvent the wheel. Flexera has built an amazing and easy to use product
that will work for the majority of scenarios, but many will want to upgrade to the
Express, Professional, or Premier editions to get the full power of InstallShield.</li>
          <li>
The final product should be great, but this beta version is not ready to be used for
more than evaluation purposes. Between the beta message box that is displayed when
the user installs it and the fact that the TFS Source Control and Team Build integration
features are not available yet, I recommend waiting until the final version is released. 
</li>
        </ul>
        <p>
Mike
</p>
        <p>
        </p>
        <p>
          <a href="http://www.deliveron.com" target="_blank">
            <img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" src="http://www.codesmartnothard.com/images/deliveron_banner.gif" />
          </a>
        </p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=be3fbe67-01ea-4f75-8a0a-ad14d9ddd302" />
      </body>
      <title>InstallShield Limited Edition for Visual Studio 2010 Walkthrough</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,be3fbe67-01ea-4f75-8a0a-ad14d9ddd302.aspx</guid>
      <link>http://codesmartnothard.com/InstallShieldLimitedEditionForVisualStudio2010Walkthrough.aspx</link>
      <pubDate>Tue, 05 Jan 2010 06:28:00 GMT</pubDate>
      <description>&lt;p&gt;
To me there has always been a feeling a of excitement to be able to build an application
and then deliver it to someone that wants it. When I first started programming over
20 years ago with GW-BASIC on my Tandy 1000 EX, it was limiting that what I built
could only be run within GW-BASIC since it was an interpreted language environment
and not compiled. When I bought Quick Basic 4.5, I could finally compile my applications
into an EXE and run them outside of the interpreter. Then I felt like I hit the big
time when I was able to build my first setup package in Visual Basic 4. I remember
I built a Hello World caliber application and created a setup package that took 3
or 4 floppy disks. I didn’t think it could get any better than this :) Over the years
the the excitement about delivering applications became more from the what was built
and not how it would be delivered. Visual Studio has always included functional, no
frills setup projects. 3rd Party vendors have created easier to use and more power
tools for creating deployment projects such as InstallShield. Developers who didn’t
purchase a 3rd Party tool were limited to using the OOB (out of the box) setup projects
within Visual Studio. While this is functional, the developer has to know where and
how to do things and the usability is not very intuitive. It requires many steps to
creating a MSI that I have blogged about in &lt;a href="http://codesmartnothard.com/DeploymentsWithTFSPart2HowToCreateAnAutomatedDeploymentMSI.aspx" target="_blank"&gt;Deployments
with TFS Part 2: How to create an automated deployment MSI&lt;/a&gt;. In Visual Studio 2010
there is finally an easy to solution without purchasing an additional production.
&lt;/p&gt;
&lt;p&gt;
Last week I saw this post from Somasegar on &lt;a href="http://blogs.msdn.com/somasegar/archive/2009/12/14/building-setup-and-deployment-packages-in-vs-2010.aspx" target="_blank"&gt;Building
setup and deployment packages in VS 2010&lt;/a&gt;. Microsoft has partnered with Flexera,
makers of InstallShield to create InstallShield Limited Edition for Visual Studio
2010. This brings the InstallShield graphical interface to Visual Studio. In addition
to providing a highly intuitive interface for building setup packages, this product
allows setup packages to be built from with TFS Team Builds. This has been a major
pain point for automated deployments and SCM (Software Configuration Management) processes.
I downloaded and installed InstallShield 2010 LE and here is a walkthrough of the
tool.
&lt;/p&gt;
&lt;h3&gt;Download and Installation
&lt;/h3&gt;
&lt;p&gt;
Read Somasegar’s blog post on how to download and install it. (see link above)
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h3&gt;InstallShield 2010 LE Setup project
&lt;/h3&gt;
&lt;p&gt;
Once it is installed and you create a InstallShield Setup project, the Project Assignment
view is the default view. As you can see, the graphic is a guide that explains the
parts of the MSI and the steps to create the package. At the bottom of the screen
are the steps to the installation project. In addition to the steps at the bottom
of the guide, there are also intuitive steps to the right that keep all of the package
settings cleanly organized. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb.png" width="804" height="479" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
This first step is to fill out the basic information about the application that is
going to be deployed.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_2.png" width="804" height="481" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
In the second step, required operating systems and prerequisite applications can be
specified and enforced when installing the application. Custom prerequisites can be
defined by choosing “Create a custom software condition” under “More Options”.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_10.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_4.png" width="804" height="481" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
The installation Architecture section step is disabled in the Limited Edition. In
the other editions different features can be defined for users to choose what sections
they want installed.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_12.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_5.png" width="804" height="481" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
The next step is the Application Files. Here the application’s files can be added
to the installation. The “Add Project Outputs” is the primary button for adding the
application files. I found this dialog window to be a lot easier to use than the Visual
Studio setup project.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_14.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_6.png" width="804" height="481" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
The Application Shortcuts step is where desktop and start menu shortcuts can be defined. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_18.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_8.png" width="804" height="481" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
If the application requires any registry entries, they can be defined in the Application
Registry step.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_20.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_9.png" width="804" height="481" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
The last step is the Installation Interview. This step asks a series of questions
that drive what dialogs the user running the installation will see. Custom dialogs
are not supported in the InstallShield Limited Edition. Custom dialogs are supported
in the Visual Studio setup projects. For the automated deployment MSIs, I create a
dialog that allows the user to specify the environment.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_22.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_10.png" width="804" height="481" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Custom Actions are non-standard activities that can be performed at different points
of the installation process. The Limited Edition supports VBScript, JScript, and Exe
custom actions. However, as shown in the following image, there are only a couple
points in the process where custom actions can be defined. The Premier and Professional
editions also support InstallScript, a powerful scripting tool to create more advanced
customizations to the installation process.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_26.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_12.png" width="804" height="481" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
After I built the MSI, I ran package to install it. Users will see this message box
that the installation was created with a beta version of InstallShield. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_23.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_1.png" width="404" height="152" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h3&gt;InstallShield 2010 LE for Visual Studio 2008
&lt;/h3&gt;
&lt;p&gt;
The InstallShield 2010 LE Installation also installs a version that works within Visual
Studio 2008. This interface looks the same in Visual Studio 2008 as it does in Visual
Studio 2010.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_15.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallShieldLimitedEditionforVisualStud_B816/image_thumb_3.png" width="640" height="484" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;Building MSIs with Team Build 2010
&lt;/h3&gt;
&lt;p&gt;
This is the feature I am most looking forward to in InstallShield 2010 LE. Standard
Visual Studio 2008 setup projects can not be built within Team Build without some
tricks. Unfortunately TFS Source Control and Team Build integration is not available
in this beta version. I verified this with Flexera. They are currently working on
it. As soon as an updated version is available with this enabled I will do a follow
up post detailing the TFS Source Control and Team Build experience. I’m interested
to see the following in action:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Triggering a build and having the MSI compile with the updated assemblies.&lt;/li&gt;
&lt;li&gt;
Curious to see if the InstallShield Setup project build can detect new dependencies
added. My tests will include adding a reference to the primary output application.
Then do a new build to see if the MSI will automatically include it. It might be expecting
too much but this would be very beneficial.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h3&gt;Overall
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
The Project Assistant is a very simple to use series of steps to create a complete
setup project. As users feel more comfortable with the too, they will probably jump
to the specific screens they are looking for in the navigation pane on the right.
Both are highly intuitive and significant improvements over the the standard Visual
Studio setup projects. 
&lt;/li&gt;
&lt;li&gt;
Most things that are supported in the standard Visual Studio setup project can be
accomplished with InstallShield 2010 Limited Edition. For most installation packages,
these limitations will not be problem. However, I will not be able to create automated
deployment MSIs because of the limitations of no custom dialogs and not being able
to create custom properties. 
&lt;/li&gt;
&lt;li&gt;
Being able to rebuild the MSIs during each Team Build is a huge benefit. Once this
feature is available, I think it will become my favorite feature. 
&lt;/li&gt;
&lt;li&gt;
I believe Microsoft and Flexera will both win with this product. Microsoft’s Visual
Studio 2010 will include an improved tool for creating installation packages without
having to reinvent the wheel. Flexera has built an amazing and easy to use product
that will work for the majority of scenarios, but many will want to upgrade to the
Express, Professional, or Premier editions to get the full power of InstallShield.&lt;/li&gt;
&lt;li&gt;
The final product should be great, but this beta version is not ready to be used for
more than evaluation purposes. Between the beta message box that is displayed when
the user installs it and the fact that the TFS Source Control and Team Build integration
features are not available yet, I recommend waiting until the final version is released. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.deliveron.com" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" src="http://www.codesmartnothard.com/images/deliveron_banner.gif" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=be3fbe67-01ea-4f75-8a0a-ad14d9ddd302" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,be3fbe67-01ea-4f75-8a0a-ad14d9ddd302.aspx</comments>
      <category>Team Build 2010;Team Foundation Server;TFS 2010;Visual Studio 2008;Visual Studio 2010</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=037fa71c-4188-4e48-93e2-64fb0d6ba9a4</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,037fa71c-4188-4e48-93e2-64fb0d6ba9a4.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,037fa71c-4188-4e48-93e2-64fb0d6ba9a4.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=037fa71c-4188-4e48-93e2-64fb0d6ba9a4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
There is a lot of information about the major updates of TFS 2010 and Team Build 2010
including changing from MSBuild to Workflow and Gated Check-Ins to name a couple. 
In using TFS and Team Build 2010 beta 2, there are a lot little features and improvements
that help make these two products complete and polished.  Here are a few of the
features and I keep discovering new ones each time I use it.
</p>
        <p>
 
</p>
        <h3>New Build Definition will default name and solution to build
</h3>
        <p>
if you have a solution open in Visual Studio 2010 when you create a new build definition,
the build name will default to the solution name.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_2.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_thumb.png" width="454" height="79" />
          </a>
        </p>
        <p>
 
</p>
        <p>
An open solution will also automatically be populated as the Project to Build
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_4.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_thumb_1.png" width="584" height="60" />
          </a>
        </p>
        <p>
 
</p>
        <h3>The build retention policy is not set to “Keep All” by default.
</h3>
        <p>
Finally, the default retention policy for the builds is not set to “Keep All” anymore. 
Primarily all results will default to keep the last 10 builds.  In Visual Studio
2008, I always recommended that this should be changed.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_6.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_thumb_2.png" width="504" height="214" />
          </a>
        </p>
        <p>
 
</p>
        <h3>TFS Build notifies you about successful and failed builds
</h3>
        <p>
The Team Foundation Build Notification tool used to be part of the power tools. 
Now it is included with the standard installation and alerts you to the success or
failure of the build.   This supports continuous integration and gated check-in
builds.  The notification dialog window also has an option for unshelving failed
gated check-ins.
</p>
        <p>
This dialog displays for a successful Gated Check-in build
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/GatedCheckinResults_2.jpg">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="GatedCheckinResults" border="0" alt="GatedCheckinResults" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/GatedCheckinResults_thumb.jpg" width="244" height="104" />
          </a>
        </p>
        <p>
 
</p>
        <p>
This dialog is display when a Gated Check-In fails.  Notice the Unshelve Changes
option to retrieve the changeset that was be attempted to be checked-in.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/FailedGatedCheckin_2.jpg">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="FailedGatedCheckin" border="0" alt="FailedGatedCheckin" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/FailedGatedCheckin_thumb.jpg" width="244" height="105" />
          </a>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <h3>Build Parameters are now strongly typed and visible
</h3>
        <p>
In Team Build 2008, parameters could be passed in to a build when it was being queued.  
However the format was command line argument style passed into a textbox similar to
this:
</p>
        <blockquote>
          <p>
/p:IsThisCool=”false”
</p>
        </blockquote>
        <p>
In Team Build 2010, the build parameters are displayed as strongly typed properties.  
This will allow for type checking and eliminate the misspelling of parameters.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_8.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_thumb_3.png" width="454" height="253" />
          </a>
        </p>
        <p>
 
</p>
        <p>
Enjoy all of the great new features in Team Build 2010 including these smaller but
helpful features!
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=037fa71c-4188-4e48-93e2-64fb0d6ba9a4" />
      </body>
      <title>The Biggest Little Features in Team Build 2010</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,037fa71c-4188-4e48-93e2-64fb0d6ba9a4.aspx</guid>
      <link>http://codesmartnothard.com/TheBiggestLittleFeaturesInTeamBuild2010.aspx</link>
      <pubDate>Sat, 12 Dec 2009 12:10:00 GMT</pubDate>
      <description>&lt;p&gt;
There is a lot of information about the major updates of TFS 2010 and Team Build 2010
including changing from MSBuild to Workflow and Gated Check-Ins to name a couple.&amp;#160;
In using TFS and Team Build 2010 beta 2, there are a lot little features and improvements
that help make these two products complete and polished.&amp;#160; Here are a few of the
features and I keep discovering new ones each time I use it.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;New Build Definition will default name and solution to build
&lt;/h3&gt;
&lt;p&gt;
if you have a solution open in Visual Studio 2010 when you create a new build definition,
the build name will default to the solution name.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_thumb.png" width="454" height="79" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
An open solution will also automatically be populated as the Project to Build
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_thumb_1.png" width="584" height="60" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;The build retention policy is not set to “Keep All” by default.
&lt;/h3&gt;
&lt;p&gt;
Finally, the default retention policy for the builds is not set to “Keep All” anymore.&amp;#160;
Primarily all results will default to keep the last 10 builds.&amp;#160; In Visual Studio
2008, I always recommended that this should be changed.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_thumb_2.png" width="504" height="214" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;TFS Build notifies you about successful and failed builds
&lt;/h3&gt;
&lt;p&gt;
The Team Foundation Build Notification tool used to be part of the power tools.&amp;#160;
Now it is included with the standard installation and alerts you to the success or
failure of the build.&amp;#160;&amp;#160; This supports continuous integration and gated check-in
builds.&amp;#160; The notification dialog window also has an option for unshelving failed
gated check-ins.
&lt;/p&gt;
&lt;p&gt;
This dialog displays for a successful Gated Check-in build
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/GatedCheckinResults_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="GatedCheckinResults" border="0" alt="GatedCheckinResults" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/GatedCheckinResults_thumb.jpg" width="244" height="104" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
This dialog is display when a Gated Check-In fails.&amp;#160; Notice the Unshelve Changes
option to retrieve the changeset that was be attempted to be checked-in.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/FailedGatedCheckin_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="FailedGatedCheckin" border="0" alt="FailedGatedCheckin" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/FailedGatedCheckin_thumb.jpg" width="244" height="105" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h3&gt;Build Parameters are now strongly typed and visible
&lt;/h3&gt;
&lt;p&gt;
In Team Build 2008, parameters could be passed in to a build when it was being queued.&amp;#160;&amp;#160;
However the format was command line argument style passed into a textbox similar to
this:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
/p:IsThisCool=”false”
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
In Team Build 2010, the build parameters are displayed as strongly typed properties.&amp;#160;&amp;#160;
This will allow for type checking and eliminate the misspelling of parameters.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/SomeoftheLittleImprovementsinTFS2010_14771/image_thumb_3.png" width="454" height="253" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Enjoy all of the great new features in Team Build 2010 including these smaller but
helpful features!
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=037fa71c-4188-4e48-93e2-64fb0d6ba9a4" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,037fa71c-4188-4e48-93e2-64fb0d6ba9a4.aspx</comments>
      <category>Team Build;Team Build 2010;Team Foundation Server;TFS 2010</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=8c1db28a-5d38-49d1-b416-53345fbfec04</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,8c1db28a-5d38-49d1-b416-53345fbfec04.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,8c1db28a-5d38-49d1-b416-53345fbfec04.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=8c1db28a-5d38-49d1-b416-53345fbfec04</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Steps to Modify a Work Item Template in Team Foundation Server 2008</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,8c1db28a-5d38-49d1-b416-53345fbfec04.aspx</guid>
      <link>http://codesmartnothard.com/StepsToModifyAWorkItemTemplateInTeamFoundationServer2008.aspx</link>
      <pubDate>Fri, 27 Nov 2009 16:56:00 GMT</pubDate>
      <description>&lt;p&gt;
Earlier this week at the Omaha Team System User Group someone asked about how to add
new statuses to a work item in TFS. I mentioned I had the steps documented that I
would send him. After reviewing the steps I thought it would be useful if I posted
this for everyone. 
&lt;/p&gt;
&lt;h3&gt;Download and Install the TFS Power Tools
&lt;/h3&gt;
&lt;p&gt;
Unless you prefer editing XML and running command line utilities to GUI editing, the
first thing you should do is download the latest edition of TFS Power Tools. The Power
Tools are a must have Team Foundation Server add-on that Microsoft has used to add
functionality since the release of TFS Power Tools. There has been several updates
with October 2008 being the latest release. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=FBD14EEA-781F-45A1-8C46-9F6BA2F68BF0&amp;displaylang=en" target="_blank"&gt;Download
Visual Studio Team System 2008 Team Foundation Server Power Tools - October 2008 Release&lt;/a&gt;
&lt;/p&gt;
&lt;h3&gt;Work Item Template Process Editor
&lt;/h3&gt;
&lt;p&gt;
After the TFS Power Tools are installed, Process Editor is now available under the
Tools menu item.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb.png" width="644" height="245" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h3&gt;Opening a Work Item Template for One Team Project 
&lt;/h3&gt;
&lt;p&gt;
To edit a Work Item Template (WIT) there are a couple options. To modify the template
for one project, you can open the WIT directly from the project, edit it, and save
it back to that project by choosing the “Open WIT from Server” option. 
&lt;br /&gt;
When you choose “Open WIT from Server”, it will display a dialog with all of the team
projects and the templates. In this example, the Bug WIT from the SampleScrum template
is chosen.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_1.png" width="264" height="311" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h3&gt;Opening a Work Item Template for Multiple Team Projects
&lt;/h3&gt;
&lt;p&gt;
To edit a WIT for multiple team projects, you will want to export the template to
a file, edit the changes and then import that change into each of the team projects. 
&lt;br /&gt;
To Export the WIT, choose Export WIT. This displays the dialog to select the WIT.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_2.png" width="264" height="311" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Save the WIT to a location on your local machine.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_3.png" width="454" height="336" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
It will prompt you if you would like to include the Global List definition. You can
choose No. 
&lt;br /&gt;
Next open the saved WIT by choosing “Open WIT from File” and selecting the saved file
(Bug.xml). 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h3&gt;Editing the Work Item Template 
&lt;/h3&gt;
&lt;p&gt;
The Work Item Template Editor has three tabs. In this example we don’t change any
of the fields or the layout of the work item, so we can ignore these tabs.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_10.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_4.png" width="644" height="320" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
To add statuses to the Work Item, we will modify the Workflow tab. Adding a status
is more than just adding the option to a list. The statuses of a work item are part
of the workflow. Basically each status is only available when it is enabled in the
workflow. For example, you might have a “Fixed” status and a “In Test” status. In
the workflow, you can define it so that “In Test” won’t be available to select until
it has been marked “Fixed” first.
&lt;/p&gt;
&lt;p&gt;
Here is an example of the workflow tab
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_12.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_5.png" width="644" height="271" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
The different Statuses in Red and the arrows show the flow of one status to the next.
Once it is decided when the new statuses will appear and what statuses will be available
after the new status, we can add the statuses and connect them to the other statuses.
&lt;/p&gt;
&lt;p&gt;
Add a Status by selecting the State item in the Toolbox (if the Toolbox is not visible,
choose View -&gt; Toolbox from the menu.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_14.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_6.png" width="424" height="176" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Drag the State item to the canvas in an area where it will be easier to connect it
to the other States. If the workflow becomes cluttered, you can right click on it
and choose “Reset Layout”
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_16.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_7.png" width="160" height="148" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
When you have added the status to the canvas it will look similar to this
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_18.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_8.png" width="133" height="49" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Give the status a name by typing over the State1 text
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_20.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_9.png" width="120" height="46" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Now, connect this to the previous status. For this example the bug will go from “In
Progress” to “Fixed” to “Ready For Test”. Do this by clicking on the Transaction Link
from the Toolbox, this will change your cursor to the link cursor. Click and hold
on the starting Status and drag the line to the target Status. This will add the line
between the two and create a Transition box.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_22.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_10.png" width="360" height="237" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
For the new status to be valid, you must give the Transition a Reason. This is just
a textual explanation why it would move to this status from the previous. Expand the
Transition box so it shows the Reasons, Actions, and Fields. Right click on the box
and choose “Open Details”. A Workflow Transition dialog box will display. Choose the
Reasons tab and modify the Value to display the text you would like.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_24.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_11.png" width="324" height="193" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Add a second Transaction Link from the new status (Fixed) to the Target status (Ready
for Retest) and give it a reason. 
&lt;br /&gt;
Once this is added, you can validate your workflow by right clicking on the canvas
and choosing “Validate All”.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_26.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_12.png" width="124" height="104" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
If there are any errors in the validation they will be displayed in the Error List.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_28.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_13.png" width="324" height="236" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
If there are no errors the Output tab will look similar to this
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_30.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_14.png" width="644" height="157" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Click the save button in the toolbar to save the WIT. If you have opened the WIT from
the server then this saves it back to the Team Project and is available. If this was
a File then you must import it into the appropriate Team Project(s). 
&lt;br /&gt;
To Import the Work Item Template, choose “Import WIT” from the menu. This dialog will
display. Select the file that was edited (Bug.xml) and then select the team project
and click OK.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_32.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_15.png" width="284" height="201" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Repeat to add to the other Team Projects.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h3&gt;Applying Change to Process Template
&lt;/h3&gt;
&lt;p&gt;
&lt;br /&gt;
Now that the work item is modified, if you want this change to be in new projects
created you must update the source and re-upload the templates. 
&lt;br /&gt;
Copy the bug.xml and bug.wit to the source template folder on the TFS Server. The
Default location is 
&lt;br /&gt;
&lt;strong&gt;C:\Program Files\Conchango\Scrum for Team System\ProcessTemplate\AgileSoftwareDevelopmentwithScrum\WorkItemTracking\TypeDefinitions&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_34.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_16.png" width="644" height="325" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
To upload the template, right click on the TFS root node in the Team Explorer and
choose “Process Template Manager”.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_36.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_17.png" width="324" height="196" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
A dialog will display that contains a list of the installed templates. Click on the
Upload and browse to: 
&lt;br /&gt;
&lt;strong&gt;C:\Program Files\Conchango\Scrum for Team System\ProcessTemplate\AgileSoftwareDevelopmentwithScrum&lt;/strong&gt; 
&lt;br /&gt;
Open the &lt;strong&gt;ProcessTemplate.xml&lt;/strong&gt; file.
&lt;/p&gt;
&lt;p&gt;
It will next prompt you if you want to overwrite. Choose &lt;strong&gt;Yes&lt;/strong&gt; and
it will upload the changes. If you do not wish to overwrite it, then you must change
the name by opening the same ProcessTemplate.xml with the Process Editor.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_38.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/StepstoModifyaWorkItemTemplateinTeamFoun_13BA0/image_thumb_18.png" width="424" height="158" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
That completes the steps to modify the Work Item Templates, apply the changes to one
or multiple team projects, and also back to the template for future projects created
with the the process template.
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.deliveron.com" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" src="http://www.codesmartnothard.com/images/deliveron_banner.gif" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=8c1db28a-5d38-49d1-b416-53345fbfec04" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,8c1db28a-5d38-49d1-b416-53345fbfec04.aspx</comments>
      <category>Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=91bd0cf5-adba-4ee1-bd5d-aa3002cd2102</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,91bd0cf5-adba-4ee1-bd5d-aa3002cd2102.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,91bd0cf5-adba-4ee1-bd5d-aa3002cd2102.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=91bd0cf5-adba-4ee1-bd5d-aa3002cd2102</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Here are the updated slides for my Getting Agile with TFS 2010 presentation. 
I gave this presentation for two lunch and learns at ANT and then earlier this week
at the Omaha Team System User Group meeting.  I had a great time giving this
presentation multiple times.   Thanks everyone that attended these talks.  
</p>
        <p>
          <a href="http://www.codesmartnothard.com/content/binary/agile_vsts2010.zip" target="_blank">Getting
Agile with TFS 2010 Presentation Slides</a>
        </p>
        <p>
Mike
</p>
        <p>
 
</p>
        <p>
          <a href="http://www.deliveron.com" target="_blank">
            <img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" src="http://www.codesmartnothard.com/images/deliveron_banner.gif" />
          </a>
        </p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=91bd0cf5-adba-4ee1-bd5d-aa3002cd2102" />
      </body>
      <title>Presentation Slides for Getting Agile with TFS 2010</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,91bd0cf5-adba-4ee1-bd5d-aa3002cd2102.aspx</guid>
      <link>http://codesmartnothard.com/PresentationSlidesForGettingAgileWithTFS2010.aspx</link>
      <pubDate>Fri, 27 Nov 2009 05:54:00 GMT</pubDate>
      <description>&lt;p&gt;
Here are the updated slides for my Getting Agile with TFS 2010 presentation.&amp;#160;
I gave this presentation for two lunch and learns at ANT and then earlier this week
at the Omaha Team System User Group meeting.&amp;#160; I had a great time giving this
presentation multiple times.&amp;#160;&amp;#160; Thanks everyone that attended these talks.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.codesmartnothard.com/content/binary/agile_vsts2010.zip" target="_blank"&gt;Getting
Agile with TFS 2010 Presentation Slides&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.deliveron.com" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" src="http://www.codesmartnothard.com/images/deliveron_banner.gif" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=91bd0cf5-adba-4ee1-bd5d-aa3002cd2102" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,91bd0cf5-adba-4ee1-bd5d-aa3002cd2102.aspx</comments>
      <category>Agile;Team Foundation Server;TFS 2010</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=9c730057-1a0a-4f5e-964d-9188ca1533bb</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,9c730057-1a0a-4f5e-964d-9188ca1533bb.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,9c730057-1a0a-4f5e-964d-9188ca1533bb.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=9c730057-1a0a-4f5e-964d-9188ca1533bb</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I am going to giving two <em>Getting Agile with Team Foundation Server 2010</em> talks
in November, both in Omaha, NE.  On Thursday November 12th, I will be giving
the talk for a lunch and learn at Advanced Network Technologies.  You can register
for the event <a href="http://anttraining.com/about/events/" target="_blank">here</a>. 
On November 24th, I will be giving the talk at the <a href="http://www.otsug.org" target="_blank">Omaha
Team System User Group</a> Meeting.  <a href="http://www.otsug.org/Events/tabid/59/ModuleID/377/ItemID/2/mctl/EventDetails/Default.aspx" target="_blank">Here</a> is
more information about the event and registration instructions.
</p>
        <p>
This is the same talk as the one I gave at the <a href="http://www.heartlanddc.com/omaha/default.aspx" target="_blank">Heartland
Developer Conference</a> in October but I will be using Beta 2 for these two. 
Here’s some more details on the presentation and myself.  I look forward to seeing
everyone there.
</p>
        <p>
          <strong>Presentation: Getting Agile with TFS 2010</strong>
        </p>
        <p>
This presentation will demonstrate a complete two week scrum iteration from the planning
meeting to development, testing, and bug fixing to deployment utilizing the features
found in Team Foundation Server 2010. New features include gated check-ins for Continuous
Integration (CI), Test-Driven Development (TDD), Product Backlog enhancements including
hierarchical views and support for multiple teams to work from a single backlog. The
presentation also demonstrates the enhancements to the TFS Portal and Web Access to
support Agile planning and displaying graphs such as burn-down charts. Each walk through
includes a live demonstration of the feature in Visual Studio 2010.
</p>
        <p>
          <strong>Speaker: Mike Douglas, <a href="http://www.deliveron.com" target="_blank">Deliveron
Consulting Services</a></strong>
        </p>
        <p>
Mike Douglas is a Solution Consultant at Deliveron Consulting Services where he provides
end-to-end solutions and TFS installation, configuration, and custom development for
clients.  He has over 11 years experience building enterprise level applications
on a variety of .NET technologies including WCF, Web Services, ASP.NET, Disconnected
Smart Clients and Data Synchronization, BizTalk, and Team Foundation Server. 
Mike enjoys trying to keep up with the constant change and evolution of .NET. 
Mike is an experienced presenter having spoken at several Omaha .NET User Group meetings
on <a href="http://www.lhotka.net/cslanet/Default.aspx" target="_blank">CSLA.NET</a>,
Subsonic, and TFS.  He also spoke at the 2008 ESRI International User Conference
on a GIS integration project he helped lead. Mike actively maintains the open source
project, <a href="http://teamdeploy.codeplex.com/" target="_blank">Team Deploy</a>,
on CodePlex for deploying MSIs using Team Foundation Server.  Mike also enjoys
sharing his experiences in Code Generation, CSLA.NET, and TFS on his blog at <a href="http://www.codesmartnothard.com/" target="_blank">www.CodeSmartNotHard.com</a>.
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=9c730057-1a0a-4f5e-964d-9188ca1533bb" />
      </body>
      <title>Getting Agile with Team Foundation Server 2010 Talks in November</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,9c730057-1a0a-4f5e-964d-9188ca1533bb.aspx</guid>
      <link>http://codesmartnothard.com/GettingAgileWithTeamFoundationServer2010TalksInNovember.aspx</link>
      <pubDate>Tue, 03 Nov 2009 09:42:00 GMT</pubDate>
      <description>&lt;p&gt;
I am going to giving two &lt;em&gt;Getting Agile with Team Foundation Server 2010&lt;/em&gt; talks
in November, both in Omaha, NE.&amp;#160; On Thursday November 12th, I will be giving
the talk for a lunch and learn at Advanced Network Technologies.&amp;#160; You can register
for the event &lt;a href="http://anttraining.com/about/events/" target="_blank"&gt;here&lt;/a&gt;.&amp;#160;
On November 24th, I will be giving the talk at the &lt;a href="http://www.otsug.org" target="_blank"&gt;Omaha
Team System User Group&lt;/a&gt; Meeting.&amp;#160; &lt;a href="http://www.otsug.org/Events/tabid/59/ModuleID/377/ItemID/2/mctl/EventDetails/Default.aspx" target="_blank"&gt;Here&lt;/a&gt; is
more information about the event and registration instructions.
&lt;/p&gt;
&lt;p&gt;
This is the same talk as the one I gave at the &lt;a href="http://www.heartlanddc.com/omaha/default.aspx" target="_blank"&gt;Heartland
Developer Conference&lt;/a&gt; in October but I will be using Beta 2 for these two.&amp;#160;
Here’s some more details on the presentation and myself.&amp;#160; I look forward to seeing
everyone there.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Presentation: Getting Agile with TFS 2010&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
This presentation will demonstrate a complete two week scrum iteration from the planning
meeting to development, testing, and bug fixing to deployment utilizing the features
found in Team Foundation Server 2010. New features include gated check-ins for Continuous
Integration (CI), Test-Driven Development (TDD), Product Backlog enhancements including
hierarchical views and support for multiple teams to work from a single backlog. The
presentation also demonstrates the enhancements to the TFS Portal and Web Access to
support Agile planning and displaying graphs such as burn-down charts. Each walk through
includes a live demonstration of the feature in Visual Studio 2010.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Speaker: Mike Douglas, &lt;a href="http://www.deliveron.com" target="_blank"&gt;Deliveron
Consulting Services&lt;/a&gt;&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
Mike Douglas is a Solution Consultant at Deliveron Consulting Services where he provides
end-to-end solutions and TFS installation, configuration, and custom development for
clients.&amp;#160; He has over 11 years experience building enterprise level applications
on a variety of .NET technologies including WCF, Web Services, ASP.NET, Disconnected
Smart Clients and Data Synchronization, BizTalk, and Team Foundation Server.&amp;#160;
Mike enjoys trying to keep up with the constant change and evolution of .NET.&amp;#160;
Mike is an experienced presenter having spoken at several Omaha .NET User Group meetings
on &lt;a href="http://www.lhotka.net/cslanet/Default.aspx" target="_blank"&gt;CSLA.NET&lt;/a&gt;,
Subsonic, and TFS.&amp;#160; He also spoke at the 2008 ESRI International User Conference
on a GIS integration project he helped lead. Mike actively maintains the open source
project, &lt;a href="http://teamdeploy.codeplex.com/" target="_blank"&gt;Team Deploy&lt;/a&gt;,
on CodePlex for deploying MSIs using Team Foundation Server.&amp;#160; Mike also enjoys
sharing his experiences in Code Generation, CSLA.NET, and TFS on his blog at &lt;a href="http://www.codesmartnothard.com/" target="_blank"&gt;www.CodeSmartNotHard.com&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=9c730057-1a0a-4f5e-964d-9188ca1533bb" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,9c730057-1a0a-4f5e-964d-9188ca1533bb.aspx</comments>
      <category>Agile;Team Foundation Server;TFS 2010</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=14402f59-aa73-4194-bfe6-a4953e3d5701</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,14402f59-aa73-4194-bfe6-a4953e3d5701.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,14402f59-aa73-4194-bfe6-a4953e3d5701.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=14402f59-aa73-4194-bfe6-a4953e3d5701</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Here are the slides from my<em> An Iteration in the Life of an Agile Team with Team
System 2010</em> talk at the 2009 Heartland Developer Conference.  Thanks for
everyone that attended.  I had a great time giving the talk and at the rest of
the conference.
</p>
        <p>
          <a title="http://www.codesmartnothard.com/content/binary/agile_vsts2010.zip" href="http://www.codesmartnothard.com/content/binary/agile_vsts2010.zip">http://www.codesmartnothard.com/content/binary/agile_vsts2010.zip</a>
        </p>
        <p>
If you didn’t get a chance to attend my talk, I am going to be giving the presentation
again (This time with beta 2!) at the next Omaha Team System User Group meeting on
November 24th.  Check out the <a href="http://www.otsug.org/" target="_blank">Omaha
Team System User Group</a> website for more details. 
</p>
        <p>
Thanks!
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=14402f59-aa73-4194-bfe6-a4953e3d5701" />
      </body>
      <title>#HDC09 Agile with VSTS 2010 Presentation Slides</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,14402f59-aa73-4194-bfe6-a4953e3d5701.aspx</guid>
      <link>http://codesmartnothard.com/HDC09AgileWithVSTS2010PresentationSlides.aspx</link>
      <pubDate>Tue, 20 Oct 2009 09:15:00 GMT</pubDate>
      <description>&lt;p&gt;
Here are the slides from my&lt;em&gt; An Iteration in the Life of an Agile Team with Team
System 2010&lt;/em&gt; talk at the 2009 Heartland Developer Conference.&amp;#160; Thanks for
everyone that attended.&amp;#160; I had a great time giving the talk and at the rest of
the conference.
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://www.codesmartnothard.com/content/binary/agile_vsts2010.zip" href="http://www.codesmartnothard.com/content/binary/agile_vsts2010.zip"&gt;http://www.codesmartnothard.com/content/binary/agile_vsts2010.zip&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
If you didn’t get a chance to attend my talk, I am going to be giving the presentation
again (This time with beta 2!) at the next Omaha Team System User Group meeting on
November 24th.&amp;#160; Check out the &lt;a href="http://www.otsug.org/" target="_blank"&gt;Omaha
Team System User Group&lt;/a&gt; website for more details. 
&lt;/p&gt;
&lt;p&gt;
Thanks!
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=14402f59-aa73-4194-bfe6-a4953e3d5701" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,14402f59-aa73-4194-bfe6-a4953e3d5701.aspx</comments>
      <category>Agile;HDC;Team Foundation Server;TFS 2010</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=14e33dfd-20a1-4f39-bce2-43117e3bc779</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,14e33dfd-20a1-4f39-bce2-43117e3bc779.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,14e33dfd-20a1-4f39-bce2-43117e3bc779.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=14e33dfd-20a1-4f39-bce2-43117e3bc779</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In <a href="http://codesmartnothard.com/ct.ashx?id=3d0434dc-2673-4c21-a186-f1f1ed281164&amp;url=http%3a%2f%2fcodesmartnothard.com%2fPermaLink%2cguid%2cf7709611-30b9-42d4-9474-e67cb6bc75b1.aspx">Part
1: The Deployment Process Should Enforce Good Configuration Management Practices</a>,
I gave some background on my experiences and how the configuration management process
has evolved and some rules and benefits to the automated deployment MSIs.
</p>
        <p>
In <a href="http://codesmartnothard.com/PermaLink,guid,3d0434dc-2673-4c21-a186-f1f1ed281164.aspx" target="_blank">Part
2: How to create an automated deployment MSI</a>, I walked through the steps to create
an automated deployment MSI in Visual Studio satisfying the rules from Part 1.
</p>
        <p>
In Part 3, I am going to walk through the steps to install Team Deploy.  Then
walk through creating a team build, configure Team Deploy, and deploy a MSI with it.  
</p>
        <p>
There is also a great <a href="http://www.noblegroupinternational.com/content/alm/teamdeploy/TeamDeploy.html" target="_blank">Screencast
by Ian Ceicys</a> walking through the entire process of installing TFS, WIX, Team
Deploy and deploying a MSI.  I highly recommend watching this.
</p>
        <h3>Installing PS Tools
</h3>
        <ul>
          <li>
Team Deploy uses the free PSExec and PSKill utilities by Sysinternals (owned by Microsoft). 
PSExec allows you to remotely run any command and PSKill can kill any process on a
local or remote machine.</li>
          <li>
Download PSTools at <a title="http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx" href="http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx">http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx</a> and
install to a local folder.  I also recommend renaming psexec and pskill to something
like psexec2.exe.  Some anti-virus software sees these files as a risk.</li>
        </ul>
        <p>
 
</p>
        <h3>Installing Team Deploy
</h3>
        <ul>
          <li>
Browse to the Team Deploy website on CodePlex at <a href="http://TeamDeploy.CodePlex.com">http://TeamDeploy.CodePlex.com</a></li>
          <li>
Click on the Downloads and download the TeamDeploy.MSI.</li>
          <li>
Run the MSI to install Team Deploy to c:\Program Files\MSBuild\TeamDeploy</li>
          <li>
The windows service account that runs Team Build on the build server will need to
be a local administrator on all target machines.</li>
        </ul>
        <h3> 
</h3>
        <h3>Creating a Team Deploy TFS Build
</h3>
        <ul>
          <li>
In Team Explorer, create a new build in your Team Project by right clicking on Builds
and choosing “New Build Definition”</li>
        </ul>
        <p>
          <img title="New Build Definition" alt="New Build Definition" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=teamdeploy&amp;DownloadId=80206" />
        </p>
        <p>
 
</p>
        <ul>
          <li>
Give it a name such as “Build and Deploy”</li>
        </ul>
        <ul>
          <li>
Create a workspace (Cloak other folders in your project that don’t need to be part
of the build. This helps the speed up your build because otherwise the server will
try to get all source files in the project)</li>
        </ul>
        <ul>
          <li>
Leave Project File name as is but click on the “Create” button to create a new TFSBuild.proj
file. 
</li>
        </ul>
        <ul>
          <li>
Next choose the solution you want to build, then the configuration type. I recommend
leaving the default. 
</li>
        </ul>
        <ul>
          <li>
Choose any options that you want to enable for running tests and/or code analysis.
I would recommend leaving these unchecked for now and once you verify everything is
working then go back and enable the options you want.</li>
        </ul>
        <ul>
          <li>
In TFS 2008, you can choose retention policies. This will help prevent builds from
filling up your server disk space quickly. I usually choose Keep 7 latest.</li>
        </ul>
        <ul>
          <li>
the next options are for the Build Defaults. Choose the appropriate build agent. If
unsure, just leave the default. Then choose the share where you want to copy the staging
files.</li>
        </ul>
        <ul>
          <li>
The last option is “Trigger”. The "build and deploy" build should be separate
from the continuous integration build. I recommend leaving the default “Check-ins
do not trigger a new build”.</li>
        </ul>
        <p>
 
</p>
        <p>
          <img title="Build Trigger" alt="Build Trigger" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=teamdeploy&amp;DownloadId=80218" />
        </p>
        <p>
 
</p>
        <ul>
          <li>
Finally click “OK” to create the build type.</li>
        </ul>
        <br />
Creating the build definition will create the TFSBuild.proj that contains the basic
options that were selected in the wizard. The following steps will customize the TFSBuild.proj
file created. This file is a Xml file based on MSBuild. 
<ul><li>
To modify the TFSBuild.proj file, located the file under Source Control -&gt; $/YourTeamProject/TeamBuildTypes/Build
and Deploy (You can also navigate directly to this file by right clicking on the build
definition and choosing "View Configuration Folder".)</li></ul><ul><li>
Check out and open the TFSBuild.proj file to configure it to use Team Deploy</li></ul><ul><li>
Find the comment &lt;!—Do not edit this -&gt; and add the following line underneath
the one that is already there. It should look something like the screenshot below</li></ul><blockquote><p>
&lt;Import Project="$(MSBuildExtensionsPath)\TeamDeploy\TeamDeploy.Tasks.targets"
/&gt;
</p></blockquote><p><img title="AddTeamDeployProject.jpg" alt="AddTeamDeployProject.jpg" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=teamdeploy&amp;DownloadId=80222" /></p><p>
 
</p><p>
Scroll to the bottom of the TFSBuild.proj file to the &lt;PropertyGroup&gt;. Overwrite
the Property group with the following (Adjust the paths for your specific environment):
</p><blockquote><p>
&lt;PropertyGroup&gt; 
<br />
    &lt;KillAppPathFilename&gt;c:\Program Files\PSTools\pskill2.exe&lt;/KillAppPathFilename&gt; 
<br />
    &lt;RemoteExecutePathFilename&gt;c:\Program Files\PStools\psexec2.exe&lt;/RemoteExecutePathFilename&gt; 
<br />
  &lt;/PropertyGroup&gt; 
</p><p>
  &lt;!-- Deploy MSI  --&gt; 
<br />
  &lt;Target Name="AfterEndToEndIteration"&gt; 
<br />
    &lt;CallTarget Condition="'$(IsDesktopBuild)'!='true'"
Targets="DeployMSITargetVirtuals" /&gt; 
<br />
  &lt;/Target&gt; 
</p><p>
  &lt;Target Name="DeployMSITargetVirtuals"&gt; 
<br />
    &lt;Deploy DeployScript="$(SolutionRoot)\..\..\Push Scripts\SampleDeploy.xml" 
<br />
            KillAppPathFilename="$(KillAppPathFilename)" 
<br />
            RemoteExecutePathFilename="$(RemoteExecutePathFilename)" 
<br />
            TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
<br />
            BuildUri="$(BuildUri)"
/&gt; 
<br />
  &lt;/Target&gt;
</p></blockquote><p>
The copied Xml in the TFSBuild.proj should look something like this
</p><p><img title="FinishedTFSBuild.jpg" alt="FinishedTFSBuild.jpg" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=teamdeploy&amp;DownloadId=80225" /></p><ul><li>
Save and check-in the TFSBuild.proj file</li></ul><p><br />
The Deploy task uses a Xml Deploy Script that contains the information of what Msi(s)
to deploy, additional tasks such as starting and stopping the service, and specifies
the target machines. The following steps walks you through editing this file.
</p><p><img title="DeployScript.jpg" alt="DeployScript.jpg" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=teamdeploy&amp;DownloadId=80227" /></p><p>
 
</p><p>
There are a few things to note here. 
</p><ul><li>
Team Deploy can 
<ul><li>
Kill 0 to many processes 
</li><li>
Deploy/Uninstall 0 to many MSIs 
</li><li>
Deploy MSIs to 0 to many Target Machines</li></ul></li></ul><ul><li>
Modify the xml appropriately for your environment. The GUID for the uninstalls are
the MSI product codes. If the MSI is done correctly it will uninstall previous versions
using the upgrade code, however they are usually unable to remove the same version
of the MSI, this is why we have the separate step of uninstall. 
</li></ul><ul><li>
The ExtraArgs element contains the SETUPENV variable that is used by the MSI’s custom
action to copy the correct environment’s config file to the project’s. The custom
action is a simple VBScript that copies the config file (not included with Team Deploy).
See Part 2 for more details on creating the config files folder structure.</li></ul><p>
 
</p><p>
Once the TFSBuild.proj is checked in and the Deploy script is saved (or also checked
in), then you can right click on the build and do a queue new build.   The
MSI will be deployed to your target machine(s). 
</p><p>
See the <a href="http://teamdeploy.codeplex.com/Wiki/View.aspx?title=Troubleshooting" target="_blank">Troubleshooting
/ FAQ section</a> of Team Deploy or contact me if you have any questions or problems.
</p><img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=14e33dfd-20a1-4f39-bce2-43117e3bc779" /></body>
      <title>Deployments with TFS Part 3: Deploying MSIs to PCs and Servers</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,14e33dfd-20a1-4f39-bce2-43117e3bc779.aspx</guid>
      <link>http://codesmartnothard.com/DeploymentsWithTFSPart3DeployingMSIsToPCsAndServers.aspx</link>
      <pubDate>Sat, 26 Sep 2009 18:16:00 GMT</pubDate>
      <description>&lt;p&gt;
In &lt;a href="http://codesmartnothard.com/ct.ashx?id=3d0434dc-2673-4c21-a186-f1f1ed281164&amp;amp;url=http%3a%2f%2fcodesmartnothard.com%2fPermaLink%2cguid%2cf7709611-30b9-42d4-9474-e67cb6bc75b1.aspx"&gt;Part
1: The Deployment Process Should Enforce Good Configuration Management Practices&lt;/a&gt;,
I gave some background on my experiences and how the configuration management process
has evolved and some rules and benefits to the automated deployment MSIs.
&lt;/p&gt;
&lt;p&gt;
In &lt;a href="http://codesmartnothard.com/PermaLink,guid,3d0434dc-2673-4c21-a186-f1f1ed281164.aspx" target="_blank"&gt;Part
2: How to create an automated deployment MSI&lt;/a&gt;, I walked through the steps to create
an automated deployment MSI in Visual Studio satisfying the rules from Part 1.
&lt;/p&gt;
&lt;p&gt;
In Part 3, I am going to walk through the steps to install Team Deploy.&amp;#160; Then
walk through creating a team build, configure Team Deploy, and deploy a MSI with it.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
There is also a great &lt;a href="http://www.noblegroupinternational.com/content/alm/teamdeploy/TeamDeploy.html" target="_blank"&gt;Screencast
by Ian Ceicys&lt;/a&gt; walking through the entire process of installing TFS, WIX, Team
Deploy and deploying a MSI.&amp;#160; I highly recommend watching this.
&lt;/p&gt;
&lt;h3&gt;Installing PS Tools
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
Team Deploy uses the free PSExec and PSKill utilities by Sysinternals (owned by Microsoft).&amp;#160;
PSExec allows you to remotely run any command and PSKill can kill any process on a
local or remote machine.&lt;/li&gt;
&lt;li&gt;
Download PSTools at &lt;a title="http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx" href="http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx"&gt;http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx&lt;/a&gt; and
install to a local folder.&amp;#160; I also recommend renaming psexec and pskill to something
like psexec2.exe.&amp;#160; Some anti-virus software sees these files as a risk.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;Installing Team Deploy
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
Browse to the Team Deploy website on CodePlex at &lt;a href="http://TeamDeploy.CodePlex.com"&gt;http://TeamDeploy.CodePlex.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
Click on the Downloads and download the TeamDeploy.MSI.&lt;/li&gt;
&lt;li&gt;
Run the MSI to install Team Deploy to c:\Program Files\MSBuild\TeamDeploy&lt;/li&gt;
&lt;li&gt;
The windows service account that runs Team Build on the build server will need to
be a local administrator on all target machines.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&amp;#160;
&lt;/h3&gt;
&lt;h3&gt;Creating a Team Deploy TFS Build
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
In Team Explorer, create a new build in your Team Project by right clicking on Builds
and choosing “New Build Definition”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;img title="New Build Definition" alt="New Build Definition" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=teamdeploy&amp;amp;DownloadId=80206" /&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Give it a name such as “Build and Deploy”&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
Create a workspace (Cloak other folders in your project that don’t need to be part
of the build. This helps the speed up your build because otherwise the server will
try to get all source files in the project)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
Leave Project File name as is but click on the “Create” button to create a new TFSBuild.proj
file. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
Next choose the solution you want to build, then the configuration type. I recommend
leaving the default. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
Choose any options that you want to enable for running tests and/or code analysis.
I would recommend leaving these unchecked for now and once you verify everything is
working then go back and enable the options you want.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
In TFS 2008, you can choose retention policies. This will help prevent builds from
filling up your server disk space quickly. I usually choose Keep 7 latest.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
the next options are for the Build Defaults. Choose the appropriate build agent. If
unsure, just leave the default. Then choose the share where you want to copy the staging
files.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
The last option is “Trigger”. The &amp;quot;build and deploy&amp;quot; build should be separate
from the continuous integration build. I recommend leaving the default “Check-ins
do not trigger a new build”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;img title="Build Trigger" alt="Build Trigger" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=teamdeploy&amp;amp;DownloadId=80218" /&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Finally click “OK” to create the build type.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Creating the build definition will create the TFSBuild.proj that contains the basic
options that were selected in the wizard. The following steps will customize the TFSBuild.proj
file created. This file is a Xml file based on MSBuild. 
&lt;ul&gt;
&lt;li&gt;
To modify the TFSBuild.proj file, located the file under Source Control -&amp;gt; $/YourTeamProject/TeamBuildTypes/Build
and Deploy (You can also navigate directly to this file by right clicking on the build
definition and choosing &amp;quot;View Configuration Folder&amp;quot;.)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
Check out and open the TFSBuild.proj file to configure it to use Team Deploy&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
Find the comment &amp;lt;!—Do not edit this -&amp;gt; and add the following line underneath
the one that is already there. It should look something like the screenshot below&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&amp;lt;Import Project=&amp;quot;$(MSBuildExtensionsPath)\TeamDeploy\TeamDeploy.Tasks.targets&amp;quot;
/&amp;gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;img title="AddTeamDeployProject.jpg" alt="AddTeamDeployProject.jpg" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=teamdeploy&amp;amp;DownloadId=80222" /&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Scroll to the bottom of the TFSBuild.proj file to the &amp;lt;PropertyGroup&amp;gt;. Overwrite
the Property group with the following (Adjust the paths for your specific environment):
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&amp;lt;PropertyGroup&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;KillAppPathFilename&amp;gt;c:\Program Files\PSTools\pskill2.exe&amp;lt;/KillAppPathFilename&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;RemoteExecutePathFilename&amp;gt;c:\Program Files\PStools\psexec2.exe&amp;lt;/RemoteExecutePathFilename&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;/PropertyGroup&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;!-- Deploy MSI&amp;#160; --&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;Target Name=&amp;quot;AfterEndToEndIteration&amp;quot;&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;CallTarget Condition=&amp;quot;'$(IsDesktopBuild)'!='true'&amp;quot;
Targets=&amp;quot;DeployMSITargetVirtuals&amp;quot; /&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;/Target&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; &amp;lt;Target Name=&amp;quot;DeployMSITargetVirtuals&amp;quot;&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;Deploy DeployScript=&amp;quot;$(SolutionRoot)\..\..\Push Scripts\SampleDeploy.xml&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; KillAppPathFilename=&amp;quot;$(KillAppPathFilename)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RemoteExecutePathFilename=&amp;quot;$(RemoteExecutePathFilename)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TeamFoundationServerUrl=&amp;quot;$(TeamFoundationServerUrl)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BuildUri=&amp;quot;$(BuildUri)&amp;quot;
/&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;/Target&amp;gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The copied Xml in the TFSBuild.proj should look something like this
&lt;/p&gt;
&lt;p&gt;
&lt;img title="FinishedTFSBuild.jpg" alt="FinishedTFSBuild.jpg" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=teamdeploy&amp;amp;DownloadId=80225" /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Save and check-in the TFSBuild.proj file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
The Deploy task uses a Xml Deploy Script that contains the information of what Msi(s)
to deploy, additional tasks such as starting and stopping the service, and specifies
the target machines. The following steps walks you through editing this file.
&lt;/p&gt;
&lt;p&gt;
&lt;img title="DeployScript.jpg" alt="DeployScript.jpg" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=teamdeploy&amp;amp;DownloadId=80227" /&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
There are a few things to note here. 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Team Deploy can 
&lt;ul&gt;
&lt;li&gt;
Kill 0 to many processes 
&lt;/li&gt;
&lt;li&gt;
Deploy/Uninstall 0 to many MSIs 
&lt;/li&gt;
&lt;li&gt;
Deploy MSIs to 0 to many Target Machines&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
Modify the xml appropriately for your environment. The GUID for the uninstalls are
the MSI product codes. If the MSI is done correctly it will uninstall previous versions
using the upgrade code, however they are usually unable to remove the same version
of the MSI, this is why we have the separate step of uninstall. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
The ExtraArgs element contains the SETUPENV variable that is used by the MSI’s custom
action to copy the correct environment’s config file to the project’s. The custom
action is a simple VBScript that copies the config file (not included with Team Deploy).
See Part 2 for more details on creating the config files folder structure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Once the TFSBuild.proj is checked in and the Deploy script is saved (or also checked
in), then you can right click on the build and do a queue new build.&amp;#160;&amp;#160; The
MSI will be deployed to your target machine(s). 
&lt;/p&gt;
&lt;p&gt;
See the &lt;a href="http://teamdeploy.codeplex.com/Wiki/View.aspx?title=Troubleshooting" target="_blank"&gt;Troubleshooting
/ FAQ section&lt;/a&gt; of Team Deploy or contact me if you have any questions or problems.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=14e33dfd-20a1-4f39-bce2-43117e3bc779" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,14e33dfd-20a1-4f39-bce2-43117e3bc779.aspx</comments>
      <category>Team Build;Team Deploy;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=8794c8dc-e949-4b43-8bc7-22fffcc74e73</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,8794c8dc-e949-4b43-8bc7-22fffcc74e73.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,8794c8dc-e949-4b43-8bc7-22fffcc74e73.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=8794c8dc-e949-4b43-8bc7-22fffcc74e73</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://teamdeploy.codeplex.com/" target="_blank">Team Deploy</a> is a free
set of custom Team Build tasks for deploying MSIs to client PCs and servers. 
Team Deploy 2.1 has been released and includes a number of fixes and a couple new
features. 
<br /></p>
        <p>
A special thanks to Jeremy Novak for creating the new CleanupPsExec task and multiple
other fixes.  Here is the list of the changes:
</p>
        <ul>
          <li>
Moved Guidance and Installation from Word document to wiki site (and created a Troubleshooting
section) 
</li>
          <li>
Added -accepteula to all pstools calls so it won’t display the EULA dialog the first
time it runs</li>
          <li>
Added new CleanupPsExec task and test to <a href="http://teamdeploy.codeplex.com/Wiki/View.aspx?title=PSExecLocksUp&amp;referringTitle=Home" target="_blank">clean
up the PSTools service</a> if it becomes stuck. 
</li>
          <li>
Fixed spelling error in RemoteExecute task 
</li>
          <li>
Added support to uninstalling 32bit apps on Windows 2008 64bit servers 
</li>
          <li>
Changed property declarations to be auto-implemented 
</li>
          <li>
Updated task required properties to have the Required attribute 
</li>
          <li>
Created Team Deploy Installation Screencast 
</li>
          <li>
Other misc fixes. 
</li>
        </ul>
        <p>
Team Deploy 2.1 can be found on CodePlex at <a title="http://teamdeploy.codeplex.com/" href="http://teamdeploy.codeplex.com/">http://teamdeploy.codeplex.com/</a>.
</p>
        <p>
-Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=8794c8dc-e949-4b43-8bc7-22fffcc74e73" />
      </body>
      <title>Team Deploy 2.1 Released</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,8794c8dc-e949-4b43-8bc7-22fffcc74e73.aspx</guid>
      <link>http://codesmartnothard.com/TeamDeploy21Released.aspx</link>
      <pubDate>Wed, 26 Aug 2009 07:49:00 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://teamdeploy.codeplex.com/" target="_blank"&gt;Team Deploy&lt;/a&gt; is a free
set of custom Team Build tasks for deploying MSIs to client PCs and servers.&amp;#160;
Team Deploy 2.1 has been released and includes a number of fixes and a couple new
features. 
&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
A special thanks to Jeremy Novak for creating the new CleanupPsExec task and multiple
other fixes.&amp;#160; Here is the list of the changes:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Moved Guidance and Installation from Word document to wiki site (and created a Troubleshooting
section) 
&lt;/li&gt;
&lt;li&gt;
Added -accepteula to all pstools calls so it won’t display the EULA dialog the first
time it runs&lt;/li&gt;
&lt;li&gt;
Added new CleanupPsExec task and test to &lt;a href="http://teamdeploy.codeplex.com/Wiki/View.aspx?title=PSExecLocksUp&amp;amp;referringTitle=Home" target="_blank"&gt;clean
up the PSTools service&lt;/a&gt; if it becomes stuck. 
&lt;/li&gt;
&lt;li&gt;
Fixed spelling error in RemoteExecute task 
&lt;/li&gt;
&lt;li&gt;
Added support to uninstalling 32bit apps on Windows 2008 64bit servers 
&lt;/li&gt;
&lt;li&gt;
Changed property declarations to be auto-implemented 
&lt;/li&gt;
&lt;li&gt;
Updated task required properties to have the Required attribute 
&lt;/li&gt;
&lt;li&gt;
Created Team Deploy Installation Screencast 
&lt;/li&gt;
&lt;li&gt;
Other misc fixes. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Team Deploy 2.1 can be found on CodePlex at &lt;a title="http://teamdeploy.codeplex.com/" href="http://teamdeploy.codeplex.com/"&gt;http://teamdeploy.codeplex.com/&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
-Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=8794c8dc-e949-4b43-8bc7-22fffcc74e73" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,8794c8dc-e949-4b43-8bc7-22fffcc74e73.aspx</comments>
      <category>Team Build;Team Deploy;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=6c9687da-2224-47e4-85f6-1976107caf4d</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,6c9687da-2224-47e4-85f6-1976107caf4d.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,6c9687da-2224-47e4-85f6-1976107caf4d.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=6c9687da-2224-47e4-85f6-1976107caf4d</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today I completed the installation of Team Foundation Server 2010 beta 1.  I
had previously started a couple times and run into a couple issue (mostly time) but
didn’t get a chance to finish.  Tonight I finally worked through a couple issues
and completed it.  I kept a few notes of the issues I encountered and what I
did to resolve them.  If you run into any of these errors, I hope they help.
</p>
        <h3>TFS Configuration Wizard Readiness Checks
</h3>
        <p>
When the configuration wizard completed, I had errors in Reporting Check and SharePoint
Check.
</p>
        <h3>Reporting
</h3>
        <p>
Here is the error
</p>
        <blockquote>
          <p>
            <strong>TF255275: The following Web service for SQL Server Reporting Services could
not be accessed: </strong>
            <a href="http://myserver/ReportServer/ReportService2005.asmx">
              <strong>http://myserver/ReportServer/ReportService2005.asmx</strong>
            </a>
          </p>
        </blockquote>
        <p>
Problem was I installed Report Services in Integrated Mode.  It only supports
Native.
</p>
        <p>
Here are the steps to fix the error:
</p>
        <blockquote>
          <p>
1. Deleted the ReportServer databases 
<br />
2. Recreated the ReportServer database in Native mode. 
</p>
        </blockquote>
        <h3>SharePoint
</h3>
        <p>
We are planning on using this server for multiple things and we installed SharePoint
2007 on before I started the installation of TFS 2010 beta 1.  I thought that
TFS would simply install the extensions to any compatible SharePoint installation
on the server.  Apparently, TFS must install and configure SharePoint on the
machine before the verification will allow you to continue.  
</p>
        <p>
Here is the error
</p>
        <blockquote>
          <p>
            <strong>TF255282: Windows SharePoint 3.0 cannot be installed error on server. 
The program is already installed on this server.</strong>
          </p>
        </blockquote>
        <p>
The fix is easy.  Simply, go to Add/Remove programs and uninstall.  
However I do want MOSS 2007 to be install on it.  Once, I have a backup made
after VSTS 2010 finishes installation.  I am going to try uninstalling WSS 3
and reinstalling MOSS 2007.
</p>
        <p>
 
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFS2010InstallationExperiences_A212/image_2.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFS2010InstallationExperiences_A212/image_thumb.png" width="404" height="289" />
          </a>
        </p>
        <p>
After fixing these two bugs, the Readiness Checks completed successfully.  Clear
sailing from here?  Not quite.   When the configuration tool completed,
it displayed the following error.
</p>
        <blockquote>
          <p>
            <strong>Windows NT user or group '.\tfsservice' not found. Check the name again.</strong>
          </p>
        </blockquote>
        <p>
Installation log details:
</p>
        <blockquote>
          <p>
TF255356: The following error occurred when configuring the Team Foundation databases:
Error occurred while executing servicing step Setup Warehouse for component TfsWarehouse
during Install: Windows NT user or group '.\tfsservice' not found. Check the name
again.. For more information, see the configuration log. (Error occurred while executing
servicing step Setup Warehouse for component TfsWarehouse during Install: Windows
NT user or group '.\tfsservice' not found. Check the name again.) ---&gt; Microsoft.TeamFoundation.Framework.Server.CollectionServicingException:
Error occurred while executing servicing step Setup Warehouse for component TfsWarehouse
during Install: Windows NT user or group '.\tfsservice' not found. Check the name
again. ---&gt; System.Data.SqlClient.SqlException: Windows NT user or group '.\tfsservice'
not found. Check the name again.
</p>
        </blockquote>
        <p>
The system allowed me to enter a dot for the server name instead of the actual server
name and then display the error.  I would classify this more as a user error
but it would be nice to prevent or allow configuration tool, to lookup the actual
server so it will complete.  I logged an error with Connect.  I will see
how they rate it. 
</p>
        <p>
For the fix, fortunately I took a snapshot of server right before I ran this. 
I restored to the previous step and restarted the configuration tool.  
For the service name, I entered: &lt;myserver&gt;\TFSService and everything worked.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFS2010InstallationExperiences_A212/image_4.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFS2010InstallationExperiences_A212/image_thumb_1.png" width="404" height="289" />
          </a>
        </p>
        <p>
It finally completed with a Success message!!!   
</p>
        <p>
While I have been typing this, I started the TSVS 2010 Beta 1 Installation. 
It is really slow (knock on wood), but so far it hasn’t caused any errors.
</p>
        <p>
 
</p>
        <p>
Thanks,
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=6c9687da-2224-47e4-85f6-1976107caf4d" />
      </body>
      <title>TFS 2010 Beta 1 Installation Experiences</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,6c9687da-2224-47e4-85f6-1976107caf4d.aspx</guid>
      <link>http://codesmartnothard.com/TFS2010Beta1InstallationExperiences.aspx</link>
      <pubDate>Mon, 17 Aug 2009 10:01:00 GMT</pubDate>
      <description>&lt;p&gt;
Today I completed the installation of Team Foundation Server 2010 beta 1.&amp;#160; I
had previously started a couple times and run into a couple issue (mostly time) but
didn’t get a chance to finish.&amp;#160; Tonight I finally worked through a couple issues
and completed it.&amp;#160; I kept a few notes of the issues I encountered and what I
did to resolve them.&amp;#160; If you run into any of these errors, I hope they help.
&lt;/p&gt;
&lt;h3&gt;TFS Configuration Wizard Readiness Checks
&lt;/h3&gt;
&lt;p&gt;
When the configuration wizard completed, I had errors in Reporting Check and SharePoint
Check.
&lt;/p&gt;
&lt;h3&gt;Reporting
&lt;/h3&gt;
&lt;p&gt;
Here is the error
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;TF255275: The following Web service for SQL Server Reporting Services could
not be accessed: &lt;/strong&gt;&lt;a href="http://myserver/ReportServer/ReportService2005.asmx"&gt;&lt;strong&gt;http://myserver/ReportServer/ReportService2005.asmx&lt;/strong&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Problem was I installed Report Services in Integrated Mode.&amp;#160; It only supports
Native.
&lt;/p&gt;
&lt;p&gt;
Here are the steps to fix the error:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
1. Deleted the ReportServer databases 
&lt;br /&gt;
2. Recreated the ReportServer database in Native mode. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;h3&gt;SharePoint
&lt;/h3&gt;
&lt;p&gt;
We are planning on using this server for multiple things and we installed SharePoint
2007 on before I started the installation of TFS 2010 beta 1.&amp;#160; I thought that
TFS would simply install the extensions to any compatible SharePoint installation
on the server.&amp;#160; Apparently, TFS must install and configure SharePoint on the
machine before the verification will allow you to continue.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Here is the error
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;TF255282: Windows SharePoint 3.0 cannot be installed error on server.&amp;#160;
The program is already installed on this server.&lt;/strong&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The fix is easy.&amp;#160; Simply, go to Add/Remove programs and uninstall.&amp;#160;&amp;#160;
However I do want MOSS 2007 to be install on it.&amp;#160; Once, I have a backup made
after VSTS 2010 finishes installation.&amp;#160; I am going to try uninstalling WSS 3
and reinstalling MOSS 2007.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFS2010InstallationExperiences_A212/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFS2010InstallationExperiences_A212/image_thumb.png" width="404" height="289" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
After fixing these two bugs, the Readiness Checks completed successfully.&amp;#160; Clear
sailing from here?&amp;#160; Not quite.&amp;#160;&amp;#160; When the configuration tool completed,
it displayed the following error.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;Windows NT user or group '.\tfsservice' not found. Check the name again.&lt;/strong&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Installation log details:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
TF255356: The following error occurred when configuring the Team Foundation databases:
Error occurred while executing servicing step Setup Warehouse for component TfsWarehouse
during Install: Windows NT user or group '.\tfsservice' not found. Check the name
again.. For more information, see the configuration log. (Error occurred while executing
servicing step Setup Warehouse for component TfsWarehouse during Install: Windows
NT user or group '.\tfsservice' not found. Check the name again.) ---&amp;gt; Microsoft.TeamFoundation.Framework.Server.CollectionServicingException:
Error occurred while executing servicing step Setup Warehouse for component TfsWarehouse
during Install: Windows NT user or group '.\tfsservice' not found. Check the name
again. ---&amp;gt; System.Data.SqlClient.SqlException: Windows NT user or group '.\tfsservice'
not found. Check the name again.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The system allowed me to enter a dot for the server name instead of the actual server
name and then display the error.&amp;#160; I would classify this more as a user error
but it would be nice to prevent or allow configuration tool, to lookup the actual
server so it will complete.&amp;#160; I logged an error with Connect.&amp;#160; I will see
how they rate it. 
&lt;/p&gt;
&lt;p&gt;
For the fix, fortunately I took a snapshot of server right before I ran this.&amp;#160;
I restored to the previous step and restarted the configuration tool.&amp;#160;&amp;#160;
For the service name, I entered: &amp;lt;myserver&amp;gt;\TFSService and everything worked.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFS2010InstallationExperiences_A212/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFS2010InstallationExperiences_A212/image_thumb_1.png" width="404" height="289" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
It finally completed with a Success message!!!&amp;#160;&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
While I have been typing this, I started the TSVS 2010 Beta 1 Installation.&amp;#160;
It is really slow (knock on wood), but so far it hasn’t caused any errors.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Thanks,
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=6c9687da-2224-47e4-85f6-1976107caf4d" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,6c9687da-2224-47e4-85f6-1976107caf4d.aspx</comments>
      <category>Team Foundation Server;TFS 2010</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=3d0434dc-2673-4c21-a186-f1f1ed281164</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,3d0434dc-2673-4c21-a186-f1f1ed281164.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,3d0434dc-2673-4c21-a186-f1f1ed281164.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=3d0434dc-2673-4c21-a186-f1f1ed281164</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Note:  I slightly changed the title from TFS Deployments to Deployments with
TFS in case there was any confusion about whether this is about deploying TFS or doing
deployments with TFS.
</p>
        <p>
In <a href="http://codesmartnothard.com/PermaLink,guid,f7709611-30b9-42d4-9474-e67cb6bc75b1.aspx" target="_blank">Part
1: The Deployment Process Should Enforce Good Configuration Management Practices</a>,
I gave some background on my experiences and how the configuration management process
has evolved and some rules and benefits to the automated deployment MSIs.
</p>
        <p>
In this Part, I will walk through the steps to create an automated deployment MSI
in Visual Studio 2008 satisfying the rules from Part 1.    In this
example I will build the MSI for a windows service that will auto assign the username
and password.
</p>
        <p>
The first few steps are standard steps for building the MSI.  Then the steps
get more interesting when it starts getting into to the automated deployment settings.
</p>
        <h3>Step 1:  Add the Setup Project to existing solution
</h3>
        <p>
To add the setup project to the solution, choose “Add New Project” &gt; Other Project
Types &gt; Setup Project.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_2.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_thumb.png" width="354" height="230" />
          </a>
        </p>
        <p>
 
</p>
        <h3>Step 2:  Add Project Output to MSI
</h3>
        <p>
Add the required files for the deployment by adding the project output of the primary
project.  To the project output, right click on the setup project in the solution
explorer  &gt; View &gt; Project Output.  A dialog box similar to the one
below will appear.  Verify that the windows service project is the selected project
in the combo box.  Choose Primary Output and click OK.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_4.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_thumb_1.png" width="208" height="244" />
          </a>
        </p>
        <p>
 
</p>
        <h3>Step 3:  Add Custom Actions
</h3>
        <p>
Next add the Primary output as a Custom action for the install, uninstall, etc. 
To do this, right click on the Custom Actions &gt; Add Custom Action &gt; Application
Folder &gt; Primary Output from &lt;your project&gt;.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_6.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_thumb_2.png" width="226" height="98" />
          </a>
        </p>
        <h3>Step 4:  Add Installer to Windows Service project
</h3>
        <p>
In the Windows Service project, add an Installer class by double clicking on the Service
component to view the designer.  In the Properties window (usually) at bottom
right corner, there will be a link to “Add Installer” similar to the image below. 
This creates the project installer class containing the service installer and the
process installer.  We will be modifying these in some later steps.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_8.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_thumb_3.png" width="304" height="244" />
          </a>
        </p>
        <h3>Step 5:  Create the environment config files and folders in the windows service
and add them to the MSI.
</h3>
        <p>
If the solution had multiple projects, I usually create a separate project for the
config files.  Here I will create the folders in the same project. Create the
folders and files as shown below.  Basically environment’s config file will be
stored here and checked into source control.  To add these to the MSI, go to
the properties of each config file and change the Build Action to Content.  Now
go back to the MSI, right click on the project &gt; Add &gt; Project Output &gt; Content
Files to add these.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_10.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_thumb_4.png" width="264" height="172" />
          </a>
        </p>
        <h3>Step 6:  Create Custom Action to copy the selected config file to the application
folder
</h3>
        <p>
Now that environment configs are in the ConfigFiles folder, the selected one needs
to be copied to Application folder.  To do this we need to create a custom action. 
This is in VBScript but eventually I want to create these custom actions as a helper
class in Team Deploy.  To create the custom task, the actual file needs to be
created outside the MSI.  I have created a CustomActions folder in the windows
service project.   In there I added a copyconfig.vbs file.  This custom
action is going to need two values passed into it.  One is the environment and
the other is TargetDir.  I couldn’t figure out a way to get current folder inside
for the vbscript so I found it easier to just pass it in.  To pass in values
into the custom action the name/value pairs are passed into the CustomActionData property. 
Also since this is going to overwrite the current app.config files, exclude the app.config
by clicking on the Primary Output &gt; Exclude &gt; Add for *.config.
</p>
        <p>
Here is the code for the copyconfig.vbs file.  After you copy and paste this
into the vbs file.  Save it and in the properties, change the Build Action to
None.   We do not want this copied to the MSI output like the config files.  
</p>
        <blockquote>
          <p>
on error resume next 
<br />
dim paramsList 
<br />
paramsList = split(session.property("CustomActionData"), ",") 
<br />
dim param1 
<br />
dim param2 
</p>
          <p>
param1 = paramsList(0) 
<br />
param2 = paramsList(1) 
</p>
          <p>
dim filesys 
<br />
dim path 
</p>
          <p>
path = param2 &amp; "configfiles\" &amp; param1 &amp; "\" 
</p>
          <p>
dim strEvn, objFile, strLogFile 
</p>
          <p>
Set objShell = CreateObject("Wscript.Shell") 
<br />
strEnv = objShell.ExpandEnvironmentStrings("%temp%") 
<br />
strLogFile = strEnv &amp; "\MSIInstallLog.txt" 
<br />
Set objFSO = CreateObject("Scripting.FileSystemObject") 
<br />
Set objFile = objFSO.OpenTextFile(strLogFile, 8, True) 
</p>
          <p>
objFSO.CopyFile path &amp; "*.config", param2, true 
</p>
          <p>
if err.number &gt; 0 then 
<br />
    objFile.WriteLine Now &amp; "::CopyConfigs - " &amp;
param1 &amp; err.Description 
<br />
else 
<br />
    objFile.WriteLine Now &amp; "::CopyConfigs - Completed Successfully." 
<br />
end if 
</p>
          <p>
objFile.Close
</p>
          <p>
          </p>
        </blockquote>
        <p>
Now add the Custom Action to the MSI by right clicking on the project &gt; View &gt;
Custom Actions.  We only want this to run during the installation process, so
right click on Install &gt; Add Custom Action &gt; Application Folder &gt; Add File
&gt; Browse to Copyconfig.vbs and click OK.  Notice in the setup project that
the copyconfig.vbs has the no sign icon on it so it isn’t copied to the application
folder.
</p>
        <p>
Next we need to pass in the the values into the Custom Action.  Click on the
Copyconfig.vbs in the Custom Actions view.  In the properties window, set CustomActionData
= [ENV],[TARGETDIR].  
</p>
        <p>
Repeat the steps above for AssignService.vbs.   Set CustomActionData = [USR],[PWD],"SampleService"
</p>
        <blockquote>
          <p>
on error resume next 
</p>
          <p>
dim param 
</p>
          <p>
param = split(session.property("CustomActionData"), ",") 
</p>
          <p>
if len(param(0)) &gt; 0 then 
</p>
          <p>
    dim strEvn, objFile, strLogFile 
</p>
          <p>
    Set objShell = CreateObject("Wscript.Shell") 
<br />
    strEnv = objShell.ExpandEnvironmentStrings("%temp%") 
<br />
    strLogFile = strEnv &amp; "\MSIInstallLog.txt" 
<br />
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
<br />
    Set objFile = objFSO.OpenTextFile(strLogFile, 8, True) 
<br />
    ' ------ SCRIPT CONFIGURATION ------ 
<br />
    strUser     = param(0) 
<br />
    strPassword = param(1)       
<br />
    strSvcName  = cstr(replace(param(2), chr(34), "")) 
<br />
    strComputer = "."     
<br />
    ' ------ END CONFIGURATION --------- 
<br />
    set objWMI = GetObject("winmgmts:\\" &amp; strComputer
&amp; "\root\cimv2") 
<br />
    set objService = objWMI.Get("Win32_Service.Name='" &amp;
strSvcName &amp; "'") 
<br />
    intRC = objService.Change(,,,,,,strUser,strPassword) 
<br />
    if intRC &gt; 0 then 
<br />
       objFile.WriteLine Now &amp; "::" &amp;
strSvcName &amp; " - " &amp; "Error setting service account: "
&amp; intRC 
<br />
    else 
<br />
       objFile.WriteLine Now &amp; "::" &amp;
strSvcName &amp; " - " &amp; "Successfully set service account" 
<br />
    end if 
<br />
    if err.number &gt; 0 then 
<br />
        objFile.WriteLine Now &amp; "::"
&amp; strSvcName &amp; " - " &amp; err.Description 
<br />
    end if 
<br />
    objFile.Close 
</p>
          <p>
end if
</p>
          <p>
          </p>
        </blockquote>
        <p>
This custom action finds the “SampleService” and changes the username and password. 
I had to use the service name literal.  There wasn’t anything I could find where
I could use a dynamic value.
</p>
        <h3>Step 7:  Modify Project Installer to handle interactive and silent modes
</h3>
        <p>
One of the requirements is that the MSI needs to work when using the wizard and when
specifying parameters when installing from the command line or remote utility. 
Therefore when the user is installing the MSI through the wizard (we will create this
in the next step)   it needs to prompt for the user and password. 
This is accomplished by setting the service account of the installer to LocalSystem
so it won’t prompt but if the username isn’t passed in it switches the service account
to User.  This will then prompt the user.
</p>
        <p>
To implement this, add the following code to the ProjectInstaller.
</p>
        <blockquote>
          <p>
private string GetContextParameter(string key) 
<br />
{ 
<br />
    string sValue = ""; 
</p>
          <p>
    try 
<br />
    { 
<br />
        sValue = this.Context.Parameters[key].ToString(); 
</p>
          <p>
    } 
<br />
    catch 
<br />
    { 
<br />
        sValue = ""; 
<br />
    } 
</p>
          <p>
    return sValue; 
<br />
}        
</p>
          <p>
// Override the 'OnBeforeInstall' method.        
<br />
protected override void OnBeforeInstall(IDictionary savedState) 
<br />
{ 
<br />
    try 
<br />
    { 
<br />
    base.OnBeforeInstall(savedState); 
<br />
    string username = GetContextParameter("usr").Trim(); 
</p>
          <p>
        if (username == "") 
<br />
        { 
<br />
            serviceProcessInstaller1.Account
= System.ServiceProcess.ServiceAccount.User; 
<br />
        } 
<br />
    } 
<br />
    catch(Exception e) 
<br />
    { 
</p>
          <p>
  } 
<br />
} 
</p>
          <p>
private string getvalues() 
<br />
{ 
<br />
    string all = ""; 
</p>
          <p>
    foreach (DictionaryEntry value in this.Context.Parameters) 
<br />
    { 
<br />
        all += value.Value.ToString() + ","; 
<br />
    } 
<br />
    return all; 
<br />
}
</p>
        </blockquote>
        <h3>Step 8:  Add step to wizard to specify the Environment.
</h3>
        <p>
In addition to prompting the user for the user and password, the MSI needs to prompt
the user for the environment.  To add a form to the Wizard.  Right click
on the setup project &gt; View &gt; User Interface.  Then right click on Start
(as shown) and the click Add Dialog.  In this example we have 3 environment,
so choose the RadioButtons (3 Buttons) and press Ok.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_12.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_thumb_5.png" width="244" height="161" />
          </a>
        </p>
        <p>
        </p>
        <p>
The Dialog window appears below the Confirm Installation box.  If you build the
setup project you will notice the warning, “All custom dialogs must precede the 'Installation
Folder' dialog”.  Therefore, click on the up arrow twice to move the RadioButton
dialog window  above the Installation folder.  Now click on the dialog and
view the Properties window.  There are several empty properties we need to set. 
Set the following to something similar to these values:
</p>
        <ul>
          <li>
BannerText = “Choose Environment” 
</li>
          <li>
BodyText = “Please select an environment from the list.” 
</li>
          <li>
Button1Label = “Production” 
</li>
          <li>
Button1Value = “Prod” 
</li>
          <li>
Button2Label = “Test” 
</li>
          <li>
Button2Value “Test” 
</li>
          <li>
Button3Labal = “Development” 
</li>
          <li>
Button3Value = “Dev” 
</li>
          <li>
ButtonProperty = “Env” 
</li>
          <li>
DefaultValue = “Prod” 
</li>
        </ul>
        <p>
 
</p>
        <h3>Step 9:  Change build type to loose uncompressed files
</h3>
        <p>
The last step is to change the Package Files option under the setup project’s properties
from “In setup file” to “As loose uncompressed files.  You will need to do this
for each configuration in the project.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_14.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_thumb_6.png" width="404" height="281" />
          </a>
        </p>
        <p>
 
</p>
        <p>
These are all of the steps.  I hope it helps.  Attached below is the sample
solution with the setup project hosted on the MSDN Code Gallery.  You may use
this however you would like.  Now that you know how to build the MSI, it is time
to deploy it.  I will walk through that in the next post.
</p>
        <p>
          <a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=msi&amp;DownloadId=6714" target="_blank">Sample
Automated Deployment Solution for building a Windows Service MSI</a> (22k)
</p>
        <p>
The other future parts in the series will include:
</p>
        <ol>
          <li>
Building and Deploying ClickOnce applications</li>
          <li>
Deploying a web application.</li>
          <li>
Hopefully more!  Let me know what you would like to see.</li>
        </ol>
        <p>
 
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=3d0434dc-2673-4c21-a186-f1f1ed281164" />
      </body>
      <title>Deployments with TFS Part 2: How to create an automated deployment MSI</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,3d0434dc-2673-4c21-a186-f1f1ed281164.aspx</guid>
      <link>http://codesmartnothard.com/DeploymentsWithTFSPart2HowToCreateAnAutomatedDeploymentMSI.aspx</link>
      <pubDate>Thu, 30 Jul 2009 10:14:00 GMT</pubDate>
      <description>&lt;p&gt;
Note:&amp;#160; I slightly changed the title from TFS Deployments to Deployments with
TFS in case there was any confusion about whether this is about deploying TFS or doing
deployments with TFS.
&lt;/p&gt;
&lt;p&gt;
In &lt;a href="http://codesmartnothard.com/PermaLink,guid,f7709611-30b9-42d4-9474-e67cb6bc75b1.aspx" target="_blank"&gt;Part
1: The Deployment Process Should Enforce Good Configuration Management Practices&lt;/a&gt;,
I gave some background on my experiences and how the configuration management process
has evolved and some rules and benefits to the automated deployment MSIs.
&lt;/p&gt;
&lt;p&gt;
In this Part, I will walk through the steps to create an automated deployment MSI
in Visual Studio 2008 satisfying the rules from Part 1.&amp;#160;&amp;#160;&amp;#160; In this
example I will build the MSI for a windows service that will auto assign the username
and password.
&lt;/p&gt;
&lt;p&gt;
The first few steps are standard steps for building the MSI.&amp;#160; Then the steps
get more interesting when it starts getting into to the automated deployment settings.
&lt;/p&gt;
&lt;h3&gt;Step 1:&amp;#160; Add the Setup Project to existing solution
&lt;/h3&gt;
&lt;p&gt;
To add the setup project to the solution, choose “Add New Project” &amp;gt; Other Project
Types &amp;gt; Setup Project.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_thumb.png" width="354" height="230" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;Step 2:&amp;#160; Add Project Output to MSI
&lt;/h3&gt;
&lt;p&gt;
Add the required files for the deployment by adding the project output of the primary
project.&amp;#160; To the project output, right click on the setup project in the solution
explorer&amp;#160; &amp;gt; View &amp;gt; Project Output.&amp;#160; A dialog box similar to the one
below will appear.&amp;#160; Verify that the windows service project is the selected project
in the combo box.&amp;#160; Choose Primary Output and click OK.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_thumb_1.png" width="208" height="244" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;Step 3:&amp;#160; Add Custom Actions
&lt;/h3&gt;
&lt;p&gt;
Next add the Primary output as a Custom action for the install, uninstall, etc.&amp;#160;
To do this, right click on the Custom Actions &amp;gt; Add Custom Action &amp;gt; Application
Folder &amp;gt; Primary Output from &amp;lt;your project&amp;gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_thumb_2.png" width="226" height="98" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h3&gt;Step 4:&amp;#160; Add Installer to Windows Service project
&lt;/h3&gt;
&lt;p&gt;
In the Windows Service project, add an Installer class by double clicking on the Service
component to view the designer.&amp;#160; In the Properties window (usually) at bottom
right corner, there will be a link to “Add Installer” similar to the image below.&amp;#160;
This creates the project installer class containing the service installer and the
process installer.&amp;#160; We will be modifying these in some later steps.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_thumb_3.png" width="304" height="244" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h3&gt;Step 5:&amp;#160; Create the environment config files and folders in the windows service
and add them to the MSI.
&lt;/h3&gt;
&lt;p&gt;
If the solution had multiple projects, I usually create a separate project for the
config files.&amp;#160; Here I will create the folders in the same project. Create the
folders and files as shown below.&amp;#160; Basically environment’s config file will be
stored here and checked into source control.&amp;#160; To add these to the MSI, go to
the properties of each config file and change the Build Action to Content.&amp;#160; Now
go back to the MSI, right click on the project &amp;gt; Add &amp;gt; Project Output &amp;gt; Content
Files to add these.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_10.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_thumb_4.png" width="264" height="172" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h3&gt;Step 6:&amp;#160; Create Custom Action to copy the selected config file to the application
folder
&lt;/h3&gt;
&lt;p&gt;
Now that environment configs are in the ConfigFiles folder, the selected one needs
to be copied to Application folder.&amp;#160; To do this we need to create a custom action.&amp;#160;
This is in VBScript but eventually I want to create these custom actions as a helper
class in Team Deploy.&amp;#160; To create the custom task, the actual file needs to be
created outside the MSI.&amp;#160; I have created a CustomActions folder in the windows
service project.&amp;#160;&amp;#160; In there I added a copyconfig.vbs file.&amp;#160; This custom
action is going to need two values passed into it.&amp;#160; One is the environment and
the other is TargetDir.&amp;#160; I couldn’t figure out a way to get current folder inside
for the vbscript so I found it easier to just pass it in.&amp;#160; To pass in values
into the custom action the name/value pairs are passed into the CustomActionData property.&amp;#160;
Also since this is going to overwrite the current app.config files, exclude the app.config
by clicking on the Primary Output &amp;gt; Exclude &amp;gt; Add for *.config.
&lt;/p&gt;
&lt;p&gt;
Here is the code for the copyconfig.vbs file.&amp;#160; After you copy and paste this
into the vbs file.&amp;#160; Save it and in the properties, change the Build Action to
None.&amp;#160;&amp;#160; We do not want this copied to the MSI output like the config files.&amp;#160; 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
on error resume next 
&lt;br /&gt;
dim paramsList 
&lt;br /&gt;
paramsList = split(session.property(&amp;quot;CustomActionData&amp;quot;), &amp;quot;,&amp;quot;) 
&lt;br /&gt;
dim param1 
&lt;br /&gt;
dim param2 
&lt;/p&gt;
&lt;p&gt;
param1 = paramsList(0) 
&lt;br /&gt;
param2 = paramsList(1) 
&lt;/p&gt;
&lt;p&gt;
dim filesys 
&lt;br /&gt;
dim path 
&lt;/p&gt;
&lt;p&gt;
path = param2 &amp;amp; &amp;quot;configfiles\&amp;quot; &amp;amp; param1 &amp;amp; &amp;quot;\&amp;quot; 
&lt;/p&gt;
&lt;p&gt;
dim strEvn, objFile, strLogFile 
&lt;/p&gt;
&lt;p&gt;
Set objShell = CreateObject(&amp;quot;Wscript.Shell&amp;quot;) 
&lt;br /&gt;
strEnv = objShell.ExpandEnvironmentStrings(&amp;quot;%temp%&amp;quot;) 
&lt;br /&gt;
strLogFile = strEnv &amp;amp; &amp;quot;\MSIInstallLog.txt&amp;quot; 
&lt;br /&gt;
Set objFSO = CreateObject(&amp;quot;Scripting.FileSystemObject&amp;quot;) 
&lt;br /&gt;
Set objFile = objFSO.OpenTextFile(strLogFile, 8, True) 
&lt;/p&gt;
&lt;p&gt;
objFSO.CopyFile path &amp;amp; &amp;quot;*.config&amp;quot;, param2, true 
&lt;/p&gt;
&lt;p&gt;
if err.number &amp;gt; 0 then 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; objFile.WriteLine Now &amp;amp; &amp;quot;::CopyConfigs - &amp;quot; &amp;amp;
param1 &amp;amp; err.Description 
&lt;br /&gt;
else 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; objFile.WriteLine Now &amp;amp; &amp;quot;::CopyConfigs - Completed Successfully.&amp;quot; 
&lt;br /&gt;
end if 
&lt;/p&gt;
&lt;p&gt;
objFile.Close
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Now add the Custom Action to the MSI by right clicking on the project &amp;gt; View &amp;gt;
Custom Actions.&amp;#160; We only want this to run during the installation process, so
right click on Install &amp;gt; Add Custom Action &amp;gt; Application Folder &amp;gt; Add File
&amp;gt; Browse to Copyconfig.vbs and click OK.&amp;#160; Notice in the setup project that
the copyconfig.vbs has the no sign icon on it so it isn’t copied to the application
folder.
&lt;/p&gt;
&lt;p&gt;
Next we need to pass in the the values into the Custom Action.&amp;#160; Click on the
Copyconfig.vbs in the Custom Actions view.&amp;#160; In the properties window, set CustomActionData
= [ENV],[TARGETDIR].&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Repeat the steps above for AssignService.vbs.&amp;#160;&amp;#160; Set CustomActionData = [USR],[PWD],&amp;quot;SampleService&amp;quot;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
on error resume next 
&lt;/p&gt;
&lt;p&gt;
dim param 
&lt;/p&gt;
&lt;p&gt;
param = split(session.property(&amp;quot;CustomActionData&amp;quot;), &amp;quot;,&amp;quot;) 
&lt;/p&gt;
&lt;p&gt;
if len(param(0)) &amp;gt; 0 then 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160; dim strEvn, objFile, strLogFile 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160; Set objShell = CreateObject(&amp;quot;Wscript.Shell&amp;quot;) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; strEnv = objShell.ExpandEnvironmentStrings(&amp;quot;%temp%&amp;quot;) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; strLogFile = strEnv &amp;amp; &amp;quot;\MSIInstallLog.txt&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Set objFSO = CreateObject(&amp;quot;Scripting.FileSystemObject&amp;quot;) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Set objFile = objFSO.OpenTextFile(strLogFile, 8, True) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; ' ------ SCRIPT CONFIGURATION ------ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; strUser&amp;#160;&amp;#160;&amp;#160;&amp;#160; = param(0) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; strPassword = param(1)&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; strSvcName&amp;#160; = cstr(replace(param(2), chr(34), &amp;quot;&amp;quot;)) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; strComputer = &amp;quot;.&amp;quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; ' ------ END CONFIGURATION --------- 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; set objWMI = GetObject(&amp;quot;winmgmts:\\&amp;quot; &amp;amp; strComputer
&amp;amp; &amp;quot;\root\cimv2&amp;quot;) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; set objService = objWMI.Get(&amp;quot;Win32_Service.Name='&amp;quot; &amp;amp;
strSvcName &amp;amp; &amp;quot;'&amp;quot;) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; intRC = objService.Change(,,,,,,strUser,strPassword) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; if intRC &amp;gt; 0 then 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; objFile.WriteLine Now &amp;amp; &amp;quot;::&amp;quot; &amp;amp;
strSvcName &amp;amp; &amp;quot; - &amp;quot; &amp;amp; &amp;quot;Error setting service account: &amp;quot;
&amp;amp; intRC 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; else 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; objFile.WriteLine Now &amp;amp; &amp;quot;::&amp;quot; &amp;amp;
strSvcName &amp;amp; &amp;quot; - &amp;quot; &amp;amp; &amp;quot;Successfully set service account&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; end if 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; if err.number &amp;gt; 0 then 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; objFile.WriteLine Now &amp;amp; &amp;quot;::&amp;quot;
&amp;amp; strSvcName &amp;amp; &amp;quot; - &amp;quot; &amp;amp; err.Description 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; end if 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; objFile.Close 
&lt;/p&gt;
&lt;p&gt;
end if
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This custom action finds the “SampleService” and changes the username and password.&amp;#160;
I had to use the service name literal.&amp;#160; There wasn’t anything I could find where
I could use a dynamic value.
&lt;/p&gt;
&lt;h3&gt;Step 7:&amp;#160; Modify Project Installer to handle interactive and silent modes
&lt;/h3&gt;
&lt;p&gt;
One of the requirements is that the MSI needs to work when using the wizard and when
specifying parameters when installing from the command line or remote utility.&amp;#160;
Therefore when the user is installing the MSI through the wizard (we will create this
in the next step)&amp;#160;&amp;#160; it needs to prompt for the user and password.&amp;#160;
This is accomplished by setting the service account of the installer to LocalSystem
so it won’t prompt but if the username isn’t passed in it switches the service account
to User.&amp;#160; This will then prompt the user.
&lt;/p&gt;
&lt;p&gt;
To implement this, add the following code to the ProjectInstaller.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
private string GetContextParameter(string key) 
&lt;br /&gt;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; string sValue = &amp;quot;&amp;quot;; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160; try 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sValue = this.Context.Parameters[key].ToString(); 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; catch 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sValue = &amp;quot;&amp;quot;; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160; return sValue; 
&lt;br /&gt;
}&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
// Override the 'OnBeforeInstall' method.&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 
&lt;br /&gt;
protected override void OnBeforeInstall(IDictionary savedState) 
&lt;br /&gt;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; try 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; base.OnBeforeInstall(savedState); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; string username = GetContextParameter(&amp;quot;usr&amp;quot;).Trim(); 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (username == &amp;quot;&amp;quot;) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; serviceProcessInstaller1.Account
= System.ServiceProcess.ServiceAccount.User; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; catch(Exception e) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; { 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; } 
&lt;br /&gt;
} 
&lt;/p&gt;
&lt;p&gt;
private string getvalues() 
&lt;br /&gt;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; string all = &amp;quot;&amp;quot;; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160; foreach (DictionaryEntry value in this.Context.Parameters) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; all += value.Value.ToString() + &amp;quot;,&amp;quot;; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; return all; 
&lt;br /&gt;
}
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;h3&gt;Step 8:&amp;#160; Add step to wizard to specify the Environment.
&lt;/h3&gt;
&lt;p&gt;
In addition to prompting the user for the user and password, the MSI needs to prompt
the user for the environment.&amp;#160; To add a form to the Wizard.&amp;#160; Right click
on the setup project &amp;gt; View &amp;gt; User Interface.&amp;#160; Then right click on Start
(as shown) and the click Add Dialog.&amp;#160; In this example we have 3 environment,
so choose the RadioButtons (3 Buttons) and press Ok.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_12.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_thumb_5.png" width="244" height="161" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
The Dialog window appears below the Confirm Installation box.&amp;#160; If you build the
setup project you will notice the warning, “All custom dialogs must precede the 'Installation
Folder' dialog”.&amp;#160; Therefore, click on the up arrow twice to move the RadioButton
dialog window&amp;#160; above the Installation folder.&amp;#160; Now click on the dialog and
view the Properties window.&amp;#160; There are several empty properties we need to set.&amp;#160;
Set the following to something similar to these values:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
BannerText = “Choose Environment” 
&lt;/li&gt;
&lt;li&gt;
BodyText = “Please select an environment from the list.” 
&lt;/li&gt;
&lt;li&gt;
Button1Label = “Production” 
&lt;/li&gt;
&lt;li&gt;
Button1Value = “Prod” 
&lt;/li&gt;
&lt;li&gt;
Button2Label = “Test” 
&lt;/li&gt;
&lt;li&gt;
Button2Value “Test” 
&lt;/li&gt;
&lt;li&gt;
Button3Labal = “Development” 
&lt;/li&gt;
&lt;li&gt;
Button3Value = “Dev” 
&lt;/li&gt;
&lt;li&gt;
ButtonProperty = “Env” 
&lt;/li&gt;
&lt;li&gt;
DefaultValue = “Prod” 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h3&gt;Step 9:&amp;#160; Change build type to loose uncompressed files
&lt;/h3&gt;
&lt;p&gt;
The last step is to change the Package Files option under the setup project’s properties
from “In setup file” to “As loose uncompressed files.&amp;#160; You will need to do this
for each configuration in the project.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_14.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeploymentswithTFSPart2Howtocreateanauto_7459/image_thumb_6.png" width="404" height="281" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
These are all of the steps.&amp;#160; I hope it helps.&amp;#160; Attached below is the sample
solution with the setup project hosted on the MSDN Code Gallery.&amp;#160; You may use
this however you would like.&amp;#160; Now that you know how to build the MSI, it is time
to deploy it.&amp;#160; I will walk through that in the next post.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=msi&amp;amp;DownloadId=6714" target="_blank"&gt;Sample
Automated Deployment Solution for building a Windows Service MSI&lt;/a&gt; (22k)
&lt;/p&gt;
&lt;p&gt;
The other future parts in the series will include:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Building and Deploying ClickOnce applications&lt;/li&gt;
&lt;li&gt;
Deploying a web application.&lt;/li&gt;
&lt;li&gt;
Hopefully more!&amp;#160; Let me know what you would like to see.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=3d0434dc-2673-4c21-a186-f1f1ed281164" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,3d0434dc-2673-4c21-a186-f1f1ed281164.aspx</comments>
      <category>Team Build;Team Deploy;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=58a5ce97-e1bb-4d20-9e50-e39122564d86</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,58a5ce97-e1bb-4d20-9e50-e39122564d86.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,58a5ce97-e1bb-4d20-9e50-e39122564d86.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=58a5ce97-e1bb-4d20-9e50-e39122564d86</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just received my new Google Voice number.  One of the cool features is creating
a “Call me” widget.   Here’s the link for you to call me.  If you have
any questions about VSTS or TFS including information about our <strong>Team System
and Team Foundation Server 2008 Jumpstart program</strong> or if you just want to
say “hi”, click on the link below.  Depending on the amount of SPAM and solicitors,
this may be directed to voice mail so please leave a message and I will call you back. 
Also, feel free to contact us through normal methods on our website at <a href="http://www.deliveron.com">http://www.deliveron.com</a>.
</p>
        <p>
Mike
</p>
        <p>
 <object type="application/x-shockwave-flash" data="https://clients4.google.com/voice/embed/webCallButton" width="230" height="85"><param name="movie" value="https://clients4.google.com/voice/embed/webCallButton" /><param name="wmode" value="transparent" /><param name="FlashVars" value="id=7d120b2494a7db8d60eb858f1f210aaa809cc718&amp;style=0" /></object></p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=58a5ce97-e1bb-4d20-9e50-e39122564d86" />
      </body>
      <title>Call me on my new Google Voice number</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,58a5ce97-e1bb-4d20-9e50-e39122564d86.aspx</guid>
      <link>http://codesmartnothard.com/CallMeOnMyNewGoogleVoiceNumber.aspx</link>
      <pubDate>Mon, 20 Jul 2009 23:12:00 GMT</pubDate>
      <description>&lt;p&gt;
I just received my new Google Voice number.&amp;#160; One of the cool features is creating
a “Call me” widget.&amp;#160;&amp;#160; Here’s the link for you to call me.&amp;#160; If you have
any questions about VSTS or TFS including information about our &lt;strong&gt;Team System
and Team Foundation Server 2008 Jumpstart program&lt;/strong&gt; or if you just want to
say “hi”, click on the link below.&amp;#160; Depending on the amount of SPAM and solicitors,
this may be directed to voice mail so please leave a message and I will call you back.&amp;#160;
Also, feel free to contact us through normal methods on our website at &lt;a href="http://www.deliveron.com"&gt;http://www.deliveron.com&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&lt;object type="application/x-shockwave-flash" data="https://clients4.google.com/voice/embed/webCallButton" width="230" height="85"&gt;
&lt;param name="movie" value="https://clients4.google.com/voice/embed/webCallButton" /&gt;
&lt;param name="wmode" value="transparent" /&gt;
&lt;param name="FlashVars" value="id=7d120b2494a7db8d60eb858f1f210aaa809cc718&amp;amp;style=0" /&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=58a5ce97-e1bb-4d20-9e50-e39122564d86" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,58a5ce97-e1bb-4d20-9e50-e39122564d86.aspx</comments>
      <category>General;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=f7709611-30b9-42d4-9474-e67cb6bc75b1</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,f7709611-30b9-42d4-9474-e67cb6bc75b1.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,f7709611-30b9-42d4-9474-e67cb6bc75b1.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f7709611-30b9-42d4-9474-e67cb6bc75b1</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Build automation and more specifically deployments are one of my favorite things to
do with Team Build in Team Foundation Server 2008.  Deployments are not an “out
of the box” feature but there are several ways to accomplish this.  I am going
to cover some of these different approaches and strategies for doing deployments with
TFS.  Before I get into doing the actual deployments, I want to give a some background
and guidance behind why creating automated deployments are part of a good software
configuration management (SCM) process. Then I will go into creating a MSI that supports
automated deployments.   The subsequent posts will cover a variety of topics
including deploying the MSIs with <a href="http://teamdeploy.codeplex.com/" target="_blank">Team
Deploy</a> and deploying Click Once applications.  Lastly I will explore what
automated deployments will look like in TFS 2010.  As always, if you have any
questions or if there is something you want me to see, send me an email, tweet, or
comment.
</p>
        <p>
This deployment process has been an evolution of the past 3 years.  I began getting
engaged in this process when I used to be part of a process where the development
team created a MSI for test and a couple weeks before production our PC configuration
team would create a new MSI with their tools.  We would do some testing of this
MSI over those couple weeks before going to production.  Unfortunately this process
led to a few mistakes, mostly due to the fact we were changing too much too late in
the game.  We began to think of an improved process with better configuration
management in mind.  We created a few rules to that we wanted our new process
to follow.  
</p>
        <p>
          <strong>Rules for MSIs</strong>
        </p>
        <ul>
          <li>
Create the MSI early in the development process – As early as a development team has
most of the projects for the deployment created, compile the assemblies and create
the MSI.  For Agile teams this can be as early as Iteration 1. 
</li>
          <li>
Create a MSI that is easily updated – MSBuild and Team Build by default do not support
building setup projects.   There are some workarounds to being able to build
a MSI, but I prefer creating the MSI and choose “As  loose, uncompressed files”
for the build in the setup project properties.   This will leave the files
out of the MSI and basically add pointers to the files in the MSI.  This makes
updating the MSI as easy as using the copy task.  If a new project is added to
the solution, add the new dependency, rebuild the MSI, and add the new assembly to
the copy process (more on this later) 
</li>
          <li>
Config files – This could probably be a post by itself.  Basically there are
a couple rules I have about config files.  
<ul><li>
The config files for all of the environments must be checked in to source control. 
Usually I will create a library project in the solution and add all of the config
files to it. 
</li><li>
Along with all of the files being in source control, there can be no editing or copying
of config files once the application is deployed.  For too long I would always
copy the config file from the installed location.  Then I would do the uninstall,
reinstall, and then copy/modify the config file based on the one I copied to another
file.   I did this because I didn’t know if there were changes or particular
production settings that were not in the MSI.   
</li><li>
Lastly the MSI should contain all of the config files for all of the environments. 
These can be removed after the installation process is done but the key is that the
config files are not copied from another location.  This will become more clear
when I start to walk through the process. 
</li></ul></li>
          <li>
Because the MSI contains the config files for multiple environments, the user must
be able to select the appropriate environment to install.  The MSI should allow
the the user to specify the environment in the wizard or through a command line argument
when installing it in quiet mode. 
</li>
          <li>
If the MSI is a windows service, the user must also be able to specify the username
and password through the wizard or command line. 
</li>
        </ul>
        <p>
 
</p>
        <p>
By following these rules, it provides the following enhancements
</p>
        <ul>
          <li>
Tested and Proven MSI – Just like we shouldn’t deploy code that we haven’t tested,
the same is true for the deployment process.  By using the same MSI in the Test
environment, throughout the development cycle, and in production, this will help ensure
that that are no surprises when deploying to production. 
</li>
          <li>
Ready for Automated Deployments – The MSI will include key features that are required
for use in automated deployments.   These include the config files for multiple
environments, easily updateable from Team Build, and supports passing environment
and username/password by command line. 
</li>
        </ul>
        <p>
In the next part, I will go over the steps and processes for creating a MSI to support
these rules and help enforce your configuration management process.  I will demonstrate
how to do all of this within Visual Studio without using any 3rd party tools.
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=f7709611-30b9-42d4-9474-e67cb6bc75b1" />
      </body>
      <title>TFS Deployments Part 1: The Deployment Process Should Enforce Good Configuration Management Practices</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,f7709611-30b9-42d4-9474-e67cb6bc75b1.aspx</guid>
      <link>http://codesmartnothard.com/TFSDeploymentsPart1TheDeploymentProcessShouldEnforceGoodConfigurationManagementPractices.aspx</link>
      <pubDate>Tue, 14 Jul 2009 10:13:00 GMT</pubDate>
      <description>&lt;p&gt;
Build automation and more specifically deployments are one of my favorite things to
do with Team Build in Team Foundation Server 2008.&amp;#160; Deployments are not an “out
of the box” feature but there are several ways to accomplish this.&amp;#160; I am going
to cover some of these different approaches and strategies for doing deployments with
TFS.&amp;#160; Before I get into doing the actual deployments, I want to give a some background
and guidance behind why creating automated deployments are part of a good software
configuration management (SCM) process. Then I will go into creating a MSI that supports
automated deployments.&amp;#160;&amp;#160; The subsequent posts will cover a variety of topics
including deploying the MSIs with &lt;a href="http://teamdeploy.codeplex.com/" target="_blank"&gt;Team
Deploy&lt;/a&gt; and deploying Click Once applications.&amp;#160; Lastly I will explore what
automated deployments will look like in TFS 2010.&amp;#160; As always, if you have any
questions or if there is something you want me to see, send me an email, tweet, or
comment.
&lt;/p&gt;
&lt;p&gt;
This deployment process has been an evolution of the past 3 years.&amp;#160; I began getting
engaged in this process when I used to be part of a process where the development
team created a MSI for test and a couple weeks before production our PC configuration
team would create a new MSI with their tools.&amp;#160; We would do some testing of this
MSI over those couple weeks before going to production.&amp;#160; Unfortunately this process
led to a few mistakes, mostly due to the fact we were changing too much too late in
the game.&amp;#160; We began to think of an improved process with better configuration
management in mind.&amp;#160; We created a few rules to that we wanted our new process
to follow.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Rules for MSIs&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Create the MSI early in the development process – As early as a development team has
most of the projects for the deployment created, compile the assemblies and create
the MSI.&amp;#160; For Agile teams this can be as early as Iteration 1. 
&lt;/li&gt;
&lt;li&gt;
Create a MSI that is easily updated – MSBuild and Team Build by default do not support
building setup projects.&amp;#160;&amp;#160; There are some workarounds to being able to build
a MSI, but I prefer creating the MSI and choose “As&amp;#160; loose, uncompressed files”
for the build in the setup project properties.&amp;#160;&amp;#160; This will leave the files
out of the MSI and basically add pointers to the files in the MSI.&amp;#160; This makes
updating the MSI as easy as using the copy task.&amp;#160; If a new project is added to
the solution, add the new dependency, rebuild the MSI, and add the new assembly to
the copy process (more on this later) 
&lt;/li&gt;
&lt;li&gt;
Config files – This could probably be a post by itself.&amp;#160; Basically there are
a couple rules I have about config files.&amp;#160; 
&lt;ul&gt;
&lt;li&gt;
The config files for all of the environments must be checked in to source control.&amp;#160;
Usually I will create a library project in the solution and add all of the config
files to it. 
&lt;/li&gt;
&lt;li&gt;
Along with all of the files being in source control, there can be no editing or copying
of config files once the application is deployed.&amp;#160; For too long I would always
copy the config file from the installed location.&amp;#160; Then I would do the uninstall,
reinstall, and then copy/modify the config file based on the one I copied to another
file.&amp;#160;&amp;#160; I did this because I didn’t know if there were changes or particular
production settings that were not in the MSI.&amp;#160;&amp;#160; 
&lt;/li&gt;
&lt;li&gt;
Lastly the MSI should contain all of the config files for all of the environments.&amp;#160;
These can be removed after the installation process is done but the key is that the
config files are not copied from another location.&amp;#160; This will become more clear
when I start to walk through the process. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Because the MSI contains the config files for multiple environments, the user must
be able to select the appropriate environment to install.&amp;#160; The MSI should allow
the the user to specify the environment in the wizard or through a command line argument
when installing it in quiet mode. 
&lt;/li&gt;
&lt;li&gt;
If the MSI is a windows service, the user must also be able to specify the username
and password through the wizard or command line. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
By following these rules, it provides the following enhancements
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Tested and Proven MSI – Just like we shouldn’t deploy code that we haven’t tested,
the same is true for the deployment process.&amp;#160; By using the same MSI in the Test
environment, throughout the development cycle, and in production, this will help ensure
that that are no surprises when deploying to production. 
&lt;/li&gt;
&lt;li&gt;
Ready for Automated Deployments – The MSI will include key features that are required
for use in automated deployments.&amp;#160;&amp;#160; These include the config files for multiple
environments, easily updateable from Team Build, and supports passing environment
and username/password by command line. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
In the next part, I will go over the steps and processes for creating a MSI to support
these rules and help enforce your configuration management process.&amp;#160; I will demonstrate
how to do all of this within Visual Studio without using any 3rd party tools.
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=f7709611-30b9-42d4-9474-e67cb6bc75b1" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,f7709611-30b9-42d4-9474-e67cb6bc75b1.aspx</comments>
      <category>Team Build;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=a7177338-4845-4cf2-9461-7d5e9850b984</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,a7177338-4845-4cf2-9461-7d5e9850b984.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,a7177338-4845-4cf2-9461-7d5e9850b984.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a7177338-4845-4cf2-9461-7d5e9850b984</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This week I was informed my presentation, “<a href="http://www.heartlanddc.com/omaha/sessions.aspx#95" target="_blank">An
Iteration in the Life of an Agile Team with Team System 2010</a>” was added to the
schedule at the <a href="http://www.heartlanddc.com/" target="_blank">Heartland Developer
Conference 2009</a>.  I am excited to be presenting at this event that usually
sells out around 600 attendees.  It is going to be huge. There are a lot of great
speakers and topics.  Scott Guthrie is one of the keynote speakers!  My
session is October 16th at 2:00pm.  I am looking forward to this session that
will be a unique, real world way of demonstrating some of the new features of Team
System 2010.
</p>
        <p>
          <strong>Presentation Summary</strong>
        </p>
        <blockquote>
          <p>
This presentation will demonstrate a complete two week scrum iteration from the planning
meeting to development, testing, and bug fixing to deployment utilizing the features
found in Team System 2010. New features include gated check-ins for Continuous Integration
(CI), Test-Driven Development (TDD), Product Backlog enhancements including hierarchical
views and support for multiple teams to work from a single backlog. The presentation
also demonstrates the enhancements to the TFS Portal and Web Access to support Agile
planning and displaying graphs such as burn-down charts. Each walk through includes
a live demonstration of the feature in Visual Studio Team System 2010.
</p>
        </blockquote>
        <p>
I hope to see everyone there!
</p>
        <p>
          <a href="http://www.heartlanddc.com" target="_blank">
            <img src="http://www.heartlanddc.com/images/badge_480x60.gif" />
          </a>
        </p>
        <p>
 
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=a7177338-4845-4cf2-9461-7d5e9850b984" />
      </body>
      <title>I am Presenting at HDC09!</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,a7177338-4845-4cf2-9461-7d5e9850b984.aspx</guid>
      <link>http://codesmartnothard.com/IAmPresentingAtHDC09.aspx</link>
      <pubDate>Thu, 09 Jul 2009 05:48:00 GMT</pubDate>
      <description>&lt;p&gt;
This week I was informed my presentation, “&lt;a href="http://www.heartlanddc.com/omaha/sessions.aspx#95" target="_blank"&gt;An
Iteration in the Life of an Agile Team with Team System 2010&lt;/a&gt;” was added to the
schedule at the &lt;a href="http://www.heartlanddc.com/" target="_blank"&gt;Heartland Developer
Conference 2009&lt;/a&gt;.&amp;#160; I am excited to be presenting at this event that usually
sells out around 600 attendees.&amp;#160; It is going to be huge. There are a lot of great
speakers and topics.&amp;#160; Scott Guthrie is one of the keynote speakers!&amp;#160; My
session is October 16th at 2:00pm.&amp;#160; I am looking forward to this session that
will be a unique, real world way of demonstrating some of the new features of Team
System 2010.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Presentation Summary&lt;/strong&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
This presentation will demonstrate a complete two week scrum iteration from the planning
meeting to development, testing, and bug fixing to deployment utilizing the features
found in Team System 2010. New features include gated check-ins for Continuous Integration
(CI), Test-Driven Development (TDD), Product Backlog enhancements including hierarchical
views and support for multiple teams to work from a single backlog. The presentation
also demonstrates the enhancements to the TFS Portal and Web Access to support Agile
planning and displaying graphs such as burn-down charts. Each walk through includes
a live demonstration of the feature in Visual Studio Team System 2010.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I hope to see everyone there!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.heartlanddc.com" target="_blank"&gt;&lt;img src="http://www.heartlanddc.com/images/badge_480x60.gif" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=a7177338-4845-4cf2-9461-7d5e9850b984" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,a7177338-4845-4cf2-9461-7d5e9850b984.aspx</comments>
      <category>HDC;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=a1afe30d-e652-4da5-abee-3f2d3725b37e</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,a1afe30d-e652-4da5-abee-3f2d3725b37e.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,a1afe30d-e652-4da5-abee-3f2d3725b37e.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a1afe30d-e652-4da5-abee-3f2d3725b37e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In many of my projects I will create a new release branch when our code is ready for
production.  This gives me a snapshot of the code when it went to production. 
This allows us to make any bug fixes in the production code base but continue adding
new features to dev and test branches.  This has always been a manual step to
create the branch until i was talking to a client and suggested that I could automate
this process.    I hadn’t done a branch from within Team Build but
I knew it could be done via the command line so I figured we could automate it.   
I used the Exec task to create the branch like this:
</p>
        <blockquote>
          <p>
&lt;Exec WorkingDirectory="$(SolutionRoot)" 
<br />
       Command="$(TF) branch $/MyTeamProject/Main/
$/MyTeamProject/Releases/2.1.0.0 /noget" 
</p>
        </blockquote>
        <p>
Next the build needed to check in the branch:
</p>
        <blockquote>
          <p>
&lt;Exec WorkingDirectory="$(SolutionRoot)" 
<br />
  Command="$(TF) checkin /comment:&amp;quot;***NO_CI***New Release Created&amp;quot;
/noprompt 
<br />
  /override:&amp;quot;New Release Created&amp;quot; /recursive" 
<br />
  IgnoreExitCode="true" /&gt;
</p>
        </blockquote>
        <p>
This was the easy part.  One of the challenging parts was the workspace mappings. 
Even though I could get this to work by creating a mapping at the root of the team
project, I didn’t want to pull down all of the branches under source control.  
If I didn’t have the mappings at a high enough level to cover the target, the build
will generate an error like this:
</p>
        <blockquote>
          <p>
No appropriate mapping exists for $/MyTeamProject/Releases/2.1.0.0
</p>
        </blockquote>
        <p>
Since with each release this problem would compound, I wanted to only pull down the
necessary source control.  To solve this problem I created a custom task that
takes a parent folder, in this case $/MyTeamProject/Releases/ and either cloaks all
of the subfolders to only add a new row, or it will cloak all of the folders except
for the one specified.   The second option is beneficial if the source folder
for the branch is dynamic also.  This will also create a dynamic mapping between
the WorkspaceServerItem and WorkspaceLocalItem.
</p>
        <p>
The task is called CreateDynamicMapping and here is the call:
</p>
        <blockquote>
          <p>
&lt;CreateDynamicMapping 
<br />
  TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
<br />
  BuildUri="$(BuildUri)" 
<br />
  WorkspaceServerItem="$/MyTeamProject/Releases/" 
<br />
  WorkspaceLocalItem="$(SolutionRoot)\Releases" 
<br />
  WorkspaceName="$(WorkspaceName)" 
<br />
  WorkspaceOwner="$(WorkspaceOwner)" 
<br />
  ParentFolder="$/MyTeamProject/Releases/" 
<br />
&lt;/CreateDynamicMapping&gt;
</p>
        </blockquote>
        <p>
This example uses the ParentFolder to get all of the child folders, loops through
each of them and if it finds a match to the WorkspaceServerItem (It won’t in this
example because it isn’t a child folder of the ParentFolder) it will keep that folder,
otherwise it cloaks the folder so it is not pulled down.
</p>
        <p>
Creating this task was my first opportunity to use the TFS API.  With the help
of some great posts by <a href="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS+API/default.aspx" target="_blank">Shai
Raiten</a>, this ended up straight forward and even wrapped some unit tests around
make sure it worked.  Here’s the main part of the code for the task:
</p>
        <blockquote>
          <p>
TeamFoundationServer tfs = new TeamFoundationServer(teamFoundationServerUrl); 
</p>
          <p>
// Get a reference to Version Control. 
<br />
VersionControlServer versionControl = (VersionControlServer)tfs.GetService(typeof(VersionControlServer)); 
</p>
          <p>
Workspace[] workspaces = versionControl.QueryWorkspaces(workspaceName, workspaceOwner,
null); 
</p>
          <p>
if (!parentFolder.Contains("*.*")) 
<br />
{ 
<br />
    parentFolder += "/*.*"; 
<br />
    parentFolder = parentFolder.Replace("//", "/"); 
<br />
} 
<br />
RecursionType recursion = RecursionType.OneLevel; 
<br />
ItemSet itemSet = versionControl.GetItems(parentFolder, recursion); 
<br />
foreach (Item item in itemSet.Items) 
<br />
{ 
<br />
    if (workspaceServerItem.ToUpper() != item.ServerItem.ToUpper()) 
<br />
    { 
<br />
        workspaces[0].Cloak(item.ServerItem); 
<br />
    } 
<br />
} 
</p>
          <p>
workspaces[0].CreateMapping(new WorkingFolder(workspaceServerItem, workspaceLocalItem));
</p>
        </blockquote>
        <p>
This is what you need to automate the branching process from with a TFS Build.  
I didn’t talk about how to get your version number to branch to.  This will depend
on your projects requirements.  You may want to use get the assembly version
of one of the assemblies you compiled to use this as the folder or in this instance
the source folder was dynamic too. 
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=a1afe30d-e652-4da5-abee-3f2d3725b37e" />
      </body>
      <title>How to Branch within in a TFS Build</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,a1afe30d-e652-4da5-abee-3f2d3725b37e.aspx</guid>
      <link>http://codesmartnothard.com/HowToBranchWithinInATFSBuild.aspx</link>
      <pubDate>Thu, 02 Jul 2009 10:01:00 GMT</pubDate>
      <description>&lt;p&gt;
In many of my projects I will create a new release branch when our code is ready for
production.&amp;#160; This gives me a snapshot of the code when it went to production.&amp;#160;
This allows us to make any bug fixes in the production code base but continue adding
new features to dev and test branches.&amp;#160; This has always been a manual step to
create the branch until i was talking to a client and suggested that I could automate
this process.&amp;#160;&amp;#160;&amp;#160; I hadn’t done a branch from within Team Build but
I knew it could be done via the command line so I figured we could automate it.&amp;#160;&amp;#160;&amp;#160;
I used the Exec task to create the branch like this:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&amp;lt;Exec WorkingDirectory=&amp;quot;$(SolutionRoot)&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Command=&amp;quot;$(TF) branch $/MyTeamProject/Main/
$/MyTeamProject/Releases/2.1.0.0 /noget&amp;quot; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Next the build needed to check in the branch:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&amp;lt;Exec WorkingDirectory=&amp;quot;$(SolutionRoot)&amp;quot; 
&lt;br /&gt;
&amp;#160; Command=&amp;quot;$(TF) checkin /comment:&amp;amp;quot;***NO_CI***New Release Created&amp;amp;quot;
/noprompt 
&lt;br /&gt;
&amp;#160; /override:&amp;amp;quot;New Release Created&amp;amp;quot; /recursive&amp;quot; 
&lt;br /&gt;
&amp;#160; IgnoreExitCode=&amp;quot;true&amp;quot; /&amp;gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This was the easy part.&amp;#160; One of the challenging parts was the workspace mappings.&amp;#160;
Even though I could get this to work by creating a mapping at the root of the team
project, I didn’t want to pull down all of the branches under source control.&amp;#160;&amp;#160;
If I didn’t have the mappings at a high enough level to cover the target, the build
will generate an error like this:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
No appropriate mapping exists for $/MyTeamProject/Releases/2.1.0.0
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Since with each release this problem would compound, I wanted to only pull down the
necessary source control.&amp;#160; To solve this problem I created a custom task that
takes a parent folder, in this case $/MyTeamProject/Releases/ and either cloaks all
of the subfolders to only add a new row, or it will cloak all of the folders except
for the one specified.&amp;#160;&amp;#160; The second option is beneficial if the source folder
for the branch is dynamic also.&amp;#160; This will also create a dynamic mapping between
the WorkspaceServerItem and WorkspaceLocalItem.
&lt;/p&gt;
&lt;p&gt;
The task is called CreateDynamicMapping and here is the call:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&amp;lt;CreateDynamicMapping 
&lt;br /&gt;
&amp;#160; TeamFoundationServerUrl=&amp;quot;$(TeamFoundationServerUrl)&amp;quot; 
&lt;br /&gt;
&amp;#160; BuildUri=&amp;quot;$(BuildUri)&amp;quot; 
&lt;br /&gt;
&amp;#160; WorkspaceServerItem=&amp;quot;$/MyTeamProject/Releases/&amp;quot; 
&lt;br /&gt;
&amp;#160; WorkspaceLocalItem=&amp;quot;$(SolutionRoot)\Releases&amp;quot; 
&lt;br /&gt;
&amp;#160; WorkspaceName=&amp;quot;$(WorkspaceName)&amp;quot; 
&lt;br /&gt;
&amp;#160; WorkspaceOwner=&amp;quot;$(WorkspaceOwner)&amp;quot; 
&lt;br /&gt;
&amp;#160; ParentFolder=&amp;quot;$/MyTeamProject/Releases/&amp;quot; 
&lt;br /&gt;
&amp;lt;/CreateDynamicMapping&amp;gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This example uses the ParentFolder to get all of the child folders, loops through
each of them and if it finds a match to the WorkspaceServerItem (It won’t in this
example because it isn’t a child folder of the ParentFolder) it will keep that folder,
otherwise it cloaks the folder so it is not pulled down.
&lt;/p&gt;
&lt;p&gt;
Creating this task was my first opportunity to use the TFS API.&amp;#160; With the help
of some great posts by &lt;a href="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS+API/default.aspx" target="_blank"&gt;Shai
Raiten&lt;/a&gt;, this ended up straight forward and even wrapped some unit tests around
make sure it worked.&amp;#160; Here’s the main part of the code for the task:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
TeamFoundationServer tfs = new TeamFoundationServer(teamFoundationServerUrl); 
&lt;/p&gt;
&lt;p&gt;
// Get a reference to Version Control. 
&lt;br /&gt;
VersionControlServer versionControl = (VersionControlServer)tfs.GetService(typeof(VersionControlServer)); 
&lt;/p&gt;
&lt;p&gt;
Workspace[] workspaces = versionControl.QueryWorkspaces(workspaceName, workspaceOwner,
null); 
&lt;/p&gt;
&lt;p&gt;
if (!parentFolder.Contains(&amp;quot;*.*&amp;quot;)) 
&lt;br /&gt;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; parentFolder += &amp;quot;/*.*&amp;quot;; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; parentFolder = parentFolder.Replace(&amp;quot;//&amp;quot;, &amp;quot;/&amp;quot;); 
&lt;br /&gt;
} 
&lt;br /&gt;
RecursionType recursion = RecursionType.OneLevel; 
&lt;br /&gt;
ItemSet itemSet = versionControl.GetItems(parentFolder, recursion); 
&lt;br /&gt;
foreach (Item item in itemSet.Items) 
&lt;br /&gt;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; if (workspaceServerItem.ToUpper() != item.ServerItem.ToUpper()) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; workspaces[0].Cloak(item.ServerItem); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; } 
&lt;br /&gt;
} 
&lt;/p&gt;
&lt;p&gt;
workspaces[0].CreateMapping(new WorkingFolder(workspaceServerItem, workspaceLocalItem));
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This is what you need to automate the branching process from with a TFS Build.&amp;#160;&amp;#160;
I didn’t talk about how to get your version number to branch to.&amp;#160; This will depend
on your projects requirements.&amp;#160; You may want to use get the assembly version
of one of the assemblies you compiled to use this as the folder or in this instance
the source folder was dynamic too. 
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=a1afe30d-e652-4da5-abee-3f2d3725b37e" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,a1afe30d-e652-4da5-abee-3f2d3725b37e.aspx</comments>
      <category>Team Build;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=d99ab570-7685-42ad-9c99-6bfd4b459bbe</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,d99ab570-7685-42ad-9c99-6bfd4b459bbe.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,d99ab570-7685-42ad-9c99-6bfd4b459bbe.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d99ab570-7685-42ad-9c99-6bfd4b459bbe</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
 
</p>
        <p>
Today I was installing Team Foundation Server 2008 on a Windows Server 2008 server
where I installed WSS 3.0 SP2 when I realized I was going to get error connecting
to an existing Windows SharePoint Services server.  The error is <strong>TF220037:
The Windows SharePoint Services administration site could not be found at the following
location:</strong>  <a href="http://myserver:17012">http://myserver:17012</a></p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/0f620c3c0864_C396/image_4.png">
            <img title="image" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="269" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/0f620c3c0864_C396/image_thumb_1.png" width="504" border="0" />
          </a>
        </p>
        <p>
 
</p>
        <p>
Basically this error means that it can’t find the WSS Central Administration site. 
Usually when I see this error it means that the WSS Central Administration site is
installed on a different port.  The easiest way I have found to get the correct
port number is to open the Central Administration site and look at the port in the
URL.   In my example below the correct port is 21810.  I simply updated
the port on the installation screen on the left and it worked fine.
</p>
        <p>
To open Central Administration,  go to Start &gt; Administrative Tools &gt; Central
Administration.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/0f620c3c0864_C396/image_2.png">
            <img title="image" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="276" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/0f620c3c0864_C396/image_thumb.png" width="504" border="0" />
          </a>
        </p>
        <p>
That’s it! I hope it helps.
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=d99ab570-7685-42ad-9c99-6bfd4b459bbe" />
      </body>
      <title>TFS Error TF220037 When Connecting to Existing Windows SharePoint Services Server</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,d99ab570-7685-42ad-9c99-6bfd4b459bbe.aspx</guid>
      <link>http://codesmartnothard.com/TFSErrorTF220037WhenConnectingToExistingWindowsSharePointServicesServer.aspx</link>
      <pubDate>Fri, 26 Jun 2009 02:04:00 GMT</pubDate>
      <description>&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Today I was installing Team Foundation Server 2008 on a Windows Server 2008 server
where I installed WSS 3.0 SP2 when I realized I was going to get error connecting
to an existing Windows SharePoint Services server.&amp;nbsp; The error is &lt;strong&gt;TF220037:
The Windows SharePoint Services administration site could not be found at the following
location:&lt;/strong&gt;&amp;nbsp; &lt;a href="http://myserver:17012"&gt;http://myserver:17012&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/0f620c3c0864_C396/image_4.png"&gt;&lt;img title=image style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=269 alt=image src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/0f620c3c0864_C396/image_thumb_1.png" width=504 border=0&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Basically this error means that it can’t find the WSS Central Administration site.&amp;nbsp;
Usually when I see this error it means that the WSS Central Administration site is
installed on a different port.&amp;nbsp; The easiest way I have found to get the correct
port number is to open the Central Administration site and look at the port in the
URL.&amp;nbsp;&amp;nbsp; In my example below the correct port is 21810.&amp;nbsp; I simply updated
the port on the installation screen on the left and it worked fine.
&lt;/p&gt;
&lt;p&gt;
To open Central Administration,&amp;nbsp; go to Start &amp;gt; Administrative Tools &amp;gt; Central
Administration.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/0f620c3c0864_C396/image_2.png"&gt;&lt;img title=image style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=276 alt=image src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/0f620c3c0864_C396/image_thumb.png" width=504 border=0&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
That’s it! I hope it helps.
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=d99ab570-7685-42ad-9c99-6bfd4b459bbe" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,d99ab570-7685-42ad-9c99-6bfd4b459bbe.aspx</comments>
      <category>Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=0eb1e7ab-f347-4b7b-b27f-aeeff32ab2ea</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,0eb1e7ab-f347-4b7b-b27f-aeeff32ab2ea.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,0eb1e7ab-f347-4b7b-b27f-aeeff32ab2ea.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=0eb1e7ab-f347-4b7b-b27f-aeeff32ab2ea</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Thanks everyone for attending the meeting on Tuesday.   It was a great time. 
I thought the attendance was good, especially for the day after a holiday and there
were a lot of great questions asked.   I hope everyone picked up some good
tips that will help them implement Team System and Team Foundation Server.  
If you run into any problems feel free to contact me.  I would be happy to try
to help. 
</p>
        <p>
Here are the slides. 
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/Installing_and_Configuring_Team_Foundation_Server_2008.zip">Installing_and_Configuring_Team_Foundation_Server_2008.zip
(603.07 KB)</a>
        </p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=0eb1e7ab-f347-4b7b-b27f-aeeff32ab2ea" />
      </body>
      <title>Omaha Team System User Group Meeting</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,0eb1e7ab-f347-4b7b-b27f-aeeff32ab2ea.aspx</guid>
      <link>http://codesmartnothard.com/OmahaTeamSystemUserGroupMeeting.aspx</link>
      <pubDate>Thu, 28 May 2009 08:31:00 GMT</pubDate>
      <description>&lt;p&gt;
Thanks everyone for attending the meeting on Tuesday.&amp;nbsp;&amp;nbsp; It was a great time.&amp;nbsp;
I thought the attendance was good, especially for the day after a holiday and there
were a lot of great questions asked.&amp;nbsp;&amp;nbsp; I hope everyone picked up some good
tips that will help them implement Team System and Team Foundation Server.&amp;nbsp;&amp;nbsp;
If you run into any problems feel free to contact me.&amp;nbsp; I would be happy to try
to help. 
&lt;/p&gt;
&lt;p&gt;
Here are the slides. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/Installing_and_Configuring_Team_Foundation_Server_2008.zip"&gt;Installing_and_Configuring_Team_Foundation_Server_2008.zip
(603.07 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=0eb1e7ab-f347-4b7b-b27f-aeeff32ab2ea" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,0eb1e7ab-f347-4b7b-b27f-aeeff32ab2ea.aspx</comments>
      <category>Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=a2e80390-8e47-481e-af0b-a2133cda7ee5</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,a2e80390-8e47-481e-af0b-a2133cda7ee5.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,a2e80390-8e47-481e-af0b-a2133cda7ee5.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a2e80390-8e47-481e-af0b-a2133cda7ee5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Team Foundation Server 2008 requires administrators to manage user and group permissions
in three locations.  Users must be added to the appropriate permissions in TFS,
SharePoint, and SQL Server Reporting Services.  Doing this manually is cumbersome. 
The <a href="http://tfsadmin.codeplex.com/" target="_blank">TFS Admin Tool</a> is
a free add-on to Team Foundation Server that makes this process much easier.
</p>
        <p>
I was installing the latest version 1.4 on Windows Server 2008 and received the message
“<strong>Please wait while the installer finishes determining your disk space requirements</strong>.” 
when I clicked on Next after the EULA.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallingtheTFSAdministrationToolonWind_12BF3/image_2.png">
            <img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="159" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallingtheTFSAdministrationToolonWind_12BF3/image_thumb.png" width="404" border="0" />
          </a>
        </p>
        <p>
I had a hunch it was UAL and I needed to do “Run As Administrator” to make this work. 
Unfortunately with MSIs there is no “Run As Administrator” option in the context menu. 
To work around this I opened an “Administrator Command Prompt”.  Here I ran MsiExec
against the Msi and it worked fine.
</p>
        <p>
C:\Users\Administrator&gt;msiexec /i c:\users\Administrator\Desktop\TFSAdminToolSetup.msi
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=a2e80390-8e47-481e-af0b-a2133cda7ee5" />
      </body>
      <title>Installing the TFS Administration Tool on Windows Server 2008</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,a2e80390-8e47-481e-af0b-a2133cda7ee5.aspx</guid>
      <link>http://codesmartnothard.com/InstallingTheTFSAdministrationToolOnWindowsServer2008.aspx</link>
      <pubDate>Mon, 25 May 2009 03:18:00 GMT</pubDate>
      <description>&lt;p&gt;
Team Foundation Server 2008 requires administrators to manage user and group permissions
in three locations.&amp;#160; Users must be added to the appropriate permissions in TFS,
SharePoint, and SQL Server Reporting Services.&amp;#160; Doing this manually is cumbersome.&amp;#160;
The &lt;a href="http://tfsadmin.codeplex.com/" target="_blank"&gt;TFS Admin Tool&lt;/a&gt; is
a free add-on to Team Foundation Server that makes this process much easier.
&lt;/p&gt;
&lt;p&gt;
I was installing the latest version 1.4 on Windows Server 2008 and received the message
“&lt;strong&gt;Please wait while the installer finishes determining your disk space requirements&lt;/strong&gt;.”&amp;#160;
when I clicked on Next after the EULA.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallingtheTFSAdministrationToolonWind_12BF3/image_2.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="159" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallingtheTFSAdministrationToolonWind_12BF3/image_thumb.png" width="404" border="0" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
I had a hunch it was UAL and I needed to do “Run As Administrator” to make this work.&amp;#160;
Unfortunately with MSIs there is no “Run As Administrator” option in the context menu.&amp;#160;
To work around this I opened an “Administrator Command Prompt”.&amp;#160; Here I ran MsiExec
against the Msi and it worked fine.
&lt;/p&gt;
&lt;p&gt;
C:\Users\Administrator&amp;gt;msiexec /i c:\users\Administrator\Desktop\TFSAdminToolSetup.msi
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=a2e80390-8e47-481e-af0b-a2133cda7ee5" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,a2e80390-8e47-481e-af0b-a2133cda7ee5.aspx</comments>
      <category>Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=0449bb80-1bee-4a75-87fd-be7ac1010396</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,0449bb80-1bee-4a75-87fd-be7ac1010396.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,0449bb80-1bee-4a75-87fd-be7ac1010396.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=0449bb80-1bee-4a75-87fd-be7ac1010396</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last week I added a MSI for installing Team Deploy.   I am excited about
this because this simplifies the installation process.  Simply run the MSI and
it installs all of the components for Team Deploy.  Team Deploy still requires
the separate download and installation of <a href="http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx" target="_blank">PSTools</a>.  
Also, if you have an older version of PSTools, download the latest version to help
ensure it works with the latest version of Team Deploy.
</p>
        <p>
Here is the listing of installed files with the MSI.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallTeamDeploywithNewMSI_14204/image_2.png">
            <img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="248" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallTeamDeploywithNewMSI_14204/image_thumb.png" width="484" border="0" />
          </a>
        </p>
        <p>
I have also included a “real world” type deploy script and TFSBuild.proj file based
on some great feedback I have received.  These should show some good examples
of how to use it.
</p>
        <p>
As always you can find Team Deploy at <a href="http://teamdeploy.codeplex.com">http://teamdeploy.codeplex.com</a>.
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=0449bb80-1bee-4a75-87fd-be7ac1010396" />
      </body>
      <title>Install Team Deploy with New MSI</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,0449bb80-1bee-4a75-87fd-be7ac1010396.aspx</guid>
      <link>http://codesmartnothard.com/InstallTeamDeployWithNewMSI.aspx</link>
      <pubDate>Wed, 20 May 2009 08:53:00 GMT</pubDate>
      <description>&lt;p&gt;
Last week I added a MSI for installing Team Deploy.&amp;#160;&amp;#160; I am excited about
this because this simplifies the installation process.&amp;#160; Simply run the MSI and
it installs all of the components for Team Deploy.&amp;#160; Team Deploy still requires
the separate download and installation of &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx" target="_blank"&gt;PSTools&lt;/a&gt;.&amp;#160;&amp;#160;
Also, if you have an older version of PSTools, download the latest version to help
ensure it works with the latest version of Team Deploy.
&lt;/p&gt;
&lt;p&gt;
Here is the listing of installed files with the MSI.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallTeamDeploywithNewMSI_14204/image_2.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="248" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/InstallTeamDeploywithNewMSI_14204/image_thumb.png" width="484" border="0" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
I have also included a “real world” type deploy script and TFSBuild.proj file based
on some great feedback I have received.&amp;#160; These should show some good examples
of how to use it.
&lt;/p&gt;
&lt;p&gt;
As always you can find Team Deploy at &lt;a href="http://teamdeploy.codeplex.com"&gt;http://teamdeploy.codeplex.com&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=0449bb80-1bee-4a75-87fd-be7ac1010396" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,0449bb80-1bee-4a75-87fd-be7ac1010396.aspx</comments>
      <category>Team Build;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=ba067170-d1b7-477e-a05a-e3dfe288aa2e</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,ba067170-d1b7-477e-a05a-e3dfe288aa2e.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,ba067170-d1b7-477e-a05a-e3dfe288aa2e.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=ba067170-d1b7-477e-a05a-e3dfe288aa2e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I normally don't just post links to another post but this post by Brian Harry really
got me excited about TFS 2010.  It appears Microsoft has addressed almost every
limitation of the TFS 2008 installation and configuration.  He explains
all of the components of TFS and provides some great screenshots.  Check it out!
</p>
        <p>
          <a href="http://blogs.msdn.com/bharry/archive/2009/04/30/tfs-2010-admin-operations-setup-improvements.aspx">http://blogs.msdn.com/bharry/archive/2009/04/30/tfs-2010-admin-operations-setup-improvements.aspx</a>
        </p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=ba067170-d1b7-477e-a05a-e3dfe288aa2e" />
      </body>
      <title>TFS 2010 Setup and Configuration Improvements Post</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,ba067170-d1b7-477e-a05a-e3dfe288aa2e.aspx</guid>
      <link>http://codesmartnothard.com/TFS2010SetupAndConfigurationImprovementsPost.aspx</link>
      <pubDate>Fri, 01 May 2009 04:03:57 GMT</pubDate>
      <description>&lt;p&gt;
I normally don't just post links to another post but this post by Brian Harry really
got me excited about TFS 2010.&amp;nbsp; It appears Microsoft has addressed almost every
limitation of the TFS 2008 installation and configuration.&amp;nbsp;&amp;nbsp;He explains
all of the components of TFS and provides some great screenshots. &amp;nbsp;Check it out!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blogs.msdn.com/bharry/archive/2009/04/30/tfs-2010-admin-operations-setup-improvements.aspx"&gt;http://blogs.msdn.com/bharry/archive/2009/04/30/tfs-2010-admin-operations-setup-improvements.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=ba067170-d1b7-477e-a05a-e3dfe288aa2e" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,ba067170-d1b7-477e-a05a-e3dfe288aa2e.aspx</comments>
      <category>Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=9a3ce095-9c1d-409e-aea9-9b85e8dbd891</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,9a3ce095-9c1d-409e-aea9-9b85e8dbd891.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,9a3ce095-9c1d-409e-aea9-9b85e8dbd891.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=9a3ce095-9c1d-409e-aea9-9b85e8dbd891</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I am excited to announce that I am going to be presenting at the next Omaha Team System
User Group meeting on May 26th, 2009.  In addition to what I think is a great
topic that I am looking forward to presenting, <a href="http://www.deliveron.com" target="_blank">Deliveron
Consulting Services</a> is co-sponsoring the meeting and giving away an <a href="http://www.xbox.com/en-US/" target="_blank">XBOX
360</a>, a <a href="http://www.nfm.com" target="_blank">NFM</a> gift card, and two
TFS books!  WOW!  I look forward to seeing everyone there.  
</p>
        <p>
Here’s the information on the presentation:
</p>
        <p>
          <b>Installing and Configuring Team Foundation Server 2008</b>
        </p>
        <p>
This presentation provides an overview of TFS 2008 and demonstrates best practices,
lessons learned, and “gotchas” installing and configuring TFS 2008.  The overview
explains the architecture and components of Team Foundation Server 2008 and recommended
server configurations.  The demonstrations will include using the Best Practice
Analyzer, Setting User Permissions and using the TFS Admin Tool, and creating and
configuring a Team Project from start to finish.  The configuration process will
include recommended settings, source control folder structure, and creating appropriate
notification.  The presentation will conclude with techniques and lessons learned
for troubleshooting problems with installations.
</p>
        <p>
          <strong>About me</strong>
        </p>
        <p>
Mike Douglas is a Solution Consultant at Deliveron Consulting Services where he provides
end-to-end solutions and TFS installation, configuration, and custom development for
clients.  He has over 11 years experience building enterprise level applications
on a variety of .NET technologies including WCF, Web Services, ASP.NET, Disconnected
Smart Clients and Data Synchronization, BizTalk, and Team Foundation Server. 
Mike enjoys trying to keep up with the constant change and evolution of .NET. 
Mike is an experienced presenter having spoken at several Omaha .NET User Group meetings
on <a href="http://www.lhotka.net/cslanet/Default.aspx" target="_blank">CSLA.NET</a>,
Subsonic, and TFS.  He also spoke at the 2008 ESRI International User Conference
on a GIS integration project he helped lead. Mike actively maintains the open source
project, <a href="http://teamdeploy.codeplex.com/" target="_blank">Team Deploy</a>,
on CodePlex for deploying MSIs using Team Foundation Server.  Mike also enjoys
sharing his experiences in Code Generation, CSLA.NET, and TFS on his blog at <a href="http://www.CodeSmartNotHard.com">www.CodeSmartNotHard.com</a>.
</p>
        <p>
          <strong>Date and Location</strong>
        </p>
        <p>
May 26th, 2009
</p>
        <p>
Farm Credit Services of America 
<br />
5015 S 118th St 
<br />
Omaha, NE 68137
</p>
        <p>
For more information and to register, visit the <a href="http://www.otsug.org/default.aspx" target="_blank">Omaha
Team System User Group</a> site.
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=9a3ce095-9c1d-409e-aea9-9b85e8dbd891" />
      </body>
      <title>Installing and Configuring Team Foundation Server 2008 Presentation</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,9a3ce095-9c1d-409e-aea9-9b85e8dbd891.aspx</guid>
      <link>http://codesmartnothard.com/InstallingAndConfiguringTeamFoundationServer2008Presentation.aspx</link>
      <pubDate>Tue, 28 Apr 2009 04:05:33 GMT</pubDate>
      <description>&lt;p&gt;
I am excited to announce that I am going to be presenting at the next Omaha Team System
User Group meeting on May 26th, 2009.&amp;nbsp; In addition to what I think is a great
topic that I am looking forward to presenting, &lt;a href="http://www.deliveron.com" target=_blank&gt;Deliveron
Consulting Services&lt;/a&gt; is co-sponsoring the meeting and giving away an &lt;a href="http://www.xbox.com/en-US/" target=_blank&gt;XBOX
360&lt;/a&gt;, a &lt;a href="http://www.nfm.com" target=_blank&gt;NFM&lt;/a&gt; gift card, and two TFS
books!&amp;nbsp; WOW!&amp;nbsp; I look forward to seeing everyone there.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Here’s the information on the presentation:
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Installing and Configuring Team Foundation Server 2008&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
This presentation provides an overview of TFS 2008 and demonstrates best practices,
lessons learned, and “gotchas” installing and configuring TFS 2008.&amp;nbsp; The overview
explains the architecture and components of Team Foundation Server 2008 and recommended
server configurations.&amp;nbsp; The demonstrations will include using the Best Practice
Analyzer, Setting User Permissions and using the TFS Admin Tool, and creating and
configuring a Team Project from start to finish.&amp;nbsp; The configuration process will
include recommended settings, source control folder structure, and creating appropriate
notification.&amp;nbsp; The presentation will conclude with techniques and lessons learned
for troubleshooting problems with installations.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;About me&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Mike Douglas is a Solution Consultant at Deliveron Consulting Services where he provides
end-to-end solutions and TFS installation, configuration, and custom development for
clients.&amp;nbsp; He has over 11 years experience building enterprise level applications
on a variety of .NET technologies including WCF, Web Services, ASP.NET, Disconnected
Smart Clients and Data Synchronization, BizTalk, and Team Foundation Server.&amp;nbsp;
Mike enjoys trying to keep up with the constant change and evolution of .NET.&amp;nbsp;
Mike is an experienced presenter having spoken at several Omaha .NET User Group meetings
on &lt;a href="http://www.lhotka.net/cslanet/Default.aspx" target=_blank&gt;CSLA.NET&lt;/a&gt;,
Subsonic, and TFS.&amp;nbsp; He also spoke at the 2008 ESRI International User Conference
on a GIS integration project he helped lead. Mike actively maintains the open source
project, &lt;a href="http://teamdeploy.codeplex.com/" target=_blank&gt;Team Deploy&lt;/a&gt;,
on CodePlex for deploying MSIs using Team Foundation Server.&amp;nbsp; Mike also enjoys
sharing his experiences in Code Generation, CSLA.NET, and TFS on his blog at &lt;a href="http://www.CodeSmartNotHard.com"&gt;www.CodeSmartNotHard.com&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Date and Location&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
May 26th, 2009
&lt;/p&gt;
&lt;p&gt;
Farm Credit Services of America 
&lt;br&gt;
5015 S 118th St 
&lt;br&gt;
Omaha, NE 68137
&lt;/p&gt;
&lt;p&gt;
For more information and to register, visit the &lt;a href="http://www.otsug.org/default.aspx" target=_blank&gt;Omaha
Team System User Group&lt;/a&gt; site.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=9a3ce095-9c1d-409e-aea9-9b85e8dbd891" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,9a3ce095-9c1d-409e-aea9-9b85e8dbd891.aspx</comments>
      <category>Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=11983e5a-c89c-4f04-947e-fd83e6a6cec2</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,11983e5a-c89c-4f04-947e-fd83e6a6cec2.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,11983e5a-c89c-4f04-947e-fd83e6a6cec2.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=11983e5a-c89c-4f04-947e-fd83e6a6cec2</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today I am excited to announce the release of <a href="http://teamdeploy.codeplex.com/" target="_blank">Team
Deploy 2.0</a>.  Additionally, the total download count of Team Deploy has passed
1000 downloads!   
</p>
        <p>
Team Deploy is an open source package of custom build tasks designed for Team Foundation
Server 2008 for deploying MSIs to clients and/or servers.  There is also a build
notification task for lava lamps or street lights with your builds.
</p>
        <p>
The enhancements and fixes for 2.0 include:
</p>
        <li>
Added TaskBase class for common functionality for example,BuildUri and TeamFoundationServerURL.
These properties are now optional. It will basically skip the build step display if
these properties are not set. All tasks inherit TaskBase. 
</li>
        <li>
Added check to "StopService" so it only does it if the service exists and it "canstop".
(bug) 
</li>
        <li>
Added new RemoteExecute task. Now call any executable on target machines. This also
has a WaitForExit property to be able to wait for the response or not from the target
machine. 
</li>
        <li>
Added setup MSI to install Team Deploy instead of manual steps. 
</li>
        <li>
Added IgnoreExitCode attribute to the base class. If the task checks for exit code
it now will log it as an error if the code &gt; 0 unless IgnoreExitCode == true. 
</li>
        <li>
Fixed a problem where with the new version of pstools, it wouldn't work unless session
zero is specified. 
</li>
        <li>
Updated the deploy task to ignoreexitcode when calling the Kill task 
</li>
        <li>
Added logic to stopservice to not try to stop if it isn't installed or started. 
<p>
Future updates to Team Deploy will include breaking out the build light notification
portion to a new CodePlex project I created called <a href="http://tfsbuildlight.codeplex.com" target="_blank">TFSBuildLight</a>. 
Also 2.x versions will continue to be for Team Foundation Server 2008.  New 3.x
versions of Team Deploy will be developed for Team Foundation Server 2010.
</p><p>
 
</p><p>
Team Deploy is a free to download and use.  You can find it at <a href="http://teamdeploy.codeplex.com">http://teamdeploy.codeplex.com</a>.
</p></li>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=11983e5a-c89c-4f04-947e-fd83e6a6cec2" />
      </body>
      <title>Team Deploy 2.0 is Released</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,11983e5a-c89c-4f04-947e-fd83e6a6cec2.aspx</guid>
      <link>http://codesmartnothard.com/TeamDeploy20IsReleased.aspx</link>
      <pubDate>Wed, 22 Apr 2009 09:28:00 GMT</pubDate>
      <description>&lt;p&gt;
Today I am excited to announce the release of &lt;a href="http://teamdeploy.codeplex.com/" target=_blank&gt;Team
Deploy 2.0&lt;/a&gt;.&amp;nbsp; Additionally, the total download count of Team Deploy has passed
1000 downloads!&amp;nbsp;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Team Deploy is an open source package of custom build tasks designed for Team Foundation
Server 2008 for deploying MSIs to clients and/or servers.&amp;nbsp; There is also a build
notification task for lava lamps or street lights with your builds.
&lt;/p&gt;
&lt;p&gt;
The enhancements and fixes for 2.0 include:
&lt;/p&gt;
&lt;li&gt;
Added TaskBase class for common functionality for example,BuildUri and TeamFoundationServerURL.
These properties are now optional. It will basically skip the build step display if
these properties are not set. All tasks inherit TaskBase. 
&lt;li&gt;
Added check to "StopService" so it only does it if the service exists and it "canstop".
(bug) 
&lt;li&gt;
Added new RemoteExecute task. Now call any executable on target machines. This also
has a WaitForExit property to be able to wait for the response or not from the target
machine. 
&lt;li&gt;
Added setup MSI to install Team Deploy instead of manual steps. 
&lt;li&gt;
Added IgnoreExitCode attribute to the base class. If the task checks for exit code
it now will log it as an error if the code &amp;gt; 0 unless IgnoreExitCode == true. 
&lt;li&gt;
Fixed a problem where with the new version of pstools, it wouldn't work unless session
zero is specified. 
&lt;li&gt;
Updated the deploy task to ignoreexitcode when calling the Kill task 
&lt;li&gt;
Added logic to stopservice to not try to stop if it isn't installed or started. 
&lt;p&gt;
Future updates to Team Deploy will include breaking out the build light notification
portion to a new CodePlex project I created called &lt;a href="http://tfsbuildlight.codeplex.com" target=_blank&gt;TFSBuildLight&lt;/a&gt;.&amp;nbsp;
Also 2.x versions will continue to be for Team Foundation Server 2008.&amp;nbsp; New 3.x
versions of Team Deploy will be developed for Team Foundation Server 2010.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Team Deploy is a free to download and use.&amp;nbsp; You can find it at &lt;a href="http://teamdeploy.codeplex.com"&gt;http://teamdeploy.codeplex.com&lt;/a&gt;.
&lt;/p&gt;
&lt;/li&gt;&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=11983e5a-c89c-4f04-947e-fd83e6a6cec2" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,11983e5a-c89c-4f04-947e-fd83e6a6cec2.aspx</comments>
      <category>Team Build;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=cfee914b-de11-4edc-ae3e-d3681ab305ed</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,cfee914b-de11-4edc-ae3e-d3681ab305ed.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,cfee914b-de11-4edc-ae3e-d3681ab305ed.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=cfee914b-de11-4edc-ae3e-d3681ab305ed</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I wanted to take a look at writing SQL Reports for TFS.  I was going to install
the Business Intelligence Studio for SQL Server 2005 but I thought it would be better
to use the latest edition of SQL Reporting Services in SQL Server 2008.  
So I decided to upgrade my TFS Test Server to SQL Server 2008.  This is a single
server install of TFS.   I ran the SQL Server 2008 Upgrade Wizard.    
Most of the steps were straight-forward.  I only ran into one roadblock that
I was able to fix and I documented below.  Here’s the steps.
</p>
        <p>
 
</p>
        <p>
First I chose the “Upgrade from SQL Server 2000 or SQL Server 2005” option.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_12.png">
            <img title="image" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="312" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_thumb_5.png" width="644" border="0" />
          </a>
        </p>
        <p>
 
</p>
        <p>
I kept the default settings for all of the steps except when it asked what instance
I would like to upgrade. 
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_2.png">
            <img title="image" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="237" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_thumb.png" width="644" border="0" />
          </a>
        </p>
        <p>
 
</p>
        <p>
All of the checks passed but one.  I got the following error.
</p>
        <p>
          <strong>Rule "Security Group SID (Security Identifier)" failed.</strong>
        </p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_4.png">
            <img title="image" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="102" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_thumb_1.png" width="404" border="0" />
          </a>
        </p>
        <p>
          <a title="http://go.microsoft.com/fwlink/?LinkId=94001" href="http://go.microsoft.com/fwlink/?LinkId=94001">http://go.microsoft.com/fwlink/?LinkId=94001</a>
        </p>
        <p>
I went to the link but it didn’t help.  I searched on the web for for the error
and I found the fix <a href="http://social.msdn.microsoft.com/forums/en-US/sqlsetupandupgrade/thread/0ca885d2-cd8d-4815-a258-d2962d477c35/" target="_blank">here</a>. 
Basically I had to manually replace the invalid SIDs with the new one.
</p>
        <p>
 
</p>
        <p>
To find the correct SIDs, I ran the command prompt utility:  <strong>whoami /groups</strong></p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_8.png">
            <img title="image" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="242" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_thumb_3.png" width="484" border="0" />
          </a>
        </p>
        <p>
 
</p>
        <p>
If you have multiple editions of SQL Server installed make sure you are in the correct
one in the registry.  Look at the Edition key
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_10.png">
            <img title="image" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="451" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_thumb_4.png" width="644" border="0" />
          </a>
        </p>
        <p>
 
</p>
        <p>
I pasted the correct SIDs into the registry keys
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_6.png">
            <img title="image" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="449" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_thumb_2.png" width="644" border="0" />
          </a>
        </p>
        <p>
 
</p>
        <p>
I fixed the ones in MSSQL.2 but I was still getting the error.  I checked the
log file %ProgramFiles%\Microsoft SQL Server\100\Setup Bootstrap\LOG\Detail.txt and
here is the error.
</p>
        <p>
2009-04-14 23:24:25 Slp: Sco: Attempting to open registry subkey SOFTWARE\Microsoft\Microsoft
SQL Server\MSSQL.3\Setup 
<br />
2009-04-14 23:24:25 Slp: SqlSidRule.GetSidValue - reading value name ASGroup 
<br />
2009-04-14 23:24:25 Slp: Sco: Attempting to get registry value ASGroup 
<br />
2009-04-14 23:24:25 Slp: Sco: Attempting to get account from sid S-1-5-21-3621347759-1475631895-1437307089-1014 
<br />
2009-04-14 23:24:25 Slp: Sco: LookupAccountSid failed for SID S-1-5-21-3621347759-1475631895-1437307089-1014 
<br />
2009-04-14 23:24:25 Slp: SqlSidRule.EnsureGroupExists - Exception caught and ignored.
Returning false. Exception message is No mapping between account names and security
IDs was done.
</p>
        <p>
        </p>
        <p>
        </p>
        <p>
I grabbed the SID for the ASUser and it worked!
</p>
        <p>
 
</p>
        <p>
The wizard continued and finished.  I launched Visual Studio and TFS is working
properly.
</p>
        <p>
Now I can look at the SQL Reporting :)
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=cfee914b-de11-4edc-ae3e-d3681ab305ed" />
      </body>
      <title>Upgrading Team Foundation Server 2008 to SQL Server 2008</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,cfee914b-de11-4edc-ae3e-d3681ab305ed.aspx</guid>
      <link>http://codesmartnothard.com/UpgradingTeamFoundationServer2008ToSQLServer2008.aspx</link>
      <pubDate>Wed, 15 Apr 2009 08:03:00 GMT</pubDate>
      <description>&lt;p&gt;
I wanted to take a look at writing SQL Reports for TFS.&amp;nbsp; I was going to install
the Business Intelligence Studio for SQL Server 2005 but I thought it would be better
to use the latest edition of SQL Reporting Services in SQL Server 2008.&amp;nbsp;&amp;nbsp;
So I decided to upgrade my TFS Test Server to SQL Server 2008.&amp;nbsp; This is a single
server install of TFS.&amp;nbsp;&amp;nbsp; I ran the SQL Server 2008 Upgrade Wizard.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
Most of the steps were straight-forward.&amp;nbsp; I only ran into one roadblock that
I was able to fix and I documented below.&amp;nbsp; Here’s the steps.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
First I chose the “Upgrade from SQL Server 2000 or SQL Server 2005” option.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_12.png"&gt;&lt;img title=image style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=312 alt=image src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_thumb_5.png" width=644 border=0&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
I kept the default settings for all of the steps except when it asked what instance
I would like to upgrade. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_2.png"&gt;&lt;img title=image style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=237 alt=image src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_thumb.png" width=644 border=0&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
All of the checks passed but one.&amp;nbsp; I got the following error.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Rule "Security Group SID (Security Identifier)" failed.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_4.png"&gt;&lt;img title=image style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=102 alt=image src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_thumb_1.png" width=404 border=0&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a title=http://go.microsoft.com/fwlink/?LinkId=94001 href="http://go.microsoft.com/fwlink/?LinkId=94001"&gt;http://go.microsoft.com/fwlink/?LinkId=94001&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
I went to the link but it didn’t help.&amp;nbsp; I searched on the web for for the error
and I found the fix &lt;a href="http://social.msdn.microsoft.com/forums/en-US/sqlsetupandupgrade/thread/0ca885d2-cd8d-4815-a258-d2962d477c35/" target=_blank&gt;here&lt;/a&gt;.&amp;nbsp;
Basically I had to manually replace the invalid SIDs with the new one.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
To find the correct SIDs, I ran the command prompt utility:&amp;nbsp; &lt;strong&gt;whoami /groups&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_8.png"&gt;&lt;img title=image style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=242 alt=image src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_thumb_3.png" width=484 border=0&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
If you have multiple editions of SQL Server installed make sure you are in the correct
one in the registry.&amp;nbsp; Look at the Edition key
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_10.png"&gt;&lt;img title=image style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=451 alt=image src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_thumb_4.png" width=644 border=0&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
I pasted the correct SIDs into the registry keys
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_6.png"&gt;&lt;img title=image style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=449 alt=image src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/UpgradingTFStoSQLServer2008_14780/image_thumb_2.png" width=644 border=0&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
I fixed the ones in MSSQL.2 but I was still getting the error.&amp;nbsp; I checked the
log file %ProgramFiles%\Microsoft SQL Server\100\Setup Bootstrap\LOG\Detail.txt and
here is the error.
&lt;/p&gt;
&lt;p&gt;
2009-04-14 23:24:25 Slp: Sco: Attempting to open registry subkey SOFTWARE\Microsoft\Microsoft
SQL Server\MSSQL.3\Setup 
&lt;br&gt;
2009-04-14 23:24:25 Slp: SqlSidRule.GetSidValue - reading value name ASGroup 
&lt;br&gt;
2009-04-14 23:24:25 Slp: Sco: Attempting to get registry value ASGroup 
&lt;br&gt;
2009-04-14 23:24:25 Slp: Sco: Attempting to get account from sid S-1-5-21-3621347759-1475631895-1437307089-1014 
&lt;br&gt;
2009-04-14 23:24:25 Slp: Sco: LookupAccountSid failed for SID S-1-5-21-3621347759-1475631895-1437307089-1014 
&lt;br&gt;
2009-04-14 23:24:25 Slp: SqlSidRule.EnsureGroupExists - Exception caught and ignored.
Returning false. Exception message is No mapping between account names and security
IDs was done.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
I grabbed the SID for the ASUser and it worked!
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
The wizard continued and finished.&amp;nbsp; I launched Visual Studio and TFS is working
properly.
&lt;/p&gt;
&lt;p&gt;
Now I can look at the SQL Reporting :)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=cfee914b-de11-4edc-ae3e-d3681ab305ed" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,cfee914b-de11-4edc-ae3e-d3681ab305ed.aspx</comments>
      <category>SQL Server 2008;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=d778f992-674e-494c-9cc4-9a4ee509c762</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,d778f992-674e-494c-9cc4-9a4ee509c762.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,d778f992-674e-494c-9cc4-9a4ee509c762.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d778f992-674e-494c-9cc4-9a4ee509c762</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
 
</p>
        <h3>Why use a virtual machine for development?
</h3>
        <p>
There are a couple things I like about doing development on a virtual.  
One of the best features is creating the image once and then being able to have the
other developers use the same image.  This is a big time saver and ensures consistency
across the developers.  In addition to having all of the developers use the same
image, this also allows us to have separate images for each of our clients. 
This obviously allows us to keep our clients data and code separate and helps prevent
3rd party controls from conflicting.
</p>
        <p>
 
</p>
        <h3>Performance
</h3>
        <p>
Defrag.  Defrag.  Defrag.   This is must whether you are using
a virtual machine or physical only.   I have a created a scheduled task
to defrag my machine every day.  <a href="http://www.microsoft.com/windowsxp/using/setup/tips/defrag.mspx" target="_blank">Here</a> are
some steps for creating the scheduled defrag.  I do it daily because the more
often it runs the quicker it will complete.   Newer PCs with Intel processors
have a <a href="http://www.intel.com/technology/virtualization/" target="_blank">virtualization
bios setting</a> that is turned off by default.  This is supposed to help virtualization
performance.   When I enabled it on my laptop, it caused my machine to temporarily
quit responding.  I ended up turning it back off.  I recommend enabling
it and trying it.   The other option to consider is where to save the virtual
disk.   My laptop has a 7200rpm hard drive and I have a 5400rpm USB Buffalo
external drive.  I thought the virtual would run better from my local drive but
since that is the drive with my swap file and the OS, the virtual image runs faster
from my external drive.   Both USB 2.0 and Firewire (400) are half duplex
so technically data can’t transfer both directions at the same time on the USB.  
Firewire 800 does support full duplex.  If your computer supports this, eSata,
or has a second hard drive, I recommend using one of the first, USB 2.0 second, and
the C: drive last.
</p>
        <p>
 
</p>
        <h3>Configuring for Team Foundation Server 2008
</h3>
        <p>
When creating your base image, install of of the required software.  For TFS,
this includes VSTS 2008 (any edition), Team Explorer, and SP1.   Do not
connect to the TFS Server.   TFS will automatically create a workspace for
your machine that is not needed.   TFS workspaces use the machine and user
as the key for unique workspaces.  The workspace displays the machine name but
uses the machine’s SID (basically a machine GUID).   Each copy of the base
image that is created, needs to have the machine name and SID changed.  The official
way to do this is to use SysPrep.    I found a handy utility by SysInternals
(owned by Microsoft) that can do it called <a href="http://technet.microsoft.com/en-us/sysinternals/bb897418.aspx" target="_blank">NewSID</a>. 
there is a disclaimer on the website stating that it isn’t officially supported by
Microsoft but I have been using with XP and Windows 2003.  I haven’t run into
any problems.   It is a simple wizard that allows you to enter the new machine
name and it creates a new SID.  After the reboot it is ready to go.
</p>
        <p>
If you make a copy of a machine that has already been connected to TFS, even after
updating the machine name and SID you could still get the error message “The workspace
“USER;MACHINENAME” already exists on computer MACHINENAME. TFS caches this information
on the machine.  To update the cache run use the Visual Studio Command Prompt
and run 
</p>
        <blockquote>
          <p>
            <font face="Courier New">tf workspaces /updateUserName:<em>USERNAME</em>/s:http://tfsserver:8080</font>
          </p>
        </blockquote>
        <p>
Run this for both the original user and the new user of the machine.  This should
clear the cache and allow you to create a workspace to the same folder as before.
</p>
        <p>
I hope this helps.
</p>
        <p>
-Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=d778f992-674e-494c-9cc4-9a4ee509c762" />
      </body>
      <title>Tips for Developing with Visual Studio Team System on a Virtual Machine</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,d778f992-674e-494c-9cc4-9a4ee509c762.aspx</guid>
      <link>http://codesmartnothard.com/TipsForDevelopingWithVisualStudioTeamSystemOnAVirtualMachine.aspx</link>
      <pubDate>Sun, 12 Apr 2009 07:15:00 GMT</pubDate>
      <description>&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;Why use a virtual machine for development?
&lt;/h3&gt;
&lt;p&gt;
There are a couple things I like about doing development on a virtual.&amp;nbsp;&amp;nbsp;
One of the best features is creating the image once and then being able to have the
other developers use the same image.&amp;nbsp; This is a big time saver and ensures consistency
across the developers.&amp;nbsp; In addition to having all of the developers use the same
image, this also allows us to have separate images for each of our clients.&amp;nbsp;
This obviously allows us to keep our clients data and code separate and helps prevent
3rd party controls from conflicting.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;Performance
&lt;/h3&gt;
&lt;p&gt;
Defrag.&amp;nbsp; Defrag.&amp;nbsp; Defrag.&amp;nbsp;&amp;nbsp; This is must whether you are using
a virtual machine or physical only.&amp;nbsp;&amp;nbsp; I have a created a scheduled task
to defrag my machine every day.&amp;nbsp; &lt;a href="http://www.microsoft.com/windowsxp/using/setup/tips/defrag.mspx" target=_blank&gt;Here&lt;/a&gt; are
some steps for creating the scheduled defrag.&amp;nbsp; I do it daily because the more
often it runs the quicker it will complete.&amp;nbsp;&amp;nbsp; Newer PCs with Intel processors
have a &lt;a href="http://www.intel.com/technology/virtualization/" target=_blank&gt;virtualization
bios setting&lt;/a&gt; that is turned off by default.&amp;nbsp; This is supposed to help virtualization
performance.&amp;nbsp;&amp;nbsp; When I enabled it on my laptop, it caused my machine to temporarily
quit responding.&amp;nbsp; I ended up turning it back off.&amp;nbsp; I recommend enabling
it and trying it.&amp;nbsp;&amp;nbsp; The other option to consider is where to save the virtual
disk.&amp;nbsp;&amp;nbsp; My laptop has a 7200rpm hard drive and I have a 5400rpm USB Buffalo
external drive.&amp;nbsp; I thought the virtual would run better from my local drive but
since that is the drive with my swap file and the OS, the virtual image runs faster
from my external drive.&amp;nbsp;&amp;nbsp; Both USB 2.0 and Firewire (400) are half duplex
so technically data can’t transfer both directions at the same time on the USB.&amp;nbsp;&amp;nbsp;
Firewire 800 does support full duplex.&amp;nbsp; If your computer supports this, eSata,
or has a second hard drive, I recommend using one of the first, USB 2.0 second, and
the C: drive last.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;Configuring for Team Foundation Server 2008
&lt;/h3&gt;
&lt;p&gt;
When creating your base image, install of of the required software.&amp;nbsp; For TFS,
this includes VSTS 2008 (any edition), Team Explorer, and SP1.&amp;nbsp;&amp;nbsp; Do not
connect to the TFS Server.&amp;nbsp;&amp;nbsp; TFS will automatically create a workspace for
your machine that is not needed.&amp;nbsp;&amp;nbsp; TFS workspaces use the machine and user
as the key for unique workspaces.&amp;nbsp; The workspace displays the machine name but
uses the machine’s SID (basically a machine GUID).&amp;nbsp;&amp;nbsp; Each copy of the base
image that is created, needs to have the machine name and SID changed.&amp;nbsp; The official
way to do this is to use SysPrep.&amp;nbsp;&amp;nbsp;&amp;nbsp; I found a handy utility by SysInternals
(owned by Microsoft) that can do it called &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb897418.aspx" target=_blank&gt;NewSID&lt;/a&gt;.&amp;nbsp;
there is a disclaimer on the website stating that it isn’t officially supported by
Microsoft but I have been using with XP and Windows 2003.&amp;nbsp; I haven’t run into
any problems.&amp;nbsp;&amp;nbsp; It is a simple wizard that allows you to enter the new machine
name and it creates a new SID.&amp;nbsp; After the reboot it is ready to go.
&lt;/p&gt;
&lt;p&gt;
If you make a copy of a machine that has already been connected to TFS, even after
updating the machine name and SID you could still get the error message “The workspace
“USER;MACHINENAME” already exists on computer MACHINENAME. TFS caches this information
on the machine.&amp;nbsp; To update the cache run use the Visual Studio Command Prompt
and run 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;tf workspaces /updateUserName:&lt;em&gt;USERNAME&lt;/em&gt;/s:http://tfsserver:8080&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Run this for both the original user and the new user of the machine.&amp;nbsp; This should
clear the cache and allow you to create a workspace to the same folder as before.
&lt;/p&gt;
&lt;p&gt;
I hope this helps.
&lt;/p&gt;
&lt;p&gt;
-Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=d778f992-674e-494c-9cc4-9a4ee509c762" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,d778f992-674e-494c-9cc4-9a4ee509c762.aspx</comments>
      <category>Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=a334ed32-2103-4cc0-92be-b2b1282fd8c4</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,a334ed32-2103-4cc0-92be-b2b1282fd8c4.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,a334ed32-2103-4cc0-92be-b2b1282fd8c4.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a334ed32-2103-4cc0-92be-b2b1282fd8c4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I created a nightly build to run my data driven unit tests.   When my build
finished it was only partially successfully.   I looked at the unit tests
and they were all passing yet there was an error on the testing step.  When I
looked in the log below is the message I saw.   I thought this was a little
confusing because there was only a warning.  I wasn’t sure what caused the TestToolsTask
to fail.  I first thought it was a permission or some other issue when it was
trying to publish but the results did publish.   Next I looked at the warning
VSP1030 message.   Then I remembered I enabled code coverage but the build
configuration was set to Release.  I changed the build to Debug and everything
worked!   Before I figured out the issue I tried searching the web but I
didn’t find any solutions.   I hope this helps.
</p>
        <p>
Summary 
<br />
  ------- 
<br />
  Test Run Warning. 
<br />
    Passed  6 
<br />
    --------- 
<br />
    Total   6 
<br />
  Results file:      t:\builds\MyTeamProject\Nightly
Build\TestResults\builduser_MYSERVER_2009-03-25 23_56_46_Any CPU_Release.trx 
<br />
  Run Configuration: Local Test Run 
<br />
  Run has the following issue(s): 
<br />
  Instrumentation error while processing file BusinessObjects.dll: 
<br />
TESTTOOLSTASK : warning VSP1030: Invalid, mismatched, or no PDB file was found for
t:\builds\MyTeamProject\Nightly Build\Binaries\Release\BusinessObjects.dll. 
<br />
  The previous error was converted to a warning because the task was called with
ContinueOnError=true. 
<br />
  Waiting to publish... 
<br />
  Publishing results of test run <a href="mailto:builduser@MYSERVER">builduser@MYSERVER</a> 2009-03-25
23:56:46_Any CPU_Release to <a href="http://tfsserver:8080/Build/v1.0/PublishTestResultsBuildService2.asmx..">http://tfsserver:8080/Build/v1.0/PublishTestResultsBuildService2.asmx..</a>. 
<br />
  ....Publish completed successfully. 
<br />
  The command exited with code -1. 
<br />
  Build continuing because "ContinueOnError" on the task "TestToolsTask"
is set to "true". 
<br />
Done executing task "TestToolsTask" -- FAILED.
</p>
        <p>
 
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=a334ed32-2103-4cc0-92be-b2b1282fd8c4" />
      </body>
      <title>TestToolsTask failed when running data driven unit tests from Team Build</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,a334ed32-2103-4cc0-92be-b2b1282fd8c4.aspx</guid>
      <link>http://codesmartnothard.com/TestToolsTaskFailedWhenRunningDataDrivenUnitTestsFromTeamBuild.aspx</link>
      <pubDate>Sat, 28 Mar 2009 07:23:00 GMT</pubDate>
      <description>&lt;p&gt;
I created a nightly build to run my data driven unit tests.&amp;#160;&amp;#160; When my build
finished it was only partially successfully.&amp;#160;&amp;#160; I looked at the unit tests
and they were all passing yet there was an error on the testing step.&amp;#160; When I
looked in the log below is the message I saw.&amp;#160;&amp;#160; I thought this was a little
confusing because there was only a warning.&amp;#160; I wasn’t sure what caused the TestToolsTask
to fail.&amp;#160; I first thought it was a permission or some other issue when it was
trying to publish but the results did publish.&amp;#160;&amp;#160; Next I looked at the warning
VSP1030 message.&amp;#160;&amp;#160; Then I remembered I enabled code coverage but the build
configuration was set to Release.&amp;#160; I changed the build to Debug and everything
worked!&amp;#160;&amp;#160; Before I figured out the issue I tried searching the web but I
didn’t find any solutions.&amp;#160;&amp;#160; I hope this helps.
&lt;/p&gt;
&lt;p&gt;
Summary 
&lt;br /&gt;
&amp;#160; ------- 
&lt;br /&gt;
&amp;#160; Test Run Warning. 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Passed&amp;#160; 6 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; --------- 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Total&amp;#160;&amp;#160; 6 
&lt;br /&gt;
&amp;#160; Results file:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; t:\builds\MyTeamProject\Nightly
Build\TestResults\builduser_MYSERVER_2009-03-25 23_56_46_Any CPU_Release.trx 
&lt;br /&gt;
&amp;#160; Run Configuration: Local Test Run 
&lt;br /&gt;
&amp;#160; Run has the following issue(s): 
&lt;br /&gt;
&amp;#160; Instrumentation error while processing file BusinessObjects.dll: 
&lt;br /&gt;
TESTTOOLSTASK : warning VSP1030: Invalid, mismatched, or no PDB file was found for
t:\builds\MyTeamProject\Nightly Build\Binaries\Release\BusinessObjects.dll. 
&lt;br /&gt;
&amp;#160; The previous error was converted to a warning because the task was called with
ContinueOnError=true. 
&lt;br /&gt;
&amp;#160; Waiting to publish... 
&lt;br /&gt;
&amp;#160; Publishing results of test run &lt;a href="mailto:builduser@MYSERVER"&gt;builduser@MYSERVER&lt;/a&gt; 2009-03-25
23:56:46_Any CPU_Release to &lt;a href="http://tfsserver:8080/Build/v1.0/PublishTestResultsBuildService2.asmx.."&gt;http://tfsserver:8080/Build/v1.0/PublishTestResultsBuildService2.asmx..&lt;/a&gt;. 
&lt;br /&gt;
&amp;#160; ....Publish completed successfully. 
&lt;br /&gt;
&amp;#160; The command exited with code -1. 
&lt;br /&gt;
&amp;#160; Build continuing because &amp;quot;ContinueOnError&amp;quot; on the task &amp;quot;TestToolsTask&amp;quot;
is set to &amp;quot;true&amp;quot;. 
&lt;br /&gt;
Done executing task &amp;quot;TestToolsTask&amp;quot; -- FAILED.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=a334ed32-2103-4cc0-92be-b2b1282fd8c4" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,a334ed32-2103-4cc0-92be-b2b1282fd8c4.aspx</comments>
      <category>Team Build;Team Foundation Server;Unit Testing</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=9e507b41-9066-45e9-841c-896282c7ee72</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,9e507b41-9066-45e9-841c-896282c7ee72.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,9e507b41-9066-45e9-841c-896282c7ee72.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=9e507b41-9066-45e9-841c-896282c7ee72</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today my employer, <a href="http://www.deliveron.com" target="_blank">Deliveron Consulting
Services</a>, was awarded the Microsoft Gold Certified Partner Status.  This
certification is recognition of the level quality and talent we hold.  I am excited
to be part of this rapidly growing company.
</p>
        <p>
 
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeliveronConsultingServicesisnowaMicroso_139EF/clip_image002_2.jpg">
            <img title="clip_image002" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="97" alt="clip_image002" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeliveronConsultingServicesisnowaMicroso_139EF/clip_image002_thumb.jpg" width="432" border="0" />
          </a>
        </p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=9e507b41-9066-45e9-841c-896282c7ee72" />
      </body>
      <title>Deliveron Consulting Services is now a Microsoft Gold Certified Partner</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,9e507b41-9066-45e9-841c-896282c7ee72.aspx</guid>
      <link>http://codesmartnothard.com/DeliveronConsultingServicesIsNowAMicrosoftGoldCertifiedPartner.aspx</link>
      <pubDate>Thu, 19 Mar 2009 08:19:00 GMT</pubDate>
      <description>&lt;p&gt;
Today my employer, &lt;a href="http://www.deliveron.com" target="_blank"&gt;Deliveron Consulting
Services&lt;/a&gt;, was awarded the Microsoft Gold Certified Partner Status.&amp;#160; This
certification is recognition of the level quality and talent we hold.&amp;#160; I am excited
to be part of this rapidly growing company.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeliveronConsultingServicesisnowaMicroso_139EF/clip_image002_2.jpg"&gt;&lt;img title="clip_image002" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="97" alt="clip_image002" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/DeliveronConsultingServicesisnowaMicroso_139EF/clip_image002_thumb.jpg" width="432" border="0" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=9e507b41-9066-45e9-841c-896282c7ee72" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,9e507b41-9066-45e9-841c-896282c7ee72.aspx</comments>
      <category>Biztalk;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=e95a25a0-95e2-4aed-a316-a35dacdbedbe</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,e95a25a0-95e2-4aed-a316-a35dacdbedbe.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,e95a25a0-95e2-4aed-a316-a35dacdbedbe.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=e95a25a0-95e2-4aed-a316-a35dacdbedbe</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I was installing Team Foundation Server on virtual server for some testing. 
The last install I did went flawless.   A quick and painless install is
always appreciated but there is something that feels victorious about successfully
troubleshooting the install and getting it to work properly.  In this case I
ran into two errors.  Also here's some general troubleshooting information that
I found useful in identifying the issues.
</p>
        <p>
          <strong>General Troubleshooting</strong>
        </p>
        <p>
When troubleshooting installation errors for Team Foundation Server there are a couple
places that can provide useful information.  First is obviously the message box. 
It will usually have something about the error to get started.  If you close
the error, you can still usually find the message in the Application Event Log. 
There may also be additional errors in the event log that can help.  If you need
more information on the error, you can look in the Local Settings\Temp folder for
the current user (C:\Documents and Settings\&lt;user&gt;\Local Settings\Temp). 
There are three files that I find the most useful.  
</p>
        <ul>
          <li>
VSMsiLogxxxx.txt - Detailed installation steps of MSI and where it failed. 
</li>
          <li>
dd_error_vstf_at_90.txt - Lists the error message for each installation attempt. 
</li>
          <li>
dd_install_vstf_at_90.txt - Detailed steps of the installation steps.</li>
        </ul>
        <p>
          <br />
          <strong>Error 28002. An unknown error occurred.</strong>
        </p>
        <p>
The first error I didn't find the solution that fixed this issue.  There were
a lot of suggestions and I might have missed it.  After trying a couple of the
suggestions, I remembered that I had Team Explorer with SP1 already installed. 
I uninstalled this and it fixed the issue.
</p>
        <p>
          <br />
          <strong>Error 28805. The setup program cannot complete the request to the server that
is running SQL Server Reporting Services.</strong>
        </p>
        <p>
I had better luck with this error.  I found a good <a href="http://social.msdn.microsoft.com/Forums/en-US/tfssetup/thread/e15160fc-757a-46b1-9d8e-908aeb4e8c14/" target="_blank">post</a> on
the MSDN forums with the answer.  There were several suggestions that I tried. 
Deleting of the encryption keys in the SQL Reporting Configuration Tool fixed it and
I was able to continue the install and complete it successfully.
</p>
        <p>
To delete this run the Reporting Services Configuration tool.  Click on Encryption
Keys on the left tool bar.  Then click on Delete to delete the keys.  You
should see a message similar to the one below.
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TroubleshootingTeamFoundationServerinsta_14C59/image_2.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="484" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TroubleshootingTeamFoundationServerinsta_14C59/image_thumb.png" width="644" border="0" />
          </a>
        </p>
        <p>
Good luck and may all of your TFS installations be successful.
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=e95a25a0-95e2-4aed-a316-a35dacdbedbe" />
      </body>
      <title>Troubleshooting Team Foundation Server installation errors (28002 and 28805)</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,e95a25a0-95e2-4aed-a316-a35dacdbedbe.aspx</guid>
      <link>http://codesmartnothard.com/TroubleshootingTeamFoundationServerInstallationErrors28002And28805.aspx</link>
      <pubDate>Mon, 09 Feb 2009 11:35:47 GMT</pubDate>
      <description>&lt;p&gt;
I was installing Team Foundation Server on virtual server for some testing.&amp;#160;
The last install I did went flawless.&amp;#160;&amp;#160; A quick and painless install is
always appreciated but there is something that feels victorious about successfully
troubleshooting the install and getting it to work properly.&amp;#160; In this case I
ran into two errors.&amp;#160; Also here's some general troubleshooting information that
I found useful in identifying the issues.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;General Troubleshooting&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
When troubleshooting installation errors for Team Foundation Server there are a couple
places that can provide useful information.&amp;#160; First is obviously the message box.&amp;#160;
It will usually have something about the error to get started.&amp;#160; If you close
the error, you can still usually find the message in the Application Event Log.&amp;#160;
There may also be additional errors in the event log that can help.&amp;#160; If you need
more information on the error, you can look in the Local Settings\Temp folder for
the current user (C:\Documents and Settings\&amp;lt;user&amp;gt;\Local Settings\Temp).&amp;#160;
There are three files that I find the most useful.&amp;#160; 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
VSMsiLogxxxx.txt - Detailed installation steps of MSI and where it failed. 
&lt;/li&gt;
&lt;li&gt;
dd_error_vstf_at_90.txt - Lists the error message for each installation attempt. 
&lt;/li&gt;
&lt;li&gt;
dd_install_vstf_at_90.txt - Detailed steps of the installation steps.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;strong&gt;Error 28002. An unknown error occurred.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The first error I didn't find the solution that fixed this issue.&amp;#160; There were
a lot of suggestions and I might have missed it.&amp;#160; After trying a couple of the
suggestions, I remembered that I had Team Explorer with SP1 already installed.&amp;#160;
I uninstalled this and it fixed the issue.
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;strong&gt;Error 28805. The setup program cannot complete the request to the server that
is running SQL Server Reporting Services.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
I had better luck with this error.&amp;#160; I found a good &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/tfssetup/thread/e15160fc-757a-46b1-9d8e-908aeb4e8c14/" target="_blank"&gt;post&lt;/a&gt; on
the MSDN forums with the answer.&amp;#160; There were several suggestions that I tried.&amp;#160;
Deleting of the encryption keys in the SQL Reporting Configuration Tool fixed it and
I was able to continue the install and complete it successfully.
&lt;/p&gt;
&lt;p&gt;
To delete this run the Reporting Services Configuration tool.&amp;#160; Click on Encryption
Keys on the left tool bar.&amp;#160; Then click on Delete to delete the keys.&amp;#160; You
should see a message similar to the one below.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TroubleshootingTeamFoundationServerinsta_14C59/image_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="484" alt="image" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TroubleshootingTeamFoundationServerinsta_14C59/image_thumb.png" width="644" border="0" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Good luck and may all of your TFS installations be successful.
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=e95a25a0-95e2-4aed-a316-a35dacdbedbe" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,e95a25a0-95e2-4aed-a316-a35dacdbedbe.aspx</comments>
      <category>Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=25067934-d702-454e-be2a-51e9258a3d2f</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,25067934-d702-454e-be2a-51e9258a3d2f.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,25067934-d702-454e-be2a-51e9258a3d2f.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=25067934-d702-454e-be2a-51e9258a3d2f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I have read and seen a lot about the TFS Power Tools and I am finally getting a chance
to install them and try them out.   The first tool I wanted to try was the
Best Practices Analyzer.   The term Best Practices is rather vague so I
didn't know what to expect in its findings.  To my surprise, this tool not only
tested configuration and server requirement best practices, it also can do pre-requisite
checks on servers before you install and it will also check for errors after you install
TFS.  I have a virtual machine with TFS that I use for some prototyping. 
I knew my virtual machine had a couple problems but the scan resulted in those and
some additional ones I would have never known about.  
</p>
        <p>
Here's the results of the scan.  
<br /><a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFSPowerToolsBestPracticesAnalyzer_F3CD/image_10.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="356" alt="TFS Power Tool Best Practices Analyer" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFSPowerToolsBestPracticesAnalyzer_F3CD/image_thumb_4.png" width="644" border="0" /></a></p>
        <p>
I noticed that this database was SUSPECT before I ran the scan.  I expanded it
to display the details.  Not only does it show the details of the issue but you
can also click on the the like to tell you more about the issue and how to resolved
it.  I tried fixing this before through SQL Management Studio and the only I
option I had was to restore from backup.   I was curious to see if it had
any ideas.  When I clicked on the the link the explanation only talked about
about single user mode and when the database is not online.   Unfortunately
there was no magic answer for my problem on this one.  The other resolutions
proved to be more useful.  Those solutions pertained to my issues.
</p>
        <p>
Here's an example of the resolution 
<br /><a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFSPowerToolsBestPracticesAnalyzer_F3CD/image_8.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="484" alt="Best Practice Analyzer Help" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFSPowerToolsBestPracticesAnalyzer_F3CD/image_thumb_3.png" width="541" border="0" /></a></p>
        <p>
As you have seen this along with the other great tools including the Process Template
editor, Build Notification Tool, TFS Users tool, etc is a must to download and utilize
for your implementation of Team Foundation Server.
</p>
        <p>
View and download the <a href="http://msdn.microsoft.com/en-us/tfs2008/bb980963.aspx">Visual
Studio Team System 2008 Team Foundation Server Power Tools</a> 
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=25067934-d702-454e-be2a-51e9258a3d2f" />
      </body>
      <title>TFS Power Tools - Best Practices Analyzer</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,25067934-d702-454e-be2a-51e9258a3d2f.aspx</guid>
      <link>http://codesmartnothard.com/TFSPowerToolsBestPracticesAnalyzer.aspx</link>
      <pubDate>Sun, 18 Jan 2009 04:53:07 GMT</pubDate>
      <description>&lt;p&gt;
I have read and seen a lot about the TFS Power Tools and I am finally getting a chance
to install them and try them out.&amp;#160;&amp;#160; The first tool I wanted to try was the
Best Practices Analyzer.&amp;#160;&amp;#160; The term Best Practices is rather vague so I
didn't know what to expect in its findings.&amp;#160; To my surprise, this tool not only
tested configuration and server requirement best practices, it also can do pre-requisite
checks on servers before you install and it will also check for errors after you install
TFS.&amp;#160; I have a virtual machine with TFS that I use for some prototyping.&amp;#160;
I knew my virtual machine had a couple problems but the scan resulted in those and
some additional ones I would have never known about.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Here's the results of the scan.&amp;#160; 
&lt;br /&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFSPowerToolsBestPracticesAnalyzer_F3CD/image_10.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="356" alt="TFS Power Tool Best Practices Analyer" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFSPowerToolsBestPracticesAnalyzer_F3CD/image_thumb_4.png" width="644" border="0" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
I noticed that this database was SUSPECT before I ran the scan.&amp;#160; I expanded it
to display the details.&amp;#160; Not only does it show the details of the issue but you
can also click on the the like to tell you more about the issue and how to resolved
it.&amp;#160; I tried fixing this before through SQL Management Studio and the only I
option I had was to restore from backup.&amp;#160;&amp;#160; I was curious to see if it had
any ideas.&amp;#160; When I clicked on the the link the explanation only talked about
about single user mode and when the database is not online.&amp;#160;&amp;#160; Unfortunately
there was no magic answer for my problem on this one.&amp;#160; The other resolutions
proved to be more useful.&amp;#160; Those solutions pertained to my issues.
&lt;/p&gt;
&lt;p&gt;
Here's an example of the resolution 
&lt;br /&gt;
&lt;a href="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFSPowerToolsBestPracticesAnalyzer_F3CD/image_8.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="484" alt="Best Practice Analyzer Help" src="http://codesmartnothard.com/content/binary/WindowsLiveWriter/TFSPowerToolsBestPracticesAnalyzer_F3CD/image_thumb_3.png" width="541" border="0" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
As you have seen this along with the other great tools including the Process Template
editor, Build Notification Tool, TFS Users tool, etc is a must to download and utilize
for your implementation of Team Foundation Server.
&lt;/p&gt;
&lt;p&gt;
View and download the &lt;a href="http://msdn.microsoft.com/en-us/tfs2008/bb980963.aspx"&gt;Visual
Studio Team System 2008 Team Foundation Server Power Tools&lt;/a&gt;&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=25067934-d702-454e-be2a-51e9258a3d2f" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,25067934-d702-454e-be2a-51e9258a3d2f.aspx</comments>
      <category>Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=d2220e5c-0e71-4fa9-8029-e9d1dc1a6b29</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,d2220e5c-0e71-4fa9-8029-e9d1dc1a6b29.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,d2220e5c-0e71-4fa9-8029-e9d1dc1a6b29.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d2220e5c-0e71-4fa9-8029-e9d1dc1a6b29</wfw:commentRss>
      <title>Continuous Generation – Generating the code during every build using TFS and CodeSmith Tools</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,d2220e5c-0e71-4fa9-8029-e9d1dc1a6b29.aspx</guid>
      <link>http://codesmartnothard.com/ContinuousGenerationGeneratingTheCodeDuringEveryBuildUsingTFSAndCodeSmithTools.aspx</link>
      <pubDate>Sun, 21 Dec 2008 04:49:44 GMT</pubDate>
      <description>&lt;p&gt;
&lt;span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;Doing
builds and running unit tests after every check-in has become a standard practice
in Agile and non-Agile development teams.&amp;nbsp; Continuous Integration is the term
that describes this process and helps ensure that that nothing has been broken since
the last check-in.&amp;nbsp;&amp;nbsp;&amp;nbsp; One area that is sometimes overlooked is the
code generation.&amp;nbsp;&amp;nbsp;&amp;nbsp; Continuous Generation, the re-generating of code
/ stored procedures for every check-in and build, should be considered for your TFS
builds.&amp;nbsp; I believe there is a lot of benefit to generating the code with every
build.&amp;nbsp; There are several benefits:&lt;/span&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;Table
schema and stored procedure parameters can change.&amp;nbsp; How do you know that your
generated objects are up to date and match the database?&lt;/span&gt; 
&lt;li&gt;
&lt;span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;It
keeps everyone honest so they don’t break the golden rule of never editing generated
code.&amp;nbsp; If the build is going to re-generate the code there’s no way to sneak
the semicolon or curly bracket that you manually fix each time after generation.&lt;/span&gt; 
&lt;li&gt;
&lt;span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;Sometimes
we generate just the class we are working on and keep the rest checked in so it doesn’t
overwrite the current object.&amp;nbsp; If any changes are made to the template only this
new class will have them.&amp;nbsp; The other classes will be based on the older version.&lt;/span&gt; 
&lt;li&gt;
&lt;span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;It
gives more credibility to the generation process.&amp;nbsp; There is sometimes a feeling
of nervousness when generating all of the objects.&amp;nbsp; Since generated code is never
edited, you can generate the code as often as you wish.&lt;/span&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;a href="http://www.codesmithtools.com/"&gt;CodeSmith
Tools&lt;/a&gt; is the code generation tool that we use.&amp;nbsp; It offers an easy way to
accomplish this from your Team Foundation Builds.&amp;nbsp;&amp;nbsp; With version 3.2 and
newer there is a custom build task included with the Professional edition.&amp;nbsp; &lt;a href="http://www.codesmithtools.com/help/Default.aspx##CodeSmith.chm/Using_a_CodeSmith_Project_from_MSBuild.html?__versionId=edcf773c-5899-42dc-b0e1-4f84ff93687e&amp;amp;__versionId=edcf773c-5899-42dc-b0e1-4f84ff93687e"&gt;Here&lt;/a&gt; is
the online help with some information about it.&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;There
are a couple things to consider.&amp;nbsp; The generated classes will be checked-in to
source control.&amp;nbsp; You will need to check them out before you call the task and
then check them back in afterwards. Also, the user guide instructions do not work
quite right in the link above.&amp;nbsp; The guide explains how to use it within your
visual studio project.&amp;nbsp; However, the task needs to be called from Team Build.&amp;nbsp;
Here’s the basic steps and changes for your CI tfsbuild.proj file.&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;Step
1: Install CodeSmith Professional on your TFS build server.&amp;nbsp; This will install
the MSBuild task and Targets file.&amp;nbsp;&amp;nbsp; I contacted CodeSmith Tool’s sales
department and this does require an additional license for the server.&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;Step
2: Import the CodeSmith Targets file.&amp;nbsp; Add the following line just below the
import element below the &amp;lt;!-- Do not edit this --&amp;gt; comment. &lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt; 
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Import&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Project&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;"&lt;span style="COLOR: blue"&gt;$(MSBuildExtensionsPath)\CodeSmith\CodeSmith.targets&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Step 3:&amp;nbsp; Add TF property in the PropertyGroup element specifying the tf.exe location
to be used throughout the process.
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;PropertyGroup&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&amp;gt;&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;TF&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;$(TeamBuildRefPath)\..\tf.exe&lt;span style="COLOR: red"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;TF&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;br&gt;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;PropertyGroup&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Step 4:&amp;nbsp; Override the AfterGet target to check out the generated file(s).&amp;nbsp;
This must be called before the CodeSmith task or it will return an access denied error.&amp;nbsp;
This example demonstrates one file but you can use a subfolder or naming prefix for
the generated files and recursively check out all of the necessary files.
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Target&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Name&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;"&lt;span style="COLOR: blue"&gt;AfterGet&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Exec&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;WorkingDirectory&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;"&lt;span style="COLOR: blue"&gt;$(SolutionRoot)\Main\TestCodeSmithMSBuild\&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Command&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;"&lt;span style="COLOR: blue"&gt;$(TF)
checkout Measure.cs&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;
Step 5:&amp;nbsp; Call the CodeSmith task to execute the CodeSmith project(s) in your
solution.&amp;nbsp; This will also be called in the AfterGet target.&amp;nbsp; Currently the
example in the documentation incorrectly shows the CodeSmith task using the ProjectFile
attribute.&amp;nbsp; As the usage description shows, the attribute is actually ProjectFiles.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;CodeSmith&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;ProjectFiles&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;"&lt;span style="COLOR: blue"&gt;$(SolutionRoot)\Main\TestCodeSmithMSBuild\Test.csp&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Step 6:&amp;nbsp; Override the AfterCompile target to check in the updated generated files.&amp;nbsp;
Fortunately TFS will only check in the file if there is a change.&amp;nbsp; This is good
because most of the time re-generating the code should generate the same thing each
time.&amp;nbsp; However, tf.exe returns a code of 1 instead of 0 and results in a partial
success of the build.&amp;nbsp; Use the IgnoreExitCode=”true” to ignore this.&amp;nbsp; You
could additionally update this to create a work item for any other return code.&amp;nbsp;
Here’s a &lt;a href="http://social.msdn.microsoft.com/forums/en-US/tfsbuild/thread/441916a0-58d7-4b81-991c-bbe8cb5a5bd5"&gt;post&lt;/a&gt; with
a good example of this. 
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Target&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Name&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;"&lt;span style="COLOR: blue"&gt;AfterCompile&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;Condition&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;'$(IsDesktopBuild)'!='true'&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Exec&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;WorkingDirectory&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;"&lt;span style="COLOR: blue"&gt;$(SolutionRoot)\Main\TestCodeSmithMSBuild&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;IgnoreExitCode&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;"&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Command&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;"&lt;span style="COLOR: blue"&gt;$(TF)
checkin /comment:&lt;/span&gt;&lt;span style="COLOR: red"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;***NO_CI***Auto-Generate&lt;/span&gt;&lt;span style="COLOR: red"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="COLOR: blue"&gt; /noprompt
/override:&lt;/span&gt;&lt;span style="COLOR: red"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;Auto
Generate&lt;/span&gt;&lt;span style="COLOR: red"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="COLOR: blue"&gt; measure.cs &lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Target&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt; &lt;/span&gt;
&lt;/span&gt;&gt;
&lt;p&gt;
Step 7:&amp;nbsp; Undo the check out if the build fails by overriding the BeforeOnBuildBreak.
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Target&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Name&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;"&lt;/font&gt;&lt;span style="COLOR: blue"&gt;BeforeOnBuildBreak&lt;/span&gt;&lt;font color=#000000&gt;"&lt;/font&gt;&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;Condition&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;font color=#000000&gt;"&lt;/font&gt;&lt;span style="COLOR: blue"&gt;'$(IsDesktopBuild)'!='true'&lt;/span&gt;&lt;font color=#000000&gt;"&lt;/font&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Exec&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;WorkingDirectory&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;"&lt;/font&gt;&lt;span style="COLOR: blue"&gt;$(SolutionRoot)\Main\TestCodeSmithMSBuild&lt;/span&gt;&lt;font color=#000000&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Command&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;"&lt;/font&gt;&lt;span style="COLOR: blue"&gt;$(TF)
undo /noprompt measure.cs&lt;/span&gt;&lt;font color=#000000&gt;"&lt;/font&gt;&lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Target&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font face=Verdana color=#003300&gt;That
is it.&amp;nbsp; Enjoy!&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font face=Verdana color=#003300&gt;Mike&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=d2220e5c-0e71-4fa9-8029-e9d1dc1a6b29" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,d2220e5c-0e71-4fa9-8029-e9d1dc1a6b29.aspx</comments>
      <category>Code Generation;Team Build;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=52ad2253-8c54-420d-8933-3478c2d93959</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,52ad2253-8c54-420d-8933-3478c2d93959.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,52ad2253-8c54-420d-8933-3478c2d93959.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=52ad2253-8c54-420d-8933-3478c2d93959</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <br />
A couple weeks ago I started a new and exciting chapter of my career.  After
8 great years at Farm Credit Services of America as a developer and lead developer,
I took a new job as a solution consultant with a small, yet proven and experienced consultanting
company called <a href="http://www.deliveron.com/">Deliveron Consulting Services</a>.  
I have no complaints about FCSAmerica and appreciate all of the oportunities that
I received while I was there.  It was a great place to work and leaving was one
of the hardest decisions I have had to make. I'm going to miss working with all of
the great people I have gotten to know.  I felt this was the right opporturnity
at the right time for me.  I'm excited to leverage all of my experiences in Team
Foundation Server, CSLA.NET, code generation, configuration management, Agile, Biztalk,
etc along with the leadership skills in a new environment.  In fact, I have already
begun helping one of our clients convert a projects to TFS.  I'm also utilizing <a href="http://www.codeplex.com/teamdeploy">Team
Deploy</a> to automate their build and deploy process.  I am excited to work
with more companies on implementing or improving their implementation of Team Foundation
Server.
</p>
        <p>
So this begins a new chapter and I am excited!
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=52ad2253-8c54-420d-8933-3478c2d93959" />
      </body>
      <title>New Chapter</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,52ad2253-8c54-420d-8933-3478c2d93959.aspx</guid>
      <link>http://codesmartnothard.com/NewChapter.aspx</link>
      <pubDate>Sun, 07 Dec 2008 14:29:11 GMT</pubDate>
      <description>&lt;p&gt;
&lt;br&gt;
A couple weeks ago I started a new and exciting chapter of my career.&amp;nbsp; After
8 great years at Farm Credit Services of America as a developer and lead developer,
I took a new job as a solution consultant with a small, yet proven and experienced&amp;nbsp;consultanting
company called &lt;a href="http://www.deliveron.com/"&gt;Deliveron Consulting Services&lt;/a&gt;.&amp;nbsp;&amp;nbsp;
I have no complaints about FCSAmerica and appreciate all of the oportunities that
I received while I was there.&amp;nbsp; It was a great place to work and leaving was one
of the hardest decisions I have had to make. I'm going to miss working with all of
the great people I have gotten to know.&amp;nbsp; I felt this was the right opporturnity
at the right time for me.&amp;nbsp; I'm excited to leverage all of my experiences in Team
Foundation Server, CSLA.NET, code generation, configuration management, Agile, Biztalk,
etc along with the leadership skills in a new environment.&amp;nbsp; In fact, I have already
begun helping one of our clients convert a projects to TFS.&amp;nbsp; I'm also utilizing &lt;a href="http://www.codeplex.com/teamdeploy"&gt;Team
Deploy&lt;/a&gt; to automate their build and deploy process.&amp;nbsp; I am excited to work
with more companies on implementing or improving their implementation of Team Foundation
Server.
&lt;/p&gt;
&lt;p&gt;
So this begins a new chapter and I am excited!
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=52ad2253-8c54-420d-8933-3478c2d93959" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,52ad2253-8c54-420d-8933-3478c2d93959.aspx</comments>
      <category>General;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=d3984597-ca10-4dbb-a5ca-32f96fc40ddf</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,d3984597-ca10-4dbb-a5ca-32f96fc40ddf.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,d3984597-ca10-4dbb-a5ca-32f96fc40ddf.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d3984597-ca10-4dbb-a5ca-32f96fc40ddf</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Last week I released some minor updates
to Team Deploy.  When you use Team Deploy to deploy your MSIs, it will update
the build steps and show that it is deploying.  The second feature will now write
any non-zero return code to the build log.  Before this, these return codes were
being lost.  In the next release of Team Deploy I will build upon this and allow
you to pass in an XML file contain return codes.  If they are an error, warning
or information.  For errors, I will make it so it will actually fail the build.<br /><br />
Here's the release<br /><a href="http://www.codeplex.com/teamdeploy">http://www.codeplex.com/teamdeploy</a><br /><br />
Mike<br /><p></p><img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=d3984597-ca10-4dbb-a5ca-32f96fc40ddf" /></body>
      <title>New Team Deploy 1.5 Release</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,d3984597-ca10-4dbb-a5ca-32f96fc40ddf.aspx</guid>
      <link>http://codesmartnothard.com/NewTeamDeploy15Release.aspx</link>
      <pubDate>Thu, 13 Nov 2008 04:36:56 GMT</pubDate>
      <description>Last week I released some minor updates to Team Deploy.&amp;nbsp; When you use Team Deploy to deploy your MSIs, it will update the build steps and show that it is deploying.&amp;nbsp; The second feature will now write any non-zero return code to the build log.&amp;nbsp; Before this, these return codes were being lost.&amp;nbsp; In the next release of Team Deploy I will build upon this and allow you to pass in an XML file contain return codes.&amp;nbsp; If they are an error, warning or information.&amp;nbsp; For errors, I will make it so it will actually fail the build.&lt;br&gt;
&lt;br&gt;
Here's the release&lt;br&gt;
&lt;a href="http://www.codeplex.com/teamdeploy"&gt;http://www.codeplex.com/teamdeploy&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
Mike&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=d3984597-ca10-4dbb-a5ca-32f96fc40ddf" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,d3984597-ca10-4dbb-a5ca-32f96fc40ddf.aspx</comments>
      <category>Team Foundation Server;Team Build</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=8a050f4f-15c5-4297-9d2f-3a7224822171</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,8a050f4f-15c5-4297-9d2f-3a7224822171.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,8a050f4f-15c5-4297-9d2f-3a7224822171.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=8a050f4f-15c5-4297-9d2f-3a7224822171</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Thanks to everyone that attended tonight's Omaha Team System User Group meeting. 
I thought it went very well.  It was a good turnout and there were a lot of good
questions asked.
</p>
        <p>
Here are the slides from the presentation.  
</p>
        <p>
          <a href="http://codesmartnothard.com/content/binary/TFS_Build_Automation.zip">TFS_Build_Automation.zip
(260.07 KB)</a>
        </p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=8a050f4f-15c5-4297-9d2f-3a7224822171" />
      </body>
      <title>Slides from TFS Build Automation and Team Deploy Presentation</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,8a050f4f-15c5-4297-9d2f-3a7224822171.aspx</guid>
      <link>http://codesmartnothard.com/SlidesFromTFSBuildAutomationAndTeamDeployPresentation.aspx</link>
      <pubDate>Wed, 28 May 2008 03:02:56 GMT</pubDate>
      <description>&lt;p&gt;
Thanks to everyone that attended tonight's Omaha Team System User Group meeting.&amp;nbsp;
I thought it went very well.&amp;nbsp; It was a good turnout and there were a lot of good
questions asked.
&lt;/p&gt;
&lt;p&gt;
Here are the slides from the presentation.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://codesmartnothard.com/content/binary/TFS_Build_Automation.zip"&gt;TFS_Build_Automation.zip
(260.07 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=8a050f4f-15c5-4297-9d2f-3a7224822171" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,8a050f4f-15c5-4297-9d2f-3a7224822171.aspx</comments>
      <category>Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=0d11d300-aa8d-4e2c-b4a0-dfbe8a363483</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,0d11d300-aa8d-4e2c-b4a0-dfbe8a363483.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,0d11d300-aa8d-4e2c-b4a0-dfbe8a363483.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=0d11d300-aa8d-4e2c-b4a0-dfbe8a363483</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
On May 27, 2008 I will be presenting on Build Automation with TFS at the Team System
User Group meeting.  This presentation will demonstrate how cool it is to automate
the build process and have a little fun along the way by having your automated builds
control street lights and lava lamps.  I will cover the creation of automated
builds, demonstrate how to create custom build tasks, and go over a <a href="http://www.codeplex.com/teamdeploy">Team
Deploy</a> custom task project for build automation
</p>
        <p>
This month's meeting will be at:
</p>
        <p>
Farm Credit Services of America<br />
5015 S 118th St<br />
Omaha, NE 68137
</p>
        <p>
Come and check it out!
</p>
        <p>
Please RSVP to <a href="mailto:jbramwell@omahamtg.com">Jeff Bramwell</a> if you plan
on attending.
</p>
        <p>
I'll post the slides after meeting.
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=0d11d300-aa8d-4e2c-b4a0-dfbe8a363483" />
      </body>
      <title>Omaha Team System User Group Presentation</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,0d11d300-aa8d-4e2c-b4a0-dfbe8a363483.aspx</guid>
      <link>http://codesmartnothard.com/OmahaTeamSystemUserGroupPresentation.aspx</link>
      <pubDate>Mon, 26 May 2008 13:09:47 GMT</pubDate>
      <description>&lt;p&gt;
On May 27, 2008 I will be presenting on Build Automation with TFS at the Team System
User Group meeting.&amp;nbsp; This presentation will demonstrate how cool it is to automate
the build process and have a little fun along the way by having your automated builds
control street lights and lava lamps.&amp;nbsp; I will cover the creation of automated
builds, demonstrate how to create custom build tasks, and go over a &lt;a href="http://www.codeplex.com/teamdeploy"&gt;Team
Deploy&lt;/a&gt; custom task project for build automation
&lt;/p&gt;
&lt;p&gt;
This month's meeting will be at:
&lt;/p&gt;
&lt;p&gt;
Farm Credit Services of America&lt;br&gt;
5015 S 118th St&lt;br&gt;
Omaha, NE 68137
&lt;/p&gt;
&lt;p&gt;
Come and check it out!
&lt;/p&gt;
&lt;p&gt;
Please RSVP to &lt;a href="mailto:jbramwell@omahamtg.com"&gt;Jeff Bramwell&lt;/a&gt; if you plan
on attending.
&lt;/p&gt;
&lt;p&gt;
I'll post the slides after meeting.
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=0d11d300-aa8d-4e2c-b4a0-dfbe8a363483" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,0d11d300-aa8d-4e2c-b4a0-dfbe8a363483.aspx</comments>
      <category>Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=45bcf331-23a3-4555-8428-c9bafd6db373</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,45bcf331-23a3-4555-8428-c9bafd6db373.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,45bcf331-23a3-4555-8428-c9bafd6db373.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=45bcf331-23a3-4555-8428-c9bafd6db373</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
The latest version of Team Deploy (0.7.0.2) now contains the Device Controller
Task.  This task allows your Team Foundation Server builds to call
the x10 Firecracker to control lamps.  <a href="http://www.x10.com/automation/firecracker.htm">http://www.x10.com/automation/firecracker.htm</a></p>
        <p>
 See the Team Deploy website on CodePlex for all of the details and files.<br /><a href="http://www.codeplex.com/TeamDeploy">http://www.codeplex.com/TeamDeploy</a></p>
        <p>
          <img src="http://codesmartnothard.com/content/binary/StreetLightSmall.jpg" border="0" />
        </p>
        <p>
Here's the street light we are using for our builds.
</p>
        <p>
Build Smart Not Hard 
</p>
        <p>
Mike
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=45bcf331-23a3-4555-8428-c9bafd6db373" />
      </body>
      <title>Control Lava Lamps and Street Light with Team Deploy in Your TFS Build </title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,45bcf331-23a3-4555-8428-c9bafd6db373.aspx</guid>
      <link>http://codesmartnothard.com/ControlLavaLampsAndStreetLightWithTeamDeployInYourTFSBuild.aspx</link>
      <pubDate>Sat, 05 Apr 2008 20:25:32 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
The latest version of Team Deploy (0.7.0.2)&amp;nbsp;now contains the Device Controller
Task.&amp;nbsp; This task allows your Team Foundation Server builds&amp;nbsp;to&amp;nbsp;call
the x10 Firecracker to control lamps.&amp;nbsp; &lt;a href="http://www.x10.com/automation/firecracker.htm"&gt;http://www.x10.com/automation/firecracker.htm&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;See the Team Deploy website on CodePlex for all of the details and files.&lt;br&gt;
&lt;a href="http://www.codeplex.com/TeamDeploy"&gt;http://www.codeplex.com/TeamDeploy&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://codesmartnothard.com/content/binary/StreetLightSmall.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Here's the street light we are using for our builds.
&lt;/p&gt;
&lt;p&gt;
Build Smart Not Hard 
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=45bcf331-23a3-4555-8428-c9bafd6db373" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,45bcf331-23a3-4555-8428-c9bafd6db373.aspx</comments>
      <category>Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://codesmartnothard.com/Trackback.aspx?guid=cff41a28-a011-428d-b47e-8699d9f62756</trackback:ping>
      <pingback:server>http://codesmartnothard.com/pingback.aspx</pingback:server>
      <pingback:target>http://codesmartnothard.com/PermaLink,guid,cff41a28-a011-428d-b47e-8699d9f62756.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://codesmartnothard.com/CommentView,guid,cff41a28-a011-428d-b47e-8699d9f62756.aspx</wfw:comment>
      <wfw:commentRss>http://codesmartnothard.com/SyndicationService.asmx/GetEntryCommentsRss?guid=cff41a28-a011-428d-b47e-8699d9f62756</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last night I just published my first CodePlex (or any open source project)! 
It is called Team Deploy.  This is a collection of custom MSBUILD tasks for deploying
applications from Team Foundation Server to a test PCs and servers.  I developed
this awhile ago for my work and several of our teams are using these extensively to
do daily updates of our internally built applications.   It has been very
helpful for us for a number of reasons:
</p>
        <ul>
          <li>
Anyone on our team can kick off the Build and Deploy build type in TFS (Not just me
doing the builds anymore!) 
</li>
          <li>
We can use the same MSI to deploy to all are environments.  Great for configuration
management. 
</li>
          <li>
The tasks available allow for killing processes, uninstalling MSIs, stopping/starting
windows services, deleting files, and installing MSIs.  See the CodePlex site
for more details.</li>
        </ul>
        <p>
There is not a lot of magic in the background on these, the real magic is actually
done with PSTools.  PSTools is a collection of some really handy free utilities
by sysinternals (that was bought by Microsoft).  Even if you don't download and
try Team Deploy, you should try out PSTools.  Eventually it would be nice to
replace the PSTools functionality and bake it into the tasks, but for now, it works
fine.
</p>
        <p>
Try it out and let me know if you have any suggestions.<br /><a href="http://www.codeplex.com/teamdeploy">http://www.codeplex.com/teamdeploy</a></p>
        <p>
Deploy Smart Not Hard!
</p>
        <p>
Mike
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=cff41a28-a011-428d-b47e-8699d9f62756" />
      </body>
      <title>Team Deploy - Custom MSBUILD tasks for deploying MSIs to Test Machines</title>
      <guid isPermaLink="false">http://codesmartnothard.com/PermaLink,guid,cff41a28-a011-428d-b47e-8699d9f62756.aspx</guid>
      <link>http://codesmartnothard.com/TeamDeployCustomMSBUILDTasksForDeployingMSIsToTestMachines.aspx</link>
      <pubDate>Fri, 18 Jan 2008 19:01:30 GMT</pubDate>
      <description>&lt;p&gt;
Last night I just published my first CodePlex (or any open source project)!&amp;nbsp;
It is called Team Deploy.&amp;nbsp; This is a collection of custom MSBUILD tasks for deploying
applications from Team Foundation Server to a test PCs and servers.&amp;nbsp; I developed
this awhile ago for my work and several of our teams are using these extensively to
do daily updates of our internally built applications.&amp;nbsp;&amp;nbsp; It has been very
helpful for us&amp;nbsp;for a number of reasons:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Anyone on our team can kick off the Build and Deploy build type in TFS (Not just me
doing the builds anymore!) 
&lt;li&gt;
We can use the same MSI to deploy to all are environments.&amp;nbsp; Great for configuration
management. 
&lt;li&gt;
The tasks available allow for killing processes, uninstalling MSIs, stopping/starting
windows services, deleting files, and installing MSIs.&amp;nbsp; See the CodePlex site
for more details.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
There is not a lot of magic in the background on these, the real magic is actually
done with PSTools.&amp;nbsp; PSTools is a collection of some really handy free utilities
by sysinternals (that was bought by Microsoft).&amp;nbsp; Even if you don't download and
try Team Deploy, you should try out PSTools.&amp;nbsp; Eventually it would be nice to
replace the PSTools functionality and bake it into the tasks, but for now, it works
fine.
&lt;/p&gt;
&lt;p&gt;
Try it out and let me know if you have any suggestions.&lt;br&gt;
&lt;a href="http://www.codeplex.com/teamdeploy"&gt;http://www.codeplex.com/teamdeploy&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Deploy Smart Not Hard!
&lt;/p&gt;
&lt;p&gt;
Mike
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://codesmartnothard.com/aggbug.ashx?id=cff41a28-a011-428d-b47e-8699d9f62756" /&gt;</description>
      <comments>http://codesmartnothard.com/CommentView,guid,cff41a28-a011-428d-b47e-8699d9f62756.aspx</comments>
      <category>General;Team Foundation Server</category>
    </item>
  </channel>
</rss>