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

  • 36
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

やりたいこと

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

image

手順

composerに追加

require-devに実行したいものを追加する。
squizlabs/PHP_CodeSnifferPHPMD - PHP Mess Detectorを追加する。

下記のようなイメージ。

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

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の設定

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を追加して好きなところに結果などを通知できることですかね。