Laravel Envoy 提供了簡(jiǎn)潔、輕量的語法用于定義在遠(yuǎn)程服務(wù)器上可執(zhí)行的通用任務(wù)。通過 Blade 風(fēng)格的語法,你可以很容易地設(shè)置任務(wù)從而完成部署、執(zhí)行 Artisan 命令或其他更多工作。
注意: Envoy 依賴 PHP 5.4 或更高版本,并且只能運(yùn)行在 Mac / Linux 操作系統(tǒng)中。
首先,通過 Composer 的 global
命令來安裝 Envoy:
composer global require "laravel/envoy=~1.0"
請(qǐng)務(wù)必將 ~/.composer/vendor/bin
目錄加入到 PATH 環(huán)境變量中,這樣才能在命令行中執(zhí)行 envoy
命令時(shí)找到可執(zhí)行文件。
接下來,在項(xiàng)目的根目錄下創(chuàng)建 Envoy.blade.php
文件。下面給出的實(shí)例代碼你可以當(dāng)做模板使用:
@servers(['web' => '192.168.1.1'])@task('foo', ['on' => 'web']) ls -la @endtask
如上所示,在文件的開頭首先定義了 @servers
數(shù)組。后續(xù)的任務(wù)聲明中,你可以在 on
選項(xiàng)中直接引用。在 @task
聲明里,你可以直接填寫需要在服務(wù)器上執(zhí)行的 Bash 腳本代碼。
init
命令可以很方便地用來創(chuàng)建一個(gè)包含基本內(nèi)容的 Envoy 文件:
envoy init user@192.168.1.1
使用 run
命令來執(zhí)行任務(wù):
envoy run foo
如有需要,你還可以通過命令行向 Envoy 文件傳遞參數(shù):
envoy run deploy --branch=master
你可以通過 Blade 語法引用這些參數(shù):
@servers(['web' => '192.168.1.1'])@task('deploy', ['on' => 'web']) cd site git pull origin {{ $branch }} php artisan migrate @endtask
你可以在 @setup
指令中聲明變量,并在 Envoy 文件中執(zhí)行普通的 PHP 代碼:
@setup $now = new DateTime(); $environment = isset($env) ? $env : "testing";@endsetup
還可以通過 @include
指令引入任意的 PHP 文件:
@include('vendor/autoload.php');
如果你想要在執(zhí)行指定的任務(wù)前有一個(gè)提示確認(rèn),可以使用 confirm
指令:
@task('deploy', ['on' => 'web', 'confirm' => true]) cd site git pull origin {{ $branch }} php artisan migrate @endtask
在多臺(tái)服務(wù)器上執(zhí)行一個(gè)任務(wù)是非常簡(jiǎn)單的,只需在聲明任務(wù)時(shí)列出服務(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 @endtask
默認(rèn)情況下,任務(wù)將以串行的方式依次在每臺(tái)服務(wù)器上執(zhí)行。也就是說,任務(wù)在第一臺(tái)服務(wù)器上執(zhí)行完成后才會(huì)切換到下一臺(tái)服務(wù)器上執(zhí)行。
如果你希望在多個(gè)服務(wù)器上并行執(zhí)行一個(gè)任務(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
“宏”可以讓你只用一條命令就能順序執(zhí)行一組任務(wù)。例如:
@servers(['web' => '192.168.1.1'])@macro('deploy') foo bar @endmacro @task('foo') echo "HELLO"@endtask @task('bar') echo "WORLD"@endtask
deploy
宏可以通過一條簡(jiǎn)單地命令啟動(dòng)并執(zhí)行:
envoy run deploy
任務(wù)執(zhí)行完后,你可能希望發(fā)送一條通知信息到團(tuán)隊(duì)的 HipChat 聊天室,這一功能可以通過 @hipchat
指令實(shí)現(xiàn):
@servers(['web' => '192.168.1.1'])@task('foo', ['on' => 'web']) ls -la @endtask @after @hipchat('token', 'room', 'Envoy')@endafter
你還可以定制發(fā)送到 hipchat 聊天室的消息內(nèi)容。任何在 @setup
或通過 @include
引入的變量都可以在消息中直接引用:
@after @hipchat('token', 'room', 'Envoy', "$task ran on [$environment]")@endafter
Envoy 讓你的團(tuán)隊(duì)時(shí)刻掌握服務(wù)器上任務(wù)執(zhí)行的情況變得驚人的簡(jiǎn)單。
下面的代碼實(shí)例可以將通知發(fā)送到 Slack 聊天室:
@after @slack('hook', 'channel', 'message')@endafter
你可以通過在 Slack 官網(wǎng)創(chuàng)建一個(gè) Incoming WebHooks
集成來獲取 webhook 的地址。hook
參數(shù)應(yīng)該是由 Slack 的 Incoming Webhooks 集成提供的一個(gè)完整的 URL 地址,比如:
https://hooks.slack.com/services/ZZZZZZZZZ/YYYYYYYYY/XXXXXXXXXXXXXXX
你可以使用如下參數(shù)填入到 channel 參數(shù)中。
發(fā)送通知給指定頻道: #channel
發(fā)送通知給指定用戶: @user
如果沒有提供 channel
參數(shù),將會(huì)使用默認(rèn)的 channel。
注意: Slack 通知僅會(huì)在所有任務(wù)都成功完成后才會(huì)發(fā)送。
通過 Composer 來更新 Envoy:
composer global update
更多建議: