💡

pre-commit時にDockerのPHPCS, PHPMDでクォリティチェック

2023/10/02に公開

PHPのインストールはもういやや

PHPの各種クォリティツールを使おうとすると、
どうしてもPHPの実行環境が必要になる。
その度にPHPをインストールするのがちょっと面倒なので、
Docker環境で完結させたい。

更にできればPHPCSとかPHPMDとか単体で用意するのではなく、
まとめて一つのモジュールで使えるようにしたい。
それにあったモジュールが
PHPQA

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

事前準備

当然DockerPodmanのような仮想実行環境は用意しておいてほしい。

テストコマンド

docker_on_php7.2
docker run --rm -it ghcr.io/edgedesigncz/phpqa:v1.26.2-php7.2 sh -c "php --version && composer --version && composer outdated --direct --all && phpqa tools"
podman_on_php8.1
podman run --rm -it ghcr.io/edgedesigncz/phpqa:v1.26.2-php8.1 sh -c "php --version && composer --version && composer outdated --direct --all && phpqa tools"

実行コマンド

現在のディレクトリを /app にマウントしてWORKDIRを/appに。
ユーザーを自身にして各種ツールを実行という流れで

PHPCS

コード標準ファイルを phpcs.xml とすると

phpcs
podman run --rm -it -u $(id -u) -v $(pwd):/app -w /app ghcr.io/edgedesigncz/phpqa:v1.26.2-php8.1 phpcs --standard=phpcs.xml  path/to/abcTest.php

PHPMD

設定ファイルを phpmd.xml とすると

phpmd
podman run --rm -it -u $(id -u) -v $(pwd):/app -w /app ghcr.io/edgedesigncz/phpqa:v1.26.2-php8.1 phpmd path/to/abcTest.php text phpmd.xml

git pre-commit連動

コードをチェックするコマンドができたので、
gitのpre-commitに登録してコミット直前に実行する形にする。

.git/hook/pre-commit
.git/hook/pre-commit
#!/bin/bash
CURRENT_PWD=$(pwd)
FILES=`git diff-index --cached --name-status HEAD | grep -E '^[AUM].*\.php$' | cut -c3-`
COMMAFILES=`echo $FILES | tr ' ' ,`

echo "phpcs start"
podman run --rm -it -v $CURRENT_PWD:/app -w /app ghcr.io/edgedesigncz/phpqa:v1.26.2-php8.1 phpcs --standard=phpcs.xml $FILES
ret=$?
if [ $ret -ne 0 ]; then
  status=$ret
fi

echo "phpmd start"
podman run --rm -it -v $CURRENT_PWD:/app -w /app ghcr.io/edgedesigncz/phpqa:v1.26.2-php8.1 phpmd $COMMAFILES ansi phpmd.xml
ret=$?

if [ $ret -ne 0 ]; then
  status=$ret
fi
exit $status

コミットを実行してみると

git commit -m "commit test"
FILE: ...path/to/abcTest.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
 12 | ERROR | [x] String "aaaa" does not require double quotes; use
    |       |     single quotes instead
    |       |     (Squiz.Strings.DoubleQuoteUsage.NotRequired)
----------------------------------------------------------------------
PHPCBF CAN FIX THE 1 MARKED SNIFF VIOLATIONS AUTOMATICALLY
----------------------------------------------------------------------

FILE: ...path/to/abcTest.php
----------------------------------------------------------------------------------------
 17 | VIOLATION | Avoid using short method names like ShortMethod::a(). The configured minimum method name length is 2.

Discussion