Aller au contenu principal

Fonctionnement des jobs QA

Ce qui est commun à phpcs, phpstan et phpunit, et les jobs qui exploitent leurs résultats.

Quand tournent-ils ?​

Sur les pushs de branche et les merge requests. Jamais sur un tag ni sur une pipeline planifiée : un déploiement en production n'attend pas la QA. Sur la branche de préproduction, ils sont ignorés, sauf avec QA_ON_PREPROD: "true".

Bloquant ou non​

Chaque job a sa variable *_ALLOW_FAILURE. À "true", un échec est signalé par un avertissement et la pipeline continue ; à toute autre valeur, il l'arrête.

JobVariablePar défaut
phpcsPHPCS_ALLOW_FAILURE"true" (non bloquant)
phpstanPHPSTAN_ALLOW_FAILURE"true" (non bloquant)
phpunitPHPUNIT_ALLOW_FAILURE"false" (bloquant)

Image Docker​

Chaque job tourne dans l'image de sa variable *_DOCKER_IMAGE, par défaut wodby/drupal-php:7.4-dev. À adapter à la version de PHP du projet : avec une image trop ancienne, composer install échoue (« lock file does not contain a compatible set of packages »).

Cache Composer​

Les trois jobs lancent composer install. Pour ne pas tout retélécharger à chaque job, ils partagent un cache (vendor/, web/core/, web/modules/contrib, web/themes/contrib), dont la clé est le composer.lock :

  • les jobs QA ne font que lire le cache ;
  • seul le job qa:cache-warmup l'écrit. Il tourne de lui-même quand composer.lock change ; sur les autres pipelines il reste disponible en lancement manuel, pour remplir le cache à nouveau s'il a été purgé.

qa:cache-warmup tourne dans l'image RUNNER_CACHE_DOCKER_IMAGE (par défaut wodby/drupal-php:7.4-dev), à adapter elle aussi à la version de PHP du projet. Son échec n'arrête pas la pipeline.

Ce cache suppose un cache distribué (S3, MinIO…) configuré sur les runners : sans lui, chaque runner a son propre cache et le gain est aléatoire.

Pour s'en passer, dans le .gitlab-ci.yml du projet :

qa:cache-warmup:
rules:
- when: never
remarque

Un job QA que le projet surcharge avec son propre extends doit y répéter .qa-cache : un extends local remplace celui du template.

Rapports agrégés (qa.yml)​

Le fichier /templates/qa/qa.yml ajoute deux jobs, qui lisent les artefacts de phpcs et de phpstan (conservés un jour) :

code-quality-merge​

Fusionne codequality_phpcs.json et codequality_phpstan.json en un seul rapport Code Quality de GitLab, affiché dans les merge requests. Il a besoin des deux jobs : n'inclure qa.yml que si phpcs.yml et phpstan.yml le sont aussi.

Le rapport phpcs demande le paquet Composer micheh/phpcs-gitlab dans le projet.

deploy-metrics​

Envoie le nombre d'erreurs et d'avertissements à un service de métriques, si CI_METRIC_ENDPOINT est défini. Sans cette variable, il ne fait rien.

Un appel GET par métrique (PHPCS_ERRORS, PHPCS_WARNING, PHPSTAN_ERRORS), avec les paramètres auth (CI_TRACKING_TOKEN), project (CI_TRACKING_PROJECT), project_name, metric, value et version (la branche).

Utilisation​

variables:
CI_TEMPLATE_VERSION: &CI_TEMPLATE_VERSION main
PHPCS_DOCKER_IMAGE: wodby/drupal-php:8.3-dev
PHPSTAN_DOCKER_IMAGE: wodby/drupal-php:8.3-dev
RUNNER_CACHE_DOCKER_IMAGE: wodby/drupal-php:8.3-dev

include:
- project: kgaut/gitlab-ci-templates
ref: *CI_TEMPLATE_VERSION
file:
- '/templates/generic/stages-variables-extends.yml'
- '/templates/qa/phpcs.yml'
- '/templates/qa/phpstan.yml'
- '/templates/qa/qa.yml'

Variables​

Nom de la variableContenuExempleRemarque
QA_ON_PREPRODLancer les jobs QA sur la branche de préproduction"true"par défaut "false"
RUNNER_CACHE_DOCKER_IMAGEImage du job qa:cache-warmupwodby/drupal-php:8.3-devpar défaut wodby/drupal-php:7.4-dev
CI_METRIC_ENDPOINTAdresse du service de métriqueshttps://suivi.exemple.fr/api/metricsans valeur, deploy-metrics ne fait rien
CI_TRACKING_TOKENJeton d'authentification auprès du servicemasquée
CI_TRACKING_PROJECTIdentifiant du projet dans le servicemon-projet