前言
最近公司開發(fā)框架由Thinkphp換成了Laravel局蚀,每次項目更新上線挽放,都會先更新代碼泡嘴,再執(zhí)行命令來確保項目運行:
- 登錄服務器趾痘,打開命令行;
- 進入項目所在文件夾(項目根目錄)
cd /innfotech/www/xxx/
; - 把本地代碼更新為最新的
svn up
; - 然后再執(zhí)行一些命令:composer的,artisan的等
剛開始榛斯,手動做這些事情观游,覺得還行,久而久之, 會覺得這種方式太過麻煩驮俗,比較繁瑣懂缕,還容易出現(xiàn)失誤。所以針對這個問題王凑,打算找一個解決方案搪柑。
Laravel Envoy 就是我找到解決方案
Laravel Envoy 為定義在遠程服務器上運行的通用任務提供了一種簡潔、輕便的語法索烹。它使用了 Blade 風格的語法逆巍,讓你可以很方便的啟動任務來進行項目部署胧弛、Artisan 命令運行等操作。目前,Envoy 只支持 Mac 及 Linux 操作系統(tǒng)栋猖。
TA 允許你通過最少的配置, 只需要在本地的命令行下執(zhí)行如下的一行命令:envoy run deploy
奋隶,就可以把上面所有的事情都做了童漩。
話不多說荣恐,下面開始介紹 Laravel Envoy的安裝和使用!
安裝
Laravel Envoy Github地址:https://github.com/laravel/envoy
Laravel Envoy 的運行需要 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放入當前用戶Path
echo 'export PATH=$PATH:/root/.composer/vendor/bin' >> ~/.bashrc
//導入求类,免登出
source ~/.bashrc
//添加larvel執(zhí)行權限
chmod +x /root/.composer/vendor/laravel/installer/laravel
//添加envoy執(zhí)行權限
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
任務
首先, 在你的 項目 跟目錄下, 執(zhí)行以下命令進行初始化
? envoy init vagrant@192.168.1.1(服務器IP)
Envoy file created!
上面的命令會在此文件夾下生成一個 Envoy.blade.php
的文件, 內容如下
@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ù)組被定義在文件的起始位置處奔垦,讓你在聲明任務時可以在 on
選項里參照使用這些服務器。`
@task
聲明里仑嗅,你可以放置當任務運行時想要在遠程服務器運行的 Bash 命令宴倍。
然后運行命令:envoy run deploy
就可以了
高級使用
你可以通過指定服務器的 IP 地址為 127.0.0.1
來執(zhí)行本地任務:(目前张症,Envoy 只支持 Mac和Linux環(huán)境 )
@servers(['localhost' => '127.0.0.1'])
任務啟動
有時,你可能想在任務啟動前運行一些 PHP 代碼鸵贬。這時可以使用 @setup
區(qū)塊在 Envoy 文件中聲明變量以及運行普通的 PHP 程序:
@setup
$now = new DateTime();
$environment = isset($env) ? $env : "testing";
@endsetup
如果你想在任務執(zhí)行前引入其他 PHP 文件俗他,可以直接在 Envoy.blade.php
文件起始位置使用 @include
:
@include('vendor/autoload.php')
@task('foo')
# ...
@endtask
任務變量
如果需要的話,你也可以通過命令行選項來傳遞變量至 Envoy 文件阔逼,以便自定義你的任務:
envoy run deploy --branch=master
你可以通過 Blade 的「echo」語法使用這些選項兆衅, 當然也能在任務里用「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
任務宏
任務宏通過一個統(tǒng)一的、便捷的名字來劃分一組任務危融,來讓你把小而專的子任務合并到大的任務里畏铆。比如說,一個名為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
多個服務器
你可以在多個服務器上運行任務辞居。首先,增加額外的服務器至你的 @servers
聲明蛋勺,每個服務器必須分配一個唯一的名稱瓦灶。一旦你定義好其它服務器,就能夠在任務聲明的 on
數(shù)組中列出這些服務器:
@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
文件中定義好的任務或者宏碉怔,就執(zhí)行 Envoy 的 run
命令,并將這個任務的名字傳遞給它家卖。Envoy 會去執(zhí)行這個任務并且把任務執(zhí)行過程中的輸出給打印出來:
envoy run task
任務確認
如果你想要在運行任務之前進行提示確認眨层,則可以增加 confirm
命令到任務聲明庙楚。這個選項對于破壞性的操作來說是相當有用的:
@task('deploy', ['on' => 'web', 'confirm' => true])
cd site
git pull origin {{ $branch }}
php artisan migrate
@endtask
通知
Slack
Envoy 也支持任務執(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