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.
| Job | Variable | Par défaut |
|---|---|---|
| phpcs | PHPCS_ALLOW_FAILURE | "true" (non bloquant) |
| phpstan | PHPSTAN_ALLOW_FAILURE | "true" (non bloquant) |
| phpunit | PHPUNIT_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-warmupl'écrit. Il tourne de lui-même quandcomposer.lockchange ; 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
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 variable | Contenu | Exemple | Remarque |
|---|---|---|---|
| QA_ON_PREPROD | Lancer les jobs QA sur la branche de préproduction | "true" | par défaut "false" |
| RUNNER_CACHE_DOCKER_IMAGE | Image du job qa:cache-warmup | wodby/drupal-php:8.3-dev | par défaut wodby/drupal-php:7.4-dev |
| CI_METRIC_ENDPOINT | Adresse du service de métriques | https://suivi.exemple.fr/api/metric | sans valeur, deploy-metrics ne fait rien |
| CI_TRACKING_TOKEN | Jeton d'authentification auprès du service | masquée | |
| CI_TRACKING_PROJECT | Identifiant du projet dans le service | mon-projet |