前言
最近公司開發(fā)框架由Thinkphp換成了Laravel,每次項目更新上線,都會先更新代碼,再執(zhí)行命令來確保項目運(yùn)行:
- 登錄服務(wù)器,打開命令行;
- 進(jìn)入項目所在文件夾(項目根目錄)
cd /innfotech/www/xxx/; - 把本地代碼更新為最新的
svn up; - 然后再執(zhí)行一些命令:composer的,artisan的等
剛開始,手動做這些事情,覺得還行,久而久之, 會覺得這種方式太過麻煩,比較繁瑣,還容易出現(xiàn)失誤。所以針對這個問題,打算找一個解決方案。
Laravel Envoy 就是我找到解決方案
Laravel Envoy 為定義在遠(yuǎn)程服務(wù)器上運(yùn)行的通用任務(wù)提供了一種簡潔、輕便的語法。它使用了 Blade 風(fēng)格的語法,讓你可以很方便的啟動任務(wù)來進(jìn)行項目部署、Artisan 命令運(yùn)行等操作。目前,Envoy 只支持 Mac 及 Linux 操作系統(tǒng)。
TA 允許你通過最少的配置, 只需要在本地的命令行下執(zhí)行如下的一行命令:envoy run deploy,就可以把上面所有的事情都做了。
話不多說,下面開始介紹 Laravel Envoy的安裝和使用!
安裝
Laravel Envoy Github地址:https://github.com/laravel/envoy
Laravel Envoy 的運(yùn)行需要 PHP 5.4 以上, 使用 Composer Global 安裝:
安裝composer
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
//將Composer配置給所有用戶
composer global require "laravel/installer"
安裝 Laravel Envoy
composer global require "laravel/envoy=~1.0"

注意: 需要把 ~/.composer/vendor/bin 放到你的 PATH 里面
//將bin放入當(dāng)前用戶Path
echo 'export PATH=$PATH:/root/.composer/vendor/bin' >> ~/.bashrc
//導(dǎo)入,免登出
source ~/.bashrc
//添加larvel執(zhí)行權(quán)限
chmod +x /root/.composer/vendor/laravel/installer/laravel
//添加envoy執(zhí)行權(quán)限
chomp +x /root/.composer/vendor/laravel/envoy/envoy
注意:
這里需要proc_open支持所以你查看是否支持
/usr/local/php/etc/php.ini
//刪除
disable_functions中
proc_open proc_status
安裝完成后測試
? envoy --version
Laravel Envoy version 1.0.16
以后要更新的話, 只需要執(zhí)行以下
composer global update
簡單使用
1.初始化并創(chuàng)建 deploy 任務(wù)
首先, 在你的 項目 跟目錄下, 執(zhí)行以下命令進(jìn)行初始化
? envoy init vagrant@192.168.1.1(服務(wù)器IP)
Envoy file created!

上面的命令會在此文件夾下生成一個 Envoy.blade.php 的文件, 內(nèi)容如下
@servers(['web' => 'vagrant@192.168.1.1'])
@task('deploy')
<!--需要執(zhí)行的命令-->
cd /innfotech/www/xxx
svn up
composer update
composer dump-autoload
php artisan cache:clear
php artisan migrate--seed
@endtask
Envoy.blade.php的語法很簡單:
@servers 的數(shù)組被定義在文件的起始位置處,讓你在聲明任務(wù)時可以在 on 選項里參照使用這些服務(wù)器。`
@task聲明里,你可以放置當(dāng)任務(wù)運(yùn)行時想要在遠(yuǎn)程服務(wù)器運(yùn)行的 Bash 命令。

然后運(yùn)行命令:envoy run deploy就可以了
高級使用
你可以通過指定服務(wù)器的 IP 地址為 127.0.0.1 來執(zhí)行本地任務(wù):(目前,Envoy 只支持 Mac和Linux環(huán)境 )
@servers(['localhost' => '127.0.0.1'])
任務(wù)啟動
有時,你可能想在任務(wù)啟動前運(yùn)行一些 PHP 代碼。這時可以使用 @setup 區(qū)塊在 Envoy 文件中聲明變量以及運(yùn)行普通的 PHP 程序:
@setup
$now = new DateTime();
$environment = isset($env) ? $env : "testing";
@endsetup
如果你想在任務(wù)執(zhí)行前引入其他 PHP 文件,可以直接在 Envoy.blade.php 文件起始位置使用 @include :
@include('vendor/autoload.php')
@task('foo')
# ...
@endtask
任務(wù)變量
如果需要的話,你也可以通過命令行選項來傳遞變量至 Envoy 文件,以便自定義你的任務(wù):
envoy run deploy --branch=master
你可以通過 Blade 的「echo」語法使用這些選項, 當(dāng)然也能在任務(wù)里用「if」 和循環(huán)操作。舉例來說,我們在執(zhí)行 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
任務(wù)宏
任務(wù)宏通過一個統(tǒng)一的、便捷的名字來劃分一組任務(wù),來讓你把小而專的子任務(wù)合并到大的任務(wù)里。比如說,一個名為deploy 的任務(wù)宏可以在它定義范圍內(nèi)列出子任務(wù)名字 git 和 composer 來運(yùn)行各自對應(yīng)的任務(wù):
@servers(['web' => '192.168.1.1'])
@story('deploy')
git
composer
@endstory
@task('git')
git pull origin master
@endtask
@task('composer')
composer install
@endtask
當(dāng) story 寫好后,像運(yùn)行普通任務(wù)一樣運(yùn)行它就好了:
envoy run deploy
多個服務(wù)器
你可以在多個服務(wù)器上運(yùn)行任務(wù)。首先,增加額外的服務(wù)器至你的 @servers 聲明,每個服務(wù)器必須分配一個唯一的名稱。一旦你定義好其它服務(wù)器,就能夠在任務(wù)聲明的 on 數(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
并行運(yùn)行
默認(rèn)情況下,任務(wù)會按照順序在每個服務(wù)器上運(yùn)行。這意味著任務(wù)會在第一個服務(wù)器運(yùn)行完后才跳到第二個。如果你想在多個服務(wù)器上并行運(yùn)行任務(wù),只需簡單的在任務(wù)聲明里加上 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
運(yùn)行任務(wù)
要想運(yùn)行一個在 Envoy.blade.php 文件中定義好的任務(wù)或者宏,就執(zhí)行 Envoy 的 run 命令,并將這個任務(wù)的名字傳遞給它。Envoy 會去執(zhí)行這個任務(wù)并且把任務(wù)執(zhí)行過程中的輸出給打印出來:
envoy run task
任務(wù)確認(rèn)
如果你想要在運(yùn)行任務(wù)之前進(jìn)行提示確認(rèn),則可以增加 confirm 命令到任務(wù)聲明。這個選項對于破壞性的操作來說是相當(dāng)有用的:
@task('deploy', ['on' => 'web', 'confirm' => true])
cd site
git pull origin {{ $branch }}
php artisan migrate
@endtask
通知
Slack

Envoy 也支持任務(wù)執(zhí)行完畢后發(fā)送通知至 Slack。@slack 命令接收 Slack hook 網(wǎng)址和頻道名稱。你可以通在在 Slack 的控制面板上創(chuàng)建 「Incoming WebHooks」 時來檢索 webhook 網(wǎng)址。webhook-url 參數(shù)必須是 @slack 的 Incoming WebHooks 所提供的完整網(wǎng)址:
@finished
@slack('webhook-url', '#bots')
@endfinished
你可以選擇下方的任意一個來作為 channel 參數(shù):
- 如果要發(fā)送通知至一個頻道:
#channel - 如果要發(fā)送通知給一位用戶:
@user