1. 前言

C#语言接入Sonar代码静态扫描相较于Java、Python来说,相对麻烦一些。Sonar检测C#代码时需要预先编译,而且C#代码必须用MSbuid进行编译,如果需要使用SonarQube对C#进行代码质量分析,则需要下载Sonar-Scanner-MSBuild和MSBuild,其中要求MSBuild在V14.0以上。

2. Sonar-Scanner for MSBuild安装与配置

1、下载SonarQube Scanner for MSBuild,它是C# Framework的Sonar分析插件。

下载地址:sonar-scanner-msbuild-4.3.1.1372

2、下载并解压之后,设置SonarQube Scanner for MSBuild的环境变量。

例如我的解压路径是:C:\Users\Administrator\Downloads\sonar-scanner-msbuild-4.3.1.1372-net466,则把该路径添加到Path下。

SonarQube Scanner for MSBuild解压目录如下图所示:

3、修改SonarQube.Analysis.xml文件,要修改的地方只是关于SonarQube服务器的一些配置,如服务器URL、USER、PASSWORD等,详细配置修改如下:
<?xml version="1.0" encoding="utf-8" ?>
<!--
This file defines properties which would be understood by the SonarQube Scanner for MSBuild, if not overridden (see below)
By default the SonarScanner.MSBuild.exe picks-up a file named SonarQube.Analysis.xml in the folder it
is located (if it exists). It is possible to use another properties file by using the /s:filePath.xml flag
The overriding strategy of property values is the following:
- A project-specific property defined in the MSBuild *.*proj file (corresponding to a SonarQube module) can override:
- A property defined in the command line (/d:propertyName=value) has which can override:
- A property defined in the SonarQube.Analysis.xml configuration file [this file] which can override:
- A property defined in the SonarQube User Interface at project level which can override:
- A property defined in the SonarQube User Interface at global level which can't override anything.
Note that the following properties cannot be set through an MSBuild project file or an SonarQube.Analysis.xml file:
sonar.projectName, sonar.projectKey, sonar.projectVersion
The following flags need to be used to set their value: /n:[SonarQube Project Name] /k:[SonarQube Project Key] /v:[SonarQube Project Version]
-->
<SonarQubeAnalysisProperties xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.sonarsource.com/msbuild/integration/2015/1"> <Property Name="sonar.host.url">http://sonar_ip:sonar_port</Property>
<Property Name="sonar.login">login_username</Property>
<Property Name="sonar.password">login_password</Property> <!-- Required only for versions of SonarQube prior to 5.2 --> <Property Name="sonar.jdbc.url">jdbc:mysql://db_ip:db_port/sonar?useUnicode=true;characterEncoding=utf8;rewriteBatchedStatements=true;useConfigs=maxPerformance;useSSL=false</Property>
<Property Name="sonar.jdbc.username">jdbc.username</Property>
<Property Name="sonar.jdbc.password">jdbc.password</Property> </SonarQubeAnalysisProperties>

 

3. MSBuild安装与配置

Visual Studio IDE在编译*.sln解决方案时默认是调用msbuild.exe来实现的。如果你的机器上没有装有Visual Studio,那么也可以单独使用MSBuild来编译.sln(工程解决方案)或.csproj(项目)。MSBuild可以直接通过.NETFramework来安装获得。

msbuild.exe的路径一般如下:

X86: C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe
X64: C:\Program Files (x86)\MSBuild\14.0\Bin\amd64\MSBuild.exe

 

msbuild.exe 目录如下所示:

 

将MSBuild.exe添加到Path环境变量,便于后面在命令行中调用MSBuild。

msbuild常用编译命令:

MSBuild MyApp.sln /t:Rebuild /p:Configuration=Release
MSBuild MyApp.csproj /t:Clean /p:Configuration=Debug;/p:Platform=x86;TargetFrameworkVersion=v3.5 编译为 Release 代码 -p:configuration="release"
清理项目 -t:clean
重新编译 -t:rebuild
编译项目 -t:build 默认可以忽略这个参数
发布 -t:Publish 注意:这里的 -t 和 /t 作用是相同的。

4. Sonar+命令行分析C#代码

1、打开CMD,切换到指定的项目根目录,必须和.sln或者.csproj同级目录。例如以\hcloud\Common\KDY.WebApi.Core项目为例,如下图所示。

 

2、使用MSBuild方式进行Sonar Scanner扫描代码前期准备文件生成,CMD命令下运行:

SonarScanner.MSBuild.exe begin /k:"hcloud.Common.KDY.WebApi.Core" /n:"hcloud.Common.KDY.WebApi.Core" /v:"1.0"

命令执行结果如下:

 
参数说明:

  • /key(简写k):对应projectKey即项目的唯一代码,如两套源代码使用同一个projectKey那扫描的结果将混在一起,所以一个项目需要有一个单独的projectKey
  • /name(简写n):对应projectName即项目的名称,为项目的一个显示的名称,建立使用完整的项目名称
  • /version(简写v):对应projectVersion即项目的版本,项目在不同的时期版本也是不一样的,如果方便,可以在sonarQube的服务器中查看到不同的版本代码其中问题的变化

执行上述命令后,在项目目录下,生成.sonarqube目录。

3、通过MSBuild命令编译项目,在CMD命令行下执行:

MSBuild.exe /t:Rebuild   (默认为Debug模式)

或者
MSBuild.exe /t:Rebuild /p:Configuration=Release (指定编译模式) 或者
MSBuild.exe D:\hcloud\Common\Common.sln /t:Rebuild (指定具体的.sln解决方案)

编译项目运行结果如下所示:

 

0个错误,则代表MSBuild编译成功,编译成功后,在当前目录下会生成一个obj目录。(编译成功后默认生成Debug产物),SonarQube分析C#项目工程时,前提需要MSBuild能预编译成功,如果存在错误,则无法成功完成后续Sonar分析动作。

4、分析C#扫描结果,将分析报告上传给SonarQube,CMD命令下运行:

SonarScanner.MSBuild.exe end

执行结果如下图所示:

温馨提示:

  • 如果运行出现错误请检查sonar server的log,路径为Snoar\sonarqube-6.7\logs下的sonar.log,web.log和access.log。
  • 如果遇到需要检测比较大的项目,可能上传的mysql数据量会很大,会超出默认的mysql上传的最大值,此时需要设置mysql的max_allowed_packet。

5、查看Sonar分析扫描后的结果,访问http://10.0.0.147:9000/dashboard?id=hcloud.Common.KDY.WebApi.Core,分析结果如下图所示:

 

5. Jenkins+Sonar+MSBuild分析C#代码

1、编译.NET(C#)应用程序可通过微软提供的MSBuild工具,先安装插件MSBuild,在Jenkins中搜索并安装MSBuild插件,如下图所示。

 

2、插件安装完毕后,进入系统管理->全局工具配置(Global Tool Configuration)找到MSBuild配置选项,如下图所示。

 

3、配置SonarScanner for MSBuild,如下图所示。

 

4、由于示例中的Jenkins服务是部署在Linux系统中,故此处可添加一台Windows主机(10.0.0.148)作为C#项目编译运行环境,在Windows从节点配置中,添加并配置相应工具,如下图所示。

 

5、新建并配置JOB,添加JOB运行节点(编译C#工程项目的运行机),如下图所示。

 

6、配置源码管理及其它所需配置(较为简单,此处省略)后,添加并配置构建选项,如下图所示。

 

7、JOB构建运行结果如下图所示。

 

8、JOB构建成功后,Sonar代码分析报告如下图所示。

 

6. 常见问题

1、解决SonarQube检测C#执行成功,但不能获取检测结果的问题,现象如下图所示。

 

由图中可以看到文件扫描成功了,但是却没有任何文件被发现,所有的指标数据皆为0。

解决方案:

将Sonar插件中的C#插件改为5.9的版本即可。修改方式将plugin目录下原本的C#插件删除掉,将5.9版本的插件放入进来。重启SonarQube后问题即可解决。(备注示例中的SonarQube版本为6.7.5)

plugin目录替换后如下图所示:

 

2、Jenkins +MSBuild+Sonar构建编译Job时提示Running the Scanner for MSBuild under Local System or Network Service account is not supported. Please, use a local or domain user account instead.

现象如下图所示:

 

解决方法:

登录从节点10.0.0.148(windows主机),右击我的电脑选择管理然后从管理界面里面找到服务或者在cmd界面输入services.msc打开服务管理界面,从服务管理界面找到jenkins slave服务,右键点击属性,在弹出的对话框中切换到登陆标签,默认登录方式为本地系统帐号,此处我们选择此账户。然后输入账户和密码点击确定,完成以上操作以后重新启动jenkins slave服务然后再重新执行即可。

修改方式如下图所示:

 

3、Jenkins单独构建没问题,Sonar静态检查代码单独执行也没问题,但是Jenkins+Sonar集成时出现未经授权问题,现象如下图所示。

 

解决方案:

原因是由于Jenkins上已经通过admin生成了Token来进行连接认证,需要注释掉SonarQube.Analysis.xml里面的sonar.login和sonar.password,删除或者注释后,再重新执行即可。

修改如下图所示(下图采用注释来解决该问题的)。

 

7. 最后

原文链接发表于笔者公众号内:一文搞定SonarQube接入C#(.NET)代码质量分析

感兴趣的可以关注笔者公众号:技术大全(mikezhou_talk)

 
 
 
 

一文搞定 SonarQube 接入 C#(.NET) 代码质量分析的更多相关文章

  1. 自动代码质量分析(GitLab+JenKins+SonarQube)

    自动代码质量分析(GitLab+JenKins+SonarQube) 1.需求场景 开发提交代码自动执行代码质量分析. 2.所需应用 GitLab,JenKins,SonarQube 3.架构图 4. ...

  2. 一文搞定MySQL的事务和隔离级别

    一.事务简介 事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: 为数据库操作序列提供 ...

  3. 一文搞定scrapy爬取众多知名技术博客文章保存到本地数据库,包含:cnblog、csdn、51cto、itpub、jobbole、oschina等

    本文旨在通过爬取一系列博客网站技术文章的实践,介绍一下scrapy这个python语言中强大的整站爬虫框架的使用.各位童鞋可不要用来干坏事哦,这些技术博客平台也是为了让我们大家更方便的交流.学习.提高 ...

  4. 一文搞定Spring Boot + Vue 项目在Linux Mysql环境的部署(强烈建议收藏)

    本文介绍Spring Boot.Vue .Vue Element编写的项目,在Linux下的部署,系统采用Mysql数据库.按照本文进行项目部署,不迷路. 1. 前言 典型的软件开发,经过" ...

  5. 基于Win10极简SonarQube C#代码质量分析

    博客有些好些时间未更新了,这几个月的时间里,离开了实习的公司.大学毕了业.来了新公司.转了户口,有点忙,最近总算稍微闲下来了,打算重新拾起博客,坚持写下去. 言归正转,什么是SonarQube ? S ...

  6. 21.SpringCloud实战项目-后台题目类型功能(网关、跨域、路由问题一文搞定)

    SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. ...

  7. 一文搞定FastDFS分布式文件系统配置与部署

    Ubuntu下FastDFS分布式文件系统配置与部署 白宁超 2017年4月15日09:11:52 摘要: FastDFS是一个开源的轻量级分布式文件系统,功能包括:文件存储.文件同步.文件访问(文件 ...

  8. 一文搞定 Git 相关概念和常用指令

    我几乎每天都使用 Git,但仍然无法记住很多命令. 通常,只需要记住下图中的 6 个命令就足以供日常使用.但是,为了确保使用地很顺滑,其实你应该记住 60 到 100 个命令. Git 相关术语 Gi ...

  9. 一文搞定Flask

    Flask 一 .Flask简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收h ...

随机推荐

  1. codeforces 798 D. Mike and distribution(贪心+思维)

    题目链接:http://codeforces.com/contest/798/problem/D 题意:给出两串长度为n的数组a,b,然后要求长度小于等于n/2+1的p数组是的以p为下表a1-ap的和 ...

  2. codeforces 768 B. Code For 1(二分)

    题目链接:http://codeforces.com/contest/768/problem/B 题意:给你一个数n和区间l,r,每次都能把任意数拆成n/2,n%2,n/2三个数,直到变成0和1,问区 ...

  3. PAT L3-017. 森森快递

    L3-017. 森森快递 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 俞勇(上海交通大学) 森森开了一家快递公司,叫森森快递.因为 ...

  4. 浅谈contentType = false

    转自https://segmentfault.com/a/1190000007207128 在刚接触 JQuery 中的 ajax 时,对其 contentType 并没有很在意,只是知晓它是代表发送 ...

  5. Elasticsearch之更新

    public class UpdateElasticAPI { private static RestClient restClient; static { restClient=RestClient ...

  6. Spring boot拦截器的实现

    Spring boot拦截器的实现 Spring boot自带HandlerInterceptor,可通过继承它来实现拦截功能,其的功能跟过滤器类似,但是提供更精细的的控制能力. 1.注册拦截器 @C ...

  7. 微服务SpringCloud之服务网关zuul一

    前面学习了Eureka.Feign.Hystrix.Config,本篇来学习下API网关zuul.在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服 ...

  8. 解决The mysql extension is deprecated and will be removed

    今天打开网站突然发现报错:“PHP Deprecated:  mysql_connect(): The mysql extension is deprecated and will be remove ...

  9. 4.12号HTML、CSS

    HTML 表单元素: 多行文本域<textarea> 标签定义多行的文本输入控件.文本区中可容纳无限数量的文本,其中的文本的默认字体是等宽字体(通常是 Courier).可以通过 cols ...

  10. valueForKey与valueForKeyPath 区别

    1.删除数组中重复的数据 2.valueForKeyPath:可以深层次取到子属性,不管隐藏的多深  valueForKey:无法取到深层次子属性 但是也有其相似的地方: 比如:快速找到字典数组中ke ...