我创建了一个执行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”是什么? 我应该将排除路径定义为绝对路径吗?
答案 0 :(得分:1)
documentation有专门的部分。 适合您案例的选项:
-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的个人资料功能。