SonarQube 6.0 获取项目特定版本的代码覆盖率
SonarQube 6.0 get code coverage for a specific version of a project
我正在尝试编写一个
的小脚本
获取特定环境下所有微服务的版本(已解决)
对于每个 project/version 获取该确切版本的 sonarqube 代码覆盖率。我在获取特定项目的确切版本的 sonarqube 覆盖范围时遇到问题。
我正在使用 sonarqube 6.0(根据我的 /api/server/version 端点)(我希望我们能尽快升级到最新的 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 来检索所需的指标:
- 例如: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”)进行编码
- 这将 return 类似于:
{
"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不同:
- 对于第一次调用,您可能想使用 return 稍微不同的 JSON 文档的
/api/events
WS。
- 在我们的 archived documentation
上查看此 "old" WS 的合同
- 对于第二次调用,
/api/timemachine
应该使用第一次 WS 调用 return 编辑的日期
- 在我们的 archived documentation
上查看此 "old" WS 的合同
我正在尝试编写一个
的小脚本获取特定环境下所有微服务的版本(已解决)
对于每个 project/version 获取该确切版本的 sonarqube 代码覆盖率。我在获取特定项目的确切版本的 sonarqube 覆盖范围时遇到问题。
我正在使用 sonarqube 6.0(根据我的 /api/server/version 端点)(我希望我们能尽快升级到最新的 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 来检索所需的指标:
- 例如: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”)进行编码
- 这将 return 类似于:
{
"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不同:
- 对于第一次调用,您可能想使用 return 稍微不同的 JSON 文档的
/api/events
WS。- 在我们的 archived documentation 上查看此 "old" WS 的合同
- 对于第二次调用,
/api/timemachine
应该使用第一次 WS 调用 return 编辑的日期- 在我们的 archived documentation 上查看此 "old" WS 的合同