如何在Dockerfile中配置SonarQube质量门检查使.NET项目构建不达标时失败
关于SonarQube质量门配置有效性及构建失败触发的问题
问题描述
我们有一个.NET应用,通过Jenkinsfile执行构建流程,依赖Dockerfile完成SonarQube代码分析,现有Dockerfile中的Sonar分析指令如下:
RUN if("$Env:SKIP_SQ" -eq 'NO') { "C:\build\sonar-scanner-msbuild-4.6.2.2108-net46\SonarQube.Scanner.MSBuild.exe" begin /k:"***" /d:sonar.exclusions=**/Foundation/Themes/code/Scripts/**,**/Project/***/code/SiteJS/Plugins/**,**/Project/***/code/SiteJS/Rates/** } RUN msbuild .\***.sln /p:DeployOnBuild=True /p:Configuration=Release /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:PublishUrl=C:\out\website /m RUN if("$Env:SKIP_SQ" -eq 'NO') { "C:\build\sonar-scanner-msbuild-4.6.2.2108-net46\SonarQube.Scanner.MSBuild.exe" end }
根据SonarQube官方文档,我们在第一个RUN指令中添加了sonar.qualitygate.wait=true属性,修改后的指令如下:
RUN if("$Env:SKIP_SQ" -eq 'NO') { "C:\build\sonar-scanner-msbuild-4.6.2.2108-net46\SonarQube.Scanner.MSBuild.exe" begin /k:"***" /d:sonar.qualitygate.wait=true /d:sonar.exclusions=**/Foundation/Themes/code/Scripts/**,**/Project/***/code/SiteJS/Plugins/**,**/Project/***/code/SiteJS/Rates/** }
请问:
- 该配置是否有效?
- 如何在此处触发质量门检查,使未通过检查时构建流程失败?
解答
1. 配置有效性
这个配置是有效的。sonar.qualitygate.wait=true是SonarQube官方支持的参数,作用是让扫描器在执行end步骤时,等待SonarQube服务器完成质量门评估,而非直接结束扫描流程。
2. 触发质量门检查并让构建失败的方法
当前配置具备基础条件,但需要完善以下几点确保质量门未通过时构建终止:
- 版本兼容性确认:该参数要求SonarQube Server版本≥6.7、sonar-scanner-msbuild版本≥4.0,你使用的4.6.2版本完全满足要求。
- 权限配置:运行Sonar扫描器的账号需要拥有对应项目的浏览权限,否则无法获取质量门评估结果。
- 修正PowerShell脚本语法:原if语句存在语法问题,会导致条件判断失效或命令无法正确执行,需调整:
- 去掉
$Env:SKIP_SQ两侧的引号,PowerShell中环境变量引用无需额外包裹引号 - 使用
&调用可执行文件,避免PowerShell将路径字符串当成命令执行
修正后的完整Dockerfile指令如下:
- 去掉
RUN if ($Env:SKIP_SQ -eq 'NO') { & "C:\build\sonar-scanner-msbuild-4.6.2.2108-net46\SonarQube.Scanner.MSBuild.exe" begin /k:"***" /d:sonar.qualitygate.wait=true /d:sonar.exclusions=**/Foundation/Themes/code/Scripts/**,**/Project/***/code/SiteJS/Plugins/**,**/Project/***/code/SiteJS/Rates/** } RUN msbuild .\***.sln /p:DeployOnBuild=True /p:Configuration=Release /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:PublishUrl=C:\out\website /m RUN if ($Env:SKIP_SQ -eq 'NO') { & "C:\build\sonar-scanner-msbuild-4.6.2.2108-net46\SonarQube.Scanner.MSBuild.exe" end }
- 利用Docker退出码机制:当质量门未通过时,
SonarQube.Scanner.MSBuild.exe end会返回非0退出码,Docker的RUN指令会检测到异常退出,直接终止镜像构建,进而让Jenkins整个构建任务失败。
内容的提问来源于stack exchange,提问作者Ashley
相关产品推荐
相关产品推荐

