PHP
Phing
docker
静的コード解析

【PHP】さくっとスタイル・フォーマットチェック

More than 1 year has passed since last update.

前置き

ルールが整っていない現場に入ったときに、
コードのスタイルやフォーマットなどで指摘を受けたくないので、
レビュー前に最低限のチェックができる環境を作りたい。

・・エディタに任せるのが一番だと思いますが。

概要

[1]Dockerコンテナにphing入れる
[2]対象ソースのディレクトリを共有にしてコンテナ起動
[3]中に入ってphing実行

※phpcsとphpmdをとりあえず入れていますが、目的に応じて追加したりしてください

実施

dockerいれる

【さらっとだけ覚えたい】Docker入門

ホストに必要なファイルを配置

以下をどこかに配置してください。
[1]Dockerfile
[2]composer.json
[3]build.xml(phing用)
[4]ruleset.xml(phpmd用)

phpcsはPSR2、phpmdのチェックルールに不満がなければ、
下記をコピペでおつかいいただけるかと。

Dockerfile
FROM centos:6.7

RUN yum update -y
RUN yum install -y yum-plugin-ovl

# Japanese Support
RUN yum -y groupinstall "Japanese Support"
RUN echo "LANG=\"ja_JP.UTF-8\"" > /etc/sysconfig/i18n
RUN source /etc/sysconfig/i18n

# ntp
RUN cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# php
RUN yum install -y http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
RUN yum install -y --enablerepo=remi php php-xml

# composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer
RUN chmod 777 /usr/local/bin/composer

# create phing dir
RUN mkdir -p /phing/src
RUN mkdir -p /phing/phpmd

ADD ./composer.json /phing/composer.json

RUN cd /phing && composer install --dev

RUN ln -s /phing/vendor/phing/phing/bin/phing /usr/local/bin/phing
RUN ln -s /phing/vendor/squizlabs/php_codesniffer/scripts/phpcs /usr/local/bin/phpcs
RUN ln -s /phing/vendor/phpmd/phpmd/src/bin/phpmd /usr/local/bin/phpmd
RUN chmod 777 /usr/local/bin/phing
RUN chmod 777 /usr/local/bin/phpcs 
RUN chmod 777 /usr/local/bin/phpmd 

ADD ./build.xml /phing/build.xml
ADD ./ruleset.xml /phing/ruleset.xml
composer.json
{
     "require-dev": {
        "squizlabs/php_codesniffer": "2.*",
        "phpmd/phpmd" : "@stable",
        "phing/phing": "2.*"
    }
}
build.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- buildタスクをデフォにしておく -->
<project name="phing" default="build">

  <!-- ソース置き場などはプロパティとして使用する -->
  <property name="myDir" value="/phing" />
  <property name="targetDir" value="/phing/src/" />

  <!-- buildタスク -->
  <target name="build" depends="phpcs,phpmd" />

  <!-- 静的解析ツールの設定 -->
  <target name="phpcs">
    <phpcodesniffer standard="PSR2" file="${targetDir}" allowedFileExtensions="php" />
  </target>

  <target name="phpmd">
    <phpmd rulesets="ruleset.xml">
      <fileset dir="${targetDir}">
        <include name="**/*.php" />
      </fileset>
      <formatter type="html" outfile="${myDir}/phpmd/phpmd.html"/>
      <formatter type="text" outfile="${myDir}/phpmd/phpmd.txt"/>
    </phpmd>
  </target>
</project>
ruleset.xml
<?xml version="1.0"?>
<ruleset name="My first PHPMD rule set"
         xmlns="http://pmd.sf.net/ruleset/1.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0
                     http://pmd.sf.net/ruleset_xml_schema.xsd"
         xsi:noNamespaceSchemaLocation="
                     http://pmd.sf.net/ruleset_xml_schema.xsd">
    <description>
        My custom rule set that checks my code...
    </description>

    <rule ref="rulesets/cleancode.xml" />
    <rule ref="rulesets/codesize.xml" />
    <rule ref="rulesets/controversial.xml" />
    <rule ref="rulesets/design.xml" />
    <rule ref="rulesets/naming.xml" />
    <rule ref="rulesets/unusedcode.xml" />
</ruleset>

コンテナ起動

docker build -t phing:latest .
docker run -itd --name phing --volume ソースのあるディレクトリ:/phing/src phing
docker exec -it phing /bin/bash

チェック

cd /phing
phing

※phpmdの結果は/phing/phpmd配下に吐くように設定してます

おまけ

静的解析ツールの単体実施

phing
phing タスク
phpcs
phpcs --standard=PSR2 src/
phpmd
phpmd [ファイル名|ディレクトリ] [レポートフォーマット(text or xml)] [ルール]
phpmdルール 説明
cleancode 汚いコードに指摘
codesize メソッドやクラスの大きさに対して指摘
controversial キャメルケースを勧める
design ソフトウェアデザインに関連した指摘
naming 命名ルール
unusedcode 使われていないコードの指摘