qualité de code avec php-cs-fixer et php mess detector (+ docker !)

php-cs-fixer est un outil développé par sensio labs, qui relève les erreurs liées notamment au psr2.

php mess detector est un outil  permettant de vérifier que des variables inutilisées ne trainent pas, le code mort, dupliqué etc.

J’ai récemment dû mettre en place un script lançant les deux outils et bloquant un push git, tout cela avec docker.

Tout commence par un DockerFile

Une fois les libs récupérées, je les déplace dans /usr/local/bin. J’installe l’extension bz2 pour utiliser les phar.

Enfin, je copie le script qa.sh et les fichiers de configuration config/.php_cs et config/rulesets à la racine du container.

Le fichier .php_cs

Ce fichier est indispensable pour php-cs-fixer si vous souhaitez exclure des répertoires lors de l’analyse (malheureusement, il n’existe pas d’option pour cela, c’est bien dommage).

Je demande donc à exclure les répertoires tests/_support, tests/_data, tests/_output, et à exclure un fichier en particulier, test/_bootstrap.php

Les rulesets de php mess detector

Les règles de mess detector sont très bien, mais certaines sont… un peu casse-pieds. Par exemple, si une variable a moins de deux caractères, il ne va pas être très content (dommage pour les variables comme $em, $id, $qb et j’en passe). De même, mess detector considère qu’utiliser else dans son code, C’EST LE MAL!!! 😉

Certaines règles, trop lourdes, ont donc été retirées dans ces fichiers. J’ai recréé deux fichiers de mess detector, cleancode.xml et naming.xml, et j’ai changé une configuration (les noms de variables peuvent faire 30 caractères maximum au lieu de 20), et ai retiré les règles concernant le else et les variables dont le nom était trop court. J’aurais pu dire que je n’acceptais pas les variables de moins de quatre caractères, mais cette règle me paraissait vraiment trop strict au final.

cleancode.xml:

 

naming.xml:

 

On y est presque. Il reste à créer le fichier qa.sh qui permet de lancer php-cs-fixer, php mess detector, ou les deux:

C’est un gros fichier mais il est aisément compréhensible:

  • Il est possible de définir l’argument « branch » pour se placer sur une branche en particulier et effectuer les tests
  • Avec l’option -f , php-cs-fixer s’exécute
  • Avec l’option -m, php mess detector s’exécute
  • Quand php-cs-fixer s’exécute, il corrige les fichiers et détecte s’il y a eu des modifications pour lancer une erreur à la fin. Il s’exécute avec le niveau « symfony » et prend en compte le fichier de configuration que nous avons renseigné précédemment.
  • Mess detector s’exécute, prend tous les standards possibles sauf naming et cleancode, car nous lui demandons de prendre les nôtres:  codesize,controversial,design,unusedcode,/rulesets/cleancode.xml,/rulesets/naming.xml
  • Mess detector génère un 1 ou un 0 selon que des erreurs aient été detectées ou non. Le résultat est versionné et placé dans le répertoire du même nom que le repot sur lequel vous vous trouvez.

Plus que deux étapes:

  • soit on créé le fichier .git/hooks/pre-push et l’on y place, tout à la fin, le code suivant (en retirant la dernière ligne existante exit 0):
  • soit on fait appel au container en ligne de commande:
     

     

Bonus:

Si vous êtes sur gitlab et que vous souhaitez automatiser les builds, il suffit de créer le fichier .gitlab-ci.yml et d’y placer le code suivant:

Bien évidemment, si vous connaissez le principe de gitlab-ci.yml, vous savez qu’il faut aussi créer un runner shell pour que cela fonctionne. Mais honnêtement, ça vaut le coup. Ca ne bloquera pas le push sur le serveur (sauf si vous avez la main et que vous pouvez modifier le hook pre-receive directement sur votre serveur) mais ça exécutera un build qui passera ou échouera et vous pourrez alors vous envoyer une alerte si tel est le cas.

Rédigé par

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *