SonarQube学习系列2:Maven+SonarQube 最佳实践
本文记录了Maven工程使用SonarQube完成代码评估,并对其中指定模块进行排除和项目权限管理等有些代码是使用相关插件或工具生成的,这些代码通常存在高冗余或书写不规范现象,不符合代码质量要求,但不影响使用,应排除在代码质量评估之外本文基于上一篇文章的基础配置本文将通过一个gRPC项目作为例子,该项目有 eureka-server,lib,provider,consumer 4个模块,其中...
本文记录了Maven工程使用SonarQube完成代码评估,并对其中指定模块进行排除和项目权限管理等
有些代码是使用相关插件或工具生成的,这些代码通常存在高冗余或书写不规范现象,不符合代码质量要求,但不影响使用,应排除在代码质量评估之外
本文基于上一篇文章的基础配置
本文将通过一个gRPC项目作为例子,该项目有 eureka-server,lib,provider,consumer 4个模块,其中lib包含gRPC的proto文件和基于该proto文件生成的Java类,代码评估时应该跳过lib模块
另外,建议先在IDE安装SonarLint插件,在本地开发时就能提供部分Sonar代码审核功能
文章目录
一 获取token
在上一篇文章中我们已经设定了提交代码评估需要授权,也给新建用户 lin 分配了对应权限,所以后续的Sonar项目开发就以 lin 的身份进行。
这里需要注意,使用token要比使用密码更安全,到 我的账号– 安全下生成token(令牌),建议以项目名命名,每个项目使用各自的 token ,以后可以针对项目撤销token授权
先将token复制保持,下一步会用到
二 配置pom文件
官方的对应说明在:https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Maven
官方给的配置示例里将一些通用配置(通过PluginGroups来提供插件默认groupId、sonar主机地址等)放到Maven的 setting.xml 文件里(也是为了在不修改pom文件的前提下可以直接运行maven-sonar指令),这里我不是很建议这么做
对于安全性配置,如密码等应该放着setting.xml里,因为pom文件时默认公开的。但除此之外,例如为了方便或统一配置将公共/默认属性放到setting.xml 里就没什么必要了,这会导致项目和Maven的高耦合。
1 添加插件
这里直接在根工程的pom文件里添加如下内容
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.5.0.1254</version>
</plugin>
</plugins>
</pluginManagement>
</build>
2 添加连接属性配置
配置的属性可参考:https://docs.sonarqube.org/display/SONAR/Analysis+Parameters
sonar的配置大多通过在properties下添加对应属性来完成,例如
<sonar.login>9129bbeb9b95ea497d14761ffaf55d19a2d63ce3</sonar.login>
<sonar.password></sonar.password>
<sonar.host.url>
http://IP:9000
</sonar.host.url>
如果使用token的话直接放到 login 里就行,如果是 用户/密码 则对应 login/password
3 排除指定模块
我要排除的模块的文件结构如下,com.linshen.grpc.cloud.lib包下的文件是工具proto自动生成的,根据实际测试,proto文件夹并不会被加入到审核代码里,默认只上传工程下 pom.xml文件,src
/main/java文件夹,src/test/java文件夹
这一步是折腾了最久的,本来应该是想在根项目的pom里使用 sonar.exclusions 简单配置一下就可以的,但一直不生效,官方也只是指明了该属性的作用,并没有做进一步的说明,也没有给出用例,即使是GitHub的Maven用例也没有出现相关用法,所以就只能自己去尝试。最后参考 StackOverflow 上的回答,并且测试可行的做法是,到对应子模块工程里添加 sonar.exclusions属性配置,使用 **/com/companyname/projectname 的格式。如下:在grpc-springboot-cloud-lib项目的pom的properties下添加如下内容
<sonar.exclusions>
**/com/linshen/grpc/cloud/lib/*
</sonar.exclusions>
三 测试Sonar项目
运行以下mvn指令完成sonar功能,注意这里我跳过了test
mvn clean verify sonar:sonar -Dmaven.test.skip=true
可以看到如下输出,点击对应链接即可访问项目分析结果
将日志往上翻,可以看到对各个模块的扫描,例如
最后点击链接查看web端结果
三 管理Sonar项目
我们只给了用户 lin 执行业务操作的能力,如果想对项目进行管理需要使用admin用户登录
admin用户可以完成对项目的管理以及包括删除的操作。
1 将项目收归私有
使用admin登录后可以发现项目下多了 配置一栏,在下拉菜单中选择 权限 进行配置,首先将权限收归 私有
2 配置项目权限
这个时候理论上默认管理员拥有 执行分析 之外的所有权限,其他用户没有任何权限
但是,需要特别注意的是,这里只要在全局权限那里授予了用户执行分析的权限,用户就可以执行分析!
即使他这个时候连浏览结果,查看源码的权限都没有!
这个我认为不是很合理,全局设置不应该优先于私有项目,但是新建用户的时候如果不授予用户 执行分析 的权限,项目连初始化都很麻烦(一般是在第一次 执行分析 的时候完成初始化的)。置备项目在这里是个比较鸡肋的功能,特别是对于多模块项目来说
这里我的理解是,这只是一个代码分析评审工具,并不是代码管理平台(比方说GitHub),应该注意的是防止代码的泄露(所以需要设置为 私有 ,并分配可见权限),而对于提交分析则不用管理得太严格(不像是代码版本管理,会进行覆盖操作,代码分析本身就意味着可能不完善、需要修改)
这个时候lin可以看到提交分析,浏览结果,看到代码结构和文件名,但是看不到源代码
四 其他
参考资料
项目配置:https://docs.sonarqube.org/display/SONAR/Project+Existence
分析参数:https://docs.sonarqube.org/display/SONAR/Analysis+Parameters
Sonar与Maven整合指南:https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Maven
相关文章
SonarQube学习系列1:安装和初始化、安全配置:https://blog.csdn.net/alinyua/article/details/83244983
SonarQube学习系列2:Maven+SonarQube 最佳实践:https://blog.csdn.net/alinyua/article/details/83267934
更多推荐
所有评论(0)