【问题标题】:How to make SonarQube module analyze the project only once when sonar analysis is bound to maven lifecycle in a multi-module project?当声纳分析绑定到多模块项目中的maven生命周期时,如何使SonarQube模块只分析项目一次?
【发布时间】:2015-05-19 21:53:59
【问题描述】:

我想要实现的是将 SonarQube 分析集成到构建过程中,以便每当运行 mvn clean install 时,都会使用 SonarQube 分析代码。我们希望将其用于本地分析以及基于 Jenkins 的构建。如果发现新问题,那么构建应该会失败(我们想为此使用构建中断插件)。这样,开发人员就会知道他的代码将引入新问题,并且必须修复它们才能使构建工作。

当我运行mvn sonar:sonar 时,分析需要 30 秒,还可以。

但是,当我尝试将sonar 目标绑定到 Maven 构建阶段时,就会出现问题。我将sonar 绑定到verify 阶段。现在构建需要 5 分钟,这太长了。大约需要 1 分钟。在没有 SonarQube 分析的情况下,构建本身需要 30 秒。

注意(可能有助于找出问题所在):运行构建的项目中有多个模块,我想这就是问题所在。看起来sonar:sonar 目标被多次执行,每个子模块一次,并且整个项目被多次分析(不仅仅是子模块)。所以,我们有 4 个子模块,在构建过程中生成了 5 次报告。

相反,我们只想分析整个项目一次,而不是 5 次。在为所有模块生成 cobertura 报告之后,在构建结束时运行此 1 分析也很重要。

那么,如何将 SonarQube 分析集成到构建中,以便它只分析我的多模块项目一次,最后在为所有子模块生成 cobertura 报告之后?

父 pom 中的 SonarQube 插件属性:

<!-- Sonar plugin properties -->
<sonar.jdbc.url>jdbc:url</sonar.jdbc.url>
<sonar.analysis.mode>preview</sonar.analysis.mode>
<sonar.issuesReport.html.enable>true</sonar.issuesReport.html.enable>       
<sonar.issuesReport.console.enable>true</sonar.issuesReport.console.enable>
<sonar.host.url>sonar.host:9000</sonar.host.url>
<sonar.language>java</sonar.language>
<sonar.buildbreaker.skip>false</sonar.buildbreaker.skip>
<sonar.qualitygate>Sonar%20way%20with%20Findbugs</sonar.qualitygate>
<sonar.preview.includePlugins>buildbreaker</sonar.preview.includePlugins>
<sonar.exclusions>file:**/target/**</sonar.exclusions>
<branch>development</branch>

项目pom中的插件配置:

                <!-- Run cobertura analysis during package phase -->
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>cobertura-maven-plugin</artifactId>
                    <executions>
                        <execution>
                           <phase>package</phase>
                              <goals>
                                 <goal>cobertura</goal>
                               </goals>
                        </execution>
                  </executions>
                </plugin>

                <!-- Run sonar analysis (preview mode) during verify phase. Cobertura reports need to be generated already -->
                <plugin>
                   <groupId>org.codehaus.mojo</groupId>
                   <artifactId>sonar-maven-plugin</artifactId>
                   <version>2.5</version>
                   <executions>
                        <execution>
                           <phase>verify</phase>
                              <goals>
                                 <goal>sonar</goal>
                               </goals>
                        </execution>
                  </executions>
                </plugin>

【问题讨论】:

    标签: java maven sonarqube cobertura static-code-analysis


    【解决方案1】:

    IMO,这只是一个 Maven 配置问题,您在执行 sonar:sonar 时缺少 &lt;inherited&gt;false&lt;/inherited&gt; 元素:

                    <!-- Run sonar analysis (preview mode) during verify phase. Cobertura reports need to be generated already -->
                    <plugin>
                       <groupId>org.codehaus.mojo</groupId>
                       <artifactId>sonar-maven-plugin</artifactId>
                       <version>2.5</version>
                       <executions>
                            <execution>
                               <phase>verify</phase>
                               <goals>
                                  <goal>sonar</goal>
                               </goals>
                               <inherited>false</inherited>
                            </execution>
                      </executions>
                    </plugin>
    

    【讨论】:

    • 感谢您的回答!我试过了,这样声纳分析只运行一次。问题在于,在这种情况下,声纳在构建的最开始运行,此时 cobertura 报告尚不可用。相反,当所有子模块都已经构建完毕时,最后运行声纳分析是有意义的。
    • 我看到了这个问题的 2 个解决方案,我不喜欢其中任何一个。解决方案 1:向最后构建的父项目添加一个新的子模块。声纳分析将仅从该子模块启动。这是令人困惑的,而且不是很透明。解决方案 2:将命令 mvn sonar:sonar 放入某个脚本中,并将此脚本作为构建后操作执行。这会导致可移植性问题,而且也不优雅。
    • 你使用什么工具来触发你的构建?
    • 我们正在为 CI 使用 quickbuild(远离 Jenkins)。但是,我们希望能够将此检查集成到本地构建中,而不仅仅是在 CI 上运行的构建中
    • 另一个可能有帮助的选项是使用单独的父 POM 和聚合 POM。原因与 Maven 构建顺序有关,在 this answer 中有更详细的描述。
    猜你喜欢
    • 2021-02-23
    • 2018-06-04
    • 2016-09-19
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多