読者です 読者をやめる 読者になる 読者になる

Jenkins + Warnings Plugin + flake8 で静的解析

ざっとググってもそれっぽい記事が見当たらなかったのでメモを残しておきます。

Jenkins の Warnings Plugin で flake8 の静的解析の結果を集計するには次のように設定します。

flake8 用のパーサーを追加する

Jenkins の管理 > システム設定 ページの コンパイラの警告 セクションで flake8 用のパーサーを追加します。

項目
名前 flake8
リンク名 flake8
推移レポート名 flake8
正規表現 (.):(\d+):(\d+): (.)
マッピングスクリプト (下記参照)
import hudson.plugins.warnings.parser.Warning
import hudson.plugins.analysis.util.model.Priority

String fileName = matcher.group(1);
int lineNumber = Integer.parseInt(matcher.group(2));
String category = null;
String type = "flake8";
String message = matcher.group(4);
Priority priority = null;

if (message.startsWith('E')) {
    category = "pep8 errors";
    priority = Priority.HIGH;
} else if (message.startsWith('W')) {
    category = "pep8 warnings";
    priority = Priority.NORMAL;
} else if (message.startsWith('F')) {
    category = "PyFlakes codes";
    priority = Priority.NORMAL;
} else if (message.startsWith('C9')) {
    category = "McCabe complexity plugin mccabe";
    priority = Priority.LOW;
} else if (message.startsWith('N8')) {
    category = "Naming Conventions plugin pep8-naming";
    priority = Priority.HIGH;
} else {
    category = "Unknown Error";
    priority = Priority.HIGH;
}

return new Warning(fileName, lineNumber, category, type, message, priority);

priority を決めるところは適当に決めたので、導入時にアレンジしてください。

  • E ではじまるエラー(PEP8 Error) は HIGH
  • W ではじまるエラー(PEP8 Warning) は NORMAL
  • F ではじまるエラー (PyFlakes Error) は NORMAL
  • C9 ではじまるエラー (McCabe) は LOW
  • N8 ではじまるエラー (pep8-naming error) は HIGH
  • その他のエラー(未知)は HIGH

プロジェクトの設定で flake8 を呼び出す

シェルの実行 やその他の方法で、いい感じに flake8 コマンドを実行します。

flake8 src/ --max-complexity=12 --exclude=path/to/tests/ > flake8.log || :
cat flake8.log

flake8 でエラーが検出されても、そのまま処理を進めるように || : とかを挟んでいます。 あと、console output を見て何が起きているのか把握するため、ログを cat しています。

  • プロジェクトの設定でコンパイラ警告の集計を設定する

同じくプロジェクトの設定ページで、Warnings plugin の設定を進めます。

項目
集計するファイル flake8.log
パーサー flake8

flake8 コマンドの出力結果ファイルと、システム設定で追加したパーサーを指定します。

さらに静的解析の結果で通知を制御するために、 高度な設定で ビルドステータスの閾値 を次のように設定してみました。f:id:tk0miya:20150309163845p:plain

まとめ

flake8 の解析内容によって success と unstable、 failure を切り替えたかったので、 Jenkins を細かく設定してみました。

追記

Warnings Plugin に PR した方がいいかしら、とリポジトリを眺めていたところ、 パッケージに含まれている PEP8 パーサーは既に flake8 に対応しているようです。

上記で登録したスクリプトとの違いは priority の決め方ぐらいです。

  • E ではじまるエラー(PEP8 Error) は HIGH
  • W ではじまるエラー(PEP8 Warning) は HIGH
  • F ではじまるエラー (PyFlakes Error) は HIGH
  • R ではじまるエラー (??) は NORMAL
  • その他のエラー(未知)は LOW

なんだかぞわぞわする…