SonarQube中的质量门限失败不会导致Teamcity构建失败

8
我在TeamCity中设置了一个Build项目,并与Sonarqube集成。该项目正在构建,甚至在SonarQube控制台上成功发布报告。但是当质量门不合格时,它没有中断构建。我搜索并阅读了有关构建破坏器的信息,但已经使用了TeamCity的Sonarqube插件支持,如此文档所述:https://confluence.jetbrains.com/display/TW/SonarQube+Integration
我是否漏掉了某些配置或遗漏?我尝试搜索了很多,但没有找到任何适当的文件或相关内容。
5个回答

7

是的,我需要编写一个使用退出状态来中止构建的自定义脚本。我使用API来分析QG的状态。

PROJECTKEY="%teamcity.project.id%"
QGSTATUS=`curl -s -u  SONAR_TOKEN: http://SONAR_URL:9000/api/qualitygates/project_status?projectKey=$PROJECTKEY | jq '.projectStatus.status' | tr -d '"'`
if [ "$QGSTATUS" = "OK" ]
then
exit 0
elif [ "$QGSTATUS" = "ERROR" ]
then
exit 1
fi    

TeamCity 相关功能请求 https://youtrack.jetbrains.com/issue/TW-63288 - tolache

5

请注意,sonar.qualitygate.wait是在SonarQube v8.1中实现的。请参阅https://community.sonarsource.com/t/sonar-scanner-not-respecting-dsonar-qualitygate-wait-true/20686。 - Yeikel
谢谢,Alexey。我认为对于使用v8.1+版本的人来说,这应该是解决问题最干净的方法。 - Emanuele Fricano
我正在进行C#和Python开发,设置此参数似乎对于质量门限失败的破坏性构建非常有效。谢谢! - Michael Remijan

5
SonarQube插件在质量门限失败时不会中断构建。为什么?这里有详细说明:为什么你不应该使用Build Breaker
主要结论是:
[...] SonarSource不想继续这个功能了。[...]
一旦我们开始使用墙板,我们就停止使用Build Breaker插件,但仍然认为使用它是一种可以接受的做法。然后,SonarQube 5.2出现了,它切断了分析器和数据库之间的连接。许多好事情随着这个切割而来,包括架构的重大变化:源代码分析是在分析器端完成的,所有聚合数字计算现在都在服务器端完成。这意味着...分析器不再知道质量门限。只有服务器知道,由于分析报告是串行处理的,先到先服务,可能需要一段时间才能获得作业的质量门限结果。
换句话说,从我们的角度来看,Build Breaker功能不再有意义。

您需要自行验证质量门状态。您可以在此处阅读如何操作:从SonarQube API访问质量门状态


xpmatteo的问题的答案:

我是唯一一个发现很难理解引用解释的人吗?

你有两个工具。SonarScanner和SonarQube。

1) SonarScanner在CI服务器上执行。它分析源代码并将分析结果推送到SonarQube服务器。

2) SonarQube服务器处理数据,并知道新更改是否通过了质量门限。

SonarScanner不知道最终结果(通过还是不通过),因此无法使构建失败(在SQ 5.2之前,它具有此信息,因为它正在处理所有数据并仅将结果推送到数据库)。这意味着Build Breaker插件没有意义,因为由于当前设计,它不起作用。执行SonarScanner后,您必须轮询服务器并检查Quality Gates状态。然后,您可以决定是否应该使构建失败。


我是唯一一个发现引用的解释难以理解的人吗? - xpmatteo
如果您不同意链接的博客文章,只想要功能回来:我们构建了一个Maven插件(或独立的JAR)来再次支持该用例,请参见此处https://github.com/qaware/sonarqube-build-breaker - phXql

1

那是一个很好而且非常可接受的解决方法!谢谢! - Jonathan POIRIER

1
在我的情况下,CI 是 Github actions,无论任何 CI 工具,Sonar 的质量门限的状态(红/绿)都应该发送到您的 CI。您可以在此 URL 上浏览报告状态:http://:/api/ce/task?id= 一份报告已经生成。 在报告生成后,您需要运行 this 脚本来检查状态,并在 SQ 失败时失败作业。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接