Descubre los contenidos más relevantes sobre tecnología

Despliegue de aplicaciones PHP con Deployer (I)

Escrito por Conasa | 15-mar-2017 10:41:25

El despliegue de aplicaciones es una de las tareas más habituales durante el ciclo de vida de las mismas, lo que significa llevar dicha aplicación o los cambios realizados en ella a lo largo del tiempo desde el entorno de desarrollo (local) hasta el entorno de producción, pasando habitualmente por otros entornos como pruebas, preparación (staging) o pre-producción etc.

Despliegue de aplicaciones PHP con Deployer (I)

El despliegue de aplicaciones consiste generalmente en recuperar el código del sistema de control de versiones, copiarlo a la máquina o máquinas de destino y realizar ciertas tareas como la instalación/actualización de dependencias mediante Composer, la preparación de recursos CSS y Javascript, ejecución de migraciones de la base de datos etc. En un proyecto pequeño o que no requiera despliegues de forma habitual, estas tareas pueden ser realizadas de forma manual o semi-manual, por ejemplo con el uso de algunos scripts que automaticen parte de las mismas.

Por contra, en proyectos en los que los despliegues sean habituales, complejos (por tener que realizar muchas tareas o ser muy laboriosas) o que sigan la técnica de entrega continua, es necesario automatizar todo el proceso, de manera que se reduzca el tiempo necesario para hacer llegar las nuevas funcionalidades o correcciones a los usuarios finales y se minimicen los errores humanos. Para ello podemos utilizar Deployer, una herramienta escrita en PHP e inspirada en otras ya existentes como Capistrano (Ruby) o Magallanes (también en PHP). En este post vamos a ver cómo instalar y configurar esta herramienta para el despliegue de aplicaciones PHP de una manera bastante sencilla.

Instalación

AVISO: Personalmente no he conseguido hacer funcionar correctamente Deployer en Windows 10 (no he probado otras versiones) debido principalmente al soporte de SSH. Recomiendo utilizar GNU/Linux.

La forma más sencilla de instalar Deployer para el despliegue de aplicaciones PHP es a través de Composer:

$ composer require global deployer/deployer 

Si todo ha ido bien ahora tendremos disponible el comando dep, que podemos utilizar para interactuar con Deployer:

$ dep Deployer master 
Usage: command [options] [arguments] 

¿Cómo funciona Deployer a la hora de realizar el despliegue de aplicaciones?

Deployer es una herramienta de despliegue de aplicaciones en línea de comandos (comando dep). Para utilizar esta herramienta, en la máquina de despliegue (la que ejecuta Deployer) se debe crear un fichero llamado deploy.php (en el siguiente post veremos cómo), donde indicaremos de qué repositorio se debe obtener el código de nuestro proyecto, a qué servidor o servidores (máquina/s destino) se debe desplegar y en general las tareas a realizar en cada despliegue.

Una vez definido este fichero deploy.php se puede iniciar el despliegue de aplicaciones con el comando dep deploy (ejecutado en el mismo directorio que el fichero deploy.php). Por defecto Deployer, al realizar un despliegue, se conectará a la máquina destino mediante SSH y desde ahí ejecutará los comandos necesarios para llevarlo a cabo. Esto incluye descargar el código actualizado del repositorio git y guardarlo en la ruta especificada, instalar dependencias, actualizar enlaces simbólicos etc.

Por tanto se debe cumplir que:

  • La máquina destino tenga todo el software necesario instalado; git para conectar al repositorio de código, Composer para instalar dependencias en caso de usar librerías de terceros etc.
  • La máquina de despliegue de aplicaciones tenga acceso mediante SSH a la máquina destino y la máquina destino tenga acceso al repositorio de código.

La instalación y configuración de las herramientas del primer punto quedan fuera del alcance de este post, sin embargo en la siguiente sección revisaremos rápidamente los pasos necesarios para realizar las conexiones SSH entre máquinas de forma eficaz.

Configuración de SSH

Aunque Deployer soporta la autenticación SSH mediante usuario y contraseña (definidos en el fichero deploy.php), mi recomendación es utilizar los ficheros de claves SSH de la máquina. Para ello, es necesario primero generar dichas claves (si ya se tienen no es necesario volver a hacerlo) ejecutando, en la máquina de despliegue, el comando:

$ ssh-keygen -t rsa 

El comando preguntará la ruta y nombre de las claves y si queremos establecer una contraseña para las mismas. Lo más sencillo en este caso es utilizar las rutas y nombres por defecto y no establecer ninguna contraseña, ya que sino nos la pedirá cada vez que hagamos un despliegue. Por defecto el comando genera los ficheros de claves:

  • Clave privada (no se debe compartir).
  • Clave pública.

El siguiente paso es copiar la clave pública de nuestra máquina de despliegue en la máquina de destino, de manera que Deployer pueda establecer una conexión con dicha máquina destino sin necesidad de usuario y contraseña (usando las claves que hemos generado en el paso anterior). Para ello basta con ejecutar:

$ ssh-copy-id usuario@maquina-destino 

Tras esto, podemos probar a conectar desde la máquina de despliegue a la máquina destino mediante SSH:

$ ssh -T usuario@maquina-destino 

Si hemos congfigurado las claves correctamente debería dejarnos conectar sin problema . En caso de que el sistema pregunte por la autenticidad del host remoto basta con aceptar.

Por otra parte, en la máquina de destino es necesario tener acceso al repositorio de código git donde tenemos alojado el proyecto. Los pasos para configurar esto depende del servicio de alojamiento utilizado, si el repositorio es público o privado etc. Como en el caso de la conexión SSH entre máquinas, se debe lograr que la máquina se conecte al repositorio y descargue el código sin necesidad de introducir usuario y contraseña. Por ejemplo, podemos consultar la documentación sobre claves SSH en caso de usar Github o su equivalente para Bitbucket.

Con esto ya tenemos todo instalado y configurado para el despliegue de aplicaciones PHP con Deployer. ¡En el siguiente post veremos cómo hacerlo!