【发布时间】:2014-04-14 13:26:56
【问题描述】:
我有一个由 Sonar 分析(在 Jenkins 内)的多模块 Maven 项目。这将创建一个 Sonar 项目,其中包含我的 Maven 项目的整个代码库的指标。 Sonar 项目的 ID 与我的 Maven 项目的 ID 相同。因此,如果我的 Maven 项目是 Foo(带有模块 M1、M2 和 M3),那么我观察到声纳项目 Foo 已创建,我可以看到组件 M1、M2 和 M3 的指标。
我想知道是否可以创建另一个对 Maven 项目子集执行分析的 Sonar 项目。我可以使用 Maven + Cobertura 做到这一点,方法是指定一个 Maven 配置文件,该配置文件定义要包含在(或排除在)Cobertura 分析中的包集。这使我可以生成一组 Cobertura 报告:一个用于整个项目,一个用于包 X、Y 和 Z;等等
所以我现在正在查看的是创建一个名为 Bar 的 Sonar 项目,它是为 Maven 项目 Foo 计算指标的结果,该 Sonar 项目将是配置为仅包含包 X、Y、Z(可能存在于模块 M1 中, M2 等)。它将作为 Jenkins 工作开始,检查 Maven 项目 Foo 并调用 sonar 构建后操作,以某种方式指定 Sonar 项目名称 Bar而不是默认为 Foo。然后(我希望)我会有两个 Sonar 项目:Foo 代表整个 Maven 项目,Bar 代表该 Maven 项目的一个子集。
我想知道 (a) 这是否可行,以及 (b) 是否可行?我不确定 Sonar 数据库是否会损坏(Sonar 项目中会有模块 M1、M2 和 M3 >Foo 和 Bar,它们可能会互相覆盖数据库条目)。
更新 1
也许我可以在调用声纳作为 Jenkins 中的构建后操作时使用 sonar.branch 属性。
例如
詹金斯工作一
- SCM:检查 maven 项目 Foo
- 构建步骤:
clean install -DskipTests - 构建后操作:声纳
Jenkins 工作二
- SCM:检查 maven 项目 Foo
- 构建步骤:
clean install -DskipTests - 构建后操作:声纳
-Dsonar.branch=Bar
我可以根据需要为 Sonar 中的 Bar 分支设置包含/排除。这种方法的缺点是声纳分析在两个不同的分支上运行两次。运行一次声纳分析然后查询数据库以根据需要缩小焦点会更有效。
更新 2
我遇到了一个问题:虽然我可以在分支上运行声纳分析,但原始(非分支)Maven 项目的声纳分析失败了。声纳分析需要 3 倍的时间,然后才因 MySQL 错误而失败:
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure.
The last packet successfully received from the server was 28,962,745 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
但是,在其他 Maven 项目上运行声纳分析时,我没有收到任何 MySQL 错误。
【问题讨论】:
-
您可以尝试为您的项目创建第二个根或当前根的新父级,并在此根上运行第二个声纳分析。由于这只存在于声纳分析中,它看起来不太好,但它可以工作。