SonarQubeの話が続きます。
python の 静的解析が SonarQubeで できるのか調べてみました。
どうも、Python Plugin というものがあり、
それを使えば、python でもレポートが作成できるようなので、
使ってみた結果を記載します。


環境情報と前提

前提

インストールと、日本語プラグインの設定は、
以前、OS X El Capitan に SonarQubeをインストール、日本語化までしてみる | Monotalk行っています。

環境情報

  • OS Version

sw_vers    
----------------------------
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G1108
----------------------------

  • SonarQube の Version 6.1

  • python/Django の Version Python 3.5.1 Django (1.10)


SonarQube の Python Plugin のインストール

検索すると、Python 用のpluginが見つかるので、インストールします。

インストール手順

  • ログイン後に、設定をクリック
    cofigration

  • 設定>システム>アップデータセンター>Available で、Python をインストールPython Plugin既にインストトール済なので、[Installed]の方にいます。

plugin で できること

SonarPython - Plugins - SonarQube見る限り、
以下のことができるようです。

  • nose テスト結果レポートの収集、作成

  • カバレッジレポートの収集、作成

  • pylintレポートの収集、作成

  • 独自ルールの作成

今回は、pylintレポートの<wbr>収集、<wbr>作成やってみます。

SonarQube で pylint ルールをONにする

ここがよくわからず、小2時間ほどはまりました。
SonarPython の デフォルトルールだと、pylint関連のルールがOFFになっており、
pylint で チェックした結果が反映されませんでした。
品質プロファイルで、デフォルトルールSonar wayコピーし、
Deprecated以外の全てのルールをONに設定、コピーしたルールをデフォルトにします。

品質プロファイル

ProfileプラグインのGithub リポジトリに、pylint の ルール設定ファイルがあります。

このルールがONになっていないと、pylintを実行しない。pylintの結果レポートを参照しないような挙動になっています。


sonar-scannerの設定

Java だと maven のタスク?で実行できますが、
その他言語だと、sonar-scannerインストールが必要なようです。
sonar-scannerのインストール、python 向けのsonar-project.properties の作成をします。

sonar-scannerのインストール

brew install sonar-scanner
---------------------------
/usr/local/Cellar/sonar-scanner/2.8: 8 files, 546.3K, built in 11 seconds
---------------------------

sonar-project.propertiesの作成

解析対象のプロジェクト直下に、sonar-project.propertiesを作成します。

  • sonar-project.properties

    sonar.projectKey=yourprojectkey
    sonar.projectName=yourprojectname
    sonar.projectVersion=0.0.1
    
    sonar.sources=yourprojectsource1,yourprojectsource2
    sonar.sourceEncoding=UTF-8
    sonar.language=py
    
    #-----------------------------------------
    #sonar.python.pylintを何故か認識してくれないので、コメントアウト。
    #スクリプト上から、pylintを実行する
    #-----------------------------------------
    #sonar.python.pylint=/usr/local/bin/pylint
    sonar.python.pylint.reportPath=pylint-reports/pylint-result.txt
    
    #-----------------------------------------
    #テスト結果レポートの設定
    #-----------------------------------------
    #sonar.python.xunit.reportPath=nosetests.xml
    #sonar.python.xunit.skipDetails=true
    
    #-----------------------------------------
    #カバレッジレポートの設定
    #-----------------------------------------
    #sonar.python.coverage.reportPath=coverage.xml
    #sonar.python.coveragePlugin=cobertura
    

  • 設定値の説明

NOキー値説明
1sonar.projectKeySonarQube上で表示されるプロジェクトのキー値 DBに登録時にキーになる。
2sonar.projectNameSonarQube上で表示されるプロジェクト名
3sonar.projectVersionプロジェクトのVersion番号
4sonar.sourceEncodingソースコードのエンコーディング指定
5sonar.languageソースコードのプログラム言語設定
6sonar.python.pylintpylintのパス(設定はしたが、したことで自動実行はされません。。何か設定が足りないのかも)
7sonar.python.pylint.reportPathpylintの結果レポートのパス
8sonar.python.xunit.reportPathnoseの結果レポートファイルのパス
9sonar.python.xunit.skipDetailsテスト結果の詳細を出力する/しない(だと思います)
10sonar.python.coverage.reportPathカバレッジレポートのファイルパス
11sonar.python.coveragePluginカバレッジプラグインとして何を使うか

pylintの設定

インストール

SonarQube の Python Plugin も 独自のルールを持っていますが、20-30個と少ないので、
pylintによるチェックを有効にするため、pylintをインストールします。

pip install pylint

.pylintrcの作成

pylint の設定ファイルを作成します。
これは、SonarQube のpython plugin が知らない(ルールとしてOFF)にしているpylintの警告があると、
以下の警告が出力されるために、設定しています。

WARN: Pylint rule 'C0103' is unknown in Sonar
WARN: Pylint rule 'C0111' is unknown in Sonar

ルール上、sonar-pythonのルール重複があるため、OFFにしてもいいものと、
rule.xmlに定義がないもの(pylint側のルール追加においついていないもの) があり、
一概に警告出るからOFFでいいかは疑問ですが、全部OFFにします。

  • 設定ファイル雛形の作成 pythonプロジェクトのルートディレクトリで、
    以下のコマンドを実行します。
    これで、設定ファイルの雛形が作成されます。

    pylint --generate-rcfile > .pylintrc
    

  • disable に 除外ルールを記載する。
    disableに除外ルールをカンマ区切りで記載します。
    C0103、R0201等が、unknown in Sonar出力されたルールになります。
    デフォルトで、disable定義された記載がありますが、
    あまりにも長いので、便宜上削除、実ファイルには記載されています。

    disable=C0103,C0111,C0113,C0122,C0301,C0305,C0325,C0413,E0704,R0101,R0201,R0801,R0912
    

sonar-scanner の 実行スクリプト作成

以下のようなスクリプトを作成し、プロジェクトルートに配置します。
sonar-scannerの-Dオプション指定は特に不要ですが、
なんとなく指定しています。
pylintの--msg-template指定は、Pylint Report - Plugins - SonarQube
記載を参考に指定しました。
このフォーマットでないと、上手く結果を読み込んでくれないようです。

  • run_sonar_scanner.sh
    #!/bin/sh
    rm -f pylint-reports/pylint-result.txt
    pylint ./yourprojectsource1/ -r n --msg-template="{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}" >> pylint-reports/pylint-result.txt
    pylint ./yourprojectsource2/ -r n --msg-template="{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}" >> pylint-reports/pylint-result.txt
    sonar-scanner -D sonar-project.properties
    

SonarQubeの起動

LocalのSonarQubeを起動しておきます。

sonar console

起動していないと、sonar-scannerの通信先がないため、以下のエラーが発生します。

ERROR: Error during SonarQube Scanner execution
org.sonarsource.scanner.api.internal.ScannerException: Unable to execute SonarQube
        at org.sonarsource.scanner.api.internal.IsolatedLauncherFactory$1.run(IsolatedLauncherFactory.java:84)
        at org.sonarsource.scanner.api.internal.IsolatedLauncherFactory$1.run(IsolatedLauncherFactory.java:71)
        at java.security.AccessController.doPrivileged(Native Method)

スクリプト実行

./run_sonar_scanner.sh

================================
INFO: Task total time: 8.367 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 10.515s
INFO: Final Memory: 47M/222M
INFO: ------------------------------------------------------------------------
================================

これで、SonarQube上で、結果が参照できるようになります。

Summary

以上です。

コメント