一、sonar 基础概念?
a. 是一个代码质量分析平台。
b. 通过插件机制,集成不同的测试工具。 (和jenkins 很像)
c. 不只是像jenkins 一样简单显示结果,而是会持续跟踪代码质量的变化.
二、 sonar 结构
sonar 系统整体分为四块。
SonarQube Server
SonarQube Database
SonarQube Plugins
SonarQube Scanner(客户端)
sonar 客户端的调用机制是:现在客户端通过Scanner 进行扫描分析,然后调用server 服务上传分析结果,最后sonar 平台基于插件进行结果展示。
SonarQube Scanner 集成了很多平台和工具,包括以下
Analyzing with SonarQube Scanner
Analyzing with SonarQube Scanner for MSBuild
Analyzing with SonarQube Scanner for Maven
Analyzing with SonarQube Scanner for Gradle
Analyzing with SonarQube Scanner for Ant
Analyzing with SonarQube Scanner for Jenkins
我们集成的是jenkins, jenkins 集成sonar的方式又分为以下几种
SonarQube Scanner
SonarQube Scanner for Maven
SonarQube Scanner for Gradle
SonarScanner for MSBuild
我们使用的是SonarQube Scanner 最基础的方式分析。
三、 jenkins 集成 sonar
3.1 插件
首先需要安装SonarQube Scanner for Jenkins插件。
3.2 基础配置
a、安装/配置 SonarQube Scanner 资源包
进入jenkins的[系统管理][全局工具配置] 页面,配置好SonarQube Scanner参数。建议使用自动安装的机制。
sonarQubeScanner配置.png
b、SonarQube servers 配置
进入jenkins的[系统管理]-->[系统配置] 页面,配置好SonarQube 服务端的参数。这里注意服务端的配置方式,分为两种。老版本是通过用户名密码关联,新版本是通过token进行关联。token的获取,需要登录sonar平台拿。
sonarQubeServer配置.png
3.3 应用配置
如果project 中要使用sonar,请先关联系统配置中的的sonar服务。无论使用什么方式scanner,这一步都是必须的。
project关联SonarServer.png
至于扫描的方式,由于我们是java maven工程。所以扫描的方式分为两种:maven 集成scanner和 sonarQube Scanner。
A、mavne方式
优点:配置简单。
缺点:不灵活,不能动态配置相关参数。
语法:在原maven build 后面添加对应参数
sonar:sonar-Dsonar.host.url=[sonar 服务地址]-Dsonar.login=[sonar 账户API token]
对应配置截图:
sonarQubeMavenConfig.png
B、sonarQube Scanner 插件
优点:可以自定义参数。比如需要根据branch 形成不同的分析报告,使用该方式就更加方便
缺点:配置项较多。
其中: sonar.projectKey、sonar.projectName、sonar.language、sonar.sources、sonar.java.binaries都是必须的
同时需要注意,sources和binaries如果有多个用“,”分割。比如一个工程有多个子模块,就需要用“,”进行分割。或者该配置项直接编写多个。
这里需要解释下sonar.projectKey 和sonar.projectName。 projectKey 是在sonar 平台上一个project 的内部唯一标志。projectName 是project 在sonar 平台上显示的名称,仅用来做显示名称,允许重复。sonar 平台通过projetKey来标记是否是同一个project,当一个git 项目需要针对不同分支进行sonar 分析时,靠的就是projectKey的差异去创建。这个会在后面会介绍
sonar.projectKey=$sonarKeysonar.projectName=$sonarKeysonar.projectVersion=1.0sonar.sourceEncoding=UTF-8sonar.language=javasonar.sources=$WORKSPACE/cjia-springcloud-user-impl/src/main/java/sonar.sources=$WORKSPACE/cjia-springcloud-user-api/src/main/java/sonar.java.binaries=$WORKSPACE/cjia-springcloud-user-impl/target/classes/sonar.java.binaries=$WORKSPACE/cjia-springcloud-user-api/target/classes/sonar.test.inclusions=$WORKSPACE/cjia-springcloud-user-impl/src/test/
四、 其他小锦囊
4.1 sonar重启失败
A、根据log分析
log 的位置位于 sonaHome的logs文件夹下。有几类日志
access.log / ce.log / es.log / sonar.log / web.log
启动失败,主要查看sonar.log 和web.log 里面的日志即可。sonar.log里面会体现几个重要组件(es、web、ce)的启动结果,三个组件都启动成功,基本上就没问题了。
sonarLog.png
B、可能是用户权限问题导致启动失败
sonar.log 在启动时, 会print 一句清空temp 文件的log。
Cleaning or creating temp directory /usr/local/sonarqube-6.7.4/temp
如果sonar 目录所属都是A用户,那么重启时也要用A用户进行重启。不然这个temp 文件会删除失败,导致重启失败。换而言之,启动、停止、重启sonar一定要确保都是同一个服务器账户,否则会出现linux目录权限等问题。
4.2 一个git工程形成不同的sonar project
可能大家会面临这样的需求。一个工程在开发中会有并行的情况,也就是会出现多个并行的dev、release分支,这时就出现了多分支的需求。如何解决这种问题,答案就是通过 sonarQube Scanner基础方式实现。
具体配置:
sonar.projectKey=$sonarKeysonar.projectName=$sonarKey
请注意,这里的projectKey 和projectName 都是jenkins 内部的自定义环境变量。所以就达到了动态的要求,剩下的问题只用解决变量问题,环境变量注入就相对简单了。
A、pre Steps 步骤时 执行 shell
根据shell 得到动态的projectKey,并写入文件。示例代码的逻辑是,根据项目名称+分支的名称为唯一Key,来维护一个sonar project。
#!/bin/sh -xecho sonarKey="project_name_"${GIT_BRANCH:7} >propsfile
B、 根据文件导入环境变量(inject environment variables 插件)
使用inject environment variables 插件,导入写有环境变量的文件名 propsfile。如下图
injectEnvVariables.png
4.3 jenkins sonar 集成排除标准模版
sonar.projectKey=
sonarKey
sonar.projectVersion=1.0
sonar.sourceEncoding=UTF-8
sonar.language=java
sonar.sources=
WORKSPACE/cjia-springcloud-message-api/src/main/java/
sonar.java.binaries=
WORKSPACE/cjia-springcloud-message-api/target/classes/
sonar.test.inclusions=$WORKSPACE/cjia-springcloud-message-impl/src/test/
具体排除规则,参看官方文档。
https://docs.sonarqube.org/latest/project-administration/narrowing-the-focus/#NarrowingtheFocus-IgnoreFiles
五、 sonar 调整 代码规则
有时候,官方定义的规则确实挺全,挺好。但是不符合国情,所以需要针对规则进行调整。比如规则的禁用、规则等级的修改等。但是内置的规则又不支持修改和编辑,所以rule copy 就能解决这个问题。
少废话,我们先看东西。
这个是内置规则原本的样子,不支持规则的挂起和修改。
sonar_rule_disable2.png
这个就是基于内置规则复制的自定义规则,高贵的挂起按钮终于出来了。:)
sonar_rule_disable.png
怎么实现的?思路十分简单:
1、进入 [host]/profiles 路径,找到你需要copy的内置规则。点击箭头,复制按钮。输入新规则的名称。
如何复制规则
如何复制规则2
2、规则复制完成后,就可以进入coding_rules 代码规则页进行自定义调整了。高贵的挂起按钮终于露出了;点击某条规则,昔日难得一见的规则修改按钮也出现了。
sonar_rule_disable_edit.png
sonar_rule_disable_edit2.png
最后,按照你们的国情去调整规则吧,调整后的规则即可生效。
sonar_rule_disable_edit_finish.png
注意
1、修改后的规则,在代码规则查询时,可能会出现查询类型错乱。
在修改过程中我们发现,如果一个规则从主要等级修改为了次要等级。但是该修改的规则,在分类查询中只能通过主要等级的条件查询出来;通过次要等级的查询条件并不能查询出来。如下图:
sonar_rule_disable_search.png
相关文档:
sonar的官方文档别错过https://docs.sonarqube.org
sonar 属性配置的文档https://docs.sonarqube.org/latest/analysis/analysis-parameters/
最后希望我的文字,能给你带来帮忙。如果确实有所收获,帮忙点个赞呗~
1人点赞