简介
SonarQube是一款用于代码质量管理的开源工具,是静态代码检查工具,采用 B/S 架构它主要用于管理源代码的质量,可以支持众多计算机语言,比如 php,java, C#, go,C/C++, Cobol, JavaScrip, Groovy 等。sonar 可以通过 PMD,CheckStyle,Findbugs 等等代码规则检测工具来检测你的代码,帮助你发现代码的漏洞,Bug,异味等信息。
可以从七个维度检测代码质量:
1)复杂度分布(complexity):代码复杂度过高将难以理解
2)重复代码(duplications):程序中包含大量复制、粘贴的代码而导致代码臃肿,sonar可以展示源码中重复严重的地方
3)单元测试统计(unit tests):统计并展示单元测试覆盖率,开发或测试可以清楚测试代码的覆盖情况
4)代码规则检查(coding rules):通过Findbugs,PMD,CheckStyle等检查代码是否符合规范
5)注释率(comments):若代码注释过少,特别是人员变动后,其他人接手比较难接手;若过多,又不利于阅读
6)潜在的Bug(potential bugs):通过Findbugs,PMD,CheckStyle等检测潜在的bug
7)结构与设计(architecture & design):找出循环,展示包与包、类与类之间的依赖、检查程序之间耦合度
架构
SonarQube 平台由 4 个组件组成:
1)一个 SonarQube 服务器启动 3 个主要进程:
-
供开发人员、管理人员浏览质量快照和配置 SonarQube 实例的 Web 服务器
-
基于 Elasticsearch 的 Search Server 支持从 UI 进行搜索
-
Compute Engine Server 负责处理代码分析报告并将其保存在 SonarQube 数据库中
2)一个用于存储的 SonarQube 数据库:
- SonarQube 实例的配置(安全性、插件设置等)
- 项目、视图等的质量快照。
3)服务器上安装了多个 SonarQube 插件,包括语言、SCM、集成、身份验证等
4)在您的构建 / 持续集成服务器上运行一个或多个 SonarScanner 来分析项目
一体化
1)开发人员在他们的 IDE 中编码并使用 SonarLint 运行本地分析。
2)开发人员把代码推送到 Git 等代码管理仓库
3)通过 Jenkens 等持续集成服务器,并使用 sonar-scanner
进行代码分析
4)分析报告被发送到 SonarQube 服务器进行处理。
5)SonarQube Server 将分析报告结果处理并存储在 SonarQube 数据库中,并在 UI 中显示结果。
6)开发人员通过 SonarQube UI 审查、评论、挑战他们的问题,以管理和减少他们的技术债务。
7)使用 API 来自动化配置并从 SonarQube 中提取数据。
安装 sonar
本文安装的版本是 SonarQube 7.6 版本,目前最高版本 (2021 年 7 月 27 日 10:29:21) SonarQube 9.0,2019 年 4 月 10 号,SonarQube 发文称在 7.9 之后,所有的 SonarQube 的版本中将停止对 MySQL 的支持。
1)SonarQube 7.6
2)java 1.8
3)Mysql 5.6
CentOs6.9 安装可参考 博客
安装完后可打开网址:
安装 sonar-scanner
本文使用 Sonar-scanner 进行代码分析
-
根据环境 下载,本文以 linux 系统为例
-
上传 sonar-scanner-cli-4.6.2.2472-linux.zip 文件到虚拟机或服务器
-
解压缩
`unzip sonar-scanner-cli-4.6.2.2472-linux.zip`
-
添加 sonar-scanner-4.6.2.2472-linux/bin 到环境变量
vim /etc/profile
-
#配置 sonar-scanner
-
SONAR_RUNNER_HOME=/opt/sonar-scanner-4.6.2.2472-linux
-
PATH=$SONAR_RUNNER_HOME/bin:$PATH
-
export SONAR_RUNNER_HOME
-
export PATH
-
source /etc/profile
sonar-scanner -h
查看是否添加成功-
INFO:
-
INFO: usage: sonar-scanner [options]
-
INFO:
-
INFO: Options:
-
INFO: -D,--define <arg> Define property
-
INFO: -h,--help Display help information
-
INFO: -v,--version Display version information
-
INFO: -X,--debug Produce execution debug output
-
-
修改 sonar-scanner 配置文件
sonar-scanner-4.6.2.2472-linux/conf
-
vim sonar-scanner.properties
-
#Configure here general information about the environment, such as SonarQube server connection details for example
-
#No information about specific project should appear here
-
-
#----- Default SonarQube server
-
sonar.host.url=http://127.0.0.1:10005
-
-
#----- Default source code encoding
-
#sonar.sourceEncoding=UTF-8
-
sonar.jdbc.url=jdbc:mysql://127.0.0.1:3307/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
-
#数据库账号
-
sonar.jdbc.username=sonar
-
#数据库密码
-
sonar.jdbc.password=sonar
-
sonar.sorceEncoding=UTF-8
此配置文件是有关环境的常规信息,例如 SonarQube 服务器连接详细信息。有关特定项目的信息不应该在此处配置
-
-
检测代码
SonarQube 创建项目
- 打开 SonarQube Web 页面创建项目
本文使用 PHP 进行分析
使用 Sonar-scanner 分析代码
-
进入需要分析的代码项目路径下
-
touch sonar-project.properties
在项目路径下创建文件, -
vim sonar-project.properties
-
# must be unique in a given SonarQube instance
-
sonar.projectKey=test
-
-
# --- optional properties ---
-
-
# defaults to project key
-
sonar.projectName=test
-
# defaults to 'not provided'
-
sonar.projectVersion=1.0
-
-
# Path is relative to the sonar-project.properties file. Defaults to .
-
# 多个路径可以使用逗号隔开
-
sonar.sources=./app,./config
-
-
# Encoding of the source code. Default is default system encoding
-
sonar.sourceEncoding=UTF-8
-
#这个具体作用目前不太清除,官网也没写
-
sonar.java.binaries=.
-
# SonarQube 创建项目生成的令牌
-
sonar.login=6c8148e18e76fbc96e73354
键 描述 sonar.projectKey 项目的唯一键。允许的字符是:字母,数字 - , _ , . 和 : ,与至少一个非数字字符。 sonar.sources 需要进行代码分析的文件目录,多个使用逗号分割 sonar.projectName 将显示在 Web 界面上的项目名称。 sonar.projectVersion 项目版本 sonar.login 对项目具有执行分析权限的 SonarQube 用户的登录或身份验证令牌 sonar.password 与 sonar.login 用户名一起使用的密码。如果正在使用身份验证令牌,则应将其留空 sonar.projectDescription 项目说明 sonar.sourceEncoding 源文件的编码。例如: UTF-8 更过参数请参考 官方文档
-
-
在 sonar-project.properties 文件同级目录执行
sonar-scanner
-
查看 SonarQube Web 页面,就可以看到 test 项目有一个
后台任务
正在执行,此时就是 Sonar-scanner 提交数据到 SonarQube 服务器,SonarQube 服务器分析数据 -
后台任务执行完,就可以查看代码分析结果
SonarQube 简单使用
用户管理
-
创建群组
- 配置 > 权限 > 群组 > 右上角
-
创建用户
- 配置 > 权限 > 用户 > 右上角
-
添加用户到 PHP 群组
-
配置 PHP 群组对 test 项目的权限
- 项目 -> test 项目 -> 配置 -> 权限
权限页面可以设置当前项目是公开
活私有
项目
可以分配给 PHP 群组六个具体权限
- 项目 -> test 项目 -> 配置 -> 权限
-
具体的权限分类
- 浏览:访问一个项目,浏览它的指标,创建 / 编辑它的问题。
- 查看源码:查看项目的源代码。(用户也需要 “浏览” 权限)
- 问题管理员:对问题进行额外编辑:设置误判 / 不会修复,修改问题严重级别。(用户也需要 “浏览” 权限)
- 管理安全热点:通过” 安全热点” 检测漏洞。驳回,清理,接受,重开” 安全热点”(用户也需要” 浏览” 权限)
- 管理员:查看项目配置,执行管理任务。(用户也需要 “浏览” 权限)
- 执行分析:可以获取执行分析的所有配置(包含安全配置,比如密码),并可以将分析结果推送至 SonarQube 服务器。
质量配置
质量配置是在分析时使用的 规则集合。每个语言都有默认配置。没有指定其他配置的项目会使用默认配置。
PHP 的质量配置安装后有三个 Drupal
,PSR-2
,Sonar way
其中 Sonar way
是系统默认使用的质量配置,可以看到规则有 111 种。
自定义质量配置
如果系统默认的满足不了现有条件,点击右上角 创建
按钮
可根据现有的质量配置创建一个新的配置,或创建一个空的配置。
- 新建的配置可以分配权限给群组或个人
- 可以把当前配置分配给具体项目,使用此配置进行代码检测
- 添加更多的规则
除此之外还有一些其它基础配置
质量阈
质量阈相当于一个代码检测的阈值,代码问题超过阈值会出现提示,或发送邮件通知。
默认的质量阈 Sonar Way
,如果一个项目没有指定质量阈,则默认使用此质量阈。
可根据项目不同,创建不同的质量阈
- 根据具体要求添加不同的指标
- 选择适用的项目
可看到 bugs
数阈值设定的 10,代码检测出来 92,此时项目状态为 错误级别
(没有超阈值为 正常
)
邮件通知
SonarQube 可以设置在一些事件发生时,通过邮件的方式进行提醒
开启邮箱 SMTP 服务
在 QQ 邮箱 中开启服务
- 开启 IMAP/SMTP 服务
- 生成授权码
SonarQube 邮箱配置
可以使用有修改配置权限的账号,或管理员账号进行邮件信息配置
SonarQube 邮件通知配置
可以在 我的账号 -> 提醒
选择需要开启的通知
当有新的问题分配时,会进行邮件提醒
可以看到邮件下面有个问题的连接,跳转的前缀域名可以在 配置
里面进行配置
配置后发送邮件
分支扫描
SonarQube Community 版本不支持多分支扫描,所以可以使用 github 的 sonarqube-community-branch-plugin 插件
根据 SonarQube 版本选择插件版本
-
下载合适的 jar 包,并放置在你安装 SonarQube 的目录下
sonarqube/extensions/plugins
-
重启 SonarQube Service 服务
-
切换你需要分析的分支并修改扫描项目下的 sonar-project.properties 文件
-
sonar.projectKey=test
-
-
# --- optional properties ---
-
-
# defaults to project key
-
sonar.projectName=test
-
# defaults to 'not provided'
-
sonar.projectVersion=1.0
-
-
# Path is relative to the sonar-project.properties file. Defaults to .
-
sonar.sources=./app,./config
-
-
# Encoding of the source code. Default is default system encoding
-
sonar.sourceEncoding=UTF-8
-
#这个具体作用目前不太清除,官网也没写
-
sonar.java.binaries=.
-
# SonarQube 创建项目生成的令牌
-
sonar.login=7eee3f6b73b5cab929c30f5bca7bc0a8bf84ec25
-
# 项目所处分支(一般和 jenkins 结合,通过变量动态修改分支名)
-
sonar.branch.name=release-1
-
-
sonar-scanner
重新扫描 -
可在
SonarQube Web
页面看到新的分支信息
多分支
SonarQube 的分支可分为
- 主分支:一般为 master
- 短期分支:短期分支的问题和长期分支相比是
增量
的数据 - 长期分支:长期维护的分支,如 release 和 develop 分支,问题数据
单独
存储
主分支如果不为 master,可修改主分支名字
同时可修改 长期分支
的分支匹配规则
Jenkins 使用 SonarQube
自行百度安装 Jenkins
安装 SonarQube Scanner
插件
Manage Jenkins -> Manage Plugins -> Sonarqube Scanner
安装完后重启 Jenkins
配置 SonarQube servers
Manage Jenkins -> Configure System -> SonarQube servers
填写自己的 SonarQube Web 地址,并创建一个 凭证
凭证添加
-
SonarQube Web 使用管理员账户生成一个令牌
我的账户 -> 安全
-
在 Jenkins 添加凭证
配置 SonarQube Scanner
Manage Jenkins -> Global Tool Configuration -> SonarQube Scanner
创建 Jenkins 项目
-
新建一个 Item
选择一个自由风格的类型创建 -
创建构建信息
-
sonar.projectKey=${JOB_BASE_NAME}
-
sonar.projectName=${JOB_BASE_NAME}
-
sonar.projectVersion=1.0
-
sonar.sources=./app
-
sonar.sourceEncoding=UTF-8
-
sonar.java.binaries=.
-
sonar.branch.name=${Branch}
构建后删除工作区,本案例只是单一的进行代码检测,不进行后续的操作,所以可以选择删除工作区 -
运行项目
如果是第一次运行,请务必选择 master
分支,不然会失败,因为 SonarQube Web 默认第一个分支就是 master
参考
www.cnblogs.com/ycyzharry/p/116890...
www.cnblogs.com/wangxu01/articles/...
原文链接: https://learnku.com/articles/59179