SonarQube Web API を python から実行する


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 をクリックINPUT KEY

  • Token をコピーして Doneをクリック
    RESULT

上記で発行した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 を使い、

        r = requests.get(url, params=payload, auth=HTTPBasicAuth(
            token, ''))
    
    と記載もできますし、単純にTaple を渡すだけでもBasic認証を実施してくれます。
        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件になります。


参考

その他、参考にした記事へのリンクになります。

以上です。

コメント