* * * * *
[TOC]
## 簡介
[Laravel Envoy](https://github.com/laravel/envoy)?為定義遠程服務器的日常任務,提供了一套簡潔、輕量的語法。Blade 風格語法即可實現部署任務的配置、Artisan 命令的執行等。目前,Envoy 僅支持 Mac 和 Linux 操作系統。
### 安裝
首先,運行 Composer 的?`global require`?命令進行全局安裝 Envoy:
~~~
composer global require laravel/envoy
~~~
Composer 的全局庫出現版本沖突時,不妨考慮使用`cgr`,它是?`composer global require`?命令的替代實現。`cgr`?庫的安裝信息可參閱?[GitHub](https://github.com/consolidation-org/cgr)。
> {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'])
~~~
### 配置
有時,執行 Envoy 任務前,需要執行 PHP 代碼,這就可以使用?`@setup`?指令聲明變量和執行 PHP:
~~~
@setup
$now = new DateTime();
$environment = isset($env) ? $env : "testing";
@endsetup
~~~
任務執行前,需要引入 PHP 文件的話,就可以在?`Envoy.blade.php`?文件頭部使用?`@include`?指令引入:
~~~
@include('vendor/autoload.php')
@task('foo')
# ...
@endtask
~~~
### 變量
需要的話,可以通過命令行選項值的方式把變量傳入 Envoy 任務:
~~~
envoy run deploy --branch=master
~~~
可以通過 Blade 的「echo」語法使用選項值。當然,任務中的?`if`?語句和循環,也同樣可以使用。現在,我們就在執行?`git pull`?命令前驗證一下?`$branch`?變量:
~~~
@servers(['web' => '192.168.1.1'])
@task('deploy', ['on' => 'web'])
cd site
@if ($branch)
git pull origin {{ $branch }}
@endif
php artisan migrate
@endtask
~~~
### Story
Story 通過唯一、便捷的名字組合一系列任務,從而把小而專的任務聚到一起。例如,一個?`deploy`?story 要運行?`git`?和?`composer`?兩個任務,可以在其定義時列出任務?`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
~~~
story 編寫好后,可以像普通任務一樣運行:
~~~
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`?文件的任務或 story 通過執行 Envoy 的?`run`?命令觸發,傳入其名運行。Envoy 在運行任務時,會顯示服務器的輸出:
~~~
envoy run task
~~~
### 任務確認
要在任務運行前進行確認,需要把?`confirm`?指令加到任務聲明中。這個選項對危險操作特別有用:
~~~
@task('deploy', ['on' => 'web', 'confirm' => true])
cd site
git pull origin {{ $branch }}
php artisan migrate
@endtask
~~~
## 通知
### Slack
Envoy 還支持在任務執行完后把通知發送至?[Slack](https://slack.com/)。`@slack`?指令接受一個 Slack hook URL 和一個頻道名。在 Slack 的控制面版創建的「Incoming WebHooks」集成就能找到 webhook URL。應把整個 webhook URL 傳入?`@slack`?指令:
~~~
@finished
@slack('webhook-url', '#bots')
@endfinished
~~~
可以選擇以下任一作為頻道參數:
* 給頻道發送通知:`#channel`
* 給用戶發送通知:`@user`
- 前言
- 翻譯說明
- 發行說明
- 升級指南
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- Homestead
- Valet
- 部署
- 核心架構
- 請求周期
- 服務容器
- 服務提供者
- Facades
- Contracts
- 基礎功能
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- URL
- Session
- 表單驗證
- 錯誤
- 日志
- 前端開發
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全相關
- 用戶認證
- Passport OAuth 認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- API 資源
- 序列化
- 測試相關
- 快速入門
- HTTP 測試
- 瀏覽器測試 Dusk
- 數據庫測試
- 測試模擬器
- 官方擴展包
- Cashier 交易工具包
- Envoy 部署工具
- Horizon
- Scout 全文搜索
- Socialite 社會化登錄