Qué es deployer y cómo usarlo
Tags: php, deploy, webdev
Published: 2020-06-21 11:22:09

Si eres un programador de PHP es posible que ya hayas oído hablar de deployer. Muchos programadores, y me incluyo, lo usamos para desplegar actualizaciones de código en los entornos, ya sea de desarrollo o producción, desde nuestro equipo local. Esto quiere decir que no entramos al servidor para lanzar el comando git pull en el entorno que sea necesario, si no que deployer ya lo hará por nosotros.

Usar esta herramienta nos permite llevar un control de versiones operativas, lo que quiere decir que si por un despiste desplegamos una nueva versión de una web que contiene errores graves y que nos llevarán tiempo corregir, podemos retornar a una versión anterior con facilidad.

Ahora vamos a empezar, lo primero es instalar deployer en tu equipo y para ello debes seguir los pasos que se indican en su propia [web](https://deployer.org/docs/getting-started.html) y son lanzar los siguientes comandos:
```
curl -LO https://deployer.org/deployer.phar
mv deployer.phar /usr/local/bin/dep
chmod +x /usr/local/bin/dep
```
Una vez lo tengas instalado, vamos al repositorio del proyecto y ejecutamos el siguiente comando:
```
dep init
```
Este comando inicia la creación del fichero deploy.php. Para ello nos irá preguntando qué framework usamos, cómo se llama nuestro proyecto, qué repositorio usamos y más información. Al terminar el proceso quedará un fichero parecido con un contenido parecido a este:
```
<?php
/**
 * Cargamos la funcionalidad de Deployer
 */
namespace Deployer;
require 'recipe/common.php'; // Tipo de Framerwork que ejecutamos
/**
 * Variables globales
 */
set('project_name', 'FuenRob'); // Indicamos el nombre del proyecto
set('keep_releases', 5); // Número de releases que queremos guardar
set('repository', 'git@github.com:USERGIT/myRepo.git'); // Repositorio de git
set('shared_dirs', ['img', 'uploads']); // Directorios que se comparten entre releases
set('shared_files', ['.htaccess']); // Directorios que se comparten entre releases
set('writable_dirs', []);

// Datos del servidor en el que vamos a desplegar
host('develop')
    ->hostname('fuenrob.des.com') // Nombre del servidor que usamos para conectar por SSH
    ->set('branch', 'develop') // Rama de GIT a desplegar
    ->user('www-data') // Usuario de conexión SSH
    ->port(21) // Puerto de conexión SSH
    ->configFile('~/.ssh/config') // Fichero de configuración de SSH
    ->identityFile('~/.ssh/id_rsa') // Fichero que contiene la clave de SSH que sirve para verificar el acceso del usuario
    ->set('deploy_path', '/var/www/html/fuenrob.com/') // En qué directorio tenemos el proyecto
    ->set('default_timeout', 10000); // Tiempo máximo de ejecución

// Tareas que ejecutará el deploy
/* DEPLOY TASK GROUP */
desc('Comienza el despliegue');
task('deploy:dev', // Nombre de la tarea
    [
        'deploy:prepare', // Se inicia el deploy
        'deploy:lock', // Se bloquea el deploy, y no permite que se pueda lanzar de nuevo.
        'deploy:release', // Se comprueba que release está usando y cuál debe crear
        'deploy:update_code', // Hace un pull de la rama que le hemos indicado en la release correspondiente
        'deploy:shared', // Se crean los enlaces simbólicos de las carpetas y ficheros compartidos entre releases
        'deploy:symlink', // Cambia el enlace simbólico de la carpeta current a la nueva release
        'deploy:unlock', // Desbloquea el deploy
        'cleanup', // Se eliminan las releases antiguas hasta que queden solo las indicadas anteriormente
        'success' // Muestra un mensaje de proceso completado
    ]
)->desc('Deploy {{project_name}}');
```

Para finalizar, si queremos ejecutar el deploy únicamente debemos lanzar en la ruta en la que está el fichero el siguiente comando:
```
dep deploy:dev develop
```
En caso de que quieras obtener más información de las acciones que ejecuta el deploy lanza el comando anterior añadiéndole al final -vvv

En caso de que quieras crear tus propias tareas puedes hacerlo así:
```
desc('My task');
task('my_task', function () {
    run('git pull'); // Comando que queramos lanzar
});
```

Esta nueva tarea la podemos añadir en el listado de acciones que se realizan al ejecutar la tarea deploy:dev o usar las funciones de hooks del propio deploy:
```
before('deploy:prepare', 'my_task')
after('deploy:prepare', 'my_task')
```
Primer valor indica una función que ejecute el deploy y el segundo valor. Para más información yo recomiendo ir a la página oficial de deployer [aquí](https://deployer.org/docs/tasks.html)