diff-repository
Job qui vérifie, avant le déploiement, que le code déployé sur le serveur n'a pas été modifié à la main. Il bloque le déploiement si c'est le cas.
Fonctionnement
Le contrôle porte sur le docroot (DRUPAL_ROOT_PATH, web par défaut) :
- fichiers versionnés modifiés : le job enregistre un patch dans
DIFFS_PATH, restaure les fichiers à leur version versionnée, puis échoue. Relancer le job suffit ensuite à débloquer le déploiement : reporter d'abord dans le dépôt ce qui doit être conservé ; - fichiers non versionnés (et non ignorés par git) : le job les liste puis échoue. Il ne les supprime jamais : les versionner, les ignorer ou les supprimer sur le serveur, puis relancer le job.
Sont exclus du contrôle, même s'ils se trouvent sous le docroot :
DRUPAL_CONFIG_PATH: le répertoire de config relève de diff-config, qui le réécrit en parallèle ;DIFFS_PATHetDB_PATH: les patchs et les dumps écrits par les templates.
Le reste du dépôt (fichiers à la racine du projet comme un .env.bak, dossiers de dumps hors docroot…) n'est pas contrôlé.
Pourquoi le code et pas seulement la config : en prod, git checkout <tag> conserve une modification locale lorsque le fichier est identique entre les deux tags. Un correctif posé à la main survivrait donc au déploiement, sans que rien ne le signale.
Rapport en artefact
Le patch écrit sur le serveur est aussi publié en artefact du job, dans reports/<DIFFS_PATH>/. Il est conservé une semaine, y compris quand le job échoue, et n'est téléchargeable que par les membres Developer et au-delà.
Utilisation
variables:
CI_TEMPLATE_VERSION: &CI_TEMPLATE_VERSION main
include:
- project: kgaut/gitlab-ci-templates
ref: *CI_TEMPLATE_VERSION
file:
- '/templates/generic/stages-variables-extends.yml'
- '/templates/generic/diff-repository.yml'
Variables nécessaires
| Nom de la variable | Contenu | Exemple | Remarque |
|---|---|---|---|
| DIFFS_PATH | Dossier relatif à la racine du projet devant contenir les patchs générés par le diff | files/diffs | créé au besoin ; à ignorer dans git s'il se trouve sous le docroot |
| DRUPAL_ROOT_PATH | Chemin relatif à la racine du projet vers le docroot, périmètre du contrôle | web | par défaut à web |
| DRUPAL_CONFIG_PATH | Chemin relatif à la racine du projet vers le dossier de config sync, exclu du contrôle | config/sync | par défaut à config/sync |
| DB_PATH | Dossier relatif à la racine du projet contenant les dumps, exclu du contrôle | files/dumps | optionnel |
| PROJECT_ROOT | Chemin relatif ou absolu vers la racine du projet | ~/public_html | |
| SSH_CHAIN | Chaine de connexion SSH | ssh user@serveur |
Liste des jobs
prod:diff:repository
Valide l'intégrité du dépôt déployé en production
preprod:diff:repository
Valide l'intégrité du dépôt déployé en préproduction
Les deux jobs étendent le job cach é .diff-repository.