Setting up continuous integration with TFS

This is a quick visual guide to setting up continuous integration with TFS 2010.

TFS is used to create build definitions for specific trigger criteria.  After the builds are copied to the drop folder, MS Build calls the MSDeploy publishing service to update the target website.

1: Configure a new TFS build controller and connect it to your TFS team project collection:


2: Add a new build definition:

3:  Choose continuous integration build triggers.  I setup up two triggers: one for a rolling build, and one to run every day at 3 AM.

4: Specify the build controller and staging location (build output folder) for the builds

5:  Now you need to copy the builds from the build folder to the web server.  We can do this using MSDeploy.

In the “MS Build Arguments”  field, I put:

/p:DeployOnBuild=True /p:DeployTarget=MsDeployPublish /p:MSDeployServiceURL= /p:DeployIISAppPath=”/OdinDaily” /p:CreatePackageOnPublish=False /p:MsDeployPublishMethod=RemoteAgent /p:AllowUntrustedCertificate=True /p:username=MYDOMAINSERVICE_ACCOUNT /p:password=PASSWORD

Note that TFS will run unit tests by default.

(TODO: I need to figure out how to use integrated authentication so I don’t have to save the credentials in plaintext.)


Now I need to configure the website on the target server:

6:  Setup the integration web server.  Use the same application path as the DeployIISAppPath above.

7:  Install the web deployment tool 2.0 from

When you install the tool, make sure the Remote Agent Service is included in the install.

8:  The Remote Agent Service is manual by default.  Change it to automatic.

9:   That should be it.  Now you should be able to “Queue a New Build” or (depending on your build trigger) check in some code and have your website updated!

You should be able to see your builds in TFS by double-clicking on the build definition.  Any successful or failed builds will show up here:


Closing Notes:

The TFS server, build server, build drop location, and web server can all be separate machines.  Using web deployment, we can locate the web server anywhere on the Internet, so we can use this method for one-click deployment to production as well.  However, we probably don’t want to save the credentials for the production server in the build definition to avoid accidental one-click deployment to live servers!



If you just want to deploy the build output to a folder or file share, you can modify the build process template. Add a CopyDirectory to the step after RunOnAgent.  (Source)


5 thoughts on “Setting up continuous integration with TFS”

  1. Hello David,

    Thanks for your post. Did you ever figure out how to do integrated authentication? If so how is it done? Also, on the Process tab, is it possible to add a “Project to Build” that is not under TFS source control? If so how?



  2. I have continuous integration set up, but I am having one issue. When I deploy a new app to IIS, the application is created, but I need to be able to specify an application pool on the target server for the new application. Anyone know how to do this?

  3. David – THIS IS AWESOME! Thank you for taking the time to put this together, I really needed a couple pieces of information from this post to complete the picture. EXCELLENT WORK!

  4. Hi David,

    Tnx for making this article but it doesn’t really work for me. I get an error which I cannot explain. Maybe you can help?

    An error occurred when the request was processed on the remote computer. Site ‘”’ does not exist.

  5. Is generting “dll” files for each code behind file of .aspx is mandatory in CI or is there an option to stop it?

Leave a Reply