規約に沿ってないPHPコードを駆逐する

## やりたいこと

PSR-2に沿ってないコードを駆逐したい。
また、[PHPMD - PHP Mess Detector](http://phpmd.org/)というものもあるらしいので、それに沿ってないコードも駆逐したい。

ただ、[FriendsOfPHP/PHP-CS-Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer)みたいに自動で変換するのは、後で見た時に違ったコードに見えてしまったり、人間の成長が無かったりする気がするので微妙。

人間レビューのする前に、自動レビューを行いたい。んで、人間が直す。

要するに、[Androidのコードを自動で解析し、GitHubのpull requestにコメントする](http://qiita.com/noboru_i/items/2f30296db1c8a6dfbd9b)のPHP版。

## 完成イメージ

GitHubにPUSHすると、CircleCIが動いて、Pull RequestにPHP CodeSnifferなどの結果を表示する。
実際に動かしたものはこちら→ https://github.com/noboru-i/laravel-sample/pull/1

![image](https://qiita-image-store.s3.amazonaws.com/0/8708/329dcdf0-44a6-2702-9c18-3ca624a655b9.png)

## 手順

### composerに追加

`require-dev`に実行したいものを追加する。
[squizlabs/PHP_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer)と[PHPMD - PHP Mess Detector](http://phpmd.org/)を追加する。

下記のようなイメージ。

```json:composer.json
    "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`として、下記のようなものを作成する。

```bash: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の設定

```yaml:circle.yml
machine:
  timezone: Asia/Tokyo
  php:
    version: 5.6.14
test:
  override:
    - sh scripts/saddler.sh
```

testをoverrideし、そこで実行するようにしています。
元々PHPUnitとかでテストしているのであれば、`post`に書くか、`override`に並列に書くかですね。


## 余談

Openなリポジトリだったり、お金があるのであれば、[SideCI](https://www.sideci.com/)とか使ったほうが手っ取り早いと思います。

CircleCIで有利な点としては、 [check-statics/get_artifacts.rb](https://github.com/noboru-i/check-statics/blob/master/get_artifacts.rb) な感じでAPI経由でArtifactにアクセスできたり、hookを追加して好きなところに結果などを通知できることですかね。