# Envoy Task Runner
- [Introduction](#introduction)
- [Installation](#envoy-installation)
- [Running Tasks](#envoy-running-tasks)
- [Multiple Servers](#envoy-multiple-servers)
- [Parallel Execution](#envoy-parallel-execution)
- [Task Macros](#envoy-task-macros)
- [Notifications](#envoy-notifications)
- [Updating Envoy](#envoy-updating-envoy)
## Introduction
Laravel Envoy provides a clean, minimal syntax for defining common tasks you run on your remote servers. Using a Blade style syntax, you can easily setup tasks for deployment, Artisan commands, and more.
> **Note:** Envoy requires PHP version 5.4 or greater, and only runs on Mac / Linux operating systems.
## Installation
First, install Envoy using the Composer `global` command:
composer global require "laravel/envoy=~1.0"
Make sure to place the `~/.composer/vendor/bin` directory in your PATH so the `envoy` executable is found when you run the `envoy` command in your terminal.
Next, create an `Envoy.blade.php` file in the root of your project. Here's an example to get you started:
@servers(['web' => '192.168.1.1'])
@task('foo', ['on' => 'web'])
ls -la
@endtask
As you can see, an array of `@servers` is defined at the top of the file. You can reference these servers in the `on` option of your task declarations. Within your `@task` declarations you should place the Bash code that will be run on your server when the task is executed.
The `init` command may be used to easily create a stub Envoy file:
envoy init user@192.168.1.1
## Running Tasks
To run a task, use the `run` command of your Envoy installation:
envoy run foo
If needed, you may pass variables into the Envoy file using command line switches:
envoy run deploy --branch=master
You may use the options via the Blade syntax you are used to:
@servers(['web' => '192.168.1.1'])
@task('deploy', ['on' => 'web'])
cd site
git pull origin {{ $branch }}
php artisan migrate
@endtask
#### Bootstrapping
You may use the ```@setup``` directive to declare variables and do general PHP work inside the Envoy file:
@setup
$now = new DateTime();
$environment = isset($env) ? $env : "testing";
@endsetup
You may also use ```@include``` to include any PHP files:
@include('vendor/autoload.php');
## Multiple Servers
You may easily run a task across multiple servers. Simply list the servers in the task declaration:
@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
By default, the task will be executed on each server serially. Meaning, the task will finish running on the first server before proceeding to execute on the next server.
## Parallel Execution
If you would like to run a task across multiple servers in parallel, simply add the `parallel` option to your task declaration:
@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
## Task Macros
Macros allow you to define a set of tasks to be run in sequence using a single command. For instance:
@servers(['web' => '192.168.1.1'])
@macro('deploy')
foo
bar
@endmacro
@task('foo')
echo "HELLO"
@endtask
@task('bar')
echo "WORLD"
@endtask
The `deploy` macro can now be run via a single, simple command:
envoy run deploy
## Notifications
#### HipChat
After running a task, you may send a notification to your team's HipChat room using the simple `@hipchat` directive:
@servers(['web' => '192.168.1.1'])
@task('foo', ['on' => 'web'])
ls -la
@endtask
@after
@hipchat('token', 'room', 'Envoy')
@endafter
You can also specify a custom message to the hipchat room. Any variables declared in ```@setup``` or included with ```@include``` will be available for use in the message:
@after
@hipchat('token', 'room', 'Envoy', "$task ran on [$environment]")
@endafter
This is an amazingly simple way to keep your team notified of the tasks being run on the server.
#### Slack
The following syntax may be used to send a notification to [Slack](https://slack.com):
@after
@slack('hook', 'channel', 'message')
@endafter
You may retrieve your token by creating an `Incoming WebHooks` integration on Slack's website.
The hook argument is the entire webhook URL provided by the Incoming Webhooks Slack Integration:
- `https://hooks.slack.com/services/ZZZZZZZZZ/YYYYYYYYY/XXXXXXXXXXXXXXX`
You may provide one of the following for the channel argument:
- For a regular channel: `#channel`
- For a specific user: `@user`
- If no argument is provided Envoy will use the default channel configured on the Slack website.
> Note: Slack notifications will only be sent if all tasks complete successfully.
## Updating Envoy
To update Envoy, simply use Composer:
composer global update