一、SonarQube简介

SonarQube 是一个用于代码质量管理的开源平台。通过插件形式,可以支持包括 java, Objective-C, Swift, C#, C/C++, PL/SQL,JavaScript 等等二十几种编程语言的代码质量管理与检测。

SonarQueb主要从以下7个维度检测评估代码质量:

  1. 糟糕的复杂度分布
    1. 文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们,且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试
  2. 重复
    1. 显示程序中包含大量复制粘贴的代码是质量低下的sonar可以展示源码中重复严重的地方。
  3. 缺乏单元测试
    1. sonar可以很方便地统计并展示单元测试覆盖率及测试结果统计。
  4. 没有代码标准
    1. sonar可以通过oclint,PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。
  5. 没有足够的或者过多的注释
    1. 没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降,而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。
  6. 潜在的bug
    1. sonar可以通过oclint,PMD,CheckStyle,Findbugs等等代码规则检测工具检测出潜在的bug。
  7. 糟糕的设计(原文Spaghetti Design,意大利面式设计)
    1. 通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系
    2. 可以检测自定义的架构规则
    3. 通过sonar可以管理第三方的jar包
    4. 可以利用LCOM4检测单个任务规则的应用情况
    5. 检测耦合
  8. sonar技术架构图
  9. 名词解释:
  • 代码错误:是代码中的一部分不正确或无法正常运行、可能会导致错误的结果,是指那些在代码发布到生产环境之前应该被修复的明显的错误。
  • 代码异味:不同于代码错误,被检测到的代码是可能能正确执行并符合预期。然而,它不容易被修复,也不能被单元测试覆盖,却可能会导致一些未知的错误,或是一些其它的问题。从长期的可维护性来讲,立即修复代码异味是明智之举。通常在编写代码的时候,代码异味并不容易被发现,而 SonarQube 的静态分析是一种发现它们的很好的方式。
  • 安全漏洞:正如听起来的一样,指的是现在的代码中可能存在的安全问题的缺陷。这些缺陷应该立即修复来防止黑客利用它们。
  • 重复的代码:也和听起来的一样,指的是源代码中重复的部分。代码重复在软件设计中是一种很不好的做法。总的来说,如果对一部分代码进行更改而另一部分没有,则会导致一些维护性的问题。例如,识别重复的代码可以很容易的将重复的代码打包成一个库来重复的使用。

二、安装sonar

步骤请看:linux安装sonar7.3(mysql5.6已提前安装好)

三、jenkins接入sonar插件

步骤:

  1. 在jenkins上安装sonarQube Generic Coverage插件,
    1. 进入“Manage Jenkins”→"Manage Plusings",选择“可选插件”面板,搜索“sonar”,勾选插件,点击“直接安装”按钮。
      在这里插入图片描述
    2. 点击“直接安装”按钮后截图。
    3. 插件安装完成后截图。
  2. 在系统配置“Configure System”里,添加“SonarQube servers”并配置。
    1. 找到“SonarQube servers”, 点击按钮“Add SonarQube”.
    2. 之后出现如下图所示,需要输入一个服务名称和服务访问链接,我们的sonar部署的服务是http://xxx:9000。
    3. 接着选择“添加”弹出“Jenkins”,选择它进入“Jenkins 凭据提供者”界面,“类型”选择“Secret text”,在Secret对应的输入框粘贴sonar生成token值(请看生成token操作),最后保存。
  3. 在全局工具配置“Global Tool Configuration”里添加工具“SonarQube Scanner”并配置。
    1. 找到“SonarQube Scanner”, 点击按钮“新增 SonarQube Scanner”扫描插件.
    2. 之后出现如下图所示,需要输入一个工具名称,勾选“Install automatically”,自动安装sonarqube scanner,最后别忘“保存”。
    3. 安装sonar-scanner,到官网下Index of /Distribution/sonar-scanner-cli下载插件,这里选择的是"sonar-scanner-cli-4.2.0.1873.zip"(官网(SonarScanner | SonarQube Docs)有明确说明对应sonarqube版本),解压放到/usr/loca/目录就行不需要配置或变更什么,只是给jenkins使用。
  4. java项目根目录新建文件sonar-project.properties,该文件是sonar-scanner扫描的配置文件.
    1. 根目录新建文件sonar-project.properties,我们的单元测试目前是放在aduer-xxx-service项目,所以在这个项目的根目录创建文件。
    2. 文件模板及例子。


      模板(“xxx”表示都是需改成对应的值):

      # 项目key
      sonar.projectKey=com.aduer.package:aduer-xxx-soa
      # 项目名称
      sonar.projectName=aduer-xxx-service
      # 项目版本,可以写死,也可以引用变量
      sonar.projectVersion=版本
      # 源文件编码
      sonar.sourceEncoding=UTF-8
      # 源文件语言
      sonar.language=java
      # path to source directories (required)
      # 源代码目录,如果多个使用","分割 例如:mode1/src/main,mode2/src/main
      sonar.sources=aduer-xxx-service/src/main/java/com/aduer/soa/xxx/service/impl
      
      #设置排除的文件
      sonar.exclusions=aduer-xxx-service/src/main/java/com/aduer/soa/xxx/service/impl/channel/*, **/Xxx.java
      # 单元测试目录,如果多个使用","分割 例如:mode1/src/test,mode2/src/test
      sonar.tests=aduer-xxx-service/src/test/java
      # java字节码目录
      sonar.java.binaries=aduer-xxx-service/target/classes/com/aduer/soa/xxx/service/impl
      # 单元测试报告目录
      sonar.junit.reportsPath=aduer-xxx-service/target/surefire-reports
      # 代码覆盖率插件
      sonar.java.coveragePlugin=jacoco
      # jacoco插件版本
      jacoco.version=0.8.3
      # jacoco.exec文件路径
      sonar.jacoco.reportPaths=aduer-xxx-service/target/jacoco.exec

      注意:

      排除具体的匹配规则可以参考sonar的官方文档,非常简单 (docs.sonarqube.org )。注意使用maven项目时匹配的文件夹基础是project base dir。 
      Wildcard Matches 
      ? 匹配单个字符 
      ** 匹配0个或多个文件夹 
      * 匹配0个或多个字符

      例子:

      排除以bean.java和dto.java为结尾的所有java文件> sonar.exclusions=/*Bean.java,/*DTO.java
      排除文件夹 “src/main/java/org/sonar” 中所有的java文件,不包括子文件夹 
      sonar.exclusions=src/main/java/org/sonar/*
       

      例子如下:

      # 项目key
      sonar.projectKey=com.aduer.package:aduer-agent-soa
      # 项目名称
      sonar.projectName=aduer-agent-service
      # 项目版本,可以写死,也可以引用变量
      sonar.projectVersion=1.0.1
      # 源文件编码
      sonar.sourceEncoding=UTF-8
      # 源文件语言
      sonar.language=java
      # path to source directories (required)
      # 源代码目录,如果多个使用","分割 例如:mode1/src/main,mode2/src/main
      sonar.sources=aduer-agent-service/src/main/java/com/aduer/soa/agent/service/impl
      # 单元测试目录,如果多个使用","分割 例如:mode1/src/test,mode2/src/test
      sonar.tests=aduer-agent-service/src/test/java
      # java字节码目录
      sonar.java.binaries=aduer-agent-service/target/classes/com/aduer/soa/agent/service/impl
      # 单元测试报告目录
      sonar.junit.reportsPath=aduer-agent-service/target/surefire-reports
      # 代码覆盖率插件
      sonar.java.coveragePlugin=jacoco
      # jacoco插件版本
      jacoco.version=0.8.3
      # jacoco.exec文件路径
      sonar.jacoco.reportPaths=aduer-agent-service/target/jacoco.exec
  5. jenkins上的job配置(java项目配置)配置执行sonarQube 扫描插件。

    1. 在“构建”面板里选择“Execute SonarQube Scanner”
    2. 出现一个“Execute SonarQube Scanner”编辑面板,JDK对应的选择“Inherit From Job”, “path to project properties”指定扫描器加载的对应项目配置路径。
  6. 构建查看推送任务。
    1. 点击
    2. 查看
    3. 进入sonarqube的web控制端,点击导航栏“配置”>项目->后台任务,如下图。
    4. 查看推送任务,如下图,jenkins调用sonar接口推送分析结果,状态“圈”是推送中。
    5. 推送成功,如下图。
  7. 查看推送的项目分析数据。
    1. 选择导航栏“项目”,找到你推送的项目,点击项目名跳到分析数据。
  8. 更改质量阈。
    1. 选择导航栏“质量阈”进入质量阈操作页面,选择“创建”按钮,新建自定义质量阈,添加自定义质量阈后,设置为“默认”。
    2. 右边栏“添加条件”来选择“度量”并配置百分比。

参考文章:

  1. 使用Jenkins+Sonarqueb进行自动化测试和代码质量检测:使用Jenkins+Sonarqueb进行自动化测试和代码质量检测_阿里云云栖号-CSDN博客.

  2. Jenkins+SonarQube+Gitlab搭建自动化持续代码扫描质量平台:Jenkins+SonarQube+Gitlab搭建自动化持续代码扫描质量平台_Mo小泽的技术博客-CSDN博客

  3. SonarScanner:SonarScanner | SonarQube Docs

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐