Envoy 任务执行器


简介

Laravel Envoy 提供了简洁、轻量的语法用于定义在远程服务器上可执行的通用任务。通过 Blade 风格的语法,你可以很容易地设置任务从而完成部署、执行 Artisan 命令或其他更多工作。

注意: Envoy 依赖 PHP 5.4 或更高版本,并且只能运行在 Mac / Linux 操作系统中。

安装

首先,通过 Composer 的 global 命令来安装 Envoy:

  1. composer global require "laravel/envoy=~1.0"

请务必将 ~/.composer/vendor/bin 目录加入到 PATH 环境变量中,这样才能在命令行中执行 envoy 命令时找到可执行文件。

接下来,在项目的根目录下创建 Envoy.blade.php 文件。下面给出的实例代码你可以当做模板使用:

  1. @servers(['web' => '192.168.1.1'])
  2. @task('foo', ['on' => 'web'])
  3. ls -la
  4. @endtask

如上所示,在文件的开头首先定义了 @servers 数组。后续的任务声明中,你可以在 on 选项中直接引用。在 @task 声明里,你可以直接填写需要在服务器上执行的 Bash 脚本代码。

init 命令可以很方便地用来创建一个包含基本内容的 Envoy 文件:

  1. envoy init user@192.168.1.1

执行任务

使用 run 命令来执行任务:

  1. envoy run foo

如有需要,你还可以通过命令行向 Envoy 文件传递参数:

  1. envoy run deploy --branch=master

你可以通过 Blade 语法引用这些参数:

  1. @servers(['web' => '192.168.1.1'])
  2. @task('deploy', ['on' => 'web'])
  3. cd site
  4. git pull origin {{ $branch }}
  5. php artisan migrate
  6. @endtask

Bootstrapping

你可以在 @setup 指令中声明变量,并在 Envoy 文件中执行普通的 PHP 代码:

  1. @setup
  2. $now = new DateTime();
  3. $environment = isset($env) ? $env : "testing";
  4. @endsetup

还可以通过 @include 指令引入任意的 PHP 文件:

  1. @include('vendor/autoload.php');

执行任务前确认

如果你想要在执行指定的任务前有一个提示确认,可以使用 confirm 指令:

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

多服务器

在多台服务器上执行一个任务是非常简单的,只需在声明任务时列出服务器名称即可:

  1. @servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2'])
  2. @task('deploy', ['on' => ['web-1', 'web-2']])
  3. cd site
  4. git pull origin {{ $branch }}
  5. php artisan migrate
  6. @endtask

默认情况下,任务将以串行的方式依次在每台服务器上执行。也就是说,任务在第一台服务器上执行完成后才会切换到下一台服务器上执行。

并行执行

如果你希望在多个服务器上并行执行一个任务,只需在任务声明处添加 parallel 选项即可:

  1. @servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2'])
  2. @task('deploy', ['on' => ['web-1', 'web-2'], 'parallel' => true])
  3. cd site
  4. git pull origin {{ $branch }}
  5. php artisan migrate
  6. @endtask

任务宏

“宏”可以让你只用一条命令就能顺序执行一组任务。例如:

  1. @servers(['web' => '192.168.1.1'])
  2. @macro('deploy')
  3. foo
  4. bar
  5. @endmacro
  6. @task('foo')
  7. echo "HELLO"
  8. @endtask
  9. @task('bar')
  10. echo "WORLD"
  11. @endtask

deploy 宏可以通过一条简单地命令启动并执行:

  1. envoy run deploy

通知

HipChat

任务执行完后,你可能希望发送一条通知信息到团队的 HipChat 聊天室,这一功能可以通过 @hipchat 指令实现:

  1. @servers(['web' => '192.168.1.1'])
  2. @task('foo', ['on' => 'web'])
  3. ls -la
  4. @endtask
  5. @after
  6. @hipchat('token', 'room', 'Envoy')
  7. @endafter

你还可以定制发送到 hipchat 聊天室的消息内容。任何在 @setup 或通过 @include 引入的变量都可以在消息中直接引用:

  1. @after
  2. @hipchat('token', 'room', 'Envoy', "$task ran on [$environment]")
  3. @endafter

Envoy 让你的团队时刻掌握服务器上任务执行的情况变得惊人的简单。

Slack

下面的代码实例可以将通知发送到 Slack 聊天室:

  1. @after
  2. @slack('hook', 'channel', 'message')
  3. @endafter

你可以通过在 Slack 官网创建一个 Incoming WebHooks 集成来获取 webhook 的地址。hook 参数应该是由 Slack 的 Incoming Webhooks 集成提供的一个完整的 URL 地址,比如:

  1. https://hooks.slack.com/services/ZZZZZZZZZ/YYYYYYYYY/XXXXXXXXXXXXXXX

你可以使用如下参数填入到 channel 参数中。

  • 发送通知给指定频道: #channel
  • 发送通知给指定用户: @user

如果没有提供 channel 参数,将会使用默认的 channel。

注意: Slack 通知仅会在所有任务都成功完成后才会发送。

更新 Envoy

通过 Composer 来更新 Envoy:

  1. composer global update