Mettre à jour un projet Symfony 2

Par @jbnahan69
Attention, cet article est ancien. Les informations ou instructions qu'il contient peuvent ne plus fonctionner.

Dans cet article qui me servira d'aide mémoire, je vais tenter de vous présenter ma méthode de mise à jour d'un projet Symfony 2.

Cette méthode vaut ce qu'elle vaut mais je n'ai rien trouvé de tel sur internet ! Même en anglais.

Plantons le décor

Nous avons un projet qui fonctionne avec Symfony 2.2.11 et nous souhaitons le faire passer sur la version LTS de Symfony 2 soit la version 2.3.x. En effet, la branche 2.2 n'est plus maintenue.

Comme de nombreux projets, j'utilise des librairies et bundles tiers gérés via l'utilitaire Composer.

Avant de rentrer dans le vif du sujet et, comme je compte pouvoir revenir en arrière, je commence par installer mon application dans un nouveau dossier. L'application doit fonctionner parfaitement avant la mise à jour.

Maintenant que nous avons notre application installée, voyons comment mettre à jour les librairies.

Récupération de la version cible

Sur le site de l'éditeur de Symfony, je commence par télécharger la version souhaitée du framework sans les vendors (without vendors). Ou je télécharge depuis le dépôt GitHub de la standard edition pour Symfony jusqu'à 3.4 ou le dépôt GitHub du Website Skeleton pour Symfony 4 et plus.

Dans l'archive, je récupère le fichier "composer.json" afin de le comparer à celui du projet.

Lors de la comparaison, je modifie le fichier "composer.json" de mon projet et modifie les versions des packages.

Mise à jour des librairies tierces

Pour les librairies tierces, j'utilise le site packagist pour vérifier la compatibilité de chaque version utilisée. Au besoin, je recherche la version compatible et je change également la version dans le fichier "composer.json" du projet.

A chaque changement de version pour une librairie tierce, je vérifie que le fonctionnement n'a pas changé. Si c'est le cas, il faudra mettre à jour mon code.

Téléchargement des mises à jour

Dans un terminal, je me place à la racine du site et j'exécute la commande qui peut faire peur :

$ php composer.phar update

Et oui, cette commande va chercher à mettre à jour toutes les librairies. L'exécution est longue et lorsque le téléchargement commence, un soulagement se fait sentir. Aucun conflit n'a été trouvé; ça ne veut pas dire qu'il n'y aura pas d'erreur(s) lors de l'exécution.

Test des nouvelles librairies

Une fois les nouvelles versions téléchargées et installées, commence la phase de débug !

La première chose que je fais est de vider les caches en supprimant les dossiers présents dans le dossier app/cache (var/cache depuis Symfony 3). Puis, dans la console, j'exécute les commandes suivantes :

$ php app/console cache:warmup

$ php app/console cache:warmup --env=prod

Si aucune erreur n'est présente à ce moment-là, vous n'avez pas d'erreur au niveau des annotations.

Voici celle que j'ai eue :

@Assert\MaxLength(100) est remplacé par @Assert\Length(max=100)

Si vous utilisez le bundle JMS/SerializerBundle et si vous êtes passés de la version 1.x à la version 2.0, les annotations ont changé de place. Il faut donc changer toutes les instructions "use" de vos fichiers.

Maintenant que le kernel démarre, passons aux choses sérieuses.

Avez-vous écrit vos tests unitaires et fonctionnels ? Non, c'est une mauvaise idée mais il n'est pas trop tard pour le faire.

Pour détecter toutes les erreurs, je teste le logiciel dans les moindres détails. A chaque erreur rencontrée, je commence par écrire les tests unitaires et fonctionnels permettant de générer l'erreur. Le test échouera bien sûr mais sera concluant une fois la correction apportée.

Pourquoi perdre du temps à écrire des tests ? Et bien pour en gagner plus tard. Un test écrit pour un bug permet d'éviter son retour !

Car une fois que tous ces tests seront écrits, vous les exécuterez avant chaque livraison pour vérifier que tout fonctionne bien. Il n'est pas exclu qu'un bug passe au travers du filet.

Mise en production

Après quelques heures de travail, le logiciel fonctionne bien. Que reste-il à faire ?

Sauvegarder les corrections du code dans le gestionnaire de codes sources ainsi que les fichiers "composer.json" et "composer.lock".

Ce dernier est le précieux sésame pour la mise en production. C'est grâce à lui et la commande suivante que l'installation se passera sans problème en production.

$ php composer.phar install --prefer-dist

Mon petit truc pour la mise en production : installer un nouveau site et une fois le nouveau site fonctionnel, réaliser la bascule. Ainsi, la coupure est limitée dans le temps.

D'autre part, j’évite de livrer de nouvelles fonctionnalités avec un changement de version du framework, surtout si elles modifient la base de données. Mais là chacun fait selon ses circonstances.

Bonne mise à jour ! Contactez moi si vous avez des difficultés !

 

php
Author avatar
Jean-Baptiste Nahan

Consultant Expert Web, j'aide les entreprises ayant des difficultés avec leur projet Web (PHP, Symfony, Sylius).

@jbnahan69 | Macintoshplus | Linkedin | JB Dev Labs