Invoking a post-build batch file in TFS 2010
The scenario: you are using TFS 2010 as your build server, and you would like to deploy files to a remote server upon successful build by invoking a batch file.
Do note that the following steps work great in conjunction with Visual Studio T4 Templates, whereby multiple .config files (e.g. Web.Dev.config, Web.Test.config) can be generated from a master template to reflect different connection strings, etc. Oleg Sych has a nice write-up on this. Hint: hand-edit your .csproj file and use the DependentUpon element to keep your project view clean in Visual Studio—multiple .tt files can be nested under the main .tt file.
- Make a copy of DefaultTemplate.xaml and check it in. Let’s call it BatchFilePostBuild.xaml.
- Open BatchFilePostBuild.xaml in the designer and add 2 new Arguments:
- BatchFile (Direction = In, Argument type = String, Default value = [blank])
- BatchFileArguments (Direction = In, Argument type = String, Default value = [blank])
- Expand “Run On Agent”. Drag “InvokeProcess” from the Toolbox and place it after “Try Compile, Test, and Associate …”
- In the Properties pane for InvokeProcess:
Property Value Arguments BatchFileArgumentsEnvironmentVariables New Dictionary(Of String, String) From {{"SourcesDirectory", SourcesDirectory}, {"BinariesDirectory", BinariesDirectory}}FileName BatchFile.Replace("$(SourceDir)", SourcesDirectory) - Double-click InvokeProcess:
- Drag “WriteBuildMessage” from the Toolbox and place it under stdOutput. Set Importance = High, Message = stdOutput.
- Drag “WriteBuildWarning” from the Toolbox and place it under stdError. Set Message = stdError.
- Save and check in BatchFilePostBuild.xaml.
- In Team Explorer, create a new build definition, with its process template being BatchFilePostBuild.xaml.
- In the Process tab, there will be 2 properties under Misc:
Property Value BatchFile Here you can specify the path and file name to your batch file relative to $(SourceDir). Refer to the folder structures in the Workspace tab. BatchFileArguments A list of arguments separated by spaces. In your batch file, they will be %1,%2,%3, and so on. - Create and check in your batch file. In this batch file you will be able to refer to
%SourcesDirectory%and%BinariesDirectory%, in addition to%1,%2,%3, etc. above. Assuming%1is the environment type (e.g. “Test”) and%2is the server name, here are some useful commands:
Clean target folder del /s /q "\\%2\path\to\remote\folder\*"Copy directory structure xcopy "%BinariesDirectory%\path\to\folder\*" "\\%2\path\to\remote\folder" /s /yCopy Web.Test.config to the Test server copy /y "%BinariesDirectory%\_PublishedWebsites\MyProject\Web.%1.config" "\\%2\path\to\remote\folder\Web.config"Start remote Windows service sc \\%2 start "My Windows Service"Stop remote Windows service sc \\%2 stop "My Windows Service"Dirty wait for around 30 seconds ping 127.0.0.1 -n 30 > NUL
6 Responses to “Invoking a post-build batch file in TFS 2010”
1 Jeremy 21 September 2012 @ 3:19 am
I got this correct up to 8 and 9. Can I see what you have in your batch file?
2 Jeremy 21 September 2012 @ 3:35 am
Forgot to mention… awesome article by the way! I’m so close. I’m trying to delete a web.config before it moves a copy to a secondary location that I created in the .xaml
3 Shweta 25 September 2012 @ 7:24 pm
Thanks for the good post… I was trying the same with a sample batch file Hello.bat
The contents of the batch is
echo hello
notepad.exe
I have added the activity InvokeProcess after Try Compile, Test, and Associate… On TFS my batch file execution does not seem to happen, neither am I getting the echo message nor the notepad.exe opening.
In the properties of InvokeProcess I have only provided the FileName as “D:\Hello.bat”.
Please help.
4 Create batch file 5 February 2013 @ 7:32 am
Quite useful, thanks! But it’s much better to create batch files with tool called Dr.Batcher - you should also mention it.
5 Roy 6 March 2013 @ 12:57 am
For Step 8, there is no “Misc” in the Process tab. All I see are: 1. Required, 2. Basic and 3. Advanced, non of which contain “Misc” when expanded.
Any idea why?
6 Roy 6 March 2013 @ 1:30 am
Mystery solved. Once I checked in the template and my batch file, “Misc” appeared in the Process tab.
Comments: