前言
Laravel Envoy 是一个用于在远程服务器上执行常用任务的工具。它使用与 Blade 相同的语法,可以轻松定义部署、Artisan 命令执行等任务。Envoy 目前仅支持 macOS 和 Linux。若在 Windows 中使用,需要通过 WSL2。
安装
使用 Composer 包管理器将 Envoy 安装到项目中。vendor/bin 目录下即可使用 Envoy 可执行文件。
任务的创建
任务的定义
任务是 Envoy 的基本构成要素。任务用于定义在任务执行时应在远程服务器上运行的 shell 命令。例如,可以定义一个在所有队列 Worker 服务器上执行php artisan queue:restart 命令的任务。
所有 Envoy 任务都定义在应用根目录下的 Envoy.blade.php 文件中。
@servers 数组,然后在每个任务声明的 on 选项中引用这些服务器。@servers 声明必须写在一行内。@task 声明中写入的是在任务执行时于服务器上运行的 shell 命令。
本地任务
将服务器的 IP 地址指定为127.0.0.1,可以强制在本地计算机上运行脚本。
Envoy 任务的导入
使用@import 指令可以导入其他 Envoy 文件,将其 story 或 task 加入到自己的文件中。导入后,可以像在自己的 Envoy 文件中定义一样执行这些任务。
多台服务器
Envoy 可以轻松地在多台服务器上执行同一个任务。首先在@servers 声明中追加服务器,并为每台服务器分配一个唯一名称。添加完毕后,在任务的 on 数组中列出各服务器。
并行执行
默认情况下,任务在各服务器上是串行执行的。也就是说,任务在第 1 台服务器完成后,才会开始在第 2 台服务器执行。如果希望在多台服务器上并行执行,可以在任务声明中添加parallel 选项。
初始化设置
如果在执行 Envoy 任务之前需要执行任意 PHP 代码,可以使用@setup 指令。
Envoy.blade.php 文件顶部使用 @include 指令。
变量
调用 Envoy 任务时,可以在命令行中指定参数传递给任务。if 语句和循环。例如,若希望在执行 git pull 命令前确认 $branch 变量存在,可以这样写。
故事(Story)
Story 用一个方便的名字将一系列任务分组。例如,可以在deploy story 中一起执行 update-code 和 install-dependencies 任务。
完成钩子
在任务和 story 执行时会触发多个钩子。Envoy 支持的钩子类型有@before、@after、@error、@success、@finished。这些钩子内的代码都会作为 PHP 解释,并在本地执行,而不是在任务操作的远程服务器上。
每种钩子可以定义任意多个,会按其在 Envoy 脚本中书写的顺序执行。
@finished 钩子会接收已执行完的任务的状态码。状态码为 null 或大于等于 0 的整数。
执行任务
要执行应用Envoy.blade.php 文件中定义的任务或 story,可运行 Envoy 的 run 命令并传入要执行的任务或 story 名称。Envoy 会执行任务,并在过程中显示来自远程服务器的输出。
任务执行的确认
如果希望在服务器上执行特定任务前要求确认,可在任务声明中添加confirm 指令。此功能在执行破坏性操作时尤其有用。
通知
Slack
Envoy 可以在每个任务执行后向 Slack 发送通知。@slack 指令接收 Slack 的 Webhook URL 与频道名(或用户名)。Webhook URL 可以通过在 Slack 控制面板中创建”Incoming WebHooks”集成来获取。
@slack 指令的第 1 个参数为整个 Webhook URL。第 2 个参数为频道名(#channel)或用户名(@user)。
@slack 指令传入第 3 个参数,可以自定义消息。
Discord
Envoy 也支持在每个任务执行后向 Discord 发送通知。@discord 指令接收 Discord 的 Webhook URL 与消息。Webhook URL 可以在服务器设置中创建”Webhook”并选择发送目标频道获得。
Telegram
Envoy 也支持在每个任务执行后向 Telegram 发送通知。@telegram 指令接收 Telegram Bot ID 与 Chat ID。Bot ID 可以通过在 BotFather 创建新 bot 得到。Chat ID 可以使用 @username_to_id_bot 获取。
Microsoft Teams
Envoy 也支持在每个任务执行后向 Microsoft Teams 发送通知。@teams 指令接收 Teams 的 webhook(必需)、消息、主题颜色(success, info, warning, error)以及可选的配置数组。Teams 的 webhook 可通过创建 Incoming Webhook 获得。Teams API 还有许多其他配置项,可以自由创建自定义消息卡片。详情请参阅 Microsoft Teams 的文档。