目录

  • SonarQube 概念
  • 什么是 SonarQube
  • SonarQube 架构
  • SonaQuge 是如何工作的
  • 现有问题
  • 如何判断代码好坏?
  • 为什么要使用 SonarQube
  • 代码可靠性
  • 应用安全
  • 技术债务
  • SonarQube 安装及配置
  • 安装
  • 汉化
  • 如何使用 SonarQube
  • 邮件提醒配置
  • 令牌生成
  • 单元测试覆盖率
  • 添加项目
  • 集成 Jenkins
  • 插件安装及配置
  • 使用 SonarQube Scanner
  • SonarLint
  • IDEA
  • VSCode
  • 配置项目
  • 安装 SonarLint 插件


SonarQube 概念

什么是 SonarQube

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

SonarQube 架构

SonarQube平台由4个组件组成:

sonarqube镜像 sonarqube安装教程_服务器


1、SonarQube 服务器

2、SonarQube数据库

3、SonarQube插件,可能包括语言,SCM,集成,身份验证和管理插件

4、Sonar 扫描器,以分析项目

SonaQuge 是如何工作的

sonarqube镜像 sonarqube安装教程_sonarqube镜像_02

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

sonarqube镜像 sonarqube安装教程_单元测试_03


进入 Docker Sonaqube 容器中,修改 /opt/sonarqube/conf/sonar.properties 文件,配置数据库

sonarqube镜像 sonarqube安装教程_单元测试_04


修改数据库连接账户密码及 URL,并重启 SonarQube 容器

sonarqube镜像 sonarqube安装教程_单元测试_05


sonarqube镜像 sonarqube安装教程_sonarqube镜像_06


重启后 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

即可永久修改

sonarqube镜像 sonarqube安装教程_服务器_07

汉化

在管理员页面中的市场中搜索 chinese 安装汉化插件

sonarqube镜像 sonarqube安装教程_重启_08


点击重启服务器即可

sonarqube镜像 sonarqube安装教程_重启_09

如何使用 SonarQube

邮件提醒配置

点击我的账户

sonarqube镜像 sonarqube安装教程_服务器_10


点击提醒配置

sonarqube镜像 sonarqube安装教程_重启_11


可以在这里自由配置需要邮件提醒的事件

sonarqube镜像 sonarqube安装教程_sonarqube镜像_12

令牌生成

在我的账户界面中选择安全,可以生成令牌

sonarqube镜像 sonarqube安装教程_服务器_13

单元测试覆盖率

开发过程中,经常会有单元测试的需求,如何对于代码的单元测试是否全面有一个整体的评估呢?
我们使用 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 解析、展示

sonarqube镜像 sonarqube安装教程_服务器_14


注意, Maven 打包时输入跳过单元测试命令或者 pom.xml 中配置跳过单元测试会导致无法生成单元测试报告

添加项目

点击添加项目

sonarqube镜像 sonarqube安装教程_重启_15


填写项目标识和项目名

sonarqube镜像 sonarqube安装教程_服务器_16


使用已有的令牌或者创建新的令牌

sonarqube镜像 sonarqube安装教程_服务器_17


选择自己代码的语言,并根据提示执行代码检查,这里以 JAVA 语言 Maven 为例

sonarqube镜像 sonarqube安装教程_服务器_18


到自己的 Maven 项目中执行该命令即可

sonarqube镜像 sonarqube安装教程_重启_19


命令执行完成后,就可以在 SonarQube 网页端查看到对应的分析报告

sonarqube镜像 sonarqube安装教程_服务器_20

如果你不想你的项目分析报告被其他人看到,可以点击权限管理控制项目的可见人员范围

sonarqube镜像 sonarqube安装教程_单元测试_21

集成 Jenkins

插件安装及配置

在 Jenkins 插件管理中安装 Sonarqube scanner

sonarqube镜像 sonarqube安装教程_sonarqube镜像_22


在 SonarQube 网页中生成令牌,并且记录

sonarqube镜像 sonarqube安装教程_单元测试_23


在 Jenkins 系统管理中配置 Sonerqube 服务器信息

sonarqube镜像 sonarqube安装教程_单元测试_24


最后,配置全局工具配置

sonarqube镜像 sonarqube安装教程_重启_25

使用 SonarQube Scanner

新建一个 Jenkins 任务,或者在原有 Jenkins 任务中新增构建步骤

sonarqube镜像 sonarqube安装教程_单元测试_26


配置任务信息

sonarqube镜像 sonarqube安装教程_单元测试_27


其中 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

sonarqube镜像 sonarqube安装教程_sonarqube镜像_28


安装 SonarLint 插件,安装成功后需要重启 IDEA

sonarqube镜像 sonarqube安装教程_服务器_29

添加你的 Sonarqube 服务器 URL 和上面已经生成好的令牌

填写名称并选择 SonarQube,填写服务器 URL

sonarqube镜像 sonarqube安装教程_单元测试_30


sonarqube镜像 sonarqube安装教程_sonarqube镜像_31

填写刚刚生成的 Token,如果没有则点击 Create Token 到网页中生成 Token 并填入

sonarqube镜像 sonarqube安装教程_重启_32

选择 Project Settings,并选择

sonarqube镜像 sonarqube安装教程_重启_33


保存配置在 IDEA 下方会出现 SonarLint tab 页,点开即可查看代码检查信息

sonarqube镜像 sonarqube安装教程_sonarqube镜像_34

VSCode

配置项目

sonarqube镜像 sonarqube安装教程_重启_35


根据提示安装扫描器

sonarqube镜像 sonarqube安装教程_sonarqube镜像_36


根据自己的情况下载,并安装配置 SonarScanner

sonarqube镜像 sonarqube安装教程_服务器_37


解压到本地,修改 /conf/sonar-scanner.properties,配置服务器 URL

sonarqube镜像 sonarqube安装教程_重启_38


将 sonar-scanner 的 /bin/ 目录添加到环境变量的 Path 中

sonarqube镜像 sonarqube安装教程_sonarqube镜像_39


验证安装,cmd 中执行 sonar-scanner -h

sonarqube镜像 sonarqube安装教程_服务器_40


在项目根目录中执行命令分析项目代码,注意配置环境变量后需要重启 vscode

sonarqube镜像 sonarqube安装教程_单元测试_41


在 vscode 中执行上面的命令,

sonarqube镜像 sonarqube安装教程_单元测试_42


然后就可以页面上查看代码的分析日志了

安装 SonarLint 插件

sonarqube镜像 sonarqube安装教程_单元测试_43


在文件-》首选项->设置 中查找 sonar

sonarqube镜像 sonarqube安装教程_单元测试_44

可以看到他已经给出了连接 SonarQube 的例子,点击在 settings.json 中编辑

sonarqube镜像 sonarqube安装教程_单元测试_45


填写好自己的 SonarQube 服务器和 token

sonarqube镜像 sonarqube安装教程_服务器_46


返回刚刚的配置页面,点击项目连接模式下的编辑

sonarqube镜像 sonarqube安装教程_重启_47


填写项目 Key 值(SonarQube 上的 projectKey)

sonarqube镜像 sonarqube安装教程_单元测试_48


更新静态规则,查看-》命令面版中执行以下命令

SonarLint: Update all project bindings to SonarQube/SonarCloud

更新规则结束以后就可以在页面上的问题 Tab 页中查看代码解析结果

sonarqube镜像 sonarqube安装教程_服务器_49