Il y a 389 articles et 19 utilisateurs inscrits (ce bandeau est défini dans MediaWiki:Sitenotice)

Basculer Drupal 8 vers Drupal 9

De AJLSM
Aller à la navigation Aller à la recherche

Suite à l'arrêt du support de Symphony 2.x et 3.x vers 4.x, Drupal arrête le support "gratuit" de Drupal 8 en octobre 2021.

Le support "gratuit" de Drupal 7 s'arrête en octobre 2022.

Ces changements majeures obligent à migrer toutes les applications D7 et D8 vers D9.

Cette version (11/11/2020) doit être complétée car incomplète (montée en version PHP depuis Ubuntu 18 LTS et forcer sa prise en compte, module Pleade, comment 'intégrer, etc.)

Pour installer Drupal 9, un certain nombre de mise à jour sont nécessaire :

  • Mise à jour obligatoire de PHP vers 7.3 : vérifiez la version php -v <ref>Migrez vers PHP 7.3.x

Selon les versions d'Ubuntu, par exemple en 18.04 LTS,

apt-get update

ne propose pas la version PHP 7.3.

Dans ce cas, utiliser les instructions suivantes :

Ouvrir le terminal et taper :

sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php7.3

php7.3 will be updated automatically when updates become available. Alternatively you can build php7.3 from source in Ubuntu 18.04, but it will not be updated automatically, and it also takes more than an hour to build if you want to test it too. After installing php7.3 you can show php7.3 modules that can also be installed by running the following command:

apt-cache search php7.3 | grep php7.3

A quick one-line command to install the same packages on php7.3 as php7.2:

sudo apt install $(apt list --installed | grep php7.2- | cut -d'/' -f1 | sed -e 's/7.2/7.3/g')

Ensuite

sudo apt-get install php7.3-mysql

PHP 7.3 n'est pas encore la version par défaut.

Pour rendre actif php3 dans Apache2 :

$ sudo a2dismod php7.2
$ sudo a2enmod php7.3

Puis relancer Apache

sudo service apache2 restart

Plus d'informations ici : https://opensenselabs.com/blog/tech/change-php-version-drupal-website-apache-nginx</ref>

  • Mise à jour de Apache vers 2.4.7 minimum : vérifier la version apachectl -V <ref>Migrez vers Apache

Recherchez la version de Apache.

Commande à utiliser

$ apachectl -V

</ref>

  • Mise à jour obligatoire de Drush vers 10. Ajouter dans composer.json : "drush/drush": "^10.0.0"

Préparation de Drupal est mise à jour des modules

[modifier | modifier le wikicode]

Drupal 8 doit être dans la version la plus récente.

Important :
Pensez à faire une sauvegarde de .htaccess avant de lancer une mise à jour de Drupal !.

Lancer la mise à jour de Drupal et de ses modules.

composer update

Tous les modules doivent être mis à jour vers leur versions les plus récentes. Ils doivent tous être compatibles avec Drupal 9.

Cette compatibilité est exprimée par l'information : Requires Drupal: ^8 || ^9 qui doit être présente lors de la mise à jour des modules. Le fichier [nom-du-module].info.yml de chaque module doit contenir l'information suivante :

core_version_requirement: ^8 || ^9

Préparation de la migration

[modifier | modifier le wikicode]

Upgrade Status

[modifier | modifier le wikicode]

Pour facilité ce travail d'inventaire, on utilise un module Upgrade Status. Ce module liste les pré-requis systèmes, les modules installés, ceux qui ne sont pas installés, etc, et signale les erreurs de compatibilités et les correctifs à apporter.

Important :
À désinstaller impérativement avant de basculer en D9, après avoir effectués et validés tous les tests de compatibilités.

Travailler avec Upgrade Status

[modifier | modifier le wikicode]
  • Installez la dernière version du module Upgrade Status avec composer, par exemple comme suit :
$ composer require 'drupal/upgrade_status:^3.0'
Notice :
Un rappel : toujours vider les caches après l'installation ou la mise à jour de Drupal et de ses modules et faire un .update.php<ref>Update.php

Pour forcer le update.php à se lancer sans authentification, modification du paramétre update_free_access dans setting.php.

</ref> puis les mises à jour attendues depuis l'update.php.
  • Installez le module upgrade status : -> [$site-drupal]/admin/modules
  • Videz les caches
  • Affichez le rapport de Upgrade Status : -> [$site-drupal]/admin/reports/upgrade-status

Lorsque Upgrade Status est activé, Le rapport de Upgrade Status se compose de 6 zones :

  • Synthèse : FIX incompatibilies doit être OK sur tous les points
  • Drupal core and hosting environment : l'environnement système et les modifications à apporter si nécessaire
  • Retirer : liste les modules demandés par composer maisnon utilisés et non installés, qui peuvent poser problèmes : à supprimer de composer.json
  • Mettre à jour : liste les modules à mettre à jour vers une verion compatible D9
  • Collaborate with maintainers : liste les modules qui ne sont plus à jour. Souvent il manque l'information "Requires Drupal: ^8 || ^9" dans le fichier [nom-du-module].info.yml. Si le module n'est pas utilisé, supprimez le module.
  • Drupal 9 compatible : liste les modules compatibles D9.

Prêt pour la migration vers D9 ?

[modifier | modifier le wikicode]

- Si tout est résolu, on obtient l'écran suivant, sinon, voir les autres possibilités de résolutions ci-dessous :

- Tout est OK, passer à la migration :

Upgrade rector

[modifier | modifier le wikicode]

Ce module, complémentaire de Update Status, aide à solutionner, voir à résoudre, les problèmes rencontrés dans la partie : Collaborate with maintainers

Important :
À désinstaller impérativement avant de basculer en D9, après avoir effectués et validés tous les tests de compatibilités.
  • Intégrez la dernière version du module Upgrade Rector avec composer, par exemple comme suit :
composer require 'drupal/upgrade_rector:^1.0@alpha'
  • Installez le module upgrade status : -> [$site-drupal]/admin/modules
  • Videz les caches et .update.php
  • Affichez l'interface de Upgrade Rector : -> [$site-drupal]/admin/reports/upgrade-rector
Notice :
Un rappel : toujours vider les caches après l'installation ou la mise à jour de Drupal et de ses modules et faire un .update.php puis les mises à jour attendues depuis l'update.php.

Les solutions proposées et sourtout, l'application de patch proposé par le module, sont expérimentales.

Important :
À utiliser avec précausion : faites des sauvegardes pour pouvoir revenir à la version précédente..

Migration vers D9

[modifier | modifier le wikicode]
Important :
Avant toutes choses, désinstaller Upgrate Status et Upgrade Reactor..

Voir ici pour la documentation officielle : https://www.drupal.org/docs/upgrading-drupal/upgrading-from-drupal-8-to-drupal-9-or-higher

Documentation au 07/11/2020 :

  • Effectuez les étapes suivantes à partir de la racine de votre site Drupal 8 (où réside).composer.json
  • Ajoutez temporairement l'accès en écriture aux fichiers et répertoires protégés:
chmod 777 web/sites/default
find web/sites/default -name "*settings.php" -exec chmod 777 {} \;
find web/sites/default -name "*services.yml" -exec chmod 777 {} \;
  • Ensuite, vous devrez extraire la version Drupal 9 de et les packages en tant que dépendances. Nous utilisons pour éviter un problème de d'oeuf et de poule avec des dépendances mutuelles:core-recommendeddev-dependencies--no-update
composer require drupal/core-recommended:^9.0.0 drupal/core-composer-scaffold:^9.0.0 drupal/core-project-message:^9.0.0 --update-with-dependencies --no-update
  • If you have drupal/core-dev installed.
composer require drupal/core-dev:^9.0.0 --dev --update-with-dependencies --no-update
  • Maintenant, effectuez la mise à jour du code lui-même avec la commande : composer update <ref>Plusieurs Problèmes possibles et solutions :

Après le lancement de la commande : composer update, un long message d'erreur qui contient :

Problem 1
    - webflo/drupal-core-require-dev 8.7.x-dev requires drupal/core 8.7.x-dev -> satisfiable by drupal/core[8.7.x-dev].

Correction : Il faut supprimer ce qui suit dans composer.json :

"webflo/drupal-core-require-dev": "^8.7.0"

Autre message d'erreur :

Problem 1
    - Conclusion: remove drupal-composer/drupal-scaffold 2.6.1

Dans /composer.json, in "require": {}, replace...

"drupal-composer/drupal-scaffold": "^2.5.0"

... par ...

"drupal/core-composer-scaffold": "~8.8.1"

</ref>:

composer update
Notice :
Remarque: Si l'un de vos packages n'a pas de version explicitement déclarée comme compatible D9 (c'est-à-dire que vous comptez sur un correctif pour le préparer), vous rencontrerez probablement une erreur de dépendance en essayant de mettre à jour votre base de code. Pour contourner ce problème, vous pouvez ajouter un alias à , tel que:drupal/core.
composer require "drupal/core:9.0.0 as 8.9.0" --no-update && composer update
Notice :
(Assurez-vous de remplacer 9.0.0 et 8.9.0 par les versions que vous utilisez dans votre installation).
  • Exécutez toutes les mises à jour de base de données en attente, requises si vous mettez à jour le code du module et que ce module doit mettre à jour la base de données, soit en lançant update.php dans le navigateur, soit avec Drush:
drush updatedb
  • Une fois terminé, restaurez l'accès en lecture seule au répertoire sites / default:
chmod 755 web/sites/default
find web/sites/default -name "*settings.php" -exec chmod 644 {} \;
find web/sites/default -name "*services.yml" -exec chmod 644 {} \;
  • Si vous avez exécuté pour inclure le noyau 9.0 en tant que 8.9, assurez-vous de modifier l'entrée après une mise à niveau réussie dans votre Sinon, vous ne pourrez pas installer de mises à jour Drupal.composer.json
"drupal/core": "^9.0.0",

Plusieurs problèmes et erreurs lors du update.php.

Voir ci-dessous "problèmes et solutions".

Une des dernières erreurs rencontrée dans update.php est liée au fichier setting.php:

  • Ajouter la variale suivante :
$settings['config_sync_directory'] = '.';

relancer le update.php

Problèmes rencontrés et solutions

[modifier | modifier le wikicode]

Corrigez des modules listés dans : Collaborate with maintainers

[modifier | modifier le wikicode]
Corrorection efficace pour la plupart des problèmes
[modifier | modifier le wikicode]

Le plus délicat consiste à rendre compatibles des modules listés dans la zone Collaborate with maintainers qui ne sont pas suivis par leur créateurs/contributeurs, mais qui sont utilisés dans le Drupal à migrer.

La solution la plus fréquente consiste à vérifier si le fichier [nom-du-module].info.yml contient bien la ligne suivante après core: 8.x  :

core_version_requirement: ^8 || ^9

Ensuite, rafraichir la page "Upgrade Status".

07/11/2020 : a solutionné le problème de compatibilité D8 -> D9 pour les modules suivants :

  • pleade_barrio
  • stikyynav
  • responsive_menu
  • view_slideshow_cycle2

Si cela ne corrige pas le problème de compatibilité, essayez "Upgrade Reactor".

Récupérer une version à jour pour Drupal 9. Par exemple, projet CND.

Remplacez "à la main" le module dans les sources de l'application Drupal à migrer.

The website encountered an unexpected error

[modifier | modifier le wikicode]

Quelques modules proposés à la mise à jour peuvent générer une erreur blocante.

Différentes raisons :

Le choix de ce module est un exemple.

Lors de la rédaction de cette documentation (07/11/2020), la montée en version (07/11/2020) de LinkIt de 4.3.0 vers 6.0.0-beta1 provoque une erreur :

The website encountered an unexpected error. Please try again later.
Error: Class 'Drupal\linkit\AttributeManager' not found in Drupal\Component\DependencyInjection\Container->createService() (line 259 of core/lib/Drupal/Component/DependencyInjection/Container.php).
  • Revenir à la précédente version de LinIt en modifiant composer.json. Ne résout pas le problème. Permet de poursuivre les autres modifications.
  • tentative de passer de 4.3 à une version intermédiaire 5.0.0-beta11 : réussit !
Notice :
Ok : c'est suffisant pour la migration..

Erreur dans Pleade_barrio

[modifier | modifier le wikicode]

L'erreur n'est pas visible directement dans le sous-thème "pleade_barrio", mais dans le thème principale "Boostrap_Barrio".

La correction doit être apportée à Pleade_barrio :

Notice :
Fichier themes/custom/pleade_barrio/pleade_barrio.theme ligne 44, modification path.alias_manager en path_alias.manager..

.

BackUp_migrate

[modifier | modifier le wikicode]

La mise à jour vers la version 5.X de Barrio génére l'erreur suivante :

Error: Call to a member function create() on null in Drupal\backup_migrate\Core\Source\MySQLiSource->exportToFile() (line 47 of modules/contrib/backup_migrate/src/Core/Source/MySQLiSource.php).

Il faut ajouter le patch suivant dans le répertoire /patches/MySQLiSource.patch :

diff --git a/src/Core/Source/MySQLiSource.php b/src/Core/Source/MySQLiSource.php
index c1d90d1..bbde7bc 100644
--- a/src/Core/Source/MySQLiSource.php
+++ b/src/Core/Source/MySQLiSource.php
@@ -8,6 +8,8 @@
 use Drupal\backup_migrate\Core\Plugin\PluginCallerTrait;
 use Drupal\backup_migrate\Core\Plugin\PluginCallerInterface;
 use PDO;
+use Drupal\backup_migrate\Drupal\File\DrupalTempFileAdapter;
+use Drupal\backup_migrate\Core\File\TempFileManager;
 
 /**
  *
@@ -44,6 +46,9 @@ public function supportedOps() {
    */
   public function exportToFile() {
     if ($connection = $this->_getConnection()) {
+      $adapter = new DrupalTempFileAdapter(\Drupal::service('file_system'));
+      $tempfilemanager = new TempFileManager($adapter);
+      $this->setTempFileManager($tempfilemanager);
       $file = $this->getTempFileManager()->create('mysql');
 
       $exclude = (array) $this->confGet('exclude_tables');
diff --git a/tests/src/Functional/BackupMigrateQuickBackupTest.php b/tests/src/Functional/BackupMigrateQuickBackupTest.php
index 17a40b5..2f2559e 100644
--- a/tests/src/Functional/BackupMigrateQuickBackupTest.php
+++ b/tests/src/Functional/BackupMigrateQuickBackupTest.php
@@ -7,7 +7,7 @@
 use Drupal\Tests\BrowserTestBase;
 
 /**
- * Tests backup migrate quick backup functionality.
+ * Tests Backup Migrate quick-backup functionality.
  *
  * @group backup_migrate
  */
@@ -52,9 +52,9 @@ public function setUp() {
   }
 
   /**
-   * Tests quick backup.
+   * Tests quick backup of the database
    */
-  public function testQuickBackup() {
+  public function _testDatabaseBackup() {
     // Load the main B&M admin page.
     $this->drupalGet('admin/config/development/backup_migrate');
     $this->assertSession()->statusCodeEquals(200);
@@ -80,4 +80,34 @@ public function testQuickBackup() {
     $this->assertNotNull($row);
   }
 
+  /**
+   * Tests quick backup of the full site.
+   */
+  public function testFullSiteBackup() {
+    // Load the main B&M admin page.
+    $this->drupalGet('admin/config/development/backup_migrate');
+    $this->assertSession()->statusCodeEquals(200);
+
+    // Submit the quick backup form.
+    $data = [
+      'source_id' => 'entire_site',
+      'destination_id' => 'private_files',
+    ];
+    $this->submitForm($data, $this->t('Backup now'));
+
+    // Confirm that the form submitted.
+    $this->assertSession()->pageTextContains('Backup Complete.');
+
+    // Get backups page.
+    $this->drupalGet('admin/config/development/backup_migrate/backups');
+    $this->assertSession()->statusCodeEquals(200);
+
+    // Searching for the existing backups.
+    $page = $this->getSession()->getPage();
+    $table = $page->find('css', 'table');
+    // @todo What is the correct filename for a full-site backup.
+    $row = $table->find('css', sprintf('tbody tr:contains("%s")', '.mysql.gz'));
+    $this->assertNotNull($row);
+  }
+
 }

À intégrer dans les sources Drupal de l'installation, dans Racine de Drupal/patches/ et dans composer.json avec l'ajout de l'application du patch suivant dans la section "patches" :

"patches": {
"drupal/backup_migrate": {
	"Notice : Error: Call to a member function create() on null in Drupal\backup_migrate\Core\Source\MySQLiSource->exportToFile() (line 47 of modules/contrib/backup_migrate/src/Core/Source/MySQLiSource.php).": "web/patches/backup_migrate-entire_site_filemanager_missing-2732195-17.patch"
	}
}

Ensuite, ajouter la ligne suivante dans composer.json :

,
			"drupal/backup_migrate": {
				"Notice Error : Error: Call to a member function create() on null in Drupal___MySQLiSource->exportToFile()).": "web/patches/MySQLiSource.patch"
			}

En console, lancer :

composer update


Important :
À vérifier car le patch ne peut pas être appliqué et l'erreur disparaît ????.

bootstrap_library

[modifier | modifier le wikicode]

L'erreur suivante :

The website encountered an unexpected error. Please try again later.
Error: Call to undefined function drupal_installation_attempted() in bootstrap_library_page_attachments() (line 20 of modules/contrib/bootstrap_library/bootstrap_library.module).

Appliquer le patchsuivant :

diff --git a/bootstrap_library.module b/bootstrap_library.module
index 31f8f7a..1f1f6b4 100644
--- a/bootstrap_library.module
+++ b/bootstrap_library.module
@@ -7,6 +7,7 @@
 
 use Drupal\Component\Utility\Unicode;
 use Drupal\Core\Url;
+use \Drupal\Core\Installer\InstallerKernel;
 
 define('BOOTSTRAP_MIN_PLUGIN_VERSION', '2.0.0');
 
@@ -17,7 +18,7 @@ define('BOOTSTRAP_MIN_PLUGIN_VERSION', '2.0.0');
  */
 function bootstrap_library_page_attachments(array &$page) {
   // Don't add the JavaScript and CSS during installation.
-  if (drupal_installation_attempted()) {
+  if (InstallerKernel::installationAttempted()) {
     return;
   }
   // Don't add the JavaScript and CSS on specified paths or themes.
{

Puis une autre erreur :

Call to undefined method Drupal\Component\Utility\Unicode::strtolower() in _bootstrap_library_check_url()

Appliquer le patch dans bootstap_library.module :

diff --git a/bootstrap_library.module b/bootstrap_library.module
index c95a2bb..f17d398 100644
--- a/bootstrap_library.module
+++ b/bootstrap_library.module
@@ -5,7 +5,6 @@
  * Primarily Drupal hooks.
  */
 
-use Drupal\Component\Utility\Unicode;
 use Drupal\Core\Url;
 use Drupal\Core\Installer\InstallerKernel;
 
@@ -112,11 +111,12 @@ function _bootstrap_library_check_url() {
   // Convert path to lowercase. This allows comparison of the same path
   // with different case. Ex: /Page, /page, /PAGE.
   $config = \Drupal::config('bootstrap_library.settings');
-  $pages = Unicode::strtolower(_bootstrap_library_array_to_string($config->get('url.pages')));
+  $pages = mb_strtolower(_bootstrap_library_array_to_string($config->get('url.pages')));
 
   // Compare the lowercase path alias (if any) and internal path.
   $path = Url::fromRoute('<current>')->toString();
-  $path_alias = Unicode::strtolower(\Drupal::service('path.alias_storage')->lookupPathAlias($path, 'en'));
+  $langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
+  $path_alias = mb_strtolower(\Drupal::service('path_alias.manager')->getAliasByPath($path, $langcode));
   $page_match = \Drupal::service('path.matcher')->matchPath($path_alias, $pages);
   if ($path_alias != $path) {
     $page_match = $page_match || \Drupal::service('path.matcher')->matchPath($path, $pages);

Message .update.php

[modifier | modifier le wikicode]
Notice: Undefined variable: site_path in system_requirements() (line 716 of core/modules/system/system.install).
  • Réglé par l'ajout de la variable dans setting.php
$settings['config_sync_directory'] = '.';

== Références == <references/>