Sunday, 25 January 2015

Stylecop with TFS Build without Changing Build Template

How to setup TFS builds to validate stylecop code standards? One way to implement using alteration to TFS build templates. Below few posts give good explanation on how to do this with TFS build template modification
https://msdn.microsoft.com/en-us/magazine/dn451443.aspx
http://www.towfeek.se/2014/05/customize-your-tfs-build-process-to-run-stylecop/
http://tfsbuildextensions.codeplex.com/wikipage?title=How%20to%20integrate%20the%20extensions%20into%20a%20build%20template&referringTitle=Documentation
Is there a way to do this without build template alteration? Of course yes, thanks to StyleCop.MSBuild by Adam Ralph  this is possible now (Brief introduction on Stylecop.msbuild here).
Let’s have a look at step by step how to setup stylecop with TFS builds.
Right click on the Visual Studio solution Go to “Manage NuGet Packages for Solution”.

1
Search for stylecop. Stylecop.MSBuild will be in the results.
2
Click on Install and it will download StyleCop.MSBuild.
3
Select available projects in the solution and click OK. If new projects added to solution they can be selected by going to “Manage NuGet Packages for Solution”. Click on Manage installed package and select the new projects available.
4_1
SyleCop.MSBuild will be installed for selected projects.
5
This will add packages folder to the solution.
6
7

Right click on packages folder and undo pending changes. Undo changes will not remove the package folder from local folder and will be available to for the solution in this machine.
7_1
 7_2
7_2_1
This will prevent packages folder and contents being checked in to TFS. It is possible to set this package to automatically downloaded when the solution built.
 7_3
A file packages.config will be added to each project in the solution and make sure to check this in.
8
Project file (.csproj) will be modified to add required configurations for StyleCop.
9

Right click on the solution and enable nuget package restore for the solution. This will allow other team members to automatically download NuGet packages of the solution when it is built.

7_6

This will add few files to solution and change the .csproj files.

7_7

7_8


When the project is built the StyleCop violations are shown.
10
After fixing all violations in code still three violations shown based on temporary files generated when building .Net framework 4.5 projects.
11
12
Below link suggests few ways to fix this issue.
http://stackoverflow.com/questions/12405619/temporarygeneratedfile-guid-in-obj-debug-breaking-build
Out of them best solution is adding option to ignore the temporary files in the .csproj file. Since .csproj file will be checked in this fix will be available for other team members and build agents.
Unload project and edit to change the .csproj file.
13
14
Add

<ItemGroup>
<ExcludeFromStyleCop Include="$(IntermediateOutputPath)\**\*.cs" >
<Visible>False</Visible>
</ExcludeFromStyleCop>
</ItemGroup>

as shown below inside the StyleCop section added by the StyleCop.MSBuild installation.

15

Reload project.

16


Now all violations are fixed.

17

To verify StyleCop violations still validated after the above fix for temporary files, purposefully create a violation and verify.

18 


19



Fix the violation and check in the solution to TFS. A CI build using default build template runs successfully.

20


To verify TFS build gives warning when there is a StyleCop violation purposefully create a violation and check in.

21

Local build in VS show violation.

22



CI build shows SA1515 violation as a warning.

23

To make this violation to fails the build, add below to .csproj StyeCop added property group.

<StyleCopTreatErrorsAsWarnings>
    false
</StyleCopTreatErrorsAsWarnings>

24


This will make the violation to fail the build locally.

25

CI Build also fails with StyleCop violation.

26

SuppressMessage can be added to code (Method or Class level) and works fine with local builds and TFS builds.

29

 30

31

Using StyleCop.MSBuild it is possible to run StyleCop with TFS builds without altering build templates and without installing StyleCop in TFS Build Agents.

No comments: