【问题标题】:SonarQube exclude Maven moduleSonarQube 排除 Maven 模块
【发布时间】:2016-01-09 20:57:56
【问题描述】:

我正在使用 Maven / Jenkins CI 运行 sonar-5.1.2。

在谷歌上搜索并查看了类似的问题(大多数都可以追溯到 2010-2012 年)之后,仍然不清楚如何从多模块 Maven 项目中排除特定的 Maven 模块。

Module Exclusions 属性自 4.3 版起已弃用,不应再使用。

我们在不同的模块中有重复的包:

root pom.xml
|-module1
  |-my.package.com
|-module2
  |-my.package.com

是否可以仅排除 module2/my.package.com 中的文件但包括 module1/my.package.com

SonarQube 分析由 https://wiki.jenkins-ci.org/display/JENKINS/SonarQube+plugin 构建后操作触发

【问题讨论】:

    标签: maven jenkins sonarqube


    【解决方案1】:

    有两个documented options 从 SonarQube 分析中排除模块;引用:

    您可以:

    • 使用构建配置文件排除某些模块(例如用于集成测试)
    • 使用高级反应器选项(例如“-pl”)。例如 mvn sonar:sonar -pl !module2

    由于您使用的是 Jenkins,也许更简单的解决方案是使用 -pl 选项。这样,您不会更改 Maven 项目中的任何配置,而只会更改 Jenkins 配置。

    【讨论】:

    • 分析是作为夜间构建的一部分完成的。对所有模块执行夜间构建。问题是我如何告诉声纳不要对特定模块进行分析。我不能使用 -pl,如果我通过 maven 排除某些模块,那么将不会对其进行编译。
    • @tillias 您只需要在运行 SonarQube 分析时使用-pl,而不是在主 Maven 构建发生时使用。
    • SonarQube 分析由 wiki.jenkins-ci.org/display/JENKINS/SonarQube+plugin 构建后操作触发。你的意思是一些 MAVEN_OPTS 吗?
    • @tillias 我现在没有启动并运行 Jenkins,但是 AFAIK,这是在构建配置中完成的。添加 Post Build “Sonar”时,可以点击“Advanced”并添加 Maven 属性。
    • 所以我检查了可能的解决方案,所有我能找到的都迫使我改变我的 pom.xml(s) 和构建过程。我希望它在文件系统级别由声纳本身过滤(而不是由 maven)
    【解决方案2】:

    正如记录的here,您可以定义属性

    <sonar.skip>true</sonar.skip>

    在要排除的模块的 pom.xml 中

    【讨论】:

      【解决方案3】:

      我在一个多模块 RCP 应用程序中遇到了类似的问题,我无法使用 -pl,因为 tycho/maven 仍然需要我需要从分析中排除的项目。

      由于不拥有代码(并且不想弄乱版本控制),我不能简单地更改这些项目的 POM。

      我也无法按包过滤(使用 sonar.exclusions),因为这些模块的包是非常简单和通用的词。

      因此我决定使用管道代码将属性“sonar.skip”动态添加到每个排除项目的 POM 中,并且效果很好。

      对于任何可能像我一样被卡住的人,这里是执行此操作的代码(在 Linux 上使用 AWK):

      // Update the given POM file with the sonar.skip property set to true
      def setSonarSkip(file) {e
          def awk_cmd = '\'BEGIN { propStr="    <sonar.skip>true</sonar.skip>"; fullpropStr="<properties>\\n" propStr "\\n</properties>\\n" } NR==FNR { if ($0 == "<properties>") props=1 ; next } /<\\/project>/ { if (props == 0) print fullpropStr } /<\\/properties>/ { print propStr } { print } \''
      
          sh "awk ${awk_cmd} ${file} ${file} > tmp"
          sh "cp tmp ${file}"
          sh "rm -f tmp"
      }
      

      要使用它,将此函数声明放在管道脚本的开头,然后在您的阶段,您可以在检查代码后直接调用它:

      // Exclusions
      setSonarSkip("module1/pom.xml")
      setSonarSkip("module1/module1a/pom.xml")
      setSonarSkip("module2/pom.xml")
      setSonarSkip("module4/pom.xml")
      

      希望有用

      【讨论】:

        【解决方案4】:

        删除根目录pom.xml 中的 module2。

        <modules> <module>module1<module> </modules>

        【讨论】:

        • 这会起作用,但删除他的 Maven 模块(或完全忽略它)可能不是 OP 想要的。
        猜你喜欢
        • 2017-10-11
        • 2016-07-26
        • 2021-02-09
        • 1970-01-01
        • 2016-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-01
        相关资源
        最近更新 更多