Aller au contenu principal

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_PATH et DB_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 variableContenuExempleRemarque
DIFFS_PATHDossier relatif à la racine du projet devant contenir les patchs générés par le difffiles/diffscréé au besoin ; à ignorer dans git s'il se trouve sous le docroot
DRUPAL_ROOT_PATHChemin relatif à la racine du projet vers le docroot, périmètre du contrôlewebpar défaut à web
DRUPAL_CONFIG_PATHChemin relatif à la racine du projet vers le dossier de config sync, exclu du contrôleconfig/syncpar défaut à config/sync
DB_PATHDossier relatif à la racine du projet contenant les dumps, exclu du contrôlefiles/dumpsoptionnel
PROJECT_ROOTChemin relatif ou absolu vers la racine du projet~/public_html
SSH_CHAINChaine de connexion SSHssh 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.