bugspotsの結果をPRにコメントする

February 11, 2017

bugspotsとは

bugspots という ruby の gem があります。 git のログを解析して、バグが起きやすいファイルを発見する機能を持っています。

原理はシンプルで、よくバグ修正の際に変更され、比較的最近変更されているものほど危ない、というヒューリスティックに従っています。 “バグ修正”の定義はコミットメッセージに bug や fix などのそれらしきメッセージが入っていることです。

みなさんの直感にもマッチするのではないでしょうか。

元は Google で使われている(た?)アルゴリズムのようで、それが gem 化されたものが bugspots です。

コードの歴史が長くなってくると、一見なんの変哲もない修正が思わぬところでバグにつながったりします。 古参メンバーだと、経験からこのファイルはよくバグの元になるから注意しよう、なるかもしれません。 しかし、プロジェクトに入ってまだ間もないメンバーにとってはそんな過去の歴史など知る由もありません。

bugspots を使えば、変更されたファイルが危険なファイル(bugspots では hotspot と呼びます)かどうかを知ることができます。 hotspot であることがわかっていれば、レビューを古参の人に頼むこともできますし、レビューをする側としてもちょっと気をつけてみようかな、となります。 定期的に危険度が高いファイルをリストアップしてリファクタリングする、といった使い方もできそうです。

レビューに活用する

手元で解析を実行してもいいのですが、レビューに活用しようと思うと自動化したいです。 ということで、CricleCIでテスト実行前に bugspots で解析して、hotspot があれば github の PR にコメントする仕組みを実装しました。 (すいません、github 前提です :bow: )

環境変数を設定する

BUGSPOTS_SCORE_THRESHOLDREVIEWER_BOT_TOKEN の二つの環境変数を CircleCI 上で設定してください。

bugspots は、hotspot ごとに危険度スコアを算出します。高いほどバグが起きやすいです。 極端に値が低いファイルを都度 PR でコメントされてものノイズになるので、閾値を設定しましょう。 特にこの値が良い、というのはないので、手元で解析をかけた結果をみつつよしなに決めてください。

REVIEWER_BOT_TOKEN は、github の PR にコメントをつける Bot アカウントのアクセストークンです。 repo のスコープが必要です。

ライブラリを読み込む

Gemfile に以下を追記します。bugspots は master ブランチを指定しましょう。 gem として公開されているバージョンはコミットメッセージに不正なバイト列が含まれているとエラーになってしまいます。 octokit は解析結果を PR にコメントするために利用します。

gem 'bugspots', git: 'git@github.com:igrigorik/bugspots.git', branch: 'master'
gem 'octokit'

レポジトリを完全にする

shallow cloneのレポジトリだとgit logの解析中にコミットが見つからず失敗することがあります。 完全なレポジトリにするために、以下の設定を circle.yml に入れておきます。

checkout:
  post:
    - "[[ ! -s \"$(git rev-parse --git-dir)/shallow\" ]] || git fetch --unshallow"

解析を実行する

circle.yml で解析コマンドを指定します。 bundle install後であればどこでも良いと思うのですが、動作確認したのはテスト実行前です。

test:
  pre:
    - bundle exec bugspots -r "/bug|fix/" -b $CIRCLE_BRANCH . | bundle exec ruby script/comment_hotspots.rb

コミットメッセージが -r オプション指定の正規表現とマッチするとき、そのコミットがバグ修正コミットとして扱われます。 -b は解析対象のブランチです。$CIRCLE_BRANCH でPRの元になったブランチを指定します。 実行結果はテキストで出力されるので、パイプでPRコメント用のスクリプトに渡します。

bugspots のオプション自体は詳しくは本家のREADMEをみてください。

コメントする

以下のスクリプトでコメントします。 github 前提のコードです。

https://gist.github.com/hokuma/eae4d695908ea8e5770e48782ef1c864

API を使って PR で編集されているファイルを取得し、hotspot のファイルがあればそれをコメントで投稿します。

まとめ

歴史と向き合っていきましょう。

comments powered by Disqus