JenkinsでPHPとJavaScriptのコーディング規約違反をGithubのレビューコメントに表示させる
Githubのプルリクを検知して、ファイル差分のみに静的解析を行い
レビューコメントに表示される処理を実装いたしました。
GithubのAPIでも実装は可能でしたが、
レビューコメントを登録する際のPositionの特定が難しかったのでsaddlerを利用いたしました。
今回結構はまったので、内容を記載いたします。
環境(Azure VM)
- ubuntu上にJenkinsを構築しております。
- PHPはインストール済みとなります。
今回の設定に必要なツール
- PHPCode_Sniffer (phpの静的解析)
- PHPの実行環境が構築できていれば問題なくインストールできると思います。
- ESlint(JavaScriptの静的解析)
- nodeとnpmが利用できれば問題なくインストールできると思います。
- saddler
- ruby製のgit差分の静的解析結果をgithubのレビューコメントに通知してくれる便利ツール
- Jenkinsでの設定の記事があまりなかったので記載します。
saddlerの設定
- rubyとruby-bundlerが必要なのでない場合はインストールします。
- 環境に応じて替えてください。
$ sudo apt install ruby
$ sudo apt install ruby-bundler
- Gemfileに以下を追記して、インストールしてください。
- jenkinsの場合、「saddler-reporter-support-git」がないとエラーとなってしまい、ここでつまりました。
source "https://rubygems.org"
gem "checkstyle_filter-git"
gem "saddler"
gem "saddler-reporter-github"
gem "saddler-reporter-support-git"
Jenkinsの設定
JenkinのジョブでGithubのプルリクを検知する仕組みを導入します。
ビルドトリガの「GitHub Pull Request Builder」を利用します。
設定方法はわかりやすく書いている記事がいくつかあるので、ここでは割愛します。
- White listに複数アカウントを設定する場合は、改行区切りで設定できました。
GithubでPullRequestを作成すると、
Github Pull Request Builderをトリガとしたジョブが実行されます。
ビルド時にブランチ名やidなどプルリク情報が変数で利用できますので、
必要な人はwikiのEnvironment Variablesを確認するといいと思います。
ビルド作成
- Github Pull Request Builderで作成したジョブのビルドでシェルの実行を選択して、
以下のシェルを作成しました。
#!/bin/bash
# HEADを更新
git fetch
# GitHub Pull Request Builderの設定時に[Create API Token]で取得したtokenを環境変数に設定します。
export GITHUB_ACCESS_TOKEN="[access_token]"
# 対象のブランチから更新があるファイルのみを検出して、コーディング規約違反があればレビューコメントに登録
echo "PHPのコーディング規約違反を通知"
git diff --name-only --diff-filter=AM origin/${ghprbTargetBranch} \
| grep -e '.php$' \
| xargs phpcs -n --standard=phpcs.xml --report=checkstyle \
| exec checkstyle_filter-git diff origin/${ghprbTargetBranch} \
| exec saddler report \
--require saddler/reporter/github \
--reporter Saddler::Reporter::Github::PullRequestReviewComment
echo "JavaScriptのコーディング規約違反を通知"
git diff --name-only --diff-filter=AM origin/${ghprbTargetBranch} \
| grep -e '.js$' \
| xargs eslint -f checkstyle \
| exec checkstyle_filter-git diff origin/${ghprbTargetBranch} \
| exec saddler report \
--require saddler/reporter/github \
--reporter Saddler::Reporter::Github::PullRequestReviewComment
ざっくりと書いてしまいましたが、それぞれの細かい設定などは
詳しく書いていただいている記事が多くありますので参考にしていください。
だいぶ便利な機能だと思いますので、レビュアーの負荷が下がることを期待します!