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=http://dailyodin.example.com /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 http://www.iis.net/download/webdeploy
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!
Update:
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)