LoginSignup
39
39

More than 5 years have passed since last update.

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

Posted at

やりたいこと

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

39
39
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
39
39