最近一段时间,我们团队在生产环境出现了几次线上问题,有部分比较严重,直接影响用户功能的使用,惹得领导不高兴了,让我想办法提升代码质量,这时候项目工程代码质量检测神器——SonarQube,出现在我们的视线当中。

一 sonarqube是做什么的

SonarQube®是一种自动代码审查工具,用于检测代码中的错误,漏洞和代码味道。它可以与您现有的工作流程集成,以实现跨项目分支和提取请求的连续代码检查。通过插件形式,可以支持包括 java, C#, C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等二十几种编程语言的代码质量管理与检测。sonarqube可以从以下7个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题。

1.1 不遵循代码标准

sonarqube可以通过CheckStyle等代码规则检测工具规范代码编写。

1.2 存在的缺陷漏洞

sonarqube可以通过Findbugs等等代码规则检测工具检测出潜在的缺陷。

1.3  糟糕的复杂度分布

文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员 难以理解它们, 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。

1.4  重复

显然程序中包含大量复制粘贴的代码是质量低下的,sonarqube可以展示源码中重复严重的地方。

1.5  注释不足或者过多

没有注释将使代码可读性变差,特别是当不可避免地出现人员变动 时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。

1.6  缺乏单元测试

sonarqube可以很方便地统计并展示单元测试覆盖率。

1.7  糟糕的设计

通过sonarqube可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则 通过sonarqube可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测耦合。sonarqube可以很方便地统计并展示单元测试覆盖率。

总览:

在典型的开发过程中:

  1. 开发人员在IDE中开发和合并代码(最好使用SonarLint在编辑器中接收即时反馈),然后将其代码签入ALM。

  2. 组织的持续集成(CI)工具可以检出,构建和运行单元测试,而集成的SonarQube扫描仪可以分析结果。

  3. 扫描程序将结果发布到SonarQube服务器,该服务器通过SonarQube界面,电子邮件,IDE内通知(通过SonarLint)以及对拉取或合并请求的修饰(使用Developer Edition及更高版本时)向开发人员提供反馈。

SonarQube实例包含三个组件:

  1. SonarQube服务器运行以下过程:

    • 提供SonarQube用户界面的Web服务器。

    • 基于Elasticsearch的搜索服务器。

    • 计算引擎负责处理代码分析报告并将其保存在SonarQube数据库中。

  2. 该数据库存储以下内容:

    • 代码扫描期间生成的代码质量和安全性的度量标准和问题。

    • SonarQube实例配置。

  3. 在构建或连续集成服务器上运行的一台或多台扫描仪可以分析项目。

    二 sonarqube如何搭建

官网地址:https://www.sonarqube.org/,选择“文档”菜单

在出现的文档页面中可以选择版本,目前最新的版本是8.5。笔者尝试过三个版本:

8.5:它是目前最新的版本,需要安装JDK11,并且只支持oracle、sqlserver和PostgreSQL数据库

7.9:它是一个长期支持的版本,非常文档,也需要安装JDK11,并且只支持oracle、sqlserver和PostgreSQL数据库 。

7.6:它是一个老版本,只需安装JDK8,支持oracle、sqlserver和PostgreSQL数据库,以及mysql数据库。

刚开始我们为了省事,安装了 7.6的版本,因为mysql数据库我们已经在用了,无需额外安装其他数据库,并且JDK8也在使用,安装成本最小。但是后来发现,如果需要安装汉化版插件,或者mybatis插件,这些插件要求的SonarQube版本必须在7.9以上,并且需要运行在JDK11以上。经过权衡之后,我们决定安装最新版的。

2.1 安装JDK11和postgreSQL

JDK下载地址:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html

JDK的安装比较简单,我在这里就不过多介绍了,网上有很多教程。

PostgreSQL它自己号称自己是世界上最先进的开源数据库,具有许多功能,旨在帮助开发人员构建应用程序,管理员来保护数据完整性和构建容错环境,并帮助您管理数据,无论数据集的大小。除了免费和开源之外,PostgreSQL也是高度可扩展的。例如,您可以定义自己的数据类型,构建自定义函数,甚至可以使用不同的编程语言编写代码,而无需重新编译数据库。

PostgreSQL的安装与使用可以参数:https://www.jianshu.com/p/7d133efccaa4

2.3 从zip文件安装sonarqube

SonarQube无法在root基于Unix的系统上运行,因此,如有必要,请为SonarQube创建专用的用户帐户。

$ SONARQUBE-HOME(下面)指的是SonarQube发行版已解压缩的目录的路径。

设置对数据库的访问

编辑$ SONARQUBE-HOME / conf / sonar.properties以配置数据库设置。模板可用于每个受支持的数据库。只需取消注释并配置所需的模板,然后注释掉专用于H2的行:

Example for PostgreSQL
sonar.jdbc.username=sonarqube
sonar.jdbc.password=mypassword
sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube

配置Elasticsearch存储路径

默认情况下,Elasticsearch数据存储在$ SONARQUBE-HOME / data中,但不建议将其用于生产实例。相反,您应该将此数据存储在其他位置,最好是在具有快速I / O的专用卷中。除了保持可接受的性能外,这样做还可以简化SonarQube的升级。

编辑$ SONARQUBE-HOME / conf / sonar.properties以配置以下设置:

sonar.path.data=/var/sonarqube/data
sonar.path.temp=/var/sonarqube/temp

用于启动SonarQube的用户必须具有对这些目录的读写权限。

启动Web服务器

默认端口为“ 9000”,上下文路径为“ /”。这些值可以在$ SONARQUBE-HOME / conf / sonar.properties中进行更改

sonar.web.host=192.0.0.1
sonar.web.port=80
sonar.web.context=/sonarqube

执行以下脚本来启动服务器:

  • 在Linux上:bin / linux-x86-64 / sonar.sh start

  • 在macOS上:bin / macosx-universal-64 / sonar.sh start

  • 在Windows上:bin / windows-x86-64 / StartSonar.bat

调整Java安装

如果服务器上安装了多个Java版本,则可能需要明确定义使用哪个Java版本。

要更改SonarQube使用的Java JVM,请编辑$ SONARQUBE-HOME / conf / wrapper.conf并更新以下行:

wrapper.java.command=/path/to/my/jdk/bin/java

您现在可以在http:// localhost:9000浏览SonarQube (默认的系统管理员凭据为adminadmin)。第一次访问这个地址比较会停留在这个页面一段时间,因为SonarQube会做一些初始化工作,包含往空数据库中建表

初始化成功后运行的页面:

同时会生成20多张表:

2.3 安装插件

根据个人需要,可以安装汉化插件,sonarqube默认是英文界面。

github地址:https://github.com/SonarQubeCommunity/sonar-l10n-zh

将项目下载编译打包后,将jar放到$SONARQUBE-HOME\extensions\plugins

目录下即可,然后执行:./sonar.sh restart命令重启sonarqube服务。

此外,还有mybatis插件

gitee地址:https://gitee.com/mirrors/sonar-mybatis

我个人用过,觉得作用不大,不过可以基于这个代码扩展自己需要的功能。

三 sonarqube如何使用

3.1 在maven项目中集成sonarqube

先在maven的settings.xml文件中增加如下配置:

<pluginGroups>
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- Optional URL to server. Default value is http://localhost:9000 -->
<sonar.host.url>http://localhost:9000
</sonar.host.url>
</properties>
</profile>
</profiles>

然后在pom.xml文件中增加配置:

<plugin><groupId>org.sonarsource.scanner.maven</groupId><artifactId>sonar-maven-plugin</artifactId><version>3.3.0.603</version>
</plugin>

在项目目录下运行代码检测命令:  mvn clean complie -U -Dmaven.test.skip=true sonar:sonar

看到这几句话,就表示检测成功了

然后在sonar后台查看检测报告

报告里面包含:bug、漏洞、异味、安全热点、覆盖、重复率等,对有问题的代码能够快速定位。

点击某个bug可以查看具体有问题代码:

没有关闭输入流问题:

空指针问题:

错误的用法:

SimpleDateFormat不应该被定义成static的。

检测出的代码问题类型太多,这里就不一一列举了。总之,记住一句话:sonar很牛逼。它不光可以检测出代码问题,还对一些不好的代码写法和用法有更好的建议。

彩蛋

sonarqube非常强大,上面只介绍了它的基本用法。一般情况下,我们可以使用jenkins配置需要代码检测的项目,从gitlab上下载代码,执行maven编译打包代码测试命令,可直接生成报告。jenkins触发执行代码检测的时机是:1.有代码提交,或者指定比如test分支有代码提交,项目数量少可以这样做。2.定时执行,我们公司就是配置在凌晨定时执行,因为jenkins部署的项目太多了,为了不影响正常的项目部署。

此外,我们可以自定义代码检测的执行规则,根据实际的项目需求自己开发插件,比如:我们自己开发了mybatis插件,扫描mapper和xml文件名称不一致的情况。

总之,sonar的功能非常强大,强烈建议大家在项目中使用,真的可以减少很多隐藏的bug,提高代码质量,如果你用过就会发现它的好处。

以下文章来源于公众号苏三说技术 ,作者因为热爱所以坚持ing

这个神器让我的 Bug 少了一半相关推荐

  1. 使用了这个神器,让我的代码bug少了一半

    最近一段时间,我们团队在生产环境出现了几次线上问题,有部分比较严重,直接影响用户功能的使用,惹得领导不高兴了,让我想办法提升代码质量,这时候项目工程代码质量检测神器--SonarQube,出现在我们的 ...

  2. 惊了,Python 民俗社会科学项目,看看能否预测【面向哪里写BUG少】

    hello ,你打开的这个系列的专栏是免费滴,每当橡皮擦发现一个不错的 Python 库的时候,就会写到这个专栏里面,分享给你. 有时候我们多了解一个 Python 库,解决问题的途径就会增加一种,效 ...

  3. 0基础学python看什么书-编程语言学python必看这三本书,少走一半弯路

    非常喜欢python 我非常喜欢python,在前面5年里,它一直是我热衷使用并不断研究的语言,迄今为止,python都非常友好并且易于学习! 它几乎可以做任何事,从简单的脚本创建.web,到数据可视 ...

  4. 如何避免Excel转PDF后内容少了一半

    虽然将Excel转成PDF是比较简单的操作,但也有时候会出现转换后的PDF对比表格内容却少了一半,怎么才能避免这种情况出现呢? 如果我们是通过office直接导出为PDF,那在导出前通过打印预览,以A ...

  5. aspose将datatable导出excel 比自己拼好的多 Bug少-。.net

    using System;  using System.Collections.Generic;  using System.Linq;  using System.Web;  using Syste ...

  6. 用好这个数据分析工具,BI平台建设少费一半力

    巧妇难为无米之炊,将军难打无兵之仗,对于数据分析人来说,最痛苦的事情莫过于拿不到数据了. 很多时候我们做数据分析的人都会遇到"万事俱备.只欠数据"的问题,没有数据一切都是泡沫,既不 ...

  7. 人常见的思维盲区有哪些?看懂这个你会少犯一半错误

    人的常见思维盲区有哪些?关于这个问题,最好的回答者是巴菲特的搭档查理·芒格,他1995年在哈佛法学院的演讲时对这个问题做了详尽分析.他后来将经常导致人类犯错的心理盲区总结为一篇长文,文章原标题为< ...

  8. 搞懂这三个指标,数据分析起码少费一半力

    之前做过的数据分析项目挺多的,最近有一位朋友,他们公司是一家年销售额勉强破千万的电商企业,因为之前的品牌红利期,加上成本优势.野蛮生长,今年后端成本上涨,前端销量也在下滑,想总结一下之前的数据情况,并 ...

  9. 盘点几本软件测试入门必读的经典书籍,让你少走一半弯路

    读书一直以来就是获取知识的最直接途径,并且成本低廉.每本书都是作者深度思考和总结的成果,书本的内容一般都要经过缜密的调研,都是作者辛辛苦苦实践的结晶.技术书籍写作耗时都比较久,基本上能广泛流传的书籍, ...

  10. 为什么优秀的程序员bug很少?因为他们……

    关注+星标公众号,不错过精彩内容 来源 | 开课吧 我现在郑重地告诉你:你的算法刷题可能是错误而无效的!!! 我为什么这么说? 你在刷题的时候是否遇到这样的情况: 一拿到题目就开始疯狂的撰写代码,可是 ...

最新文章

  1. day12 Python操作rabbitmq及pymsql
  2. pac代理模式什么意思_满镒财务:代理记账所说的“核税”是什么意思?
  3. 比较有意思的比较内表的小函数
  4. python心得体会300字_有没有简单一点的 Python 小例子或小项目?
  5. leetcode 787. Cheapest Flights Within K Stops | 787. K 站中转内最便宜的航班(BFS)
  6. kaggle(03)-自行车租赁预测问题(基础版)
  7. 脑波控制机械手,双手打字也无法自证清白| Science Robotics
  8. 一位Erlang程序猿的自白
  9. C# Newtonsoft.Json用法
  10. 计算机二级考试办公软件高级应用题型,计算机二级考试题型
  11. 《锋利的jQuery》二、jQuery的选择器
  12. C++多线程 - 无锁编程
  13. codeforces 1260 总结
  14. java.lang.Integer常用方法
  15. Linux下的man指令
  16. 宅家神器—epub阅读器
  17. An Actor–Critic based controller for glucose regulation in type 1 diabetes
  18. 怎样提取音频制作手机铃声
  19. 使用python uiautomation从钉钉网页版提取公司所有联系人信息
  20. CAD - 创建块、插入块

热门文章

  1. 值此“程序员节”之际,祭奠那位猝死的程序员兄弟
  2. 在nuxt中使用swiper轮播
  3. swiper点击左右失效
  4. PicoNeo3开发VR项目
  5. MySQL ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
  6. 国内外9大最佳测试管理平台
  7. IBM Tivoli Storage Manager安装介绍
  8. POI生成Word水印watermark(兼容WPS)的终极解决方案
  9. c语言函数的标准写法,C语言函数的两种写法变种
  10. 如何在电脑上录制游戏视频画面