SonarQube 概念

什么是 SonarQube

SonarQube 是一种自动代码审查工具,用于检测代码中的错误,漏洞和有味道的代码。它可以与现有的工作流程集成,以实现跨项目分支和提取请求的连续代码检查。

SonarQube 架构

SonarQube平台由4个组件组成:
在这里插入图片描述
1、SonarQube 服务器
2、SonarQube数据库
3、SonarQube插件,可能包括语言,SCM,集成,身份验证和管理插件
4、Sonar 扫描器,以分析项目

SonaQuge 是如何工作的

在这里插入图片描述

1、开发人员在其IDE中进行编码,并使用SonarLint运行本地分析。
2、开发人员将他们的代码放入他们最喜欢的SCM中:git,SVN,TFVC,…
3、Continuous Integration Server会触发自动生成,并执行运行SonarQube分析所需的SonarScanner。
4、分析报告将发送到SonarQube服务器进行处理。
5、SonarQube Server处理分析报告结果并将其存储在SonarQube数据库中,并在UI中显示结果。
6、开发人员通过SonarQube UI审查,评论,挑战他们的问题,以管理和减少技术债务。
7、经理从分析中接收报告。Ops使用API​​自动执行配置并从SonarQube提取数据。运营商使用JMX监视SonarQube Server。

现有问题

从代码开发这个事情一诞生开始,混乱就是一直伴随着的。人们经常会问,“我做的对不对?”,对此下面这些回答:

  • 最古老的一个:编译通过了看上去在工作
  • 普遍的情况是:用户没有抱怨(直到用户开始抱怨或者我们必须添加新功能,那么我们可以弄清楚我们做了多少)
  • 最近的答案是自动测试用例(如何知道是否有足够的测试,以及如何知道测试无法涵盖的内容)

我们如何评估代码的质量和编写代码的开发人员? 评估工厂工人(可接受的质量),律师(案例获胜)等都很容易

我们是否可以评估软件质量,这是一个可以回答的问题。软件质量可以通过抽象,从不同的角度进行检查,按不同的维度来打分。

我们来试验一下。下面这段文字,你能否正确阅读。

研表究明,汉字的序顺并不定一能影阅响读,比如当你看完这句话后,才发这现里的字全是乱的。

从一个产品的角度,有人会认为文本顺序不对,但这段话没毛病,因为但不影响阅读。但不好的一面是影响了阅读体验,需要一些额外的精力去重建单词的顺序。此外,文章的编辑者有点郁闷。
把上面的场景换成软件开发的源代码。阅读者是产品的最终用户,编辑者是开发人员。两者从不同的角度来看这段代码。最终用户关注功能是否实现,开发者关注代码结构。

如何判断代码好坏?

我们可以通过以下几个方面判断代码好坏:

  • 是否遵守了特定的编码规范;

  • 是否遵循了已知的最佳实践,避免了已知的不良实践;

  • 是否有潜在的BUG和性能问题、安全隐患、重复代码;

  • 代码逻辑是否很复杂;

  • 公开的API是否有完善的文档和注释;

  • 是否有单元测试;

  • 代码是否遵循了最佳的设计和架构;

为什么要使用 SonarQube

SonarQube不会告诉你什么是错的,你自己判断。它只是质量管理工具(平台),帮助你走在正确的道路上。
SonarQube的产品涵盖了其创造者所称的七大品质:SonarQube不仅解决了错误,还解决了编码规则,测试覆盖,重复,API文档,复杂性和架构,并在仪表盘中提供所有这些详细信息。
SonarQube 从以下几个方面检查我们的代码:

代码可靠性

  • 检测错误

SonarQube提出的问题要么是明显的错误代码,要么是更可能没有给出预期行为的代码。查找最棘手的错误,轻松地在代码路径中导航,同时指出在多个位置发现的问题。

  • 异味代码

“有臭味”的代码(可能)完成了应有的工作,但将很难维护。在最坏的情况下,这将令人迷惑,以至于维护人员可能会无意间引入错误。示例包括重复的代码,单元测试中未发现的代码以及过于复杂的代码。

  • 安全漏洞

SonarQube可帮助您查找和跟踪代码中的不安全性。示例包括SQL注入,硬编码密码和管理不善的错误。

  • 自定义规则

SonarQube代码分析器包括默认的质量配置文件,这些配置文件提供了无争议规则集的强大价值。默认的质量配置文件适用于大多数项目,但是您可以轻松调整它们以完全满足您的需求。

应用安全

  • 安全热点问题

安全热点突出显示了可疑的代码片段,开发人员应对其进行审查和分类,因为它们可能隐藏漏洞。
在编写代码和发现热点时,您将学习如何评估安全风险,同时更加了解安全的编码做法。

  • 安全漏洞

SonarQube提供了详细的问题描述和代码亮点,以解释为什么您的代码存在风险。只需按照指南进行操作,签入修复程序并保护您的应用程序安全即可。

技术债务

  • 专注于新代码以保持项目健康

SonarQube项目主页突出显示了(更改或添加的)新代码的代码质量和安全性,因此您可以专注于重要的事情:确保今天编写的代码是可靠的。

  • 开发人员在新规范中的品质

作为开发人员,您的首要任务是确保您今天编写的代码干净安全。

SonarQube 安装及配置

安装

这里使用 docker 安装 SonarQube,需要注意的是,在生产环境下,需要指定连接数据库,不能使用自带的内部数据库,否则会导致 SonarQube 无法升级。
SonarQube 目前支持 3 种 数据库

  • SqlServer
  • Oracle
  • PostgreSQL

具体要求请查看官方文档
这里以 SqlServer 为例,创建的数据库排序规则必须区分大小写(CS)和区分重音(AS)。

用以下命令创建卷

docker volume create --name sonarqube_data
docker volume create --name sonarqube_extensions
docker volume create --name sonarqube_logs

docker 安装

 docker run -d \
    -p 19000:9000 \
    -v sonarqube_extensions:/opt/sonarqube/extensions \
    sonarqube

#开放服务器上的项目对应端口 
firewall-cmd --zone=public --add-port=19000/tcp --permanent
#重启防火墙 
firewall-cmd --reload

访问你的 Sonarqube 服务器 19000 端口,点击登录默认管理员账户 admin 密码 admin
在这里插入图片描述
进入 Docker Sonaqube 容器中,修改 /opt/sonarqube/conf/sonar.properties 文件,配置数据库
在这里插入图片描述
修改数据库连接账户密码及 URL,并重启 SonarQube 容器
在这里插入图片描述
在这里插入图片描述
重启后 SonarQube 会将数据转存到你配置的新的数据库,需要一段时间,请耐心等待

如果 docker 容器重启后报错

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

切换到 root 用户执行命令

sysctl -w vm.max_map_count=262144

查看结果:

sysctl -a|grep vm.max_map_count

显示:

vm.max_map_count = 262144

上述方法修改之后,如果重启虚拟机将失效,所以:

解决办法:

在 /etc/sysctl.conf文件最后添加一行
vi /etc/sysctl.conf

vm.max_map_count=262144

即可永久修改
在这里插入图片描述

汉化

在管理员页面中的市场中搜索 chinese 安装汉化插件
在这里插入图片描述
点击重启服务器即可
在这里插入图片描述

如何使用 SonarQube

邮件提醒配置

点击我的账户
在这里插入图片描述
点击提醒配置
在这里插入图片描述
可以在这里自由配置需要邮件提醒的事件
在这里插入图片描述

令牌生成

在我的账户界面中选择安全,可以生成令牌
在这里插入图片描述

单元测试覆盖率

开发过程中,经常会有单元测试的需求,如何对于代码的单元测试是否全面有一个整体的评估呢?
我们使用 jacoco 这个单元测试报告软件生成单元测试覆盖报告

在自己的 Maven 项目的 pom.xml 文件中添加构建时插件 jacoco-maven-plugin

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.5.201505241946</version>
                <executions>
                    <execution>
                        <id>pre-test</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>post-test</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

在 Maven install 和 packge 的时候就会自动生成代码单元测试覆盖率报告,路径在 target\site\jacoco\index.html,提供 SonarQube 解析、展示
在这里插入图片描述
注意, Maven 打包时输入跳过单元测试命令或者 pom.xml 中配置跳过单元测试会导致无法生成单元测试报告

添加项目

点击添加项目
在这里插入图片描述
填写项目标识和项目名
在这里插入图片描述
使用已有的令牌或者创建新的令牌
在这里插入图片描述
选择自己代码的语言,并根据提示执行代码检查,这里以 JAVA 语言 Maven 为例
在这里插入图片描述
到自己的 Maven 项目中执行该命令即可
在这里插入图片描述
命令执行完成后,就可以在 SonarQube 网页端查看到对应的分析报告
在这里插入图片描述如果你不想你的项目分析报告被其他人看到,可以点击权限管理控制项目的可见人员范围
在这里插入图片描述

集成 Jenkins

插件安装及配置

在 Jenkins 插件管理中安装 Sonarqube scanner
在这里插入图片描述
在 SonarQube 网页中生成令牌,并且记录
在这里插入图片描述
在 Jenkins 系统管理中配置 Sonerqube 服务器信息
在这里插入图片描述
最后,配置全局工具配置
在这里插入图片描述

使用 SonarQube Scanner

新建一个 Jenkins 任务,或者在原有 Jenkins 任务中新增构建步骤
在这里插入图片描述
配置任务信息
在这里插入图片描述
其中 Analysis properties 配置如下

sonar.projectKey=com.landicorp:ecm
sonar.projectName=com.landicorp:ecm
sonar.projectVersion=1.0

sonar.language=java
sonar.sourceEncoding=UTF-8

sonar.sources=$WORKSPACE
sonar.java.binaries=$WORKSPACE

相关文档在这里:

https://github.com/SonarSource/sonar-scanning-examples/blob/master/sonarqube-scanner/sonar-project.properties

https://docs.sonarqube.org/display/PLUG/Java+Plugin+and+Bytecode

这样,在每次 Jenkins 自动构建任务时,会自动到 Sonarqube 扫描代码

SonarLint

SonarQube

IDEA

File->Setting 在这里插入图片描述
安装 SonarLint 插件,安装成功后需要重启 IDEA
在这里插入图片描述

添加你的 Sonarqube 服务器 URL 和上面已经生成好的令牌
填写名称并选择 SonarQube,填写服务器 URL
在这里插入图片描述
在这里插入图片描述

填写刚刚生成的 Token,如果没有则点击 Create Token 到网页中生成 Token 并填入
在这里插入图片描述

选择 Project Settings,并选择
在这里插入图片描述
保存配置在 IDEA 下方会出现 SonarLint tab 页,点开即可查看代码检查信息
在这里插入图片描述

VSCode

配置项目

在这里插入图片描述
根据提示安装扫描器
在这里插入图片描述
根据自己的情况下载,并安装配置 SonarScanner
在这里插入图片描述
解压到本地,修改 /conf/sonar-scanner.properties,配置服务器 URL
在这里插入图片描述
将 sonar-scanner 的 /bin/ 目录添加到环境变量的 Path 中
在这里插入图片描述
验证安装,cmd 中执行 sonar-scanner -h
在这里插入图片描述
在项目根目录中执行命令分析项目代码,注意配置环境变量后需要重启 vscode
在这里插入图片描述
在 vscode 中执行上面的命令,
在这里插入图片描述
然后就可以页面上查看代码的分析日志了

安装 SonarLint 插件

在这里插入图片描述
在文件-》首选项->设置 中查找 sonar
在这里插入图片描述

可以看到他已经给出了连接 SonarQube 的例子,点击在 settings.json 中编辑
在这里插入图片描述
填写好自己的 SonarQube 服务器和 token
在这里插入图片描述
返回刚刚的配置页面,点击项目连接模式下的编辑
在这里插入图片描述
填写项目 Key 值(SonarQube 上的 projectKey)
在这里插入图片描述
更新静态规则,查看-》命令面版中执行以下命令

SonarLint: Update all project bindings to SonarQube/SonarCloud

更新规则结束以后就可以在页面上的问题 Tab 页中查看代码解析结果
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐