些細な指摘に時間を取られないようにreviewdogを導入してみました。
弊社のプランではGitHub Actionsが利用できないためJenkinsでの導入です。
導入の背景
ここ数ヶ月でチームの開発スピードが上がり、PRの数が増えてきました。
PRが増えるということはそれだけコードレビューに割く時間も増えることになります。
そうなってくると些細な指摘をするのが面倒になってきます。
def func():
...
if condition:
return result
else:
return None
「これ、elseいらないけど。でもわざわざ指摘するほどでもないかな、、」
こういうのは事前にlintして潰しておいてほしいと思いつつも、すべてのPRがlinterの指摘を修正しているとは保証できません。
うっかりlintを忘れることもある。
じゃあ単純にCIでlintすればいいかと言うとそれも難しい。
なぜなら修正範囲外の古いコードまで指摘を受けて、どこがPRに関係する指摘なのかわからなくなるから。
そこでreviewdogの出番です。
このツールはlinterの指摘を変更のあった行だけに絞ってくれます。
さらににGitHubにコメントしてくれるので指摘を確認しやすいというオマケ付き。
早速設定していきます。
reviewdogのインストール
今回はdocker上で動くJenkinsへインストールします。
WORKDIR /tmp
RUN curl -sfL https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh | sh -s \
&& mv /tmp/bin/reviewdog /usr/local/bin \
&& rm -rf /tmp/bin
GitHubのトークン発行
PRにコメントを残してもらうためにPersonal Access Tokenを発行します。
プライベートリポジトリなのでrepoにチェックをつけます。それ以外の権限は不要です。
Jenkinsの設定
reviewdogを動かすプロジェクトを作成してリポジトリをクローンします。
READMEによると4つの環境変数を設定するだけでGitHubにコメントしてくれるようです。
まず先程の認証情報をプロジェクトの設定でREVIEWDOG_GITHUB_API_TOKEN
という変数に紐付けます。
続いてプロジェクトの実行コマンドで残りの環境変数を設定します。
export CI_REPO_OWNER=xxx
export CI_REPO_NAME=yyy
export CI_COMMIT=$(git rev-parse HEAD)
最後にpylintの結果をreviewdogに食べさせます。
pip install pylint
pylint src/ | reviewdog -efm="%f:%l:%c: %m" -reporter=github-pr-review -diff="git diff origin/release"
あとはPRに反応してJenkinsプロジェクトを実行する設定ですが、これは省略。
GitHub Pull Request BuilderやGeneric Webhook Triggerを使って実現できます。
ここは一旦手動で動かします。
動かしてみる
冒頭の不要なelseを含むPRを出してみると、
できたー🎉
まとめ
Jenkinsでreviewdogを導入しているケースが少ないので調べるのに時間がかかりましたが、設定自体は簡単でした。
実は執筆時点で数ヶ月運用しているのですが、開発者以上にレビューしてくれることもあり助かっています。
現在はpylintのみ実行していますが、任意のlinterで使用可能なので今後mypyなどにも活用できたらと考えています。