Il y a certains changements, dans notre manière de travailler, qui facilitent tellement la vie (coucou Git) qu'une fois adoptés, on ne se voit plus revenir en arrière.
Et bien chez nous, à élao, depuis quelques années on est passé aux environnements de développement virtuels. Et on n'envisage pas de s'en passer !
Qu'est-ce qu'un environnement de développement virtuel ?
C'est une machine virtuelle (que nous appellerons simplement VM) qui tourne sur mon ordinateur et dans laquelle vit mon application.
L'idée c'est d'avoir tout l'environnement de mon application (version de PHP, configuration Nginx, packages Node ou extensions PHP particulières) installé, configuré et fonctionnel dans cette VM et ce de manière automatique (c'est à dire au lancement d'une simple commande, sans intervention manuelle).
Les avantages de la machine virtuelle
- (Re)monter et supprimer un projet sans effort sur ma machine à l'aide d'une seule commande.
- Partager le même environnement au sein d'une équipe projet.
- Développer dans des conditions et dans un contexte proches de la prod (même moteur de base de données, même version de PHP, etc.).
- Accéder au projet localement derrière une url intelligible. Ex : http://monprojet.vm
- Pouvoir faire tourner plusieurs projets dépendant de différentes versions de PHP sur sa machine.
- Versionner tout ce contexte projet au même titre que son code source.
Manalizer son projet
Et pour faire ça nous utilisons Manala, un outil petit et puissant qui permet de décrire l'environnement de notre projet sous la forme d'une configuration texte, puis de monter et lancer une VM selon cette recette.
Pré-requis
Tout d'abord, installons l'outil de configuration en ligne de commande dédié : manalize
curl -LSs https://raw.githubusercontent.com/manala/manalize/master/installer.php | php
💡 Note : il est aussi possible de l'installer via git ou composer.
Ensuite, Manala s'appuie sur Vagrant et VirtualBox pour créer des machines virtuelles et sur Ansible pour les configurer. Il nous faudra donc installer sur notre ordinateur tous ces pré-requis :
💡 Note : manalize est capable de nous confirmer que tous les pré-requis sont correctement installés avec la commande :
manalize check:requirements
Et voila, nous sommes prêts à manalizer notre projet web !
Au lancement
Pour l'exemple, je vais créer un nouveau projet Symfony vide avec :
symfony new --full acme
cd acme
Puis créer un environnement virtuel Manala pour cette application :
manalize setup .
À travers son outil de setup interactif, Manala me demande de faire un certain nombre de choix concernant les technologies nécessaires au fonctionnement de mon projet à intégrer dans la VM.
Puisque nous travaillons beaucoup avec Symfony chez élao, Manala propose une pré-configuration adaptée aux projets Symfony, embarquant entre autres PHP et Mysql. C'est ce que j'utiliserai ici :
💡 Qu'est-ce qui est créé ?
Vangrantfile
: Décrit les propriétés de la machine virtuelle pour Vagrant.ansible/.manalize.yml
: Fichier de configuration Manala persistant les choix faits lors du setup interactif, à partir duquel sont générés les fichiers de configuration Ansible.ansible/*.yml
: Fichiers de configuration Ansible configurant le système de fichiers de la VM, Nginx, PHP et toute technologie nécessaire au fonctionnement du projet.Makefile
: Liste de commandes Make servant à piloter la VM et le projet depuis la console.
💡 Note : Ces fichiers font maintenant partie du code source du projet et seront versionnés et publiés dans Git. Ils pourront également évoluer et s'étoffer au fur et à mesure de la vie du projet.
Au quotidien
Créer la VM
Lorsque je viens de mettre en place Manala sur mon projet, ou bien lorsque je clone un projet existant, utilisant déjà Manala, sur ma machine hôte; je dois d'abord créer la machine virtuelle :
make setup
Lancer la VM
Ensuite, je n'aurai plus qu'a lancer cette VM à chaque fois que je démarre mon ordinateur et que je veux développer sur ce projet :
vagrant up
Mon app est maintenant disponible à l'adresse suivante : http://acme.vm
Mission accomplie ! 🎉
Entrer dans la VM
Mon projet ne tourne pas localement sur mon poste, mais dans une machine virtuelle (c'était le but).
C'est pourquoi, pour accéder à des fonctions internes comme la console Symfony, je vais devoir lancer bin/console
dans la VM; afin que le script s'execute dans le contexte de la VM, avec sa version de PHP et son système de fichiers.
Pour cela, je me connecte en SSH à la VM (comme je le ferais à un serveur web distant hébergeant mon application), grâce à la commande suivante fournie par vagrant :
vagrant ssh
Une fois connecté, je suis dans le répertoire de mon application et peux accéder à la console Symfony :
💡 Notez le chemin du répertoire courant : je suis dans le système de fichiers de la VM, plus sur ma machine !
Le tester, c'est l'adopter !
Nous utilisons Manala depuis plusieurs années pour nos environnements de développement, l'outil est maintenant mature et stable.
Il est également totalement open-source, disponible et utilisable par tous.
Vous avez un projet qui tourne localement sur votre machine ?
Pourquoi ne pas tester un petit manalize setup .
dès maintenant et voir votre projet tourner dans un environnement virtuel ?
Une dernière chose ...
En 2019, une nouvelle mouture de manalize
devrait pointer le bout de son nez, encore plus cool !
Mais ça fera l'objet d'un prochain article. 😉
Breaking news!
Cette nouvelle mouture s'apelle simplement Manala et consiste en un binaire Go et un ensemble de recipes pour bootstraper vos projets, que ce soit en utilisant Vagrant, Docker, Ansible, et bien plus encore !