LoginSignup
7
7

More than 5 years have passed since last update.

プルリクエストで変更点を対象にチェックスタイル警告をコメントする

Last updated at Posted at 2015-02-20

いちいち指摘するのがめんどくさいことは自動化しましょう。

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

やっていること

  1. プルリクエストのブランチの他に、比較対象となるmasterブランチの取得
  2. 変更ファイルを取得
  3. git difftoolを使って、変更点だけではなく、ファイル全体を取得
  4. 削除行を除き、追加行の行番号を取得
  5. 対象ファイルに対して、phpcsを実行
  6. 4.で取得した行番号の警告だけを抽出
  7. 3.に戻る
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7