With TFS we can have two different type of Build, local or remote. A remote build in triggered on a controller that doesnt reside on your local PC. A local build is triggered on your local dev agent and it can also be hidden from the main queue build repository.
My scenario is the following:
I have to commit a code change and I want to test the CI build locally before check-in my changes and commit the code to the main repository. I dont want to work with Shelvesets cause I just dont want to keep busy the main Build Controller.
So, for every build you queue (local or remote) the build agent will just create a new workspace and download the required files that need to be built.
So in my local PC I will end up with the following situation:
Which is really inconvenient because it will just replicate my workspace for each build agent I am running locally and it wont include the changes I didnt commit to the repository.
So, first of all we want to instruct TFS to use a different strategy when running a local build than the strategy when running a remote build.
Second we want to instruct the build agent to execute the build within the workspace directory without creating a new workspace and without downloading the latest files from the source because our local workspace is the source.
How does TFS get the latest sources?
In order to understand my solution we need to have a look at how TFS build the workspace and what activities in the workflow are in charge of that. If you open the default build workflow (please refer here if you dont know what I am talking about) you will find that is starts with the following activities:
This activity setup the initial values for the Target folder, the bin folder and the test output folder. You want to get rid of this activity because it will override your workspace.
This activity creates a new Workspace locally and download the latest code. You can pass a name for the workspace but unfortunately TFS will always drop the existing one and re-create it, so this activity should also be removed from your local build definition.
Convert the remote to local path
At this point we need to inform TFS about the project location. Because we didnt generate a workspace, when we ask TFS to build $/MyProject/MyFile.cs it will bomb saying that he doesnt know how to translate a server path into a local path. Actually the real error is a bit misleading cause it just says I cant find the file
This error can be easily fixed by converting the projects to build into local path using the following TFS activities:
First I ask TFS to get an instance of my Workspace, which is the same I am using within Visual Studio. Then, for each project/solution configured in my build definition I update the path. The Workspace name is a Build Parameter in my workflow
Last piece, we still need to build against a Workspace but the existing one, so in order to accomplish this kind of build we need to change the build path of the local agent in the following way:
Now when you ask to the workflow to convert Server to Local paths using your Workflow name, it will return a path pointing to the local workspace which is the same path configured in your build agents.
Note: Multiple agents can run on the same workflow path in parallel, which means a parallel build sequence