使用SonarQube

时间:2018-04-11 14:11:01

标签: .net msbuild sonarqube azure-devops vstest

我有以下问题。

我们有一个.NET解决方案,其中包含多个项目,并为每个项目创建了一个VSTS构建定义,因为我们不希望每次某个项目发生变化时都要构建整个解决方案。

当然,在这种情况下,当使用SonarQube时,我们只想将特定项目/构建定义的指标推送到SonarQube服务器而不是整个解决方案。 默认情况下,后者正在发生,这就是我们想要改变的。

我们在Visual Studio 2015,SonarQube插件版本4.1.1和SonarQube版本6.7(版本33306)中使用VSTS。构建程序此时正在Windows 8.1上运行。

示例解决方案结构:

MainSolution

  • 项目A
  • 项目B
  • 项目C

在这种情况下,VSTS的根源目录是C:\buildagent\vsts-agent\_work\19\s

构建代理上的目录结构如下所示:

C:\buildagent\vsts-agent\_work\19\s\ProjectA
C:\buildagent\vsts-agent\_work\19\s\ProjectB
C:\buildagent\vsts-agent\_work\19\s\ProjectC

假设我们为ProjectB提供了一个VSTS构建定义,它只构建ProjectB。在这种情况下,我们只希望SonarQube扫描ProjectB项目的内容。

我已经尝试了几件事来完成这件事,但没有一件能奏效。

  1. sonar.inclusions / sonar.exclusions 似乎只适用于文件级别,而不是目录或项目。尝试了几个设置并且没有发生错误,但扫描仪忽略了所有内容,导致没有任何内容被推送到SQ 服务器。

  2. sonar.sources

  3. 将属性sonar.sources设置为C:\buildagent\vsts-agent\_work\19\s\ProjectB看起来很有希望但是我们在运行扫描程序时收到以下错误消息:

      

    2018-04-04T07:12:51.0538120Z信息:基础目录:C:\ buildagent \ vsts-agent_work \ 19 \ s   2018-04-04T07:12:51.0538120Z信息:工作目录:C:\ buildagent \ vsts-agent_work \ 19.sonarqube \ out.sonar   2018-04-04T07:12:51.0538120Z信息:源路径:ProjectB   2018-04-04T07:12:51.0548120Z信息:源编码:windows-1252,默认语言环境:nl_NL   2018-04-04T07:12:51.1518136Z错误:SonarQube扫描仪执行期间出错   2018-04-04T07:12:51.1518136Z错误:文件ProjectB / App.config不能被索引两次。请检查包含/排除模式是否为主文件和测试文件生成不相交的集合

    SonarQube似乎试图将ProjectB编入索引两次。将BaseDir设置为C:\buildagent\vsts-agent\_work\19\s\ProjectB后 并将BaseDir设置为C:\buildagent\vsts-agent\_work\19\s

    1. sonar.projectBaseDir
    2. 将属性sonar.projectBaseDir设置为C:\ buildagent \ vsts-agent_work \ 19 \ s \ ProjectB时,我们从SonarQube收到以下错误。

        

      2018-04-04T07:00:51.2906744Z错误:SonarQube扫描仪执行期间出错   2018-04-04T07:00:51.2906744Z错误:Dir C:\ buildagent \ vsts-agent_work \ 19 \ s \ ProjectA应该是相对于项目baseDir

      看起来它仍在尝试扫描整个VSTS根源目录C:\buildagent\vsts-agent\_work\19\s,而不仅仅是C:\buildagent\vsts-agent\_work\19\s\ProjectB

      所以问题仍然存在。我们怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

SonarQube不支持仅更新SonarQube项目中的某些指标 - 如果您有MSBuild项目A,B和C都是内置在解决方案中并推送到SonarQube X,那么您就不能只是构建A并推送其更新的指标。

您有几个选择:

  • 不要将分析作为per-MSBuild项目VSTS构建定义的一部分运行。相反,运行整个解决方案的夜间构建,并将分析作为构建的一部分运行。
  • 将每个MSBuild项目推送到单独的SonarQube项目。这将允许您在每个构建上推送指标,但是您将丢失项目的聚合视图。如果您使用的是SonarQube企业版,那么您可以使用“投资组合管理”功能获取有关这些SonarQube项目的统一视图。

答案 1 :(得分:0)

我们决定将具有多个项目的解决方案分解为多个解决方案,并将我们的VSTS构建定义基于单个解决方案而不是项目。这可能是最好的方法。