在詹金斯的一个多模块项目中,从Sonar Qube扫描中排除目录,而不对项目进行修改



我创建了一个Jenkins作业,用于执行SONAR QUBE分析。我添加了SONAR扫描作为一个通用的构建步骤。我没有对项目进行任何修改以启用SONAR集成,因为项目不应该关心SONAR。(即没有更改POM.xml,也没有添加属性文件)

我的SONAR集成正在工作,没有任何项目所需的MOD,这很好。

然而,这是一个多模块项目,现在我想从扫描中排除其中一个模块,因为这个模块包含自动生成的代码。以下是我在Jenkins:中用来触发SONAR扫描的Maven命令

sonar:sonar
-Dsonar:host.url=http://url.com:9000/sonar
-Dsonar.login=myusername
-Dsonar.password=mypassword

这是我的项目结构:

root
Project A
Project B
Project C

我想从扫描中排除ProjectB。

我试过-Dsonar.exclusions=/ProjectB,但它不起作用。

以下是日志摘录:

[INFO] ------------- Scan Project B
[INFO] Base dir: /workspace/jenkins/…/workspace/CI-JOB-NAME/projectB
[INFO] Working dir: /workspace/jenkins/…/workspace/CI-JOB-NAME/projectB/target/sonar
[INFO] Source paths: pom.xml, src/main/java
[INFO] Binary dirs: target/classes
[INFO] Source encoding: UTF-8, default locale: en_US
[INFO] Index files
[INFO] Excluded sources: 
[INFO]   /projectB
[INFO] 44 files indexed
[INFO] 0 files ignored because of inclusion/exclusion patterns

如日志中所示,excluded sources属性已设置,但不起作用,因为它表示忽略了0个文件。。。

问题:如何从扫描中排除项目B目录中的所有内容?(最好在Jenkins作业中使用命令,不要向项目本身添加任何属性文件或其他修改)

"排除的源路径"是相对于"基本目录"路径还是根路径??我应该将排除路径定义为绝对路径吗?

文档中有一个专门的部分。似乎适合您的情况的选项:

  • 使用构建概要文件排除某些模块(如集成测试)
  • 使用先进反应堆选项(如-pl)。例如mvn sonar:sonar -pl !module2

例如,使用最后一个,您可以执行:

sonar:sonar -pl "!projectB"
-Dsonar:host.url=http://url.com:9000/sonar
-Dsonar.login=myusername
-Dsonar.password=mypassword

"排除的源路径"是相对于"基本目录"路径还是根路径??我应该将排除路径定义为绝对路径吗?

根据排除条款的文档,模式是相对于基本目录的,所以不是绝对路径。无论如何,我认为这个选项对你来说没有用,因为在多模块maven项目中,子模块的文件使用相对于模块的基本目录的路径进行索引。因此,像projectB/**这样的模式不会匹配任何内容,因为projectB不是所用路径的一部分。如果模块中有一些唯一的包名称,比如位于src/main/java/someuniquepackagesomeuniquepackage,那么模式src/main/java/someuniquepackage/**就会起作用。

无论如何,我建议使用上面的-pl选项,或者使用Maven的概要文件功能。

最新更新