Voici un petit billet qui va servir de pense-bête, checklist, procédure pour mettre à jour une plateforme Prestashop 1.6 en Prestashop 1.7.

L’un de nos client, Direct-filet, souhaitait migrer une de ses boutiques d’un Prestashop 1.6 vers sa version 1.7.

Nous y sommes arrivés non sans quelques gouttes de sueur. En effet, à ce jour, le module « 1 Click upgrade » ou « Mise à jour en 1 clic » ne permet pas de mise à jour vers la version 1.7.

Prestashop l’annonce, cela ne sera pas facile.

La plupart des procédures pour une mise à jour proposent d’exporter les données en fichiers et de les importer par la suite. Cette procédure convient parfaitement à une « petite boutique » sans trop de modules. Cette technique à l’avantage de partir d’un Prestashop « neuf » avec de vieilles données. L’inconvénient majeur est la non reprise des données qui ne sont pas prévues pour être exportées. Notamment toutes les données stockées par les modules. Ce qui peut être problématique lors de l’utilisation de modules tel que les produits dynamiques, des avis clients, … qui associent des données à des produits, clients, …..

Un autre risque serait d’installer sur la plateforme Prestashop 1.7 un module compatible 1.7 qui ne stocke pas ses données de la même manière entre la version 1.6 et 1.7. Cela rend le transfert de la base de données très difficile en fonction de ces modules.

Nous avons donc décidé de mettre à jour la plateforme sans utiliser les exports/imports.

Mise à jour idéale

Pré-requis

Avant de tenter une migration, il faut valider certains points :screenshot-addons.prestashop.com-2017-12-11-10-50-59

  • Bien vérifier sur le site https://addons.prestashop.com/fr/ que les modules utilisés sont compatibles avec la version 1.7.  Cette phase est très importante, car il y a encore de nombreux modules qui ne sont pas compatibles.
    • Si un module n’est pas compatible, est-il obligatoire pour ma boutique ? Si oui
      • Demander au développeur si une version compatible Prestashop 1.7 est disponible
      • Chercher un module qui propose la même fonctionnalité et compatible Prestashop 1.7
      • Demander à une agence de développement (Pliciweb) par exemple, de rendre le module compatible

Heureusement Prestashop a développé une version béta du module « Mise à jour en 1 clic« pour effectuer cette mise à jour (Plus d’information). Ce module permet de basculer d’une version 1.6 vers une version 1.7.1.0.

!!! Attention !!!

Cela peut paraître trivial, mais une telle mise à jour n’est pas anodine et nous déconseillons TRÈS TRÈS fortement d’appliquer cette mise à jour directement sur votre environnement de production.

Le plus simple est de créer un environnent de préproduction sur votre serveur avec une copie des données et tester sur cet environnement de préproduction. Si cela n’est pas possible, récupérez les données de votre boutique (Fichiers + bases de données) dans un environnement local et testez localement. Dans cette dernière configuration, vous pourriez rencontrer des difficultés le jour de la mise à jour en production.

Astuce

Pour éviter de mettre à jour la base de données de production alors que vous pensez être en préproduction, voici notre « petite » procédure qui peut épargner bien du stress :

  • Exporter la base de données dans un fichier database.sql
  • Exécuter en remplaçant les noms de domaines (ex : « ndd »)
    • sed -i "s/www\.ndd\.com/www.ndd-preprod.com/g" database.sql
  • Importer le fichier database.sql dans la base de données de préproduction
  • Copier les fichiers de l’environnement de production vers l’environnement de préproduction.
  • Accéder à http(s)://www.ndd-preprod.com/admin/index.php?controller=AdminMaintenance
  • « Activer la boutique », cliquer sur Non et supprimer toutes les ips
  • Accéder à votre site de préproduction http(s)://www.ndd-preprod.com/
  • Si celui-ci est en maintenance, vous travaillez bien en totalité sur l’environnement de préproduction.
  • Si ce n’est pas le cas, vérifier que le fichier /config/setting.inc.php contient bien les informations de connexion à l’environnement de préproduction.

Très bien, notre environnement de préproduction est prêt, il ne vous reste plus qu’a accéder à la page des modules http(s)://www.ndd-preprod.com/admin/index.php?controller=AdminModules, Ajouter un module, et sélectionner le module béta que vous avez préalablement téléchargé.

!!! Attention !!! : Une fois l’ajout du module de mise à jour réalisé, Prestashop va vous indiquer une mise à jour pour ce module, il ne faut surtout pas la faire !

 

Il suffit ensuite de configurer le module, pour sélectionner « Channel » : « Major release » et sauver.

Il vous suffit ensuite de cliquer sur les boutons « next », cocher toutes les cases et espérer que tout ce termine avec la phrase verte « Upgrade process done ».

Nous vous conseillons durant cette mise jour de surveiller 2 fichiers de logs qui peuvent s’avérer utiles en cas d’erreur :

  • Votre fichier de log apache généralement situé dans /var/log/apache2/error.log
  • Une fois les fichiers décompressés, le fichier de log de Prestashop se situe dans /app/logs/prod/ (Suite à l’adoption de Symfony)

 

!!! Attention !!! : Cette mise à jour désactive tous les modules non natifs de Prestashop et utilise le thème « Classic » par défaut.

 

Il vous reste à suivre les étapes suivantes :

  • Installer votre nouveau thème.
  • Supprimer le cache.
  • Ajouter votre IP dans l’onglet de maintenance.
  • Activer 1 par 1 vos modules et tester à chaque fois que le site Internet s’affiche correctement. Je sais, c’est fastidieux, mais tellement pratique lorsque l’on rencontre des erreurs.
  • Notez toutes les manipulations que vous effectuez afin de les reproduire le jour de la mise à jour en production (ou alors créez un script qui vous permettra d’automatiser la mise en ligne).

 

Voici le processus idéal d’une mise à jour.

 

Les problèmes et leurs résolutions ….

Bien sûr cela n’arrive jamais 🙂

Voici une liste d’erreurs que nous avons pu rencontrer et les solutions que nous avons utilisées.

Astuce

Au vu des changements profonds opérés par cette mise à jour, nous vous conseillons en plus de votre espace de production, d’avoir un espace qui contient uniquement un Prestashop proprement installé et un autre espace qui contient un Prestashop proprement installé avec votre nouveau thème. Cela vous permettra de déterminer ce qui cause des dysfonctionnements : Un Bug de Prestashop pas encore corrigé, un bug sur le thème et ses modules, un de vos modules, une configuration de votre boutique.

Erreur fatale lors de la mise à jour de la base de données

Lors de la phase de mise à jour de la base de données, nous rencontrions cette erreur :

PHP Fatal error:  Cannot use PrestaShopBundle\\Service\\Database\\Upgrade as Upgrade because the name is already in use in /home/xxxxx/public_html/preprod/src/PrestaShopBundle/Install/Install.php on line 56

Lors du lancement de la mise à jour, le module « Mise à jour en 1 clic », déploie les fichiers nécessaires à la mise à jour dans un répertoire temporaire avec un nom unique, puis avec ce « micro noyau » déployé, il va commencer la mise à jour. Sa première étape consiste à télécharger la version de Prestashop 1.7 pour ensuite la décompresser dans le répertoire. Durant cette décompression, un fichier vient aussi déclarer l’espace de nom Upgrade déjà utilisé par le micro noyau. Ne pouvant pas accéder au micro noyau car il se crée lors du lancement de la mise à jour nous avons opté pour la solution de chargement d’un Prestashop customisé.

Pour ce faire, nous avons téléchargé la dernière version en date de Prestashop 1.7.2.4 que nous avons dézippé. Nous avons ensuite modifié le fichier /src/PrestashopBundle/Install/Install.php puis créé à nouveau le fichier zip. Voici la liste des modifications apportées  :

  • Mise en commentaire de la ligne 55 « //use PrestaShopBundle\Service\Database\Upgrade; »
  • Remplacement de la ligne 274 par « $schemaUpgrade = new PrestaShopBundle\Service\Database\Upgrade(); »

 

Ensuite nous avons indiqué à Prestashop d’utiliser notre fichier zip pour se mettre à jour.

Pour ce faire :

  • Copier le fichier zip modifié dans le répertoire /admin/autoupgrade/download
  • Dans la configuration du module « Mise à jour en 1 clic », sélectionner le canal « Archive locale » et prestashop_1.7.2.4.zip et indiquer 1.7.2.4
  • Puis lancer la mise à jour
  • Une fois la mise à jour effectuée, modifier à nouveau le fichier /src/PrestashopBundle/Install/Install.php pour revenir à son état initial

 

Erreur lors de la mise à jour du module ps_linklist

Durant la mise à jour des modules, dans les fichiers de logs, nous avons aperçu l’erreur suivante :

PHP Catchable fatal error:  Argument 2 passed to LinkBlockPresenter::__construct() must be an instance of Language, null given, called in /home/webmaster/public_html/preprod/modules/ps_linklist/ps_linklist.php on line 64 and defined in /home/webmaster/public_html/preprod/modules/ps_linklist/src/LinkBlockPresenter.php on line 8

Nous l’avons corrigée durant la mise à jour en modifiant le fichier /modules/ps_linklist/ps_linklist.php à la ligne 64 et en la remplaçant par

$this->linkBlockPresenter = new LinkBlockPresenter(new Link(), new Language());

 

Mise à jour avec une boucle infinie

Nous avons été confronté à une mise à jour qui ne s’arrêtait jamais d’être exécutée sans aucun message d’erreur.

Nous avons réussi à identifier l’erreur en modifiant le fichier/modules/autoupgrade/classes/Tools14.php et la méthode file_get_contents. Nous avons supprimé le masquage d’erreur ‘@’ sur les appels  » @stream_context_create » à la ligne 1264 et « @file_get_contents » à la ligne 1277. Cela nous a permit de comprendre que notre machine de test n’avait pas d’entrée dans le fichier host qui permettait de lier le nom de domaine au serveur. En effet, lors de la mise à jour, Prestashop fait des appels Ajax jusqu’à obtenir un retour. Si une erreur apparaît et que cela renvoi vide à l’appel de l’adresse, celle-ci est rappelée indéfiniment. Ce qui entraîne une boucle infinie.

 

Remplacement de Svn par Git

Lors de cette mise à jour, nous avons souhaité migrer notre outil de versionning de Svn vers Git. Voici les étapes mises en place :

Dans un environnement local :

  1. Forker le github prestashop sur notre git
  2. Lancer le One click upgrade
  3. Installer le thème
  4. Lancer une mise à jour des modules
  5. Commit
  6. Nettoyage des corrections effectuées durant la mise à jour et nettoyage (Fait avec un diff entre un prestashop 1.7 neuf et notre environnement)
  7. Commit
  8. Application de modifications

Sur le serveur :

  • Lancer le One click upgrade
  • Installer le thème
  • Lancer une mise à jour des modules
  • Redescendre la repository dans un répertoire git dans la révision de l’étape 5 de l’environnement local
  • Copier les fichiers de la production dans le répertoire git
  • Faire un git pull sur le répertoire git
  • Remplacer le répertoire de production par le répertoire git.

 

En dernier recours

Si vous n’arrivez toujours pas à mettre à jour votre boutique avec la méthode proposée plus haut, vous pouvez télécharger un Prestashop, dézipper le contenu du répertoire par dessus vos fichiers, et lancer dans un navigateur l’adresse http(s)://www.ndd.com/install/upgrade/upgrade.php. Cette dernière tentative doit être votre ultime recours.

 

Vous pouvez aussi demander à Prestashop un devis pour déléguer la migration. Rendez vous dans la rubrique de pied de page du site https://addons.prestashop.com/fr/.

 

Si vous souhaitez un éclaircissement, préciser un point, mentionner une erreur ou une omission, n’hésitez pas à nous le signaler dans les commentaires.