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

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
- Documentation officielle : https://ddev.readthedocs.io/en/stable/
- Services contribués pour étendre un projet : https://github.com/drud/ddev-contrib