やりたいこと
PSR-2に沿ってないコードを駆逐したい。
また、PHPMD - PHP Mess Detectorというものもあるらしいので、それに沿ってないコードも駆逐したい。
ただ、FriendsOfPHP/PHP-CS-Fixerみたいに自動で変換するのは、後で見た時に違ったコードに見えてしまったり、人間の成長が無かったりする気がするので微妙。
人間レビューのする前に、自動レビューを行いたい。んで、人間が直す。
要するに、Androidのコードを自動で解析し、GitHubのpull requestにコメントするのPHP版。
完成イメージ
GitHubにPUSHすると、CircleCIが動いて、Pull RequestにPHP CodeSnifferなどの結果を表示する。
実際に動かしたものはこちら→ https://github.com/noboru-i/laravel-sample/pull/1
手順
composerに追加
require-dev
に実行したいものを追加する。
squizlabs/PHP_CodeSnifferとPHPMD - PHP Mess Detectorを追加する。
下記のようなイメージ。
"require-dev": {
"fzaninotto/faker": "~1.4",
"mockery/mockery": "0.9.*",
"phpunit/phpunit": "~4.0",
"phpspec/phpspec": "~2.1",
"squizlabs/php_codesniffer": "*",
"phpmd/phpmd" : "*"
},
シェルスクリプトの作成
script/saddler.sh
として、下記のようなものを作成する。
#!/usr/bin/env bash
set -eu
echo "********************"
echo "* install gems *"
echo "********************"
gem install --no-document checkstyle_filter-git saddler saddler-reporter-github pmd_translate_checkstyle_format
echo "********************"
echo "* exec check *"
echo "********************"
set +e
vendor/bin/phpcs app --report=checkstyle --report-file=phpcs.result.xml --standard=phpcs.ruleset.xml
vendor/bin/phpmd app xml phpmd.ruleset.xml --reportfile phpmd.result.xml
set -e
echo "********************"
echo "* save outputs *"
echo "********************"
LINT_RESULT_DIR="$CIRCLE_ARTIFACTS/lint"
mkdir "$LINT_RESULT_DIR"
cp -v "phpcs.result.xml" "$LINT_RESULT_DIR/"
cp -v "phpmd.result.xml" "$LINT_RESULT_DIR/"
echo "********************"
echo "* select reporter *"
echo "********************"
if [ -z "${CI_PULL_REQUEST}" ]; then
# when not pull request
REPORTER=Saddler::Reporter::Github::CommitReviewComment
else
REPORTER=Saddler::Reporter::Github::PullRequestReviewComment
fi
echo "********************"
echo "* checkstyle *"
echo "********************"
cat phpcs.result.xml \
| checkstyle_filter-git diff origin/master \
| saddler report --require saddler/reporter/github --reporter $REPORTER
echo "********************"
echo "* PMD *"
echo "********************"
cat phpmd.result.xml \
| pmd_translate_checkstyle_format translate \
| checkstyle_filter-git diff origin/master \
| saddler report --require saddler/reporter/github --reporter $REPORTER
phpmdでは、エラーがあったとき(?)にエラーのreturn codeが返ってくるので、事前にset +e
としています。
circle.ymlの設定
machine:
timezone: Asia/Tokyo
php:
version: 5.6.14
test:
override:
- sh scripts/saddler.sh
testをoverrideし、そこで実行するようにしています。
元々PHPUnitとかでテストしているのであれば、post
に書くか、override
に並列に書くかですね。
余談
Openなリポジトリだったり、お金があるのであれば、SideCIとか使ったほうが手っ取り早いと思います。
CircleCIで有利な点としては、 check-statics/get_artifacts.rb な感じでAPI経由でArtifactにアクセスできたり、hookを追加して好きなところに結果などを通知できることですかね。