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
以上です。
コメント