SonarQube学习系列2:Maven+SonarQube 最佳实践

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/alinyua/article/details/83267934

本文记录了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复制保持,下一步会用到
获取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

扫描二维码关注公众号,回复: 3909714 查看本文章

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

猜你喜欢

转载自blog.csdn.net/alinyua/article/details/83267934