SonarQube の Web API を python から叩こうと思い、Issues を取得するスクリプトを書きましたので記載します。
前提
以下の環境で作業は実施しています。
- 
OS 
 % sw_vers ProductName: Mac OS X ProductVersion: 10.12.6 BuildVersion: 16G29
- 
python の version 
 % python -V Python 2.7.10
- 
SonarQube の Version 
 SonarQube 6.5
認証設定について
Local 環境 での API 実行なのであまり気にする必要はないかもしれませんが、一応設定してみました。
初期構築後から、ユーザーの Token の発行まで以下、2点実施する必要があります。   
1. 認証を強制する
デフォルトだと、ログイン認証なしでも、参照系 API の実行は可能ですので、認証が通っている場合のみ、API の実行を許可します。
メニュー「設定」 > プロジェクト設定タブ > 左メニューのセキュリティ から Force user authentication をONにします。
  
2. Token を発行する
ユーザーに紐づく Token を発行します。
- 
セキュリティタブ>ユーザ をクリック 
- 
Update Tokens をクリック 
- 
キー名を入力して、Generate をクリック 
- 
Token をコピーして Doneをクリック 
 
上記で発行したToken をスクリプト内で使用します。
作成したスクリプト
- print_sonarqube_issues.py
# -*- coding: utf-8 - from requests.auth import HTTPBasicAuth import requests def main(): url = "http://localhost:9000/api/issues/search" page_size = 100 token = "your_token" data_length = 0 issues = [] p = 1 while (data_length % page_size == 0): payload = { "id": "your_project_key", "additionalFields": "_all", "p": p, "ps": page_size } r = requests.get(url, params=payload, auth=HTTPBasicAuth( token, '')) json_o = r.json() data_length = len(json_o.get("issues")) for issue in json_o.get("issues"): issues.append(issue) p = p + 1 print("###Issues ###") for issue in issues: print(issue) print("###Issue Length###") print(len(issues)) if __name__ == '__main__': main()
説明
- 
ライブラリのインストール 
 requests を使用していますので、インストールしていない場合は、インストールを実施してください。
 pip install requests
- 
発行したToken について 
 発行したToken は、Basic 認証に使用します。
 Token の場合は、user名にToken のみ設定してpasswordはブランクにします。
 user名とpassword での認証もできますが、SonarQubeとしては、このやり方を推奨しています。
 requests でベーシック認証を行う場合は、HTTPBasicAuth を使い、
 と記載もできますし、単純にTaple を渡すだけでもBasic認証を実施してくれます。r = requests.get(url, params=payload, auth=HTTPBasicAuth( token, ''))
 以下、参考になりました。r = requests.get(url, params=payload, auth=(token, ''))
 requestsでbasic認証 - Misc Notes
 Authentication — Requests 2.18.4 documentation
- 
ページングについて 
 api/issues/searchでは、最大500件までデータを返してくれ、500件以上は複数回リクエストを実行する必要があります。
 件数はpage_sizeで指定可能です。
 1ページ目を取得する際は、クエリストリングp=1となり、次ページ以降は1ずつインクリメントしてすれば取得できます。
 例えば736ページで、page_size=100の場合、最終ページはp=8になり、8ページ目のデータ件数は36件になります。
参考
その他、参考にした記事へのリンクになります。
- 
sonarqube - How do I pass credentials to Sonar API calls? - Stack Overflow 
- 
sonarqube - Disallow anonymous users to access Sonar - Stack Overflow 
以上です。
コメント