【前言】

本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目。目录如下:

  1. SonarQube系列一、Linux安装与部署
  2. SonarQube系列二、分析dotnet core/C#代码
  3. SonarQube系列三、Jenkins集成SonarQube(dotnetcore篇)

【实现功能】

  这篇文章将要介绍的主要内容如下:

  1. sonarqube分析.netcore项目下的C#代码
  2. sonarqube生成单元测试报告(代码覆盖率)

【SonarQube分析C#代码】

1.sonarqube账号token的生成

sonarqube支持生成用户token,以便在命令行或者脚本中使用token代表账号操作sonarbue,避免造成账号密码的泄露。

点击sonarqube首页右上角头像,进入我的账号

然后进入安全tab页,随便输入个标识,点击生成,生成一个账号专属的token

生成的token只会显示一次,且后续无法查询,因此先把他手动备份下来,后续会用到。

2.安装netcore分析器

分析netcore项目,微软和sonar一起协作做了很多工作,大大简化了我们的工具使用,官网可以查看相关工具及命令:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-msbuild/

我们按照官方提示,找到 MSBuild .NET Core Global Tool ,直接安装dotnet全局工具

dotnet tool install --global dotnet-sonarscanner --version 4.3.

安装完后,我们把我们的sonar的token注入到该命令的配置中,以便在执行命令时自动关联到对应账户的sonar。

在dotnet tool的安装目录下,找到一个叫 SonarQube.Analysis.xml 的配置文件。

我的xml在该目录下:/root/.dotnet/tools/.store/dotnet-sonarscanner/4.6.2/dotnet-sonarscanner/4.6.2/tools/netcoreapp2.1/any

然后我们在对应节点将 sonarweb 的地址和 token 填写上即可。

当然如果不配置也是可以的,那么就需要每次执行命令时将token一起当作参数填写,肯定是不如一次性配置好方便的。

3.开始分析代码

首先随便找个项目,这个就不多说了。有了代码以后然后进入代码目录,依次输入下面命令:

开始命令,下面命令已经备注了三个参数的用途

dotnet sonarscanner begin /k:这里填SonarQube将要生成的项目的唯一编码 /n:sonarqube中将要显示的项目名称 /v:当前执行活动号(可以动态递增或使用时间戳)

编译命令,build 后面的参数为 dotnet core 项目的 xxx.sln 文件的完整路径

dotnet build xxx.csproj

分析并将分析结果推送到sonarqube站点

dotnet sonarscanner end 

例如:

dotnet sonarscanner begin /k:SevenTiny.Bantina /n:SevenTiny.Bantina /v:

dotnet build -Solution/SevenTiny.Bantina.sln

dotnet sonarscanner end 

经过一段时间以后,可以看到输入日志已经 push 到 sonarqube 站点成功,那么就可以去 sonarqube 站点查看结果了,项目会通过 api 自动创建。

上述步骤并不会有覆盖率,先忽略,我们后面会继续讲解如何提供单元测试覆盖率。

我们点击标题进入项目详情页:

这里主要报告了几个指标(sonar有默认标准,如果不达标会报警,例如顶端红色错误提示):

Bugs 漏洞:代码中的重大漏洞,可能影响到项目的正常运行,急需改正;

异味:无关紧要的编码不规范问题,建议改正,一般不会影响功能,点开详细信心可以看到规范的使用案例,对规范自己的变成水平有相当大的帮助;

覆盖率:项目的单元测试情况;

重复:项目中的重复代码块,建议重构;

sonarqube 还提供了很多图表来展示多维度的代码分析情况。

【添加单元测试信息】

经过上述步骤并不能实现单元测试的结果展示,事实上,sonarqube 本身也办不到对单元测试的分析,通常的做法是将其他工具生成的单元测试结果整合到 sonarqube 中,借助 sonarqube 来更好地展示单元测试结果。

首先我们的项目要有专门的单元测试项目,并且规范地使用 Assert 等单元测试语句对项目代码进行了单元测试。

1.使用 coverlet 分析单元测试覆盖率

在单元测试项目安装 coverlet.msbuild nuget包(单测项目,不是正式的项目),这种方式便于和dotnet test命令集成。这种方式下, 当它被启用后, 它会集成到dotnet test 这个命令架构里, 在测试运行后自动生成覆盖率报告.

2.通过 dotnet test 命令输出单元测试结果

dotnet test 是 dotnet 默认的集成工具,用于执行单元测试项目并输出测试结果。

执行命令

dotnet test xxxtest.csproj --logger:"trx;LogFileName=test.trx" /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:CoverletOutput='./TestResults/'

上述命令指定了某个测试项目,并输出测试结果为 test.trx 文件,同时输出单元测试覆盖率分析文件为 opencover 格式的文件。

也就是说,上述命令会生成两个文件,一个是单测的结果,一个是单测覆盖率的详情描述 xml 文件。

3.将单测文件集成到sonarqube

打开 sonarqube 的单个项目设置(不是全局设置)

然后找到对应语言的页签,当然我们今天的语言是C#,找到单元测试覆盖率 opencover 的设置区域,用通配符 ** 去匹配生成的单测覆盖率文件。

还有单元测试报告文件设置

这样下次执行 dotnet sonarscanner 命令的时候,就会自动把单元测试的相关文件输出结果也推送到 sonarqube 中。

最后的结果也就是图中展示的那样,显示出了项目代码的单元测试覆盖率,甚至是本次有提交新代码的时候新代码的单元测试覆盖率,如果低于阈值(默认80%)则会出现上面的报警:

点进单元测试覆盖率详情页,我们可以看到更加详细地对单元测试的描述,例如覆盖了多少行代码,漏掉了多少行代码:

点开具体的代码行还可以看到那些行有单元测试的覆盖,总之是非常详尽了...

【扩展】

SonarQube 如何排除不需要分析地代码文件?

有些时候,引入了很多第三方的库(尤其是web项目的jquery库),我们并不需要对第三方引用的库进行分析(甚至会因为包含的杂七杂八的的各种语言脚本太多),那么我们就要将无关的代码排除。

打开单独项目的设置(非全局设置)

找到排除,可以采用通配符排除文件或文件夹,下面有通配符的使用介绍。

当然了也可以指定哪些文件是需要包含的,这样可以按需进行分析。

【总结】

使用 sonarqube 分析dotnet core/C#代码的全部过程已经完成了,下一章我们会将过程中的所有命令脚本化,使其便于集成CI/CD工具,也便于脚本通用化,方便地应用到多个项目中。

如有任何疑问,欢迎在评论区讨论~

SonarQube系列二、分析dotnet core/C#代码的更多相关文章

  1. 使用 SonarQube 来分析 .NET Core 项目代码问题

    0.介绍 Sonar 是一款开源的代码分析工具,可能有很多人已经用过,本篇文章主要是讲解如何在 Docker 里面安装 Sonar 并且用其来分析 .Net Core 项目. Sonar 是一个用于代 ...

  2. 《ASP.NET Core In Action》读书笔记系列二 ASP.NET Core 能用于什么样的应用,什么时候选择ASP.NET Core

    ASP.NET Core 能用于什么样的应用 ASP.NET Core 可以用作传统的web服务.RESTful服务.远程过程调用(RPC)服务.微服务,这归功于它的跨平台支持和轻量级设计.如下图所示 ...

  3. WebChart网页局域网聊天系列(二):服务器结构及核心代码

    public partial class MainForm : Form { private Socket server;//服务器Socket private int userNum;//当前在线用 ...

  4. SonarQube系列一、Linux安装与部署

    [前言] 随着项目团队规模日益壮大,项目代码量也越来越多.且不说团队成员编码水平层次不齐,即便是老手,也难免因为代码量的增加和任务的繁重而忽略代码的质量,最终的问题便是bug的增多和代码债务的堆积.因 ...

  5. SonarQube系列三、Jenkins集成SonarQube(dotnetcore篇)

    [前言] 本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目.目录如下: SonarQube系列一.Linux安装与部署 SonarQube系列二.分析 ...

  6. 好代码是管出来的——浅谈.Net Core的代码管理方法与落地(更新中...)

    软件开发的目的是在规定成本和时间前提下,开发出具有适用性.有效性.可修改性.可靠性.可理解性.可维护性.可重用性.可移植性.可追踪性.可互操作性和满足用户需求的软件产品. 而对于整个开发过程来说,开发 ...

  7. 机器学习之决策树二-C4.5原理与代码实现

    决策树之系列二—C4.5原理与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/9435712.html I ...

  8. dotnet Core 2.0学习笔记(一)

    一:Dotnet Core Windows运行环境,标红部分要注意 https://docs.microsoft.com/en-us/dotnet/core/windows-prerequisites ...

  9. spring cloud+dotnet core搭建微服务架构:服务发现(二)

    前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...

随机推荐

  1. [网络协议]TCP粘包分析

    关于socket粘包,socket缓冲区设置的问题,记录一下: 一 .两个简单概念长连接与短连接: 长连接     Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送 ...

  2. c++学习书籍推荐《C++编程思想第一卷》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <C++编程思想>(第1卷)(第2版)第1版荣获"软件开发"杂志评选的1996年度 图书震撼大奖,中文版自2000年推出以来, ...

  3. Nginx+Tomat8负载后,利用Redis实现Tomcat8的session共享

    网上相应的文章应该都介绍,这里只特别记录下笔者在实操的过程出现的问题.此文件只针对tomcat 8 版本,之前版本可略过. tomcat 8 中的context.xml文件修改,增加以下配置. Jav ...

  4. Elasticsearch实战总结

    上手elasticsearch有段时间了,主要以应用为主,未做深入的研究,下面就简单的日常作个简单的总结,做个记录. 版本问题 es版本繁杂,让首次使用的人无从下手.常见的有2+.5+版本,最新版已达 ...

  5. Docker学习第二天

    CentOS 系列安装 Docker Docker 支持 CentOS6 及以后的版本. CentOS6 对于 CentOS6,可以使用 EPEL 库安装 Docker,命令如下 [root@MSJT ...

  6. C#类型详解

    一.类型成员 类成员定义有(public.private.internal.protected). Public--对任何类和成员都是公开的,无限制 Private--是私有的,仅能由类内部代码访问, ...

  7. 【学习笔记】动态规划—斜率优化DP(超详细)

    [学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...

  8. 开发板编译./camera显示-/bin/sh: ./camera: not found解决方案

    问题: 开发板根文件系统目录: 运行./camera显示: 问题解决: 1.排除根目录路径问题: 2. 加入静态链接库即无问题,但是编译后的".o"文件大小突增,而且也不可能每次编 ...

  9. Ubuntu系统安装QQ等软件

    1.安装deepin-wine环境:上https://github.com/wszqkzqk/deepin-wine-for-ubuntu页面下载zip包(或用git方式克隆),解压到本地文件夹,在文 ...

  10. 有不少朋友问我Halcon和Opencv的区别?

    Halcon:机器视觉行业里知名的商业视觉库,非开源的,在国内市场份额处于第一,其提供了1500个多个API算子供开发人员使用,有些编程基础的都可以轻松的入门,其调试也是很方便的,断点单步运行,图像变 ...