Most of the time when you are creating a build script (TFSBuild.proj), you need to do some steps after the build. Wether it's creating an MSI for easier deployment, creating a VSI for a Visual Studio Add-in, or whatever if may be... you normally do a post build.
A post build event looks like the following inside the TFSBuild.proj :
<Target Name="AfterDropBuild"> <CallTarget Targets="PostBuildStep" /> </Target> <Target Name="PostBuildStep"> <!-- Do something --> </Target>
When you only have 1 or 2 tasks and that one fails, it might be easy to find the one that failed. What if you have 8 to 20 tasks? It then becomes incredibly hard to find which one failed. What I've seen the most is normally some "<Message />" tags with some descriptive tasks. This is the equivalent of debugging with Console.WriteLine or Debug.Print.
What if you could know EXACTLY which task failed to run? Here is a way to add a custom build step to your TFS build which will allow you to easily know what crashed.
<Target Name="PostBuildStep"> <!-- Create the build steps which start in mode "Running" --> <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" Message="Doing Something on a PostBuild Event" Condition=" '$(IsDesktopBuild)' != 'true' "> <!-- Return the ID of the tasks and assigned it to "PropertyName" --> <Output TaskParameter="Id" PropertyName="PostBuildStepId" /> </BuildStep> <!-- Do something --> <!-- When everything is done, change the status of the task to "Succeeded" --> <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" Id="$(PostBuildStepId)" Status="Succeeded" Condition=" '$(IsDesktopBuild)' != 'true' " /> <!-- If an error occurs during the process, run the target "PostBuildStepFailed" --> <OnError ExecuteTargets="PostBuildStepFailed" /> </Target> <Target Name="PostBuildStepFailed"> <!-- Change the status of the task to "Failed" --> <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" Id="$(PostBuildStepId)" Status="Failed" Condition=" '$(IsDesktopBuild)' != 'true' " /> </Target>
With that in place, you will see exactly which task failed. As a bonus, it will also give you the time at which it completed. This will easily allow you to compare with your other task to see which one is taking the most time.
I would like to thank Martin Woodward which is a TeamSystem MVP. The question originated from Stackoverflow and more details are also available on Martin's website.
No comments:
Post a Comment
Please try to keep comments relevant to the topic. All comments after 1 month will be moderated.