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 コマンドの出力結果ファイルと、システム設定で追加したパーサーを指定します。
さらに静的解析の結果で通知を制御するために、
高度な設定で ビルドステータスの閾値
を次のように設定してみました。
まとめ
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
なんだかぞわぞわする…