Laravel Envoy
Introducción
Laravel Envoy es una herramienta para ejecutar tareas comunes que realizas en tus servidores remotos. Usando la sintaxis estilo Blade, puedes configurar fácilmente tareas para despliegue, comandos Artisan y más. Actualmente, Envoy solo admite los sistemas operativos Mac y Linux. Sin embargo, el soporte para Windows se puede lograr utilizando WSL2.
Instalación
Primero, instala Envoy en tu proyecto utilizando el gestor de paquetes Composer:
composer require laravel/envoy --dev
Una vez que Envoy haya sido instalado, el binario de Envoy estará disponible en el directorio vendor/bin
de tu aplicación:
php vendor/bin/envoy
Tareas de Escritura
Definiendo Tareas
Las tareas son el bloque de construcción básico de Envoy. Las tareas definen los comandos de shell que deben ejecutarse en tus servidores remotos cuando se invoca la tarea. Por ejemplo, podrías definir una tarea que ejecute el comando php artisan queue:restart
en todos los servidores de trabajadores de cola de tu aplicación.
Todas tus tareas de Envoy deben definirse en un archivo Envoy.blade.php
en la raíz de tu aplicación. Aquí tienes un ejemplo para comenzar:
@servers(['web' => ['user@192.168.1.1'], 'workers' => ['user@192.168.1.2']]) @task('restart-queues', ['on' => 'workers']) cd /home/user/example.com php artisan queue:restart@endtask
Como puedes ver, se define un array de @servers
en la parte superior del archivo, lo que te permite hacer referencia a estos servidores a través de la opción on
de tus declaraciones de tarea. La declaración @servers
siempre debe colocarse en una sola línea. Dentro de tus declaraciones @task
, debes colocar los comandos de shell que se deben ejecutar en tus servidores cuando se invoca la tarea.
Tareas Locales
Puedes forzar a un script a ejecutarse en tu computadora local especificando la dirección IP del servidor como 127.0.0.1
:
@servers(['localhost' => '127.0.0.1'])
Importando Tareas de Envoy
Usando la directiva @import
, puedes importar otros archivos de Envoy para que sus historias y tareas se añadan a las tuyas. Después de que se hayan importado los archivos, puedes ejecutar las tareas que contienen como si estuvieran definidas en tu propio archivo de Envoy:
@import('vendor/package/Envoy.blade.php')
Múltiples Servidores
Espresso te permite ejecutar una tarea fácilmente en múltiples servidores. Primero, añade servidores adicionales a tu declaración @servers
. Cada servidor debe tener un nombre único. Una vez que hayas definido tus servidores adicionales, puedes listar cada uno de los servidores en el array on
de la tarea:
@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2']) @task('deploy', ['on' => ['web-1', 'web-2']]) cd /home/user/example.com git pull origin {{ $branch }} php artisan migrate --force@endtask
Ejecución Paralela
Por defecto, las tareas se ejecutarán en cada servidor de manera serial. En otras palabras, una tarea terminará de ejecutarse en el primer servidor antes de proceder a ejecutarse en el segundo servidor. Si deseas ejecutar una tarea a través de múltiples servidores en paralelo, añade la opción parallel
a la declaración de tu tarea:
@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2']) @task('deploy', ['on' => ['web-1', 'web-2'], 'parallel' => true]) cd /home/user/example.com git pull origin {{ $branch }} php artisan migrate --force@endtask
Configuración
A veces, es posible que necesites ejecutar código PHP arbitrario antes de ejecutar tus tareas de Envoy. Puedes usar la directiva @setup
para definir un bloque de código PHP que se debe ejecutar antes de tus tareas:
@setup $now = new DateTime;@endsetup
Si necesitas incluir otros archivos PHP antes de que se ejecute tu tarea, puedes usar la directiva @include
en la parte superior de tu archivo Envoy.blade.php
:
@include('vendor/autoload.php') @task('restart-queues') # ...@endtask
Variables
Si es necesario, puedes pasar argumentos a las tareas de Envoy especificándolos en la línea de comandos al invocar Envoy:
php vendor/bin/envoy run deploy --branch=master
Puedes acceder a las opciones dentro de tus tareas utilizando la sintaxis "echo" de Blade. También puedes definir sentencias if
y bucles de Blade dentro de tus tareas. Por ejemplo, verifiquemos la presencia de la variable $branch
antes de ejecutar el comando git pull
:
@servers(['web' => ['user@192.168.1.1']]) @task('deploy', ['on' => 'web']) cd /home/user/example.com @if ($branch) git pull origin {{ $branch }} @endif php artisan migrate --force@endtask
Historias
Las historias agrupan un conjunto de tareas bajo un solo nombre conveniente. Por ejemplo, una historia deploy
puede ejecutar las tareas update-code
e install-dependencies
enumerando los nombres de las tareas dentro de su definición:
@servers(['web' => ['user@192.168.1.1']]) @story('deploy') update-code install-dependencies@endstory @task('update-code') cd /home/user/example.com git pull origin master@endtask @task('install-dependencies') cd /home/user/example.com composer install@endtask
Una vez que la historia haya sido escrita, puedes invocarla de la misma manera en que invocarías una tarea:
Hooks
Cuando se ejecutan las tareas y las historias, se ejecuta una serie de ganchos. Los tipos de ganchos que soporta Envoy son @before
, @after
, @error
, @success
y @finished
. Todo el código en estos ganchos se interpreta como PHP y se ejecuta localmente, no en los servidores remotos con los que interactúan tus tareas.
Puedes definir tantos de estos hooks como desees. Se ejecutarán en el orden en que aparecen en tu script de Envoy.
@before
Antes de la ejecución de cada tarea, todos los hooks @before
registrados en tu script de Envoy se ejecutarán. Los hooks @before
reciben el nombre de la tarea que se va a ejecutar:
@before if ($task === 'deploy') { // ... }@endbefore
@after
Después de la ejecución de cada tarea, todos los hooks @after
registrados en tu script de Envoy se ejecutarán. Los hooks @after
reciben el nombre de la tarea que se ejecutó:
@after if ($task === 'deploy') { // ... }@endafter
@error
Después de cada fallo de tarea (sale con un código de estado mayor que 0
), todos los hooks @error
registrados en su script Envoy se ejecutarán. Los hooks @error
reciben el nombre de la tarea que se ejecutó:
@error if ($task === 'deploy') { // ... }@enderror
@success
Si todas las tareas se han ejecutado sin errores, todos los ganchos @success
registrados en tu script de Envoy se ejecutarán:
@success // ...@endsuccess
@finished
Después de que se hayan ejecutado todas las tareas (independientemente del estado de salida), se ejecutarán todos los ganchos @finished
. Los ganchos @finished
reciben el código de estado de la tarea completada, que puede ser null
o un entero
mayor o igual a 0
:
@finished if ($exitCode > 0) { // There were errors in one of the tasks... }@endfinished
Ejecutando Tareas
Para ejecutar una tarea o historia que está definida en el archivo Envoy.blade.php
de tu aplicación, ejecuta el comando run
de Envoy, pasando el nombre de la tarea o historia que te gustaría ejecutar. Envoy ejecutará la tarea y mostrará la salida de tus servidores remotos a medida que se ejecute la tarea:
php vendor/bin/envoy run deploy
Confirmando la Ejecución de la Tarea
Si deseas que se te pida confirmación antes de ejecutar una tarea dada en tus servidores, debes añadir la directiva confirm
a la declaración de tu tarea. Esta opción es especialmente útil para operaciones destructivas:
@task('deploy', ['on' => 'web', 'confirm' => true]) cd /home/user/example.com git pull origin {{ $branch }} php artisan migrate@endtask
Notificaciones
Slack
Envoy admite el envío de notificaciones a Slack después de que se ejecute cada tarea. La directiva @slack
acepta una URL de webhook de Slack y un nombre de canal / usuario. Puedes recuperar tu URL de webhook creando una integración de "Incoming WebHooks" en tu panel de control de Slack.
Debes pasar la URL completa del webhook como el primer argumento dado a la directiva @slack
. El segundo argumento dado a la directiva @slack
debe ser un nombre de canal (#channel
) o un nombre de usuario (@user
):
@finished @slack('webhook-url', '#bots')@endfinished
Por defecto, las notificaciones de Envoy enviarán un mensaje al canal de notificaciones describiendo la tarea que se ejecutó. Sin embargo, puedes sobrescribir este mensaje con tu propio mensaje personalizado pasando un tercer argumento a la directiva @slack
:
@finished @slack('webhook-url', '#bots', 'Hello, Slack.')@endfinished
Discord
Envoy también admite el envío de notificaciones a Discord después de que se ejecute cada tarea. La directiva @discord
acepta una URL de webhook de Discord y un mensaje. Puedes recuperar tu URL de webhook creando un "Webhook" en la Configuración de tu servidor y eligiendo a qué canal debe publicar el webhook. Debes pasar la URL completa del Webhook a la directiva @discord
:
@finished @discord('discord-webhook-url')@endfinished
Telegram
Envoy también admite el envío de notificaciones a Telegram después de que se ejecute cada tarea. La directiva @telegram
acepta un ID de Bot de Telegram y un ID de Chat. Puedes recuperar tu ID de Bot creando un nuevo bot utilizando BotFather. Puedes recuperar un ID de Chat válido usando @username_to_id_bot. Debes pasar el ID de Bot y el ID de Chat completos a la directiva @telegram
:
@finished @telegram('bot-id','chat-id')@endfinished
Microsoft Teams
Envoy también admite el envío de notificaciones a Microsoft Teams después de que se ejecute cada tarea. La directiva @microsoftTeams
acepta un Webhook de Teams (requerido), un mensaje, color de tema (éxito, información, advertencia, error) y un array de opciones. Puedes recuperar tu Webhook de Teams creando un nuevo webhook entrante. La API de Teams tiene muchos otros atributos para personalizar tu cuadro de mensaje, como título, resumen y secciones. Puedes encontrar más información en la documentación de Microsoft Teams. Debes pasar la URL completa del Webhook a la directiva @microsoftTeams
:
@finished @microsoftTeams('webhook-url')@endfinished