前言
在前面一篇《代码质量扫描工具SonarQube原理及环境搭建》中,我们介绍了Sonarqube的架构组成、工作原理以及环境搭建相关操作。本篇将会重点介绍:
下面先来回顾一下SonarQube的架构组成:
Sonarqube的架构可以分为以下几个部分:
Sonar Scanner是一种静态代码分析工具,旨在帮助开发者带来更高质量的代码。它提供了一个工作流,通过扫描代码并提供有关编码错误、漏洞、代码异味等方面的问题的反馈,帮助开发团队优化其代码质量。
Sonar Scanner基于SonarQube平台,可利用其强大的规则引擎分析多种编程语言,包括Java、C#、JavaScript、Python、Go等。Sonar Scanner可作为静态代码分析流程的一部分,通过与构建系统集成实现自动化分析,也可在将其作为一个插件运行于IDE中并为开发人员提供快速反馈。
Sonar Scanner的优点包括:
sonar主要是借助客户端检测工具来检测代码,使用sonar必须配置好本地客户端检测工具,下载地址:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/,下载完成后解压。
将sonar-scanner\bin目录添加到环境变量
将/home/sonar-scanner/bin目录添加到环境变量
① 生成令牌
我的账号-安全:生成令牌
② 将令牌复制到sonar scanner配置文件中
配置文件目录sonar-scanner/conf/sonar-scanner.properties
注:若在前面配置sonar时端口号修改为非9000,则需要在sonar-scanner.properties中指定URL
通过sonar-project.properties配置文件分析代码,具体流程如下:
① clone项目代码
如果本地有java项目,可以分析本地java项目的代码,如果本地没有java项目,可以从网上克隆一个java开源项目的代码
git clone https://gitee.com/hujix/jrequests.git
② 在项目根目录创建一个target文件夹
使用sonar scanner分析时会用到,如果工程下存在target目录则不需要创建,否则会报错
cd jrequests
mkdir target
③ 在项目根目录下创建sonar-project.properties文件
sonar-project.properties内容:
# 登录sonar的token
sonar.login=6874308b3dee33cd1cb299c291af478947c4aa54
# 项目唯一标识,每个项目都不能重复
sonar.projectKey=my:project
# 展示在SonarQube UI的项目名称,可以与Git拉取的项目名称不一致(不能是中文)
sonar.projectName="JAVA-Requests"
# 项目的版本号
sonar.projectVersion=0.1
# 项目的代码的编码格式
sonar.sourceEncoding=UTF-8
# 项目的语言
sonar.language=java
# 项目的源代码目录
sonar.sources=src
# 项目的编译目录
sonar.java.binaries=target
④ 执行sonar scanner读取项目配置信息sonar-project.properties,开始扫码分析
sonar-scanner
执行结果如下:
⑤ 查看sonar控制台展示
扫描分析完成后会生成分析报告,sonar scanner会连接sonar服务,并将分析报告传递给sonar服务器,从而在控制台展示。
可以看出,当前项目共有2个bug,11个漏洞,51个坏味道,重复率为25.7%
利用sonarqube自动生成扫描命令:
① 创建项目
② 创建或使用已有令牌
可以创建一个新令牌,也可以使用前面生成的令牌
③ 选择对应语言,自动生成扫描命令
④ 进入要检测的项目工程根目录,执行扫描命令
sonar-scanner \
-Dsonar.projectKey=test-jrequests \
-Dsonar.sources=. \
-Dsonar.host.url=http://192.168.1.122:9000 \
-Dsonar.login=6874308b3dee33cd1cb299c291af478947c4aa54
但是在执行过程中出现了报错“org.sonar.java.AnalysisException: Please provide compiled classes of your project with sonar.java.binaries property”
后来在这篇博文《sonar-scanner连接sonarquebe7的sonar.java.binaries问题对应》中找到了答案:
大概意思就是,自4.12起,分析将失败,并显示以下消息:请使用sonar.java.binaries属性提供项目的编译类
先看下我本地/home/sonar/sonarqube/extensions/plugins目录下的sonar-java-plugin版本,版本为5.10.1.16922.jar;
解决办法:将 sonar-java-plugin-5.10.1.16922.jar 版本替换为4.12版本以下的,重新执行前面的扫描命令即可;
https://docs.sonarqube.org/latest/analysis/analysis-parameters/
管理Java依赖包,类似于Python的pip,同时还提供项目的全生命周期管理,如打包构建、代码比对、测试、集成测试、安装、部署、管理项目报告,生成站点,管理JAR文件等。
① Windows系统安装配置maven
可以参考前面的一篇《Jenkins接入maven构建后端springboot项目》;
② Linux系统安装配置maven
需要编辑/etc/profile 配置文件,将apache-maven的bin目录加入到环境变量
# maven
export MAVEN_HOME=/home/apache-maven-3.6.3
export PATH=${PATH}:${MAVEN_HOME}"/bin"
随后执行source /etc/profile
命令重新加载环境变量。
输入mvn -help
出现以下内容表示安装配置成功:
mvn archetype:generate 创建Maven项目
mvn compile 编译源代码
mvn deploy 发布项目
mvn test-compile 编译测试源代码
mvn test 运行应用程序中的单元测试
mvn site 生成项目相关信息的网站
mvn clean 清除项目目录中的生成结果
mvn package 根据项目生成的jar
mvn install 在本地Repository中安装jar
mvn eclipse:eclipse 生成eclipse项目文件
mvnjetty:run 启动jetty服务
mvntomcat:run 启动tomcat服务
mvn clean package -Dmaven.test.skip=true:清除以前的包后重新打包,跳过测试类
只要项目存在pom.xml,此项目就是用maven管理的,执行maven命令时,maven会根据pom.xml文件中的配置自动下载依赖包。例如我们前面克隆的jrequests项目下,就有pom.xml文件:
配置apache-maven的conf/settings.xml文件,添加如下配置,用于连接sonar服务:
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!--平台登录的账号的令牌,格式:姓全拼+名第一个字母-->
<sonar.login>6874308b3dee33cd1cb299c291af478947c4aa54</sonar.login>
<!--sonarqube访问地址-->
<sonar.host.url>http://192.168.1.122:9000</sonar.host.url>
<!--代码分析包括哪些文件需要分析,英文逗号分隔-->
<sonar.inclusions>**/*.java,**/*.xml</sonar.inclusions>
</properties>
</profile>
① 进入要检测的代码工程目录,cmd命令行执行mvn sonar:sonar
命令
若出现以下报错“Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.9.1.2184:sonar (default-cli) on project Jrequests: Please provide compiled classes of your project with sonar.java.binaries property”,是因为项目的sonar-project.properties文件中配置了”sonar.java.binaries=target“,而工程未经过编译,没有生成target相关的文件。
所以需要先执行编译操作,生成target相关的文件:
mvn package
mvn sonar:sonar
再次执行扫描,成功:
② sonarqube控制台查看检测结果
这里的项目名称默认的是读取的该代码工程根目录下pom.xml文件中的“artifactId”字段的内容
① 项目工程下新建sonar-project.properties文件
扫描上一篇文章介绍的"auto_test_project"代码工程,sonar-project.properties内容如下:
# 登录sonar的token
sonar.login=6874308b3dee33cd1cb299c291af478947c4aa54
# 项目的key
sonar.projectKey=my:auto_test_project
# this is the name displayed in the SonarQube UI,不能是中文
sonar.projectName="auto_test_project"
# 项目的版本号
sonar.projectVersion=3.0
# 项目的代码的编码格式
sonar.sourceEncoding=UTF-8
# 项目的语言
sonar.language=py
# 项目的源代码目录
# 若此处配置的是 .
# 当前目录,则sonar-scanner会扫描整个工程目录,包括venv目录,由于第三方包文件较多,会导致扫描和分析时间过长
# 可以指定目录扫描sonar.sources=./api_test
sonar.sources=./api_test
② 执行扫描命令
sonar-scanner
③ sonarqube控制台查看检测结果