Инструмент запуска задач Envoy

Введение

Laravel Envoy обеспечивает чистый и минималистичный синтаксис для регистрации общих задач, запускаемых на удалённых серверах. Используя синтаксис в стиле Blade, вы легко можете настроить задачи для развёртывания, Artisan-команды и прочее. На данный момент Envoy работает только на ОС Mac/Linux.

Установка

Сначала установите Envoy с помощью команды Composer global require:

composer global require laravel/envoy

Так как глобальные библиотеки Composer иногда могут стать причиной конфликтов версий пакетов, возможно вы захотите использовать cgr, который представляет собой drop-in замену команды composer global require. Инструкции по установке библиотеки cgr можно найти на GitHub.

{note} Не забудьте поместить директорию ~/.composer/vendor/bin в вашу переменную PATH, чтобы исполняемый файл envoy мог быть найден при запуске команды envoy в терминале.

Обновление Envoy

Также вы можете использовать Composer для обновления вашего Envoy. Простая команда composer global update обновит все ваши глобально установленные пакеты Composer:

composer global update

Написание задач

Все ваши Envoy-задачи должны быть определены в файле Envoy.blade.php в корне вашего проекта. Вот пример для начала:

@servers(['web' => ['user@192.168.1.1']])

@task('foo', ['on' => 'web'])
    ls -la
@endtask

Как видите, массив @servers определён в начале файла. Вы можете ссылаться на эти сервера в параметре on при объявлении задач. Поместите в ваши объявления @task тот Bash-код, который будет запускаться на сервере при исполнении задачи.

Вы можете задать локальное выполнение скрипта, определив IP адрес сервера как 127.0.0.1:

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

Настройка

Иногда необходимо выполнить некий PHP-код перед тем, как задать параметры Envoy-задач. Для объявления переменных и выполнения общих PHP-задач в файле Envoy вы можете использовать директиву @setup:

@setup
    $now = new DateTime();

    $environment = isset($env) ? $env : "testing";
@endsetup

Вля подключения любых PHP-файлов используйте директиву @include поверх своего файла Envoy.blade.php:

@include('vendor/autoload.php')

@task('foo')
    # ...
@endtask

Переменные

При необходимости вы можете передать переменные в файл Envoy с помощью ключей командной строки, что позволяет вам настраивать ваши задачи:

envoy run deploy --branch=master

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

@servers(['web' => '192.168.1.1'])

@task('deploy', ['on' => 'web'])
    cd site

    @if ($branch)
        git pull origin {{ $branch }}
    @endif

    php artisan migrate
@endtask

Истории

Истории группируют набор задач под единым, удобным именем, позволяя вам группировать небольшие, сфокусированные задачи в более крупные задачи. Например, история deploy может выполнить задачи git и composer перечислив имена задач в своем определении:

@servers(['web' => '192.168.1.1'])

@story('deploy')
    git
    composer
@endstory

@task('git')
    git pull origin master
@endtask

@task('composer')
    composer install
@endtask

Как только была написана история, вы можете просто выполнить ее как обыкновенную задачу:

envoy run deploy

Несколько серверов

Вы легко можете запускать задачи на нескольких серверах. Сначала добавьте дополнительные сервера в объявление @servers. Каждому серверу должно быть присвоено уникальное имя. Когда вы определили дополнительные сервера, просто перечислите их в массиве объявления задачи on:

@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2'])

@task('deploy', ['on' => ['web-1', 'web-2']])
    cd site
    git pull origin {{ $branch }}
    php artisan migrate
@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 site
    git pull origin {{ $branch }}
    php artisan migrate
@endtask

Запуск задач

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

envoy run task

Подтверждение выполнения задачи

Если вы хотите, чтобы система спрашивала подтверждение прежде чем выполнить заданные задачи на ваших серверах, вы должны добавить директиву confirm к своему объявлению задачи. Это особенно полезно при разрушительных операциях:

@task('deploy', ['on' => 'web', 'confirm' => true])
    cd site
    git pull origin {{ $branch }}
    php artisan migrate
@endtask

Оповещения

Slack

Envoy также поддерживает отправку оповещений в Slack после выполнения каждой задачи. Директива @slack принимает Slack хук-URL и имя канала. Вы можете получить свой вебхук-URL, создав интеграцию "Incoming WebHooks" в панели управления Slack. Следует передавать весь вебхук-URL в директиву @slack:

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

Любое из нижеследующего можно предоставить в качестве аргумента канала:

  • Для отправки уведомлений на канал: #channel
  • Для отправки уведомлений пользователю: @user