在Jenkins的多模块项目中从Sonar Qube扫描中排除目录而不修改项目

时间:2017-01-18 14:00:58

标签: maven jenkins sonarqube

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

我的SONAR集成正在运行,没有项目所需的任何模块,这很棒。

但是,它是一个多模块项目,现在我想从扫描中排除其中一个模块,因为该模块包含自动生成的代码。 以下是我用于在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

如日志中所示,排除的sources属性已设置但无法正常工作,因为它表示忽略了0个文件...

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

相对于“Base dir”路径或Root的“Excluded sources path”是什么? 我应该将排除路径定义为绝对路径吗?

1 个答案:

答案 0 :(得分:1)

documentation有专门的部分。 适合您案例的选项:

  • 使用构建配置文件排除某些模块(如集成测试)
  • 使用Advanced Reactor Options(例如-pl)。例如mvn sonar:sonar -pl !module2

例如,使用最后一个,你可以这样做:

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

相对于“Base dir”路径或Root的“Excluded sources path”是什么?我应该将排除路径定义为绝对路径吗?

根据documentation on exclusions, 模式是相对于基本目录的,因此不是绝对路径。 无论如何,我不认为这个选项对你的情况有用, 因为在一个多模块的maven项目中, 子模块的文件使用相对于模块基本目录的路径编制索引。因此projectB/**之类的模式不会匹配任何内容,因为projectB不是所用路径的一部分。如果您在模块中有一些独特的包名称,请说someuniquepackage位于src/main/java/someuniquepackage,那么模式src/main/java/someuniquepackage/**就可以了。

无论如何,我建议使用上面的-pl选项,或使用Maven的个人资料功能。