大道至简,知易行难
广阔天地,大有作为

你写的代码靠谱么—SornaQube源码扫描的搭建及与Jenkins的集成(扫描Maven管理的Java工程及Node工程)

零、SonarQube简介
SonarQube是一个开源的代码质量分析平台,用于管理代码的质量,可检查项目代码的漏洞和潜在的逻辑问题等。它提供了丰富的插件,支持包括对Java、C、Python、C++、C#、Swift、JavaScript、TypeScript、PHP等在内的数十种语言的检测。SonarQube在进行代码质量管理时,会从下图所示的七个纬度来分析项目的质量:

SonarQube Concept 1

SonarQube Concept 1

SonarQube需要持续集成工具(如Jenkins、Bamboo for Sonar)的支持,在构建版本前通过持续集成工具调用SonarQube Scanner执行分析,并通过SonarQube Server的Web页面展示分析结果和对扫描发现的各类问题进行持续跟踪。下图是SonarQube参与持续集成时的大意:

SonarQube Concept 2

SonarQube Concept 2

一、下载并启动SonarQube Server
从官方下载Community版本即可,支持Linux和Windows等多个操作系统,解压后直接运行bin目录下对应操作系统的脚本即可:

启动SonarQube

启动SonarQube

如需中文汉化可以从其插件市场在线安装或直接从GitHub下载,地址为https://github.com/SonarQubeCommunity/sonar-l10n-zh,注意根据版本选择对应的汉化包即可(如果是从在线时长安装则不需要选择版本)。汉化包是一个jar包,将其放到$SONAR_HOME/extensions/plugins,然后重启SonarQube即可:

安装中文语言包

安装中文语言包

SonarQube Server默认的Web页面端口为9000,默认管理员用户名密码为admin/admin。下图为登陆后的主界面,有两个工程:

SonarQube首页

SonarQube首页

二、Jenkins集成SonarQube Scanner
1、安装SonarQube Scanner插件
SonarQube是通过Scanner进行源码扫描的,除了Maven/Gradle管理的工程可以直接通过“运行Maven顶层目标”进行扫描外,其他对诸如JavaScript等工程的扫描则需要和配置SonarQube Scanner插件。我们可以在Jenkins中通过“系统管理->插件管理”安装SonarQube Scanner插件:

在Jenkins中安装SonarQube Scanner插件

在Jenkins中安装SonarQube Scanner插件

安装此插件后需要重启Jenkins。
2、配置SonarQube Server
插件成功安装后,通过“系统管理->系统设置”配置SonarQube Server:

Jenkins中配置SonarQube Server的地址和访问密钥

Jenkins中配置SonarQube Server的地址和访问密钥

其中,注意需要勾选“Enable injection of SonarQube server configuration as build environment variables”,原因后面会看到;Server URL为SonarQube Server的Web主页地址;Server authentication token需要在SonarQube Server中生成(权限->用户->选择用户->令牌,填入令牌名称然后点击生成即可):

在SonarQube Server中生成登陆令牌

在SonarQube Server中生成登陆令牌

3、配置SonarQube Scanner
在Jenkins中,通过“系统管理->全局配置(Global Tool Configuration)”配置SonarQube Scanner,选择指定的版本并勾选自动安装:

在Jenkins中配置SonarQube Scaner

在Jenkins中配置SonarQube Scaner

三、与Maven工程的集成与使用
尽管参考文献中指出通过“运行Maven顶层目标”进行扫描进行扫描已经不推荐,但当在SonarQube创建工程时,对于Java工程而言还是通过Maven下载SonarQube Scanner进行的:

在SonarQube Server中创建Maven管理的Java项目

在SonarQube Server中创建Maven管理的Java项目

如果不是通过Jenkins等持续集成工具使用SonarQube,那么直接在Java工程pom.xml文件对应的目录下执行上述提示的命令即可,待扫描完成后SonarQube会自动将结果上传到对应的SonarQube Server中。如果是使用Jenkins,则需要增加一个“调用顶层Maven目标”的Build Step。由于此前勾选了“Enable injection of SonarQube server configuration as build environment variables”,因此在Jenkins Job的Build Environment中可以看到“Prepare SonarQube Scanner environment ”的选项:

在Jenkins配置使用Maven管理的Java工程调用SonarQube Scanner

在Jenkins配置使用Maven管理的Java工程调用SonarQube Scanner

请注意,Maven的目标(Goals)中使用了通过“Prepare SonarQube Scanner environment ”引入的两个环境变量,并通过sonar.exclusion排除了不需要分析的部分文件(支持通配符,多个欲排除Pattern之间使用逗号分隔);而SonarQube Server自动给出命令中的sonar.login将会被此前配置的Server authentication token替换且自动追加上。
当构建执行完成后,我们可以在Console Output中看到SonarQube Scanner的执行结果,还有其将扫描结果上传到了SonarQube Server中的日志:

Jenkins中SonarQube Scanner的执行结果

Jenkins中SonarQube Scanner的执行结果

这样,我们在SonarQube Server中就可以看到对应项目(如果没有指定sonar.projectKey那么默认会是Jenkins项目根目录的名称)的扫描结果了:

SonarQube扫描一个Java J2EE Web工程的结果

SonarQube扫描一个Java J2EE Web工程的结果

及其中包含的问题:

SonarQube分析出的一个空指针异常示例(其中包含引发空指针异常的5个步骤的执行路径)

SonarQube分析出的一个空指针异常示例(其中包含引发空指针异常的5个步骤的执行路径)

上图的例子是一个不太容易被发现的空指针异常,SonarQube同时给出了引发空指针的执行路径(包含五个步骤)。

四、与非工程的集成与使用
当工程不是使用Maven/Gradle管理的工程时,则需要在Build步骤中增加一个“Execute SonarQube Scanner”的步骤,例如下面的一个NodeJS工程:

Jenkins中配置SonarQube扫描非Maven工程

Jenkins中配置SonarQube扫描非Maven工程

五、未尽事宜
有如下的几点未在本文中详细说明,读者可自行尝试:
1、SonarQube Server有配置文件sonar.properties,可以对其使用的数据库、Web服务器、ES等进行各类配置;
2、SonarQube Scanner会默认读取被扫描工程根目录下的配置文件,并从中加载扫描参数。由于我们目前没有使用这种方式进行配置,因此是直接通过-D(Maven工程)直接传递参数或Analysis Properties参数(非Maven工程,Execute SonarQube Scanner步骤中)传入的。有关具体的配置信息,请参见官网文档。

参考资料:
1、https://docs.sonarqube.org/latest/setup/operate-server/
2、https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Jenkins
3、https://blog.csdn.net/flysqrlboy/article/details/80525727

转载时请保留出处,违法转载追究到底:进城务工人员小梅 » 你写的代码靠谱么—SornaQube源码扫描的搭建及与Jenkins的集成(扫描Maven管理的Java工程及Node工程)

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址