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が見つかるので、インストールします。
インストール手順
-
ログイン後に、設定をクリック
-
設定>システム>アップデータセンター>Available で、Python をインストール
既にインストトール済なので、[Installed]の方にいます。
plugin で できること
SonarPython - Plugins - SonarQube を見る限り、
以下のことができるようです。
-
nose テスト結果レポートの収集、作成
-
カバレッジレポートの収集、作成
-
pylintレポートの収集、作成
-
独自ルールの作成
今回は、pylintレポートの収集、作成
をやってみます。
SonarQube で pylint ルールをONにする
ここがよくわからず、小2時間ほどはまりました。
SonarPython の デフォルトルールだと、pylint関連のルールがOFFになっており、
pylint で チェックした結果が反映されませんでした。
品質プロファイルで、デフォルトルールSonar way
をコピーし、
Deprecated
以外の全てのルールをONに設定、コピーしたルールをデフォルトにします。
品質プロファイル
プラグインの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 | キー値 | 説明 |
---|---|---|
1 | sonar.projectKey | SonarQube上で表示されるプロジェクトのキー値 DBに登録時にキーになる。 |
2 | sonar.projectName | SonarQube上で表示されるプロジェクト名 |
3 | sonar.projectVersion | プロジェクトのVersion番号 |
4 | sonar.sourceEncoding | ソースコードのエンコーディング指定 |
5 | sonar.language | ソースコードのプログラム言語設定 |
6 | sonar.python.pylint | pylintのパス(設定はしたが、したことで自動実行はされません。。何か設定が足りないのかも) |
7 | sonar.python.pylint.reportPath | pylintの結果レポートのパス |
8 | sonar.python.xunit.reportPath | noseの結果レポートファイルのパス |
9 | sonar.python.xunit.skipDetails | テスト結果の詳細を出力する/しない(だと思います) |
10 | sonar.python.coverage.reportPath | カバレッジレポートのファイルパス |
11 | sonar.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上で、結果が参照できるようになります。
以上です。
コメント