Documentación de Laravel 10.x
Aquí encontrarás fragmentos de código de Laravel y consejos útiles sobre desarrollo web.
Laravel Envoy es una herramienta para ejecutar tareas comunes en servidores remotos. Utilizando la sintaxis de estilo Blade, puede configurar fácilmente tareas para implementación, comandos Artisan y más. Actualmente, Envoy solo es compatible con los sistemas operativos Mac y Linux. Sin embargo, el soporte de Windows es posible mediante WSL2.
Primero, instale Envoy en su proyecto utilizando el administrador de paquetes Composer:
composer require laravel/envoy --dev
Una vez instalado Envoy, el ejecutable de Envoy estará disponible en el directorio vendor/bin
de su aplicación:
php vendor/bin/envoy
Las tareas son el bloque de construcción básico de Envoy. Las tareas definen los comandos de shell que deben ejecutarse en sus servidores remotos cuando se invoca la tarea. Por ejemplo, podría definir una tarea que ejecute el comando php artisan queue:restart
en todos los servidores de trabajadores de cola de su aplicación.
Todas sus tareas de Envoy deben definirse en un archivo Envoy.blade.php
en la raíz de su aplicación. Aquí tienes un ejemplo para empezar:
@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 invoque la tarea.
Puedes forzar la ejecución de un script en tu computadora local especificando la dirección IP del servidor como 127.0.0.1
:
@servers(['localhost' => '127.0.0.1'])
Usando la directiva @import
, puedes importar otros archivos de Envoy para que sus historias y tareas se agreguen a las tuyas. Después de importar los archivos, puedes ejecutar las tareas que contienen como si estuvieran definidas en tu propio archivo de Envoy:
@import('vendor/package/Envoy.blade.php')
Envoy te permite ejecutar fácilmente una tarea en varios servidores. Primero, agrega servidores adicionales a tu declaración @servers
. A cada servidor se le debe asignar un nombre único. Una vez que hayas definido tus servidores adicionales, puedes enumerar 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
Por defecto, las tareas se ejecutarán en cada servidor de forma 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 en varios servidores en paralelo, agrega 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
A veces, es posible que necesite ejecutar código PHP arbitrario antes de ejecutar sus tareas de Envoy. Puede utilizar la directiva @setup
para definir un bloque de código PHP que se debe ejecutar antes de sus tareas:
@setup $now = new DateTime;@endsetup
Si necesita requerir otros archivos PHP antes de que se ejecute su tarea, puede utilizar la directiva @include
en la parte superior de su archivo Envoy.blade.php
:
@include('vendor/autoload.php') @task('restart-queues') # ...@endtask
Si es necesario, puede 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
Puede acceder a las opciones dentro de sus tareas mediante la sintaxis de "echo" de Blade. También puede definir declaraciones if
y bucles Blade dentro de sus tareas. Por ejemplo, verifiquemos la presencia de la variable $branch
antes de ejecutar el comando git pull
:
@task('deploy', ['on' => 'web']) cd /home/user/example.com @if ($branch) git pull origin {{ $branch }} @endif php artisan migrate --force@endtask
Las historias agrupan un conjunto de tareas bajo un nombre único y conveniente. Por ejemplo, una historia de deploy
puede ejecutar las tareas update-code
e install-dependencies
enumerando los nombres de las tareas dentro de su definición:
@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 se ha escrito la historia, puede invocarla de la misma manera que invocaría una tarea:
php vendor/bin/envoy run deploy
Cuando se ejecutan tareas e historias, se ejecutan varios ganchos. Los tipos de ganchos admitidos por 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 sus tareas.
Puede definir tantos de cada uno de estos ganchos como desee. Se ejecutarán en el orden en que aparecen en su script de Envoy.
@before
Antes de cada ejecución de tarea, se ejecutarán todos los ganchos @before
registrados en su script de Envoy. Los ganchos @before
reciben el nombre de la tarea que se ejecutará:
@before if ($task === 'deploy') { // ... }@endbefore
@after
Después de cada ejecución de tarea, se ejecutarán todos los ganchos @after
registrados en su script de Envoy. Los ganchos @after
reciben el nombre de la tarea que se ejecutó:
@after if ($task === 'deploy') { // ... }@endafter
@error
Después de cada falla de tarea (sale con un código de estado mayor que 0
), se ejecutarán todos los ganchos @error
registrados en su script de Envoy. Los ganchos @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, se ejecutarán todos los ganchos @success
registrados en su script de Envoy:
@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) { // Hubo errores en una de las tareas... }@endfinished
Para ejecutar una tarea o historia que está definida en el archivo Envoy.blade.php
de su aplicación, ejecute el comando run
de Envoy, pasando el nombre de la tarea o historia que le gustaría ejecutar. Envoy ejecutará la tarea y mostrará la salida de sus servidores remotos a medida que se ejecuta la tarea:
php vendor/bin/envoy run deploy
Si desea que se le pida confirmación antes de ejecutar una tarea determinada en sus servidores, debe agregar la directiva confirm
a su declaración de 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
Envoy admite el envío de notificaciones a Slack después de cada tarea ejecutada. La directiva @slack
acepta una URL de gancho de Slack y un canal / nombre de usuario. Puede obtener su URL de gancho recuperando su URL de gancho creando una integración de "Incoming WebHooks" en su panel de control de Slack.
Debe pasar la URL completa del gancho como 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 notificación describiendo la tarea que se ejecutó. Sin embargo, puede sobrescribir este mensaje con su propio mensaje personalizado pasando un tercer argumento a la directiva @slack
:
@finished @slack('webhook-url', '#bots', 'Hello, Slack.')@endfinished
Envoy también admite el envío de notificaciones a Discord después de cada tarea ejecutada. La directiva @discord
acepta una URL de gancho de Discord y un mensaje. Puede obtener su URL de gancho creando un "Webhook" en la configuración de su servidor y eligiendo a qué canal debe enviar el gancho. Debe pasar la URL completa del gancho en la directiva @discord
:
@finished @discord('discord-webhook-url')@endfinished
Envoy también admite el envío de notificaciones a Telegram después de cada tarea ejecutada. La directiva @telegram
acepta un ID de bot de Telegram y un ID de chat. Puede obtener su ID de bot creando un nuevo bot usando BotFather. Puede obtener un ID de chat válido usando @username_to_id_bot. Debe pasar el ID completo del bot y el ID del chat en la directiva @telegram
:
@finished @telegram('bot-id','chat-id')@endfinished
Envoy también admite el envío de notificaciones a Microsoft Teams después de cada tarea ejecutada. La directiva @microsoftTeams
acepta un Webhook de Teams (obligatorio), un mensaje, un color de tema (success, info, warning, error) y una matriz de opciones. Puede obtener su Webhook de Teams creando un nuevo incoming webhook. La API de Teams tiene muchas otras atributos para personalizar su cuadro de mensaje como título, resumen y secciones. Puede encontrar más información en la documentación de Microsoft Teams. Debe pasar la URL completa del gancho en la directiva @microsoftTeams
:
@finished @microsoftTeams('webhook-url')@endfinished