2017-07-18 89 views
4

我試圖寫一個小腳本,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 

回答

3

與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

相關問題