SSH
設定檔
Laravel 可以簡單的 SSH 到遠端伺服器以及執行指令,讓你可以簡單在遠端執行的建立 Artisan 任務。SSH
facade 提供了使用方式讓你連線到遠端伺服器並執行指令。
設定檔位在 app/config/remote.php
,包含所有你需要設定的遠端連線設定,connections
陣列裡有以遠端伺服器名稱作為鍵值的列表。只要在 connections
陣列設定好認證,你就準備好可以執行遠端任務了。記得 SSH
可以經由密碼或 SSH key 認證。
提示: 需要再遠端伺服器執行很多任務嗎?瞧瞧 Envoy 任務執行!
基本用法
在在預設伺服器執行指令
使用 SSH::run
方法,在預設的遠端伺服器執行指令:
SSH::run(array(
'cd /var/www',
'git pull origin master',
));
在特定伺服器執行指令
你也可以使用 into
方法在特定的伺服器上執行指令:
SSH::into('staging')->run(array(
'cd /var/www',
'git pull origin master',
));
捕捉指令的輸出
你可以經由傳入閉合函數到 run
方法,捕捉遠端指令的即時輸出:
SSH::run($commands, function($line)
{
echo $line.PHP_EOL;
});
任務
如果你需要定義一組一起執行的指令,你可以用 define
方法定義一個「任務」:
SSH::into('staging')->define('deploy', array(
'cd /var/www',
'git pull origin master',
'php artisan migrate',
));
你可以用 task
方法執行定義過的任務:
SSH::into('staging')->task('deploy', function($line)
{
echo $line.PHP_EOL;
});
SFTP 下載
SSH
類別裡有簡單的方式可以下載檔案,使用 get
和 getString
方法:
SSH::into('staging')->get($remotePath, $localPath);
$contents = SSH::into('staging')->getString($remotePath);
SFTP 上傳
SSH
類別裡也有簡單的方式可以上傳檔案或甚至是字串到遠端伺服器,使用 put
和 putString
方法:
SSH::into('staging')->put($localFile, $remotePath);
SSH::into('staging')->putString($remotePath, 'Foo');
編輯遠端日誌
Laravel 有一個有用的指令可以讓你在任何遠端伺服器的 laravel.log
尾端附加日誌內容。使用 Artisan 的 tail
指令以及指定遠端連線的伺服器名稱:
php artisan tail staging
php artisan tail staging --path=/path/to/log.file
Envoy 任務執行
Laravel Envoy 提供了簡潔,輕量的語法,定義在遠端伺服器執行的共同任務。使用 Blade 風格的語法,你可以簡單的設置部署任務,執行 Artisan 指令或是更多。
提醒: Envoy 需要 PHP 5.4 或更高的版本,並且只能在 Mac / Linux 作業系統下執行。
安裝
首先,使用 Composer global
指令安裝 Envoy:
composer global require "laravel/envoy=~1.0"
記得將 ~/.composer/vendor/bin
路徑加入 PATH,如此在終端機執行 envoy
指令時才找得到。
再來,在專案根目錄建立 Envoy.blade.php
檔案。這裡有個範例可以讓你作為起頭:
@servers(['web' => '192.168.1.1'])
@task('foo', ['on' => 'web'])
ls -la
@endtask
如你所見,@servers
陣列建立在檔案的起始。你可以在宣告任務時,在 on
選項裡參照這些伺服器。在你的 @task
宣告裡,寫入想要在遠端伺服器執行的 Bash code。
init
指令可以簡單的建立一個基本的 Envoy 檔:
envoy init [email protected]
執行任務
以 envoy 的 run
指令去執行你設定的任務:
envoy run foo
如有需要,你可以傳遞指令列參數到 Envoy 檔案:
envoy run deploy --branch=master
你也可以經由你所熟悉的 Blade 語法使用這些參數:
@servers(['web' => '192.168.1.1'])
@task('deploy', ['on' => 'web'])
cd site
git pull origin {{ $branch }}
php artisan migrate
@endtask
Bootstrapping
你可以在 Envoy 檔案裡使用 @setup
語法宣告 PHP 變數和執行一般的 PHP 程式碼:
@setup
$now = new DateTime();
$environment = isset($env) ? $env : "testing";
@endsetup
你也可以使用 @include
引入 PHP 檔案:
@include('vendor/autoload.php');
多伺服器
你可以簡單的在多個伺服器執行任務。只要在任務宣告裡列出伺服器名稱:
@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
任務巨集
巨集讓你可以使用一個指令就循序執行一組任務。例如:
@servers(['web' => '192.168.1.1'])
@macro('deploy')
foo
bar
@endmacro
@task('foo')
echo "HELLO"
@endtask
@task('bar')
echo "WORLD"
@endtask
現在 deploy
巨集可以經由一個簡單的指令執行:
envoy run deploy
提醒通知
HipChat
你可能想要在執行完任務後,發送通知到團隊的 HipChat 聊天室,使用簡單的 @hipchat
宣告:
@servers(['web' => '192.168.1.1'])
@task('foo', ['on' => 'web'])
ls -la
@endtask
@after
@hipchat('token', 'room', 'Envoy')
@endafter
你也可以自定發送到 hipchat 聊天室的訊息,任何在 @setup
裡宣告,或是經由 @include
引入的變數都可以使用在訊息裡:
@after
@hipchat('token', 'room', 'Envoy', "$task ran on [$environment]")
@endafter
這是一個令人驚豔的簡單方式,讓你的團隊保持通知在伺服器執行的任務。
Slack
下面的語法可以發送通知到 Slack:
@after
@slack('team', 'token', 'channel')
@endafter
更新 Envoy
簡單的執行 self-update
指令即可更新 Envoy:
envoy self-update
如果你的 Envoy 安裝在 /usr/local/bin
,你可能需要加上 sudo
:
sudo envoy self-update