DDEV, une plateforme puissante pour simplifier l'environnement de développement local

11 juin 2021 - by Olivier Brunau
Olivier Brunau
ddev

Qu'est-ce que DDEV ?

DDEV est un outil de développement PHP open source basé sur docker.

Il permet, en quelques minutes, de mettre en place un environnement adapté à chaque projet avec tous les outils nécessaires pour être performant sans se préoccuper de la gestion des conteneurs Docker. 

Quels sont les pré-requis à son utilisation?

Le seul pré-requis est l'installation de Docker > 18.06 et Docker-compose > 1.21.0.

Pour MacOS et Linux l'installation recommandée se fait avec Homebrew/Linuxbrew.

Pour Windows 10, il vaut mieux commencer par installer WSL2 (Windows subsystem for Linux).

Toutes les étapes de l'installation se trouvent dans la documentation de DDEV.

Pour quels projets l'utiliser?

Pour l'instant, DDEV est dédié au développement PHP et propose des configurations adaptées aux principaux CMS du marché : Backdrop, Drupal 6, Drupal 7, Drupal 8, Drupal 9, Laravel, Magento, Magento 2, PHP, Shopware 6, TYPO3, WordPress.

Les images dockers utilisées sont maintenues par la communauté open source et mises à jour régulièrement. Elles contiennent les outils de développement courants (Composer, Node.js, Xdebug, Blackfire).

Configuration d'un nouveau projet

Il faut tout d'abord créer un dossier pour le nouveau projet, se mettre dedans et lancer la commande ddev config:

$ mkdir new-project
$ cd new-project/
$ ddev config
Creating a new ddev project config in the current directory (/home/olivier/sites/new-project)
Once completed, your configuration will be written to /home/olivier/sites/new-project/.ddev/config.yaml

Project name (new-project):

DDEV demande de renseigner le nom du projet, le docroot et le type de projet. Pour cet exemple, j'ai créé un projet Drupal 9.

Docroot Location (current directory): web
Warning: the provided docroot at /home/olivier/sites/new-project/web does not currently exist.
Create docroot at /home/olivier/sites/new-project/web? [Y/n] (yes):
Created docroot at /home/olivier/sites/new-project/web.
Found a php codebase at /home/olivier/sites/new-project/web.
Project Type [backdrop, drupal6, drupal7, drupal8, drupal9, laravel, magento, magento2, php, shopware6, typo3, wordpress] (php): drupal9

Suivant le type de projet choisi, DDEV peut créer des fichiers supplémentaires.

Ensuring write permissions for new-project
No settings.php file exists, creating one
Existing settings.php file includes settings.ddev.php
Configuration complete. You may now run 'ddev start'.

Au lancement de la commande ddev start, DDEV crée les conteneurs Docker nécessaires et gère automatiquement les permissions.

$ ddev start
Starting new-project...
Pushed mkcert rootca certs to ddev-global-cache/mkcert
Running   Command=ip address show dev docker0
Building db
Building web
Creating ddev-new-project-db ...
Creating ddev-new-project-db ... done
Creating ddev-new-project-web ...
Creating ddev-new-project-dba ...
Creating ddev-new-project-web ... done
Creating ddev-new-project-dba ... done
Creating ddev-router ...
Creating ddev-router ... done
Ensuring write permissions for new-project
Existing settings.php file includes settings.ddev.php
Ensuring write permissions for new-project
Successfully started new-project
Project can be reached at https://new-project.ddev.site https://127.0.0.1:59152

L'étape suivante consiste à installer Drupal à l'aide de Composer. La commande est lancée dans le conteneur à travers DDEV.

$ ddev composer create "drupal/recommended-project"

Il est également indispensable d'installer Drush.

$ ddev composer require drush/drush

Après cela, on peut terminer l'installation en accédant au site depuis un navigateur en lançant la commande ddev launch. Le site se lance en https avec un nom de domaine dédié au projet : https://new-project.ddev.site/.

$ ddev launch

Un outil adaptable

La configuration d'un projet se fait très facilement à l'aide d'un fichier config.yml, pas besoin de toucher aux fichiers docker-compose.

Ce fichier de configuration se trouve dans le dossier créé à la racine du projet .ddev:

name: new-project
type: drupal9
docroot: web
php_version: "7.4"
webserver_type: nginx-fpm
router_http_port: "80"
router_https_port: "443"
xdebug_enabled: false
additional_hostnames: []
additional_fqdns: []
mariadb_version: "10.3"
mysql_version: ""
use_dns_when_possible: true
composer_version: ""
web_environment: []

On peut voir ici qu'il est très facile de changer les versions de PHP, Composer, MariaDB, le type de serveur web (Apache ou Nginx) ou encore les ports utilisés pour accéder au site en http ou https.

Une fois le fichier modifié, il suffit de lancer la commande ddev start pour rafraîchir les conteneurs.

Un outil extensible

Pour ajouter un service comme Solr ou ElasticSearch, il suffit d'ajouter le fichier docker-compose correspondant proposé par DDEV dans le dossier .ddev. Les services additionnels proposés par la communauté sont disponibles ici https://github.com/drud/ddev-contrib.

Au redémarrage du projet, le service additionnel sera automatiquement intégré.

Un outil personnalisable

DDEV propose par défaut de nombreuses commandes.

ddev
Create and maintain a local web development environment.
Docs: https://ddev.readthedocs.io
Support: https://ddev.readthedocs.io/en/stable/#support

Usage:
  ddev [command]

Available Commands:
  auth             A collection of authentication commands
  blackfire        Enable or disable blackfire.io profiling (global shell web container command)
  composer         Executes a composer command within the web container
  config           Create or modify a ddev project configuration in the current directory
  debug            A collection of debugging commands
  delete           Remove all project information (including database) for an existing project
  describe         Get a detailed description of a running ddev project.
  drush            Run drush CLI inside the web container (global shell web container command)
  exec             Execute a shell command in the container for a service. Uses the web service by default.
  export-db        Dump a database to a file or to stdout
  help             Help about any command
  hostname         Manage your hostfile entries.
  import-db        Import a sql file into the project.
  import-files     Pull the uploaded files directory of an existing project to the default public upload directory of your project.
  launch           Launch a browser with the current site (shell host container command)
  list             List projects
  logs             Get the logs from your running services.
  mysql            run mysql client in db container (shell db container command)
  pause            uses 'docker stop' to pause/stop the containers belonging to a project.
  poweroff         Completely stop all projects and containers
  restart          Restart a project or several projects.
  share            Share project on the internet via ngrok.
  snapshot         Create a database snapshot for one or more projects.
  ssh              Starts a shell session in the container for a service. Uses web service by default.
  start            Start a ddev project.
  stop             Stop and remove the containers of a project. Does not lose or harm anything unless you add --remove-data.
  version          print ddev version and component versions
  xdebug           Enable or disable xdebug (shell web container command)

Flags:
  -h, --help          help for ddev
  -j, --json-output   If true, user-oriented output will be in JSON format.
  -v, --version       version for ddev

Additional help topics:
  ddev pull             Pull files and database using a configured provider plugin.
  ddev push             push files and database using a configured provider plugin.

Use "ddev [command] --help" for more information about a command.

Mais il est également possible d'ajouter les siennes très facilement pour améliorer son workflow.

Il suffit de créer un nouveau script en bash dans le répertoire correspondant au service dans lequel on souhaite que la commande soit lancée (.ddev/commands/SERVICE/).

Par exemple, si je veux créer une commande pour compiler mon sass et mon js avec gulp dans le conteneur web, je crée un fichier du nom de ma commande (par ex: compile-sass) dans le dossier .ddev/commands/web/.

#!/bin/bash

cd /var/www/html/themes/new-project/;
npx gulp sass-dev;
npx gulp js-dev;

Je rends le fichier exécutable avec un simple chmod +x compile-sass et ma commande est accessible depuis mon terminal.

$ ddev compile-sass
[08:22:41] Using gulpfile /var/www/html/themes/new-project/gulpfile.js
[08:22:41] Starting 'sass-dev'...
[08:22:41] Starting 'js-dev'...
[08:22:41] Finished 'js-dev' after 39 ms
[08:22:41] Starting '<anonymous>'...
[gulp] SASS compilation finished: 158 ms
[gulp] postCSS finished: 384 ms
[gulp] created sourcemap files: 384 ms
[08:22:42] Finished '<anonymous>' after 392 ms
[08:22:42] Finished 'sass-dev' after 433 ms
[08:22:42] Using gulpfile /var/www/html/themes/new-project/gulpfile.js
[08:22:42] Starting 'js-dev'...
[08:22:42] Finished 'js-dev' after 40 ms

On voit rapidement qu'on peut facilement créer toutes les commandes nécessaires à une bonne optimisation du workflow pour le développement back ou front.

Pour la plupart de nos projets, nous avons créé des commandes pour la synchronisation des fichiers et de la base de données de l'environnement local avec l'environnement de staging, ainsi que des commandes pour l'initialisation du projet (installation gulp, création de symlink, etc.) ou pour la mise à jour en local (git pull, composer install, drush updb, drush cim, drush cr).

Conclusion

DDEV semble cocher toutes les cases de l'outil parfait pour une agence de développement PHP: compatible avec toutes les machines, facile à installer, adaptable et extensible. Utiliser DDEV devrait aussi permettre de diminuer les coûts de maintenance interne et d'accélérer l'onboarding des nouveaux collaborateurs.

  • La plateforme a gagné en popularité et son usage est de plus en plus répandu. Quand un nouveau collaborateur nous rejoint, il y a de fortes chances qu'il ait déjà utilisé ou testé cet outil.
  • Il existe de nombreux tutoriels en ligne (articles de blog, vidéos).
  • La documentation officielle est suffisamment riche et bien structurée pour permettre au néophyte de trouver les informations nécessaires.
  • Les images Docker et la documentation sont maintenues par la communauté.

Ressources

Olivier Brunau
Olivier Brunau
Développeur backend

Olivier est un développeur aguerri, toujours concentré sur l'objectif de fournir la meilleure expérience possible aux utilisateurs finaux et aux éditeurs.

Contactez nos experts et construisons ensemble votre transformation digitale.