SonarQube 6.0获取代码覆盖率的一个项目的特定版本

问题描述:

我试图写一个小脚本,SonarQube 6.0获取代码覆盖率的一个项目的特定版本

  1. 获取是在特定环境中的所有microserves的版本(解决)

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

我使用sonarqube 6.0(按我/ API /服务器/版本端点)(我希望我们能够尽快升级到6.4最新的,但是这不是我的直接控制,我不希望等待它)

我的问题是 - 我不能将数据绑定在一起,因为当我调用/ api/events端点时,我只能获取项目的日期和覆盖范围,而不是版本。这里是一个工作代码示例(凭据和基本URL不包括在内)

我很乐意在任何语言中解决这个问题 - ruby​​,python,php,java,js,无论什么作品。

#!/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 

与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" 
       } 
      ] 
     }, 
... 
} 
{ 

    "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调用
+0

合同谢谢你把精力进入这个!当我使用/ 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 ::未找到:404未找到 – compiledwrong

+1

仔细阅读您的问题,我已经看到您使用的是SonarQube的“旧版”。因此,我更新了我的答案,以提供有关使用哪个WS的提示,而不是我最初在答案中提供的新提示。 –

+0

谢谢!它为我工作:) – compiledwrong