Sonar Api:在对新拉取请求完成扫描后,无法获得 /api/measures/component?metricKeys=coverage

Sonar Api: After scan is finished on new pull request it’s not possible to get /api/measures/component?metricKeys=coverage

SonarQube:企业版版本 9.2.4(内部版本 50792) 声纳客户端:4.7.0.2747

在 gitlab 中启动了合并请求扫描。我正在请求对拉取请求的报道。

扫描(使用扫描仪客户端)完成后,我立即尝试通过以下呼叫获得覆盖: http:///api/measures/component?metricKeys=coverage&component=&pullRequest=

我得到: 404:“{“错误”:[{“消息”:“未找到拉取请求 \u0027\u0027 的组件 \u0027u0027”}]}”

有趣的是,如果我在扫描完成后和打电话以获得覆盖之前睡一会(1 秒),一切都很好。

它似乎必须做一些事情,因为它是一个新的拉取请求,无论扫描是否完成,它都会生成 link 结果,它仍然需要一些时间才能实现 api 调用我提到的能够 return 覆盖。此外,如果我在已经存在的拉取请求上重试操作(扫描并获取结果),则不会出现此类问题。

能否请您详细说明这个问题,这种行为是预期的,还是有一些其他方法可以在扫描完成后立即获得覆盖而无需添加任何睡眠……

作为在相同情况下的附带观察,如果我扫描新的拉取请求并调用另一个 api(/issues/search?)以获取检测到的问题列表并且它成功地工作而无需任何额外的睡眠,

谢谢。

来自扫描仪客户端的调用完成后,SonarQube 在项目中执行一个“后台任务”,完成测量的计算。后台任务完成后,您的措施将可用。这就是为什么添加“睡眠”似乎对您有用的原因。事实上,你睡得够久只是运气。正确的做法是手动检查后台任务的状态,或者使用工具在后台检查后台任务是否完成。

如果您正在使用 Jenkins 管道,并且在 SonarQube 中正确配置了“webhook”以通知后台任务完成,则“waitForQualityGate”管道步骤会执行此操作,首先检查任务是否是已经完成,如果没有,进入轮询循环等待它完成。

机器使用“report-task.txt”文件,本应由扫描仪写入。这是一个 Java 属性文件的形式,但您关心的文件中只有一个 属性,即“ceTaskId”属性。那是后台任务的id。然后,您可以 api 调用“/api/ce/task?id=",其中 returns 一个告诉您后台任务是否完成的块。