Image

Développement Drupal avec Vagrant sous Windows

Si comme moi vous persistez à utiliser Windows pour votre travail... Bin oui, tant que les jeux sortent pas sous Linux... Voici un descriptif de vos solutions de développement.

Logiciel LAMP sous Windows

Il existe aujourd'hui plusieurs solutions pour simplement mettre en place un environnement de développement sous Windows pour Drupal.

Acquia propose une solution très pratique, une sorte d'EasyPhp ou Wamp (ou Xamp) tout prêt :

Il y a encore quelques années c'était un peu la base pour tout développeur web sous Windows, installer un logiciel qui propose un environnement type serveur Apache MySQL Php, configurer un peu et c'est parti.

Le gros problème avec ce système est la compatibilité et la réplication de l'environnement. Pour être sûr de ne pas avoir de surprise il fallait que l'environnement de production soit au plus proche de celui de développement et dans certains cas il devient difficile de "débugger" des problèmes liés à l'environnement puisqu'on est bloqué avec les versions fourni par notre logiciel AMP.

Avec Acquia Dev Desktop on retrouve le même problème, même si cela reste une excellente solution pour développer rapidement sans devoir être administrateur système.

Virtualisation d'environnement sous Windows

Heureusement la virtualisation est venue remettre tout ça à plat en fournissant une solution robuste et efficace.

Je reproduis l'environnement de production sur ma machine ou je peux installer moi même un serveur LAMP sans limitations. Je parle des logiciels tels que Virtualbox ou VmWare... Il en existe d'autres, mais aujourd'hui si vous cherchez un outil gratuit et robuste, Virtualbox est la meilleure solution.

Pour accéder à votre machine, la virtualisation permet également de mette en place des dossiers partagés, par exemple dans le cas d'un développement web on va partager la racine du serveur web pour avoir accès à notre code même quand la machine virtuelle est éteinte. Mais cela va malheureusement amener quelques soucis de performance sous Windows, qui pourront être réglés plus bas dans cet article.

Reste un problème de temps, bien configurer un serveur est un métier à part entière ! Sans parler du suivi et des mises à jour.

Virtualisation à la demande sous Windows

Une solution est apparue pour répondre à ce besoin : Vagrant
Son principe est simple, on décrit un environnement dans un fichier texte et le logiciel va s'occuper de le créer en machine virtuelle. Il va tout faire, installer le Linux, les logiciels etc... Le premier lancement sera un peu long mais ensuite la machine virtuelle sera lancée directement.

Vagrant est donc en fait un "pilote" de machine virtuelle et également un "provisionner" c'est-à-dire qu'il peut effectuer des modifications et lancer des actions sur la machine virtuelle.
Il existe plusieurs "provisionner", ça peut-être du Shell directement ou Chef, Puppet, Ansible ou encore Docker. Le principe est souvent le même : un fichier texte décris les actions que doit effectuer le provisionneur, installer un logiciel, configurer, etc. Il y a peu Ansible n'était pas utilisable sous Windows, heureusement les depuis Vagrant 1.7 il existe un Ansible local, mais pour l'instant il reste des bugs sur la 1.8.1.

C'est bien beau, mais il faut tout de même au moins créer un fichier Vagrant pour tout régler, ce qui peut prendre du temps... heureusement d'autres se chargent de ce boulot ! Malheureusement entre les fichiers Vagrant disponibles chez l'éditeur de Vagrant, les fichiers de configuration Chef, Puppet, Ansible et Docker disponibles chacun sur leur repos sans parler de ceux sur GitHub. Vous allez passer pas mal de temps pour trouver ce qui vous convient. Et bien sûr Vagrant utilise des plugins, dont on peut trouver une liste ici : https://github.com/mitchellh/vagrant/wiki/Available-Vagrant-Plugins

Vagrant et Drupal sous Windows

Il existe plusieurs solutions, toutes prêtes pour Drupal : Liste des projets Vagrant pour Drupal.

Mais pour vous simplifier la vie je vais vous proposer deux environnements qui aujourd'hui répondent au mieux à ce besoin :

Drupal VM est soutenu par Acquia, c'est un développeur de chez eux qui le maintient et il le fait très bien. Le provisionneur est Ansible.
VDD est un projet qui évolue moins vite, mais sa version de dev est utilisable et fourni tout ce qu'il faut. Le provisionneur est Chef.

Installation Drupal VM sous Windows

Pour mon exemple de mise en place je vais prendre Drupal VM.

Logiciels

Vous allez devoir installer le gestionnaire de virtualisation Virtualbox

Optionnel, installation de Git pour Windows (il faudra bien le faire si vous n'y êtes pas encore)

Puis installation de Vagrant

Vagrant fourni un éxecutable, mais pas d'interface graphique, pour le lancer vous devez donc passer soit par la bonne vielle cmd Windows ou le plus récent PowerShell.
Après l'installation, il est bon d'installer quelques plugins, pour cela lancer votre fenêtre cmd ou PowerShell :

vagrant plugin install vagrant-cachier vagrant-hostsupdater vagrant-vbguest

Performances sous Windows

Comme vu précédemment nous allons devoir partager notre dossier de développement avec la machine virtuelle, mais la manière dont on va le partager va grandement influencer les performances.

Avec Virtualbox les solutions sont

  • vboxfs : système de Virtualbox pour le partage, assez lent...
  • samba : Partage réseau du dossier, malheureusement bien que certains disent que cela fonctionne bien je trouve ça toujours horriblement lent, même avec SMB3
  • rsync : Rapide, mais ne fonctionne que dans un sens : depuis votre machine vers la machine virtuelle ! autant dire que cela ne sert à rien !
  • nfs : Rapide ! mais ne fonctionne pas sous windows, il faudra un plugin Vagrant qui repose sur le logiciel Winnfsd, voir plus bas la mise en place

Si vous êtes pressé, vous pouvez utiliser vboxfs mais si vous avez besoin d'un environnement plus rapide je vous conseil la solution Winnfsd, pour smb vous risquez de rencontrer des problèmes de droits.

Voici un petit test des performances sur un Drupal 7 avec plusieurs modules, du contenu, une vue page avec deux vues blocs, en visiteur cache Drupal désactivé. C'est une mesure obtenue avec le module Performance sur un test ab -n 200 -c 10.

 

Natif (VM)

vboxfs

NFS

SMB

ms (Max)

883.7

2442.5

1022.7

8170.0

ms (Avg)

510

1156.7

598.4

3414.8

Ce test n'est qu'indicatif, mais au ressenti c'est flagrant, Samba est très lent, mieux vaut garder le montage par défaut de Virtualbox. Le NFS est le mieux mais il faut des efforts pour le mettre en place et la stabilité à long terme n'est pas garantie.
Le natif, c'est à dire sans montage est évidement le plus rapide, mais le nfs le talonne de prêt, c'est donc une solution à suivre.

Préparation de votre VM

Récupérez Drupal VM et extraire l'archive dans votre dossier de travail (Prévoir plusieurs Go de libres)

Vous devez ensuite configurer un minimum, dans le dossier extrait, copier example.config.yml en config.yml, ouvrez ce fichier avec votre éditeur de texte favori (Notepad++ ?).

Le plus important sera de choisir le dossier de synchronisation, sous Windows le mieux est de créer un dossier au même niveau que drupal-vm-master, par exemple "www", ce qui donne en configuration :

vagrant_synced_folders:
  # The first synced folder will be used for the default Drupal installation, if
  # build_makefile: is 'true'.
  - local_path: ../www
    destination: /var/www/drupalvm
    type: ""
    create: true

Ensuite, selon la performance de votre ordinateur vous pouvez augmenter un peu les ressources alloués à votre VM : 

vagrant_memory: 2048
vagrant_cpus: 4

Si vous voulez que vagrant s'occupe d'installer également un Drupal 8 tout prêt, vous devez copier et adapter le fichier example.drupal.make.yml, sinon vous pouvez annuler le makefile :

build_makefile: false
install_site: false

Enfin vous pouvez choisir d'installer ou pas certaines choses dans la section :

installed_extras

Pour ma part je n'installe pas varnish et j'ajoute nodejs.

Partage plus performant en nfs

Si vous avez besoin de performance, voici le meilleur moyen de faire fonctionner nfs :

Installer le plugin vagrant

vagrant plugin install vagrant-winnfsd

Malheureusement au moment de cet article il y a quelques soucis et modifications bienvenus pas encore mergés dans ce projet, je vous conseille donc de le remplacer par ce fork : https://github.com/GuyPaddock/vagrant-winnfsd, pour cela écrasez les ficher dans le dossier vagrant choisis lors de l'installation (.vagrant.d\gems\gems\vagrant-winnfsd-1.1.0).

Un autre problème est qu'un seul dossier partagé nfs peut-être mis en place, hors la VM partage également le dossier du fichier vagrant, il faudra donc faire deux modifications dans la config :

vagrant_synced_folder_default_type: ""

Correspond à un montage natif (vboxfs) par défaut pour le dossier /vagrant, ensuite vous pouvez régler le montage nfs :

vagrant_synced_folders:
  # The first synced folder will be used for the default Drupal installation, if
  # build_makefile: is 'true'.
  - local_path: ../www
    destination: /var/www/drupalvm
    type: nfs
    mount_options: ["rw","vers=3","udp","nolock"]
    create: true

Enfin pour éviter des problèmes de droits il va falloir ajouter des directives de configuration Vagrant, pour éviter de modifier le fichier sources, il suffit de créer un fichier Vagrantfile.local au même niveau que Vagrantfile dans le dossier drupal-vm-master.

config.winnfsd.uid=900
config.winnfsd.gid=900
config.winnfsd.logging="off"
config.winnfsd.halt_on_reload="on"

L'uid et le gid correspondent à vagrant. En cas de problème vous pouvez passer l'option logging à on, une fenêtre se lancera avec le log de Winnfsd.

Lancement de votre VM

Sans Git vous devez lancer une commande cmd ou PowerShell (en administrateur pour que le plugin vagrant-hostsupdater s'occupe de modifier votre fichier host) directement dans le dossier drupal-vm-master au même niveau que le fichier Vagrantfile (c'est le fichier de description Vagrant).

Lancement de la VM, prévoir au moins ~15min la première fois et une connexion internet correcte.

vagrant up

Beaucoup de blabla et à la fin avec un peu de chance :

==> drupalvm: localhost                  : ok=192  changed=91   unreachable=0    failed=0

Il vous suffit de lancer votre navigateur et pointer sur http://dashboard.drupalvm.dev

Étiquettes
vagrant drupal virtualbox

Commentaires