Skip to main content

Tips and Tricks to configure Sonar Qube for .NET projects (C#)

Last week’s I had the opportunity to configure Sonar for a pretty big project. The application has over 3M lines of code and use different languages and technologies, from C# and Silverlight to JavaScript, C++ and embedded applications.
The main scope was to see if we can configure Sonar for this project. We decided at this step to exclude the embedded part of the application for Sonar. This was decided because of the time limitations. I’m almost sure that we can configure Sonar for embedded part without any kind of problems.
In the next part of the post I will present different issues that I encountered during Sonar configuration.
Where to store custom configuration?
Sonar gives you the possibility to specify different custom configuration at server level or on each project that is analyzed. Personally I prefer to have all the configuration (tools path location, unit tests projects pattern and so on) at project level – in sonar-project.properties file. For me is more easily to manage and if you have two different project that use two different tools, it will be very easily to configure them. Also, on Sonar server multiple person can have access and change the configuration (more teams on the same server). But at sonar-project.properties files, only the team that is working on the project will have access.
Where to put and store the plugins?
In Sonar, for each custom plugin you need to install or setup 3rd part applications or tools. First thing that you ask yourself where should I install and configure them.
I recommend to put all this tools in a folder called “Sonar-Plugins” or something similar. In this way if someone will need to check the plugins resources, change the configuration or configure a new Sonar server, it will be pretty easy to find all the resources and reconfigure them. Also, in this way it will be easier for you to manage them – you don’t need to search each tool in different folders.
What encoding should I set?
When you create the sonar-project.properties files don’t forget to set the encoding of source file to UTF-8. The default encoding is different from the one that is used in .NET projects.
sonar.sourceEncoding=UTF-8
How to exclude setup project?
If you have different project used to create the install package I recommend to use ssonar.exclusion  property. Using it, you can specify what folders to be excluded.
sonar.exclusions=Install/*
How to specify the project name that is displayed in the Sonar dashboard?
To be able to specify a custom name of the project, you need to use the following 3 properties available for this purpose:
sonar.projectKey=MyFooProject
sonar.projectVersion=1.0
sonar.projectName=MyFooProject
How to specify the SLN that needs to be used?
In the case you have the SLN project in different location that the sonar-project.properties or you have multiple SLN files under the same folder you can use the following property to specify exactly what SLN should be used:
sonar.dotnet.visualstudio.solution.file=MyFooProject.sln
Ho to specify the Silverlight installation directory?
If you installed Silverlight in a custom location or you have a 64 bits machines, that you will need to specify the location where Silverlight is installed. You can do as in the following example:
sonar.silverlight.3.mscorlib.location=c:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/Silverlight/v3.0
sonar.silverlight.4.mscorlib.location=c:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/Silverlight/v4.0
sonar.silverlight.5.mscorlib.location=c:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/Silverlight/v5.0
How to specify what projects contains the unit tests?
In general Sonar will detect what are the projects that contains unit tests. In practice this is not happening. Because of this, you will need to specify the project pattern for projects that contains unit test. In the following example you all the projects that contains the ‘Test’ string will be processed as unit tests projects.
sonar.donet.visualstudio.testProjectPattern=*Test*
What is the configuration pattern when I need to configure different plugins?
All plugins has the same configurations (the general one). To access this properties, you need to use the following path:
sonar.[pluginName].[propertyName]=[value]
In the following example you can see an example that  specify the installation directory of a plugin.
sonar.stylecop.installDirectory=C:/Sonar/sonar-plugins/StyleCop
How to skip a specific plugin?
If you have a plugin that you don’t want to run you can set the mode of the plugin to ‘skip.
sonar.fxcop.mode=skip
How to specify the installation directory of a plugin?
The installdirectory property is you solution. Don’t forget to use ‘/’ and not ‘\’.
sonar.fxcop.installDirectory=c:/Program Files (x86)/Microsoft Fxcop 10.0

I hope that this tips helped you to configure Sonar.

Comments

  1. Thanks for the good tips. By the way, how do you specify skipProjectPattern for multiple patterns. For example, I want to skip any project that has word "contracts" or "entities" in its project name?

    ReplyDelete
  2. Can you have different stylecop settings for unit test and other project?

    ReplyDelete
    Replies
    1. By default is at project level. People usually forget this because they are using only a stylecop file. Take a look on http://blogs.msdn.com/b/sourceanalysis/archive/2008/05/25/managing-source-analysis-project-settings.aspx

      Delete

Post a Comment

Popular posts from this blog

How to check in AngularJS if a service was register or not

There are cases when you need to check in a service or a controller was register in AngularJS.
For example a valid use case is when you have the same implementation running on multiple application. In this case, you may want to intercept the HTTP provider and add a custom step there. This step don’t needs to run on all the application, only in the one where the service exist and register.
A solution for this case would be to have a flag in the configuration that specify this. In the core you would have an IF that would check the value of this flag.
Another solution is to check if a specific service was register in AngularJS or not. If the service was register that you would execute your own logic.
To check if a service was register or not in AngularJS container you need to call the ‘has’ method of ‘inhector’. It will return TRUE if the service was register.
if ($injector.has('httpInterceptorService')) { $httpProvider.interceptors.push('httpInterceptorService&#…

ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded

Today blog post will be started with the following error when running DB tests on the CI machine:
threw exception: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information. at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName) This error happened only on the Continuous Integration machine. On the devs machines, everything has fine. The classic problem – on my machine it’s working. The CI has the following configuration:

TeamCity.NET 4.51EF 6.0.2VS2013
It seems that there …

[Post-Event] Codecamp Conference Cluj-Napoca - Nov 19, 2016

Last day I was invited to another Codecamp Conference, that took place in Cluj-Napoca. Like other Codecamp Conferences, the event was very big, with more than 1.000 participants and 70 sessions. There were 10 tracks in parallel, so it was pretty hard to decide at  what session you want to join.
It was great to join this conference and I hope that you discovered something new during the conference.
At this event I talked about Azure IoT Hub and how we can use it to connect devices from the field. I had a lot of demos using Raspberry PI 3 and Simplelink SensorTag. Most of the samples were written in C++ and Node.JS and people were impressed that even if we are using Microsoft technologies, we are not limited to C# and .NET. World and Microsoft are changing so fast. Just looking and Azure IoT Hub and new features that were launched and I'm pressed (Jobs, Methods, Device Twin).
On backend my demos covered Stream Analytics, Event Hub, Azure Object Storage and DocumentDB.

Title:
What abo…