# Envoy 任務運行器
- [簡介](#introduction)
- [安裝](#installation)
- [編寫任務](#writing-tasks)
- [任務啟動](#setup)
- [任務變量](#task-variables)
- [任務故事](#stories)
- [多個服務器](#multiple-servers)
- [運行任務](#running-tasks)
- [任務確認](#confirming-task-execution)
- [通知](#notifications)
- [Slack](#slack)
<a name="introduction"></a>
## 簡介
[Laravel Envoy](https://github.com/laravel/envoy) 為定義在遠程服務器上運行的通用任務提供了一種簡潔、輕便的語法。它使用了 Blade 風格的語法,讓你可以很方便的啟動任務來進行項目部署、Artisan 命令運行等操作。目前,Envoy 只支持 Mac 及 Linux 操作系統。
<a name="installation"></a>
### 安裝
因為 Composer 的全局庫有時會導致包的版本沖突,所以你可以考慮使用 `cgr`,它是 `composer global require` 命令的一種替代實現。`cgr` 庫的安裝指導可以在 [GitHub上找到](https://github.com/consolidation-org/cgr)。
> {note} 一定要確保 `~/.composer/vendor/bin` 目錄加入到了你的 PATH 中,這樣才能在命令行運行 `envoy`。
#### 更新 Envoy
你也可以使用 Composer 來更新 Envoy 到最新版本。
要注意 `composer global update` 命令是更新你所有在全局安裝的包。
composer global update
<a name="writing-tasks"></a>
## 編寫任務
所有的 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'])
<a name="setup"></a>
### 任務啟動
有時,你可能想在任務啟動前運行一些 PHP 代碼。這時可以使用 ```@setup``` 區塊在 Envoy 文件中聲明變量以及運行普通的 PHP 程序:
@setup
$now = new DateTime();
$environment = isset($env) ? $env : "testing";
@endsetup
如果你想在任務執行前引入其他 PHP 文件,可以直接在 `Envoy.blade.php` 文件起始位置使用 `@include`:
@include('vendor/autoload.php')
@task('foo')
# ...
@endtask
<a name="variables"></a>
### 任務變量
如果需要的話,你也可以通過命令行選項來傳遞變量至 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
<a name="stories"></a>
### 任務故事
任務故事通過一個統一的、便捷的名字來劃分一組任務,來讓你把小而專的子任務合并到大的任務里。比如說,一個名為 `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
當 story 寫好后,像運行普通任務一樣運行它就好了:
envoy run deploy
<a name="multiple-servers"></a>
### 多個服務器
你可以在多個服務器上運行任務。首先,增加額外的服務器至你的 `@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
<a name="running-tasks"></a>
##運行任務
要想運行一個在 `Envoy.blade.php` 文件中定義好的任務或者故事,就執行 Envoy 的 `run` 命令,并將這個任務的名字傳遞給它。Envoy 會去執行這個任務并且把任務執行過程中的輸出給打印出來:
envoy run task
<a name="confirming-task-execution"></a>
### 任務確認
如果你想要在運行任務之前進行提示確認,則可以增加 `confirm` 命令到任務聲明。這個選項對于破壞性的操作來說是相當有用的:
@task('deploy', ['on' => 'web', 'confirm' => true])
cd site
git pull origin {{ $branch }}
php artisan migrate
@endtask
<a name="notifications"></a>
<a name="hipchat-notifications"></a>
## 通知
<a name="slack"></a>
### Slack
Envoy 也支持任務執行完畢后發送通知至 [Slack](https://slack.com)。`@slack` 命令接收 Slack hook 網址和頻道名稱。當你在 Slack 的網站控制面板上創建 `Incoming WebHooks` 時會獲得 webhook 網址。`webhook-url` 參數必須是 Slack 的 Incoming WebHooks 所提供的完整網址:
@after
@slack('webhook-url', '#bots')
@endafter
你可以選擇下方的任意一個來作為 channel 參數:
<div class="content-list" markdown="1">
- 如果要發送通知至一個頻道:`#channel`
- 如果要發送通知給一位用戶:`@user`
</div>
- 說明
- 翻譯說明
- 發行說明
- 升級說明
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- 錯誤與日志
- 開發環境
- HomeStead
- Valet
- 核心概念
- 服務容器
- 服務提供者
- 門面(facades)
- contracts
- HTTP層
- 路由
- 中間件
- CSRF保護
- 控制器
- 請求
- 響應
- Session
- 表單驗證
- 視圖與模板
- 視圖
- Blade模板
- 本地化
- Javascript與CSS
- 入門指南
- laravel-elixir
- 安全
- 用戶認證
- 用戶授權
- 重置密碼
- API授權
- 加密解密
- 哈希
- 綜合話題
- 廣播系統
- 緩存系統
- 事件系統
- 文件存儲
- 郵件發送
- 消息通知
- 隊列
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent集合
- 修改器
- 序列化
- Artisan控制臺
- Artisan 命令行
- 任務調度
- 測試
- 快速入門
- 應用程序測試
- 數據庫測試
- 模擬器
- 官方擴展包
- Cashier交易包
- Envoy 部署工具
- Passport OAuth 認證
- Scout 全文搜索
- Socialite 社交化登錄
- 附錄
- 集合
- 輔助函數
- 擴展包開發
- 交流說明