SonarQube 6.0如何获取特定版本项目的代码覆盖率?

5
我正在尝试编写一个小脚本,用于以下操作:
  1. 获取特定环境中所有微服务的版本(已解决)

  2. 对于每个项目/版本,获取该确切版本的SonarQube代码覆盖率。我在获取特定项目版本的SonarQube覆盖率时遇到了问题。

我正在使用SonarQube 6.0(根据我的/api/server/version端点)。 我希望我们尽快升级到最新的6.4版本,但这不在我的直接控制范围之内,因此我不想等待它。
我的问题是:我无法将数据联系起来,因为当我调用/api/events端点时,我只能获取到项目而非版本的日期和覆盖率。以下是一个有效的代码示例(未包括凭据和基本URL)。
我将很高兴在任何语言中解决此问题- Ruby,Python,PHP,Java,JavaScript,任何可行的语言。
#!/usr/bin/ruby
require 'rest-client'
require 'json'
require 'ostruct'
require 'date'
require 'nokogiri'

projects_endpoint='/api/projects/'
time_machine_endpoint='/api/timemachine/'
events_endpoint='/api/events'

rc = RestClient::Resource.new(server_url, user, pass)
sonarqube_projects = JSON.parse(rc["#{projects_endpoint}index?format=json"].get, object_class: OpenStruct)

coverage_per_project = sonarqube_projects.map {|sq_project|
  # data shape: #<OpenStruct id="1687", k="foo-project", nm="foo-project", sc="PRJ", qu="TRK", lv="0.0.617", v=#<OpenStruct 0.0.617=#<OpenStruct sid="4197", d="2017-07-18T03:50:48+0000">>>
  project_name = sq_project.k
  url = "#{time_machine_endpoint}?format=json&resource=#{project_name}&metrics=coverage"
  events = JSON.parse(rc[url].get, object_class: OpenStruct)

  # data shape:
  # [#<OpenStruct cols=[#<OpenStruct metric="coverage">], cells=[#<OpenStruct d="2016-12-08T19:26:24+0000", v=[68.0]>, #<OpenStruct d="2016-12-08T19:36:46+0000", v=[68.0]>, #<OpenStruct d="2016-12-08T20:26:28+0000", v=[79.5]>, #<OpenStruct d="2016-12-08T20:36:53+0000", v=[79.5]>]
  # my problem is right here- I need a version of the app in each cells object so that I can search for one that matches my deployed version!

  # idealistic pseudo-code that doesn't work:
  correct_event = events.first {|event|
    event.version == my_deployed_app_version
  }

  return {project_name: project_name, coverage: correct_event.coverage}
}
puts coverage_per_project
1个回答

5

从SonarQube 6.3开始

如果要获取特定版本的度量值(这是用例),则需要使用2个Web服务:

{

    "paging": {
        "pageIndex": 1,
        "pageSize": 100,
        "total": 10
    },
    "analyses": [
        {
            "key": "AV07Vpk4NAVDjyrgWPAw",
            "date": "2017-07-13T11:45:12+0200",
            "events": [
                {
                    "key": "AV07VpslNAVDjyrgWPAx",
                    "category": "VERSION",
                    "name": "1.4.0"
                }
            ]
        },
...
}

一旦您找到所需版本的日期,只需进行一次WS调用即可检索所需的指标:
例如:https://sonarcloud.io/api/measures/search_history?component=sonarqube-scanner&metrics=coverage&from=2017-07-13T11:45:12%2B0200&to=2017-07-13T11:45:12%2B0200。请注意:确保使用“%2B”对加号进行编码。这将返回类似以下内容的结果:
{

    "paging": {
        "pageIndex": 1,
        "pageSize": 100,
        "total": 1
    },
    "measures": [
        {
            "metric": "coverage",
            "history": [
                {
                    "date": "2017-07-13T11:45:12+0200",
                    "value": "51.1"
                }
            ]
        }
    ]

}

SonarQube 6.3之前

原则是相同的,但WS不同:

  • 对于第一个调用,您可能想使用返回略有不同JSON文档的/api/events WS。
  • 对于第二个调用,/api/timemachine应该使用由第一个WS调用返回的日期来完成工作

谢谢您为此付出了努力!当我使用/project_analyses端点时,我遇到了404错误。可能是我以某种方式错误地填写了“project_name”字段,我会在工作时继续尝试。=> "/api/project_analyses/search?project=foo-api&category=VERSION" 2.4.0-rc1: 396> events = JSON.parse(rc [url] .get,object_class:OpenStruct) RestClient::NotFound:404 Not Found - compiledweird
1
仔细阅读您的问题后,我发现您正在使用“旧版”SonarQube。因此,我更新了我的答案,为您提供了一个提示,告诉您应该使用哪个WS而不是我最初在答案中提供的新WS。 - Fabrice - SonarSource Team

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