Laravel Envoy 優(yōu)雅的SSH遠(yuǎn)程任務(wù)執(zhí)行工具

前言

最近公司開發(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"
微信截圖_20190123164325.png

注意: 需要把 ~/.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!
微信截圖_20190123164309.png

上面的命令會在此文件夾下生成一個 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 命令。

微信截圖_20190123164336.png

然后運(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ù)名字 gitcomposer 來運(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

slack.jpg

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容