いちいち指摘するのがめんどくさいことは自動化しましょう。
PHP CodeSnifferによるコーディング規約のチェックを実践している方はとても多いと思いますが、ファイル数によっては結構な時間がかかるので、素早くテストを終わらせたいプルリクエストでは省略しているという方、いらっしゃるのではないでしょうか。
株式会社うるるでも、プルリクエストがマージされた後のmasterブランチに対してのみ、チェックスタイルを実行する様にしていました。
しかし、やろうやろうと思っていても忘れてしまったり漏れてしまうのが、コーディング規約のチェック。reviewerも、気づいて指摘するのも面倒くさいと感じてしまい、結果的に少しずつ増えてしまう事がありました。
そこで、せめてプルリクエストで追加された行だけを対象にチェックスタイルの警告をコメントできれば、自分が追加したコードに対する責任から、規約違反を修正してくれるのでは?という事でやってみました。
材料
- jenkins
- GitHub pull request builder plugin
- PHP_CodeSniffer
ビルドの設定
プルリクエストをビルドする手順は、ぐぐってみると結構出てくると思いますので、ここでは省略します m(.)m
スクリプトの設置
ghpr-phpcs.sh
#!/bin/bash
PR_ID=$1
tmpfile=$(mktemp)
git branch master origin/master
echo "#### PHP Code Sniffer Result:" >> $tmpfile
for filename in `git diff master...HEAD --name-only | grep -e "\.php$"`
do
echo "**${filename}**" >> $tmpfile
declare -a LINE_NUMBER=(`git difftool -y -x "diff --old-line-format='< %L' --new-line-format='> %L' --unchanged-line-format=' %L'" master...HEAD $filename | grep -v "^<" | grep '^>' -n | cut -d":" -f1`)
phpcs=`vendors/bin/phpcs --standard=phpcs.xml --encoding=utf8 --report-width=300 ${filename}`
for line in ${LINE_NUMBER[@]}
do
echo "$phpcs" | grep -e "^\s*"${line}"\s|" >> $tmpfile
done
echo "" >> $tmpfile
done
if [ -s $tmpfile ]; then
BODY=$(perl -ne 'chomp; s/\\/\\\\/g; s/"/\\"/g; print $_ ."\\n"' $tmpfile)
curl -v -X POST -H "Content-type: application/json" -H "Accept: application/json" -u "GitHub認証トークン":x-oauth-basic -d "{ \"body\": \"${BODY}\" }" https://api.github.com/repos/ユーザー/プロジェクト/issues/${PR_ID}/comments
fi
rm $tmpfile
上記スクリプトを、jenkinsで実行できる様に設置してください。
以下の部分をご自身の環境にあわせて変更していただく必要があります。
- GitHub認証トークン
- ユーザー
- プロジェクト
また、phpcsの実行時のオプションでphpcs.xmlによるチェック内容の指定を行っていますので、適宜変更してください。
スクリプトの実行
Jenkinsの[ビルド]-[シェルの実行]に以下のとおり記述します。
sh ghpr-phpcs.sh $ghprbPullId
やっていること
- プルリクエストのブランチの他に、比較対象となるmasterブランチの取得
- 変更ファイルを取得
- git difftoolを使って、変更点だけではなく、ファイル全体を取得
- 削除行を除き、追加行の行番号を取得
- 対象ファイルに対して、phpcsを実行
- 4.で取得した行番号の警告だけを抽出
- 3.に戻る