如果不想让`target`、`dist`、`build`、`generated`、`node_modules`这类目录被当成手写的代码来分析,就得靠SonarQube的排除规则,它支持通过路径匹配的方式,去把那些文件给排除掉,这个设置,既可以在项目的页面上去完成,也可以写在CI/CD主机上的扫描参数里面;不过有一点要注意,要是同一个参数,在两个地方都设置了,那CI/CD里的参数,是会优先于页面上的设置的。
一、怎么把生成目录给排除掉
在动手去排除那些生成的目录之前,得先确认一下,这些目录,是不是真的不应该参加到代码质量的统计里面来,有些目录,它是编译之后产出来的东西;有些目录,是那种接口工具,自己生成出来的代码;还有些目录,虽然名字看着像是“generated”,可这里面,说不定还混着一些,是人工在维护的代码。
1、在项目页面上去做设置
进到SonarQube的项目里面,去打开项目设置里的通用设置,找到分析范围这一项,在源码文件排除的那个框里面,去把你要排除的目录规则给填上,然后保存一下,官方文档里给出来的项目级入口,就是这么个路径,当然,前提是你当前用的这个账号,得有管理项目的权限才行。
2、在扫描的参数里面去设置排除
要是项目是通过流水线去跑扫描的,那你就可以在项目的配置文件,或者是CI的脚本里面,去把排除源码的那行参数给写进去,如果同时有好几个规则,中间就用英文的逗号给隔开,就比如,把`/target/`、`/dist/`、`/build/`和`/generated/`这几条写在一起,这样配置完了以后,在扫描的时候,它就会按照你写的这些路径规则,去把那些源码文件给排除掉了。
3、要把源码的排除,跟覆盖率的排除,给区分开
用来排除源码的那个参数,是会让文件,从源代码分析的这个范围里面,被整个拿掉的,可要是你的目的,只是想让某些文件,不去参加覆盖率的统计,那你就应该去用专门排除覆盖率统计的那个参数;同样的,要是你只是想排除掉重复率的检查,那就应该去用,专门排除重复度分析的那个参数,可千万别把这三种不同的排除,给混到一块儿去用了,要不然的话,在页面上,你可能还是会看到那些文件,只不过,是某一种指标的统计,不管它们了而已。
二、排除路径里的通配符,要怎么写
在SonarQube里写路径通配符的时候,心里得清楚,它是相对于哪个目录来算的,按照官方文档的说明,这个路径,可以是相对于项目基本目录的,也可以直接去写那个绝对路径;在默认的情况下,这个项目基本目录,就是你启动分析时候的那个目录。
1、要先搞明白,各种符号到底代表什么意思
单独一个``号,它能去匹配零个或者好几个字符,但是,它不会跨过目录分隔符;两个``号,它是能去匹配路径中间,零个或者好几个目录层级的;那个问号,能去匹配一个字符,可它也是不会跨过目录分隔符的,所以,要是你想排除掉任意层级下面的build目录,那就应该写成`/build/`这个样子,可不要就只写一个build。
2、常见的那些目录,都有固定的写法
要想把所有叫target的目录都给排除掉,可以写成`/target/`;所有叫dist的,写成`/dist/`;那种放生成文件的目录,可以写成`/generated/`,或者是带上源码后缀的写法;要是想排除掉所有那种压缩过的js文件,就可以写成`/.min.js`,凡是在写目录规则的时候,尽量要把它写到目录的级别,不要就只丢一个目录的名字上去。
3、不要把你写的规则,范围给弄得太大
举个例子来说,像是`/.java`这样的写法,它可是会把所有的Java文件,全都给排除掉的,这种用法,一般来说,是不太合适的,在排除自动生成的代码的时候,你可以优先去写那种具体一点的目录,比如,写成`src/generated/`,这就要比,写成`/generated/`,要好控制得多,你要知道,范围越是写得宽,就越是容易,把那些真实的业务代码,也给一块儿排除掉了。
三、要是排除规则没生效,该怎么去检查
当你发现,排除的规则好像没有生效的时候,不要就只是一个劲地,在那儿反反复复地去改那个通配符,你还得同时去检查一下,这个参数到底是从哪里来的、项目的基本目录在哪儿,还有扫描的日志里都写了些什么。
1、去检查一下,参数是不是被别的地方给盖掉了
要是你在页面里,已经设置好了排除,可是CI的脚本里面,也写了一份同样功能的参数,那扫描的时候,是会优先去用CI里面的那份的,在这种情况下,页面上的设置,它看着是还待在那里,可实际在扫描的时候,用的那个口径,很有可能,已经不是它了。
2、去检查一下,路径的起点,到底对不对
有好多规则,之所以没有生效,全是因为,跑扫描的那条命令,它不是从代码仓库的那个根目录底下执行的,这个时候,你就可以去翻一翻扫描的日志,在里面找一下项目基本目录到底在哪儿,然后再照着这个目录,去重新算一下那个相对的路径。
3、去检查一下,你要排除的文件,是不是被归到了测试代码里面
SonarQube它处理源代码和测试代码,是分开来做的,同一个文件,是不能既被当成源代码,又被当成测试代码来处理的;在你去排除测试代码的时候,是要用专门排除测试代码的那个参数的,而不是只去改那个排除源码的参数。
总结
给SonarQube排除生成目录,一种比较常用的做法,是去项目设置的通用与分析范围里面去配,或者是在扫描的参数里,去写排除源码的那一行,在通配符里面,单独的星号只能去匹配当前这一个层级的字符,而两个星号,是能跨着目录去匹配的,问号呢,就只能去匹配单个的字符,当发现排除没生效的时候,重点要去查一查,是不是CI的参数给覆盖掉了、项目基本目录那个路径的起点对不对、还有源码和测试代码的范围有没有弄混,这样,就能避免出现一种情况,就是你规则倒是写对了,可最后,却被放错了地方。