Au studio Meteora, on utilise souvent PHP/Symfony pour nos projets. Notamment pour construire nos superbes Backend & API. Et comme tout bon développeur, on est assez fainéant. D'où la nécessité d'automatiser les déploiements sur les serveurs de preprod et prod.

Pour ce faire, on a testé plusieurs outils dont Capistrano et Deployer.
Dans cet article je vais traiter de Deployer, qui, je trouve est le plus apte à déployer un projet PHP. Deployer est en effet développé en PHP. C'est un outil qui déploie rapidement, est entièrement customisable et s'intègre à un multitude de projets PHP nativement. Il y a en effet des modules pour Symfony, LaravelMagento, etc...

On va voir comment mettre en place Deployer sur un projet Symfony 3.

Installer Deployer

Dans le terminal, tu exécutes les commandes :

curl -LO https://deployer.org/deployer.phar
mv deployer.phar /usr/local/bin/dep
chmod +x /usr/local/bin/dep

Ou, encore plus simple, via composer :

composer require deployer/deployer

Ensuite, tu te places à la racine de ton super projet et exécutes la commande :

dep init

Voilà, Deployer est en place sur ton projet oueb trop cool.

Fichier de configuration

Et oui, il va bien falloir configurer un fichier spécifique à notre projet. Et c'est bien tout l'intérêt de Deployer, ce fichier est un fichier PHP. Donc inutile d'apprendre Ruby ou consort pour paramétrer ton fichier de manière vraiment spécifique. Et ça, c'est bien cool !

Et ce fichier, il existe déjà suite à la commande "dep init", il s'agit du fichier deploy.php (oui tout à fait)

Un petit exemple de fichier que j'ai utilisé pour un déploiement d'un projet pour TaxiEnsemble - Orange :

<?php
namespace Deployer;

/* On inclut la recette pour une application Symfony 3. 
 * Si vous êtes encore sur Symfony 2, il faut inclure la recette recipe/symfony.php */
require 'recipe/symfony3.php';

set('ssh_type', 'native');
set('ssh_multiplexing', true);
set('dump_assets', true);

// Les répertoires partagés pour chaque déploiement. Oui, il ne faudrait pas écraser certaines données internes à l'environnement (exemple, les fichiers uploadés par les utilisateurs)
set('shared_dirs', ['var/logs', 'var/sessions']);
// Les répertoires qui auront besoin d'un droit d'écriture.
set('writable_dirs', ['var/cache', 'var/logs', 'var/sessions']);

/* Dans notre exemple, on a qu'un serveur, le serveur de prod. 
Comme j'ai créé une clé SSH sur le serveur afin d'identifier mon mac automatiquement, 
je la mets en paramètre. 
Mais il est tout à fait possible de s'authentifier avec un mot de passe. */
server('prod', 'vps362496.ovh.net')
	->user('root')
    ->identityFile('~/.ssh/id_rsa.pub', '~/.ssh/id_rsa', '')
    ->set('deploy_path', '/var/www/orange')
    ->stage('prod');

/* On utilise Git pour récupérer le projet : on indique l'URL du dépôt du projet. 
Il faut qu'une Clé SSH soit spécifier sur le repo GitLab afin d'avoir les droits 
de clone du projet dans ce cas précis. */
set('repository', 'git@gitlab.com:meteora/taxiensemble/orange.git');

/* Ce qui vient par la suite est optionnel. Il existe plein de variables personnalisables (Cf documentation). 
 * Ici, cela permet de demander à Deployer de ne pas utiliser la commande sudo pour changer les droits des fichiers. 
 * C'est utile par exemple quand cette commande n'est pas disponible sur le serveur */
set('writable_use_sudo', false);

/* A chaque déploiement, l'ancienne version est archivée. 
 * Cette variable permet d'indiquer le nombre maximum de version que l'on souhaite conserver. */
set('keep_releases', 5);

Plus qu'a déployer le projet en prod en exécutant :

dep deploy prod

Et voilà, ton super projet est en prod. Comme tu peux le constater, ce n'est pas si long à mettre en place, mais ça fait gagner énormément de temps :)

Bon déploiement !

Références


Besoin d'un site internet, d'une application, de services de motion design ou de community management ?