設定

Laravelはリモートサーバーへ接続し、コマンドを実行するシンプルな方法をサポートしています。これによりリモートサーバーで動作するArtisanタスクを簡単に作成することができます。SSHファサードはリモートサーバーへの接続とコマンドの実行を提供します。

設定ファイルはapp/config/remote.phpです。すべてのオプションはリモート接続の設定として必要です。connections配列は、名前をキーとしたサーバーの接続リストです。connections配列に、ただ接続情報を指定すれば、リモートタスクを実行する準備が整います。SSHは認証にパスワードかSSHキーが使用できることに注意して下さい。

注目:簡単に、いろいろなタスクをリモートサーバーで走らせたいのですか? なら、Envoyタスクランナーを試してください!

基本的な使用法

デフォルトサーバーでコマンドを実行する

defaultリモート接続は、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メソッドでtaskを定義できます。

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クラスは、getgetStringメソッドを使用し、ファイルをダウンロードするシンプルな方法を、持っています。

SSH::into('staging')->get($remotePath, $localPath);

$contents = SSH::into('staging')->getString($remotePath);

SFTPアップロード

SSHクラスはファイルか文字列をサーバーにアップロードする簡単な方法を用意しています。putputStringメソッドを使用して下さい。

SSH::into('staging')->put($localFile, $remotePath);

SSH::into('staging')->putString($remotePath, 'Foo');

リモートのログ表示

Laravelはリモート接続先にある、laravel.logファイルの最新部分を表示する便利なコマンドを用意しています。tail Artisanコマンドを使用し、最新行を表示したいリモート接続の名前を指定して下さい。

php artisan tail staging

php artisan tail staging --path=/path/to/log.file

Envoyタスクランナー

Laravel Envoy(使節)は、リモートサーバーで定義済みの共通タスクを実行するための、クリーンで最低限の記法を提供します。Bladeスタイルの記述法を使用し、デプロイやArtisanコマンドなどのタスクを簡単にセットアップできます。

注目: Envoyは、PHPバージョン5.4以上で、MacかLinuxのオペレーティングシステム上で動作します。

インストール

最初に、EnvoyをComposerのglobalコマンドでインストールします。

composer global require "laravel/envoy=~1.0"

envoyコマンドを端末で実行するときには、envoyの実行ファイルが起動できるように、~/.composer/vendor/binディレクトリーに、実行パスを通しておくのを忘れないでください。

次に、Envoy.blade.phpファイルをプロジェクトのルートに作成します。最初のサンプル設定をどうぞ。

@servers(['web' => '192.168.1.1'])

@task('foo', ['on' => 'web'])
    ls -la
@endtask

見ての通り、最初に@serversで、配列を定義しています。これらのサーバーへは、タスク宣言のonオプションの中で、参照できます。@task宣言の中に、タスクを実行するサーバーで走らせる、Bashコードを記述します。

initコマンドを使用し、Envoyファイルのスタブを簡単に作成できます。

envoy init user@192.168.1.1

タスク実行

タスクを実行するには、インストールした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

準備コード

@setupディレクティブを使えば、Envoyファイルの中で変数宣言をしたり、一般的な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のアップデート

Envoyを更新するには、ただ、self-updateコマンドを実行してください。

envoy self-update

/usr/local/binにEnvoyをインストールしている場合、sudoを使用する必要があるでしょう。

composer global update