TeamCity中MsBuild任务运行Sonar Scanner for MsBuild失败求助
解决Sonar Scanner for MSBuild与TeamCity 任务的兼容问题
这个问题的核心矛盾在于Sonar Scanner for MSBuild的工作机制和TeamCity默认的<MSBuild>任务执行方式不匹配,我来给你拆解原因和解决方案:
问题根源
Sonar Scanner for MSBuild在begin阶段会设置一系列环境变量,用来让后续启动的MSBuild进程加载Sonar的分析目标,从而追踪构建过程中的代码信息。但TeamCity的<MSBuild>任务默认是在当前MSBuild脚本的进程内直接执行构建目标,而不是启动一个全新的MSBuild进程——这就导致它无法读取begin阶段设置的环境变量,Sonar自然就识别不到这个构建过程,抛出“项目未构建或未使用新版MsBuild构建”的错误。
而你用<Exec>直接调用MSBuild路径时,是启动了一个全新的MSBuild进程,这个进程会继承begin阶段设置的所有环境变量,所以Sonar能正常捕获构建信息。
解决方案:让任务启动独立进程
只需要给<MSBuild>任务添加UseCommandLine="true"属性,强制TeamCity通过命令行调用MSBuild(也就是启动独立进程),这样就能继承Sonarbegin阶段的环境变量了。
修改后的完整脚本如下:
<Exec Command="$(SonarScannerMSBuildPath) begin /d:sonar.verbose=$(SonarScannerVerboseLogging) /k:"$(SonarProjectKey)" /n:"$(SonarProjectName)" /v:"$(Build_Number)"" /> <MSBuild Targets="Rebuild" Properties="Configuration=Debug" Projects="@(Solution)" UseCommandLine="true" /> <Exec Command="$(SonarScannerMSBuildPath) end" />
额外注意事项
- TeamCity会自动将你选定的MSBuild版本映射到
<MSBuild>任务,开启UseCommandLine=true后,它会调用你在TeamCity构建配置中指定的MSBuild版本,不需要手动写绝对路径。 - 如果还是遇到问题,可以检查构建日志:
- 确认
begin阶段输出了Sonar相关的环境变量(比如SONAR_MSBUILD_PROJECT_KEY等); - 查看
<MSBuild>任务执行时的命令行,确认包含Sonar注入的参数(比如/p:SonarQube...)。
- 确认
- 若需要更精准控制MSBuild路径,可以在
<MSBuild>任务中添加ToolPath="$(MSBuildToolsPath)",这个变量是TeamCity根据你选定的MSBuild版本自动填充的。
内容的提问来源于stack exchange,提问作者Gruss
相关产品推荐
相关产品推荐

