Envoy 任務(wù)運(yùn)行器
簡(jiǎn)介
Laravel Envoy 為遠(yuǎn)端服務(wù)器常用任務(wù)的定義與執(zhí)行提供了迷你簡(jiǎn)潔的語(yǔ)法。你可以通過使用 Blade 語(yǔ)法樣式輕松的為部署,Artisan 命令等設(shè)置任務(wù)。目前,Envoy 只支持 Mac 和 Linux 操作系統(tǒng)。
安裝
首先,你需要通過 Composer 的 global 命令來安裝 Envoy:
composer global require "laravel/envoy=~1.0"
你需要確保 ~/.composer/vendor/bin 目錄被加入到你的 PATH 中,這樣才能使你在使用終端時(shí)可以直接使用 envoy 命令。
更新 Envoy
你可以使用 Composer 來維持 Envoy 的更新:
composer global update
編寫任務(wù)
所有的 Envoy 任務(wù)應(yīng)該被定義在你項(xiàng)目的根目錄下的 Envoy.blade.php 文件中。這里有一個(gè)簡(jiǎn)單的示例:
@servers(['web' => 'user@192.168.1.1'])
@task('foo', ['on' => 'web'])
ls -al
@endtask
就如你所看到的,@servers 指令被定義在文件的頭部,并且包含一個(gè)數(shù)組,數(shù)組中包含服務(wù)器的列表。@task 指令用來定義任務(wù),它包含一個(gè)任務(wù)名稱,和一個(gè)數(shù)組參數(shù),數(shù)組中包含一個(gè) on 鍵,它的值就是任務(wù)所要執(zhí)行的服務(wù)器,它應(yīng)該是 @servers 指令列表中的一個(gè)或多個(gè)。你應(yīng)該在 @task 指令的內(nèi)部放置 Bash 代碼,這些代碼會(huì)在任務(wù)執(zhí)行時(shí)傳遞給所要執(zhí)行的遠(yuǎn)端服務(wù)器。
本地任務(wù)
你可以指定服務(wù)器為本地來執(zhí)行本地的任務(wù):
@servers(['localhost' => '127.0.0.1'])
引導(dǎo)
有時(shí)候,你可能希望在執(zhí)行 Envoy 任務(wù)之前先執(zhí)行某些 PHP 操作。你可以使用 @setup 指令來聲明變量,并且你可以在其內(nèi)部使用 PHP 來工作:
@setup
$now = new DateTime();
$environment = isset($env) ? $env : "testing";
@endsetup
你也可以使用 @include 指令來引入任意的外部 PHP 文件:
@include('vendor/autoload.php')
確認(rèn)任務(wù)
如果你希望在遠(yuǎn)端服務(wù)器執(zhí)行所給定任務(wù)之前先進(jìn)行提示,你可以在你的任務(wù)定義時(shí)添加 confirm 指令:
@task('deploy', ['on' => 'web', 'confirm' => true])
cd site
git pull origin {{ $branch }}
php artisan migrate
@endtask
任務(wù)變量
如果你需要的話,你可以使用命令行開關(guān)來傳遞變量到 Envoy 任務(wù)中,這允許你定制化你的任務(wù):
envoy run deploy --branch=master
你可以在你的任務(wù)中通過 Blade 的 echo 語(yǔ)法使用該選項(xiàng):
@servers(['web' => '192.168.1.1'])
@task('deploy', ['on' => 'web'])
cd site
git pull origin {{ $branch }}
php artisan migrate
@endtask
多個(gè)服務(wù)器
你可以輕松的跨多個(gè)服務(wù)器執(zhí)行任務(wù)。首先,你需要在 @servers 指令中添加額外的服務(wù)器。每個(gè)服務(wù)器應(yīng)該被分配一個(gè)唯一的名字。當(dāng)你添加完額外的服務(wù)器之后,你需要在待執(zhí)行的任務(wù)指令中使用數(shù)組 on 鍵來列出待執(zhí)行的服務(wù)器:
@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
默認(rèn)的,任務(wù)會(huì)在服務(wù)器間串行執(zhí)行,這意味著只有在當(dāng)前服務(wù)器執(zhí)行任務(wù)完成之后才會(huì)執(zhí)行下一個(gè)服務(wù)器的任務(wù)。
平行執(zhí)行
如果你希望跨服務(wù)器平行執(zhí)行任務(wù)。你可以在任務(wù)指令中添加 parallel 選項(xiàng):
@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
任務(wù)宏
任務(wù)宏允許你定義一個(gè)命令來順序的執(zhí)行一組任務(wù)。舉個(gè)實(shí)例,我們定義一個(gè) deploy 宏來執(zhí)行 git 和 composer 任務(wù):
@servers(['web' => '192.168.1.1'])
@macro('deploy')
git
composer
@endmacro
@task('git')
git pull origin master
@endtask
@task('composer')
composer install
@endtask
一旦你定義完成了宏,你就可以通過一條命令來運(yùn)行多個(gè)任務(wù):
envoy run deploy
運(yùn)行任務(wù)
你需要使用 Envoy 的 run 命令來執(zhí)行 Envoy.blade.php 文件中所定義的任務(wù)。你可以傳遞一個(gè)任務(wù)的名稱或者宏名稱到命令中。Envoy 會(huì)執(zhí)行任務(wù)并同步顯示服務(wù)器執(zhí)行的輸出:
envoy run task
通知
HipChat
你可以使用 @hipchat 指令來在任務(wù)執(zhí)行完成之后,發(fā)送一個(gè)消息通知到團(tuán)隊(duì)的 HipChat 房間中。這個(gè)指令接收一個(gè) API token,房間的名稱和消息中所顯示的發(fā)送者的用戶名:
@servers(['web' => '192.168.1.1'])
@task('foo', ['on' => 'web'])
ls -al
@endtask
@after
@hipchat('token', 'room', 'Envoy')
@endafter
如果你需要,你也可以發(fā)送自定義的消息到 HipChat 房間。構(gòu)建消息時(shí),任務(wù)可用的變量在消息中也是可用的:
@after
@hipchat('token', 'room', 'Envoy', "$task ran in the $env environment.")
@endafter
Slack
除了 HipChat 之外,Envoy 也支持向 Slack 中發(fā)送通知。@slack 指令接收一個(gè) Slack hook URL,一個(gè)頻道名稱,和你需要發(fā)送的消息內(nèi)容:
@after
@slack('hook', 'channel', 'message')
@endafter
你可以通過在 Slack 的網(wǎng)站上創(chuàng)建一個(gè) Incoming WebHooks 來獲取 webhook URL。hook 參數(shù)應(yīng)該是一個(gè)完整的 webhook URL,比如:
https://hooks.slack.com/services/ZZZZZZZZZ/YYYYYYYYY/XXXXXXXXXXXXXXX
你可以提供以下作為頻道的參數(shù)之一:
-
#channel發(fā)送通知到頻道 -
@user發(fā)送通知到用戶