SonarQube 6.0获取代码覆盖率的一个项目的特定版本
问题描述:
我试图写一个小脚本,SonarQube 6.0获取代码覆盖率的一个项目的特定版本
获取是在特定环境中的所有microserves的版本(解决)
对于每个项目/版本,获取该确切版本的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服务:
- 一个WS调用要知道你想要的版本的分析日期
{
"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日期检索所需的指标:
{
"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。- 看到这个“老” WS对我们archived documentation
- 合同对于第二个电话,
/api/timemachine
应该做的,是由第一WS调用- 看到返回的日期的工作这个“老” WS对我们archived documentation
合同谢谢你把精力进入这个!当我使用/ 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
仔细阅读您的问题,我已经看到您使用的是SonarQube的“旧版”。因此,我更新了我的答案,以提供有关使用哪个WS的提示,而不是我最初在答案中提供的新提示。 –
谢谢!它为我工作:) – compiledwrong