Un rapport Upgrade Status ne se lit pas comme une liste d'erreurs à compter. Il se lit en trois passages : l'environnement (PHP, base de données, version du cœur), puis les groupes de projets, qui disent quoi faire de chaque module, et enfin le détail du code sur mesure, ligne par ligne. Dans ce détail, un seul critère sépare ce qui bloque Drupal 11 de ce qui peut attendre : la version à laquelle l'API dépréciée est retirée. À un peu plus de deux mois de la fin de vie de Drupal 10, le 9 décembre 2026, c'est ce tri qui permet de savoir où porter l'effort.
Cet article porte sur la lecture du rapport. Le traitement des modules contrib eux-mêmes (patch, plugin lenient, remplacement) est détaillé dans l'article sur les modules incompatibles avec Drupal 11.
Avant de lire : obtenir un rapport fiable
Upgrade Status analyse le site sur lequel il est installé et évalue sa préparation à la version majeure suivante. Pour préparer Drupal 11, il s'exécute donc sur le site Drupal 10, de préférence sur une copie de préproduction.
Deux points à vérifier avant de se fier au résultat :
- La branche du module. La version stable 4.x fonctionne avec Drupal 9, 10 et 11. La branche 5.0, encore en alpha, demande Drupal 10.4 au minimum et vise aussi Drupal 12. Pour un passage de 10 à 11, la 4.x suffit.
- L'installation par Composer. La page du projet indique que le module doit être installé avec Composer, à cause de ses dépendances PHP (PHPStan notamment). En cas de conflit avec Drush, elle décrit une procédure qui passe par
drupal/core-dev.
L'analyse peut se lancer depuis l'interface (Rapports > Upgrade Status) ou avec Drush, plus pratique sur un site qui compte beaucoup de modules :
# Tous les projets du site
drush upgrade_status:analyze --all
# Uniquement le code sur mesure, sans les modules non installés
drush us-a --all --ignore-contrib --ignore-uninstalled
# Si PHPStan manque de mémoire sur un gros projet
drush us-a mon_module --phpstan-memory-limit=2G
Les options --ignore-contrib, --ignore-custom, --ignore-uninstalled, --ignore-list et --skip-existing sont documentées sur la page du projet. Elles servent surtout à découper l'analyse pour relire un périmètre à la fois.
Premier passage : le bloc environnement
Commencez toujours par là. Un blocage d'environnement ne dépend pas de votre code, souvent pas de vous non plus : il faut une intervention de l'hébergeur, et c'est ce qui se planifie le plus tôt.
Le rapport vérifie notamment la version de Drupal, de PHP, de la base de données et de Drush, ainsi que la présence de modules du cœur dépréciés. Les valeurs attendues pour Drupal 11, d'après la documentation de drupal.org :
| Élément | Minimum pour Drupal 11 |
|---|---|
| Drupal 10 de départ | 10.3.0 (dans les faits, visez la dernière 10.6.x) |
| PHP | 8.3 |
| MySQL / MariaDB | MySQL 8.0 / MariaDB 10.6 |
| PostgreSQL | 16, avec l'extension pg_trgm activée |
| SQLite | 3.45 |
| Drush | 13 (compatible Drupal 10.2+ et 11) |
Si PHP ou la base de données sont sous ces seuils, le reste du rapport peut être parfait : la mise à jour ne passera pas. Pour la version de PHP, l'article sur la fin de support de PHP 8.2 détaille ce qu'il faut demander à l'hébergeur.
Le même bloc signale les modules du cœur retirés dans Drupal 11 : Actions UI, Activity Tracker, Book, Forum, Statistics et Tour. S'ils sont installés, il faut soit les désinstaller, soit ajouter leur version contrib avant de passer le cœur en 11.
Deuxième passage : les groupes de projets
Le rapport ne classe pas les modules par nombre de problèmes, mais par action suggérée. Ce choix, expliqué par l'auteur du module, Gábor Hojtsy, change la façon de lire : chaque groupe est une file de travail.
| Groupe | Ce qu'il contient | Première action |
|---|---|---|
| Remove | Projets présents dans le code mais non installés | Les retirer de composer.json |
| Update | Projets contrib dont une version plus récente existe | Mettre à jour sous Drupal 10, puis relancer l'analyse |
| Collaborate with maintainers | Projets contrib à jour, mais sans version compatible | Chercher un correctif dans la file d'issues |
| Scan | Code sur mesure pas encore analysé | Lancer l'analyse |
| Fix with rector | Projets dont une bonne part des problèmes est corrigeable par Drupal Rector | Passer Rector, relire le diff |
| Fix manually | Projets à corriger à la main | Lire le détail ligne par ligne |
| Compatible | Projets prêts | Rien, sinon mettre à jour avec le reste |
Pour chaque projet contrib, le rapport distingue deux informations : la compatibilité de la version installée (ce que dit le code sur le disque) et celle de la version disponible sur drupal.org. Un module incompatible en local mais compatible sur drupal.org relève d'une simple mise à jour. Un module incompatible des deux côtés est un vrai point bloquant.
Pour le groupe Collaborate with maintainers, un réflexe utile : ouvrir la file d'issues du module et chercher un ticket intitulé « Automated Drupal 11 compatibility fixes ». Il est ouvert par le Project Update Bot, qui combine justement Upgrade Status et Drupal Rector pour proposer des correctifs aux projets contrib. Ce ticket est un point de départ, pas une garantie : vérifiez qu'il a été relu et testé.
Un mot sur Remove : un module non installé ne gêne pas Drupal, mais son paquet reste dans composer.json. S'il déclare une contrainte drupal/core limitée à Drupal 10, il empêchera Composer d'installer Drupal 11. Le retirer est la correction la moins chère du rapport.
Troisième passage : le détail d'un projet
C'est là que les rapports impressionnent : un module sur mesure peut afficher des dizaines de lignes. Chaque ligne indique un fichier, un numéro de ligne et un message. Pour les API PHP de Drupal, ce message suit un format imposé par la politique de dépréciation de Drupal :
%élément% is deprecated in drupal:X.Y.Z and is removed from drupal:A.B.C.
%consigne de remplacement%. See https://www.drupal.org/node/…
Deux informations de ce message font tout le tri :
- La version de retrait (
is removed from). Si elle vautdrupal:11.0.0, l'API n'existe plus dans Drupal 11 : c'est bloquant. Si elle vautdrupal:12.0.0, l'API fonctionne encore en Drupal 11 : la correction peut être planifiée plus tard, avant le passage à Drupal 12. - Le lien final, vers la fiche de changement (change record) sur drupal.org. C'est là que se trouve la manière de corriger, souvent avec un exemple avant/après.
Le rapport ajoute à chaque problème une étiquette de tri. L'auteur du module décrit les principales : Fix now pour ce qui peut et doit être corrigé maintenant, Fix later pour ce qui peut attendre, Check manually quand l'outil ne peut pas trancher avec les informations dont il dispose. Les problèmes que Drupal Rector sait corriger sont signalés comme tels.
Au-delà du PHP, la documentation drupal.org sur les outils de détection liste d'autres types de constats :
- une syntaxe Twig dépréciée dans les templates du thème ou des modules ;
- l'utilisation ou l'extension de bibliothèques dépréciées (déclarations
libraries.yml) ; - une clé
core_version_requirementabsente ou insuffisante dans le fichier.info.yml.
Ce dernier constat est le plus simple à corriger, et il est bloquant : sans ^11 dans cette clé, Drupal refusera d'activer le module, même si son code est parfait.
Le tableau de triage
Une fois les trois passages faits, chaque constat entre dans l'une de ces lignes :
| Constat | Bloque Drupal 11 ? | Action | Qui |
|---|---|---|---|
| PHP < 8.3 ou base de données sous le minimum | Oui | Montée de version du serveur | Hébergeur |
| Cœur en dessous de 10.3 | Oui | Mise à jour en 10.6.x | Développeur |
| Book, Forum, Tour, etc. encore installés | Oui | Version contrib ou désinstallation | Développeur |
| Projet dans Remove | Peut bloquer Composer | composer remove |
Développeur |
| Projet dans Update | Tant qu'il n'est pas mis à jour | Mise à jour sous Drupal 10 | Développeur |
| Projet dans Collaborate with maintainers | Oui | Correctif, remplacement ou retrait | Développeur et mainteneur |
core_version_requirement sans ^11 |
Oui | Modifier le .info.yml |
Développeur |
API retirée dans drupal:11.0.0 |
Oui | Drupal Rector, puis correction manuelle | Développeur |
API retirée dans drupal:12.0.0 |
Non | À planifier avant Drupal 12 | Développeur |
| Check manually | À vérifier | Lire le code et la fiche de changement | Développeur |
Pour les lignes « Drupal Rector », la marche habituelle est de lancer l'outil en simulation avant d'écrire quoi que ce soit :
composer require --dev palantirnet/drupal-rector
cp vendor/palantirnet/drupal-rector/rector.php .
vendor/bin/rector process web/modules/custom/mon_module --dry-run
D'après sa documentation, les règles couvrent les dépréciations de Drupal 10.0 à 11.4, et l'outil peut être exécuté sur un site encore en Drupal 10. Relancez ensuite Upgrade Status sur le module : les lignes restantes sont celles à corriger à la main.
Ce que le rapport ne voit pas
Upgrade Status s'appuie sur une analyse statique : il lit le code sans l'exécuter. Un rapport vide sur un projet signifie qu'aucun usage détectable d'API dépréciée n'a été trouvé, pas que le module fonctionnera à l'identique en Drupal 11.
Restent donc à vérifier par d'autres moyens :
- les changements de comportement qui ne passent pas par une API dépréciée ;
- ce qui se construit à l'exécution (nom de classe ou de service calculé, par exemple), que l'analyse ne peut pas suivre ;
- la configuration du site et les données, que l'outil n'analyse pas.
C'est pourquoi le rapport à vert n'est qu'une étape. La recette sur une préproduction en Drupal 11 reste indispensable.
Suivre l'avancement
Le rapport est utile une fois, il l'est davantage relancé à chaque étape. Drush sait produire un résultat exploitable par une chaîne d'intégration continue :
drush us-a --all --ignore-contrib --format=codeclimate > upgrade-status.json
Les formats plain, checkstyle (XML) et codeclimate (JSON) sont disponibles. La page du projet précise que le format Code Climate s'intègre à GitLab CI pour afficher les constats dans les demandes de fusion. Suivre le nombre de constats bloquants d'une exécution à l'autre donne une mesure plus honnête de l'avancement qu'une impression générale.
Par où commencer
Si vous n'avez pas encore installé Upgrade Status, deux outils gratuits donnent un premier aperçu sans rien toucher au site : le vérificateur de version Drupal, pour connaître la version et sa date de fin de support, et le vérificateur de modules Drupal 11, qui indique pour chaque module contrib s'il existe une version compatible. Ils ne remplacent pas Upgrade Status : ni l'un ni l'autre ne lit votre code sur mesure.
Si votre rapport ne montre que des mises à jour contrib et quelques lignes corrigeables par Rector, une équipe à l'aise avec Composer et Drush peut mener la mise à jour elle-même, en suivant le déroulé de la page mise à jour Drupal 10 vers 11. Si l'environnement bloque, si plusieurs modules sont dans Collaborate with maintainers ou si le code sur mesure accumule les Check manually, c'est là qu'un audit est utile : l'audit flash reprend ce rapport, tranche chaque ligne et débouche sur un devis ferme, avec une date de bascule compatible avec le 9 décembre.
Sources, consultées en septembre 2026 : drupal.org, Upgrade Status ; drupal.org, How to upgrade from Drupal 10 to Drupal 11 ; drupal.org, PHP requirements et Database server requirements ; drupal.org, Deprecation checking and correction tools ; drupal.org, Drupal deprecation policy ; drupal.org, Project Update Bot ; drupal.org, Drupal core release schedule ; Drush, Install ; Palantir, Drupal Rector ; Gábor Hojtsy, Evolving the Upgrade Status user interface et First beta of Upgrade Status for Drupal 8.