Laravel Envoy

Вступ

Laravel Envoy — це інструмент для виконання загальних завдань, які ви запускаєте на ваших віддалених серверах. Використовуючи синтаксис у стилі Blade, ви можете легко налаштувати завдання для розгортання, команд Artisan та іншого. Наразі Envoy підтримує лише операційні системи Mac та Linux. Однак, підтримка Windows можлива за допомогою WSL2.

Встановлення

Спочатку встановіть Envoy у ваш проект, використовуючи менеджер пакетів компонувальник:

composer require laravel/envoy --dev

Після встановлення Envoy, двійковий файл Envoy буде доступний у директорії vendor/bin вашого застосунку:

php vendor/bin/envoy

Завдання з написання

Визначення Завдань

Завдання є основним будівельним блоком Envoy. Завдання визначають shell-команди, які повинні виконуватися на ваших віддалених серверах, коли завдання викликається. Наприклад, ви можете визначити завдання, яке виконує команду php artisan queue:restart на всіх серверах обробників черги вашого застосунку.

Усі ваші завдання Envoy повинні бути визначені у файлі Envoy.blade.php у корені вашого застосунку. Ось приклад, щоб почати:

@servers(['web' => ['example@example.com'], 'workers' => ['example@example.com']])
 
@task('restart-queues', ['on' => 'workers'])
    cd /home/user/example.com
    php artisan queue:restart
@endtask

Як ви можете бачити, масив @servers визначено на початку файлу, що дозволяє вам посилатися на ці сервери через опцію on у ваших оголошеннях завдань. Оголошення @servers завжди повинно бути розміщено на одному рядку. У межах ваших оголошень @task ви повинні розміщувати shell-команди, які повинні виконуватися на ваших серверах, коли завдання викликається.

Локальні завдання

Ви можете примусити скрипт виконуватись на вашому локальному комп'ютері, вказавши IP-адресу сервера як 127.0.0.1:

@servers(['localhost' => '127.0.0.1'])

Імпорт завдань Envoy

Використовуючи директиву @import, ви можете імпортувати інші файли Envoy, щоб їхні сценарії та завдання були додані до ваших. Після імпорту файлів ви можете виконувати завдання, які вони містять, так, ніби вони були визначені у вашому власному файлі Envoy:

@import('vendor/package/Envoy.blade.php')

Кілька серверів

Envoy дозволяє легко виконувати завдання на декількох серверах. Спочатку додайте додаткові сервери до вашої декларації @servers. Кожному серверу слід призначити унікальне ім'я. Після того, як ви визначили ваші додаткові сервери, ви можете перерахувати кожен з серверів у масиві on завдання:

@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

Паралельне виконання

За замовчуванням завдання будуть виконуватись на кожному сервері послідовно. Іншими словами, завдання завершить виконання на першому сервері перед тим, як перейти до виконання на другому сервері. Якщо ви хочете виконувати завдання на декількох серверах паралельно, додайте опцію parallel до вашого оголошення завдання:

@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

Налаштування

Іноді вам може знадобитися виконати довільний PHP-код перед запуском ваших завдань Envoy. Ви можете використовувати директиву @setup, щоб визначити блок PHP-коду, який повинен виконатися перед вашими завданнями:

@setup
    $now = new DateTime;
@endsetup

Якщо вам потрібно підключити інші PHP файли перед виконанням вашого завдання, ви можете використовувати директиву @include на початку вашого файлу Envoy.blade.php:

@include('vendor/autoload.php')
 
@task('restart-queues')
    # ...
@endtask

Змінні

Якщо потрібно, ви можете передавати аргументи до завдань Envoy, вказуючи їх у командному рядку під час виклику Envoy:

php vendor/bin/envoy run deploy --branch=master

Ви можете отримати доступ до параметрів у ваших завданнях, використовуючи синтаксис Blade "echo". Ви також можете визначати Blade if інструкції та цикли у ваших завданнях. Наприклад, давайте перевіримо наявність змінної $branch перед виконанням команди git pull:

@servers(['web' => ['example@example.com']])
 
@task('deploy', ['on' => 'web'])
    cd /home/user/example.com
 
    @if ($branch)
        git pull origin {{ $branch }}
    @endif
 
    php artisan migrate --force
@endtask

Історії

Stories групують набір завдань під одним зручним ім'ям. Наприклад, історія deploy може виконувати завдання update-code та install-dependencies, перераховуючи імена завдань у своїй дефініції:

@servers(['web' => ['example@example.com']])
 
@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

Після того, як історію написано, ви можете викликати її так само, як ви б викликали завдання:

php vendor/bin/envoy run deploy

Хуки

Коли завдання та історії виконуються, виконується ряд хуків. Типи хуків, які підтримуються Envoy, це @before, @after, @error, @success та @finished. Весь код у цих хуках інтерпретується як PHP і виконується локально, а не на віддалених серверах, з якими взаємодіють ваші завдання.

Ви можете визначити стільки цих хуків, скільки забажаєте. Вони будуть виконуватись у тому порядку, в якому з'являються у вашому Envoy скрипті.

@before

Перед виконанням кожного завдання всі зареєстровані у вашому Envoy скрипті хуки @before будуть виконані. Хуки @before отримують назву завдання, яке буде виконано:

@before
    if ($task === 'deploy') {
        // ...
    }
@endbefore

@after

Після виконання кожного завдання всі зареєстровані в вашому Envoy скрипті хуки @after будуть виконані. Хуки @after отримують назву завдання, яке було виконано:

@after
    if ($task === 'deploy') {
        // ...
    }
@endafter

@error

Після кожного збою завдання (виходить зі статус-кодом більшим за 0), всі зареєстровані у вашому скрипті Envoy хуки @error будуть виконані. Хуки @error отримують назву завдання, яке було виконано:

@error
    if ($task === 'deploy') {
        // ...
    }
@enderror

@success

Якщо всі завдання виконано без помилок, всі @success хуки, зареєстровані у вашому Envoy скрипті, будуть виконані:

@success
    // ...
@endsuccess

@finished

Після виконання всіх завдань (незалежно від статусу виходу) будуть виконані всі @finished хуки. Хуки @finished отримують код статусу завершеного завдання, який може бути null або integer, більшим або рівним 0:

@finished
if ($exitCode > 0) {
// У одному із завдань виникли помилки...
}
@endfinished

Запуск завдань

Щоб виконати завдання або історію, визначену у файлі Envoy.blade.php вашого застосунку, виконайте команду run Envoy, передавши ім'я завдання або історії, яку ви хочете виконати. Envoy виконає завдання і відобразить вивід з ваших віддалених серверів під час виконання завдання:

php vendor/bin/envoy run deploy

Підтвердження Виконання Завдання

Якщо ви хочете, щоб перед виконанням певного завдання на ваших серверах з'являвся запит на підтвердження, ви повинні додати директиву confirm до вашого оголошення завдання. Ця опція особливо корисна для деструктивних операцій:

@task('deploy', ['on' => 'web', 'confirm' => true])
    cd /home/user/example.com
    git pull origin {{ $branch }}
    php artisan migrate
@endtask

Сповіщення

Slack

Envoy підтримує відправку сповіщень до Slack після виконання кожного завдання. Директива @slack приймає URL Slack hook та ім'я каналу / користувача. Ви можете отримати свій URL вебхука, створивши інтеграцію "Incoming WebHooks" у вашій панелі керування Slack.

Ви повинні передати повний URL вебхука як перший аргумент, наданий директиві @slack. Другий аргумент, наданий директиві @slack, повинен бути назвою каналу (#channel) або ім'ям користувача (@user):

@finished
    @slack('webhook-url', '#bots')
@endfinished

За замовчуванням сповіщення Envoy надсилатимуть повідомлення до каналу сповіщень, описуючи виконане завдання. Однак ви можете замінити це повідомлення власним, передавши третій аргумент у директиву @slack:

@finished
    @slack('webhook-url', '#bots', 'Hello, Slack.')
@endfinished

Discord

Envoy також підтримує відправку сповіщень до Discord після виконання кожного завдання. Директива @discord приймає URL-адресу Discord hook та повідомлення. Ви можете отримати URL-адресу вашого вебхука, створивши "Webhook" у налаштуваннях сервера та вибравши канал, до якого вебхук повинен надсилати повідомлення. Ви повинні передати всю URL-адресу Webhook у директиву @discord:

@finished
    @discord('discord-webhook-url')
@endfinished

Telegram

Envoy також підтримує відправку сповіщень до Telegram після виконання кожного завдання. Директива @telegram приймає Telegram Bot ID та Chat ID. Ви можете отримати свій Bot ID, створивши нового бота за допомогою BotFather. Ви можете отримати дійсний Chat ID за допомогою @username_to_id_bot. Ви повинні передати повний Bot ID та Chat ID у директиву @telegram:

@finished
    @telegram('bot-id','chat-id')
@endfinished

Microsoft Teams

Envoy також підтримує відправку сповіщень до Microsoft Teams після виконання кожного завдання. Директива @microsoftTeams приймає Teams Webhook (обов'язково), повідомлення, колір теми (success, info, warning, error) та масив опцій. Ви можете отримати свій Teams Webhook, створивши новий вхідний webhook. API Teams має багато інших атрибутів для налаштування вашого повідомлення, таких як заголовок, резюме та секції. Ви можете знайти більше інформації в документації Microsoft Teams. Ви повинні передати всю URL-адресу Webhook у директиву @microsoftTeams:

@finished
    @microsoftTeams('webhook-url')
@endfinished