Laravel 8.x Laravel Envoy

イントロダクション

Laravel Envoyは、リモートサーバ上で実行する一般的なタスクを実行するためのツールです。bladeスタイルの構文を使用し、デプロイやArtisanコマンドなどのタスクを簡単に設定できます。現在、EnvoyはMacおよびLinuxオペレーティングシステムのみをサポートしています。ただし、WindowsサポートはWSL2を使用して実現できます。

インストール

まず、Composerパッケージマネージャーを使用してEnvoyをプロジェクトにインストールします。

composer require laravel/envoy --dev

Envoyがインストールされると、Envoyバイナリはアプリケーションのvendor/binディレクトリで利用できるようになります。

php vendor/bin/envoy

タスクの記述

タスク定義

タスクはEnvoyの基本的な設定要素です。タスクには、呼び出されたときにリモートサーバで実行する必要があるシェルコマンドを定義します。たとえば、アプリケーションのすべてのキューワーカーサーバでphp artisan queue:restartコマンドを実行するタスクを定義できます。

すべてのEnvoyタスクは、アプリケーションのルートにあるEnvoy.blade.phpファイルで定義する必要があります。開始時に使えるサンプルを以下に示します。

@servers(['web' => ['user@192.168.1.1'], 'workers' => ['user@192.168.1.2']])

@task('restart-queues', ['on' => 'workers'])
    cd /home/user/example.com
    php artisan queue:restart
@endtask

ご覧のとおり、ファイルの先頭で@servers配列を定義しており、タスク宣言のonオプションを使用してこれらのサーバを参照できます。@servers宣言は常に1行に配置する必要があります。@task宣言内に、タスクが呼び出されたときにサーバ上で実行する必要のあるシェルコマンドを配置する必要があります。

ローカルタスク

サーバのIPアドレスを127.0.0.1として指定することにより、ローカルコンピューターでスクリプトを強制的に実行できます。

@servers(['localhost' => '127.0.0.1'])

Envoyタスクのインポート

@importディレクティブを使用すると、他のEnvoyファイルをインポートして、それらのストーリーとタスクを自身へ追加できます。ファイルをインポートすると、そのファイルに含まれるタスクを、自身のEnvoyファイルで定義されているかのように実行できます。

@import('vendor/package/Envoy.blade.php')

複数サーバ

Envoyを使用すると、複数のサーバ間でタスクを簡単に実行できます。まず、@servers宣言にサーバを追加します。各サーバには一意の名前を割り当てる必要があります。追加のサーバを定義したら、タスクのon配列へ各サーバをリストします。

@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2'])

@task('deploy', ['on' => ['web-1', 'web-2']])
    cd /home/user/example.com
    git pull origin {{ $branch }}
    php artisan migrate --force
@endtask

並列実行

デフォルトでは、タスクは各サーバで順次実行されます。つまり、タスクは、2番目のサーバでの実行に進む前に、最初のサーバでの実行を終了します。複数のサーバ間でタスクを並行して実行する場合は、タスク宣言にparallelオプションを追加します。

@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2'])

@task('deploy', ['on' => ['web-1', 'web-2'], 'parallel' => true])
    cd /home/user/example.com
    git pull origin {{ $branch }}
    php artisan migrate --force
@endtask

準備

Envoyタスクを実行する前に、任意のPHPコードを実行する必要がある場合があります。@setupディレクティブを使用して、タスクの前に実行する必要があるPHPコードブロックを定義できます。

@setup
    $now = new DateTime;
@endsetup

タスクを実行する前に他のPHPファイルをリクエストする必要がある場合は、Envoy.blade.phpファイルの先頭にある@includeディレクティブを使用できます。

@include('vendor/autoload.php')

@task('restart-queues')
    # ...
@endtask

変数

必要に応じて、Envoyを呼び出すときにコマンドラインで引数を指定することにより、Envoyタスクに引数を渡すことができます。

php vendor/bin/envoy run deploy --branch=master

Bladeの「エコー(echo)」構文を使用して、タスク内のオプションにアクセスできます。タスク内でBladeのifステートメントとループを定義することもできます。例としてgit pullコマンドを実行する前に、$branch変数の存在を確認してみましょう。

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

@task('deploy', ['on' => 'web'])
    cd /home/user/example.com

    @if ($branch)
        git pull origin {{ $branch }}
    @endif

    php artisan migrate --force
@endtask

ストーリー

ストーリーは、一連のタスクを1つの便利な名前でグループ化します。たとえば、deployストーリーは、その定義内にタスク名をリストすることにより、update-codeおよびinstall-dependenciesタスクを実行できます。

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

@story('deploy')
    update-code
    install-dependencies
@endstory

@task('update-code')
    cd /home/user/example.com
    git pull origin master
@endtask

@task('install-dependencies')
    cd /home/user/example.com
    composer install
@endtask

ストーリーを作成したら、タスクの呼び出しと同じ方法でストーリーを呼び出せます。

php vendor/bin/envoy run deploy

完了フック

タスクとストーリーが終了すると、いくつかのフックが実行されます。Envoyがサポートしているフックタイプは@after@error@success@finishedです。これらのフック内のすべてのコードはPHPとして解釈され、ローカルで実行されます。タスクが操作するリモートサーバ上では実行されません。

好きなようにこれらのフックを好きなだけ定義できます。それらはEnvoyスクリプトに現れる順序で実行されます。

@after

各タスクの実行の後、Envoyスクリプト中で登録したすべての@afterフックが実行されます。@afterフックは、実行したタスクの名前を受け取ります。

@after
    if ($task === 'deploy') {
        // ...
    }
@endafter

@error

すべてのタスクが失敗した(ステータスコードが0より大きかった)場合、Envoyスクリプトに登録されているすべての@errorフックが実行されます。@errorフックは実行したタスクの名前を受け取ります。

@error
    if ($task === 'deploy') {
        // ...
    }
@enderror

@success

すべてのタスクがエラーなしで実行された場合は、Envoyスクリプトで登録したすべての@successフックが実行されます。

@success
    // ...
@endsuccess

@finished

すべてのタスクが実行された後(終了ステータスに関係なく)、すべての@finishedフックが実行されます。@finishedフックはnull0以上のintegerを終了したタスクのステータスコードとして受け取ります。

@finished
    if ($exitCode > 0) {
        // 1つのタスクにエラーがあった
    }
@endfinished

タスク実行

アプリケーションのEnvoy.blade.phpファイルで定義されているタスクまたはストーリーを実行するには、Envoyのrunコマンドを実行し、実行するタスクまたはストーリーの名前を渡します。Envoyはタスクを実行し、タスクの実行中にリモートサーバからの出力を表示します。

php vendor/bin/envoy run deploy

タスク実行の確認

サーバで特定のタスクを実行する前に確認を求めるプロンプトを表示する場合は、タスク宣言にconfirmディレクティブを追加します。このオプションは、破壊的な操作で特に役立ちます。

@task('deploy', ['on' => 'web', 'confirm' => true])
    cd /home/user/example.com
    git pull origin {{ $branch }}
    php artisan migrate
@endtask

通知

Slack

Envoyは、各タスクの実行後にSlackへの通知送信をサポートしています。@slackディレクティブは、SlackフックURLとチャネル/ユーザー名を受け入れます。Slackのコントロールパネルで"Incoming WebHooks"統合を作成し、WebフックURLを取得してください。

@slackディレクティブに指定する最初の引数に、WebフックURL全体を渡す必要があります。@slackディレクティブの2番目の引数は、チャネル名(#channel)またはユーザー名(@user)です。

@finished
    @slack('webhook-url', '#bots')
@endfinished

デフォルトでEnvoy の通知は、実行したタスクを説明するメッセージを通知チャネルに送信します。しかし、@slack ディレクティブに第三引数を渡すことで、このメッセージを自分のカスタムメッセージで上書きすることができます。

@finished
    @slack('webhook-url', '#bots', 'Hello, Slack.')
@endfinished

Discord

Envoyは、各タスクの実行後のDiscordへの通知送信もサポートしています。@discordディレクティブは、DiscordフックのURLとメッセージを受け入れます。サーバ設定で"Webhook"を作成し、Webフックが投稿するチャンネルを選択することで、WebフックURLを取得できます。WebフックURL全体を@discordディレクティブに渡す必要があります。

@finished
    @discord('discord-webhook-url')
@endfinished

Telegram

Envoyは、各タスクの実行後のTelegramへの通知送信もサポートしています。@telegramディレクティブは、TelegramボットIDとチャットIDを受け入れます。BotFatherを使用して新しいボットを作成することにより、ボットIDを取得できます。@username_to_id_botを使用して有効なチャットIDを取得できます。ボットIDとチャットID全体を@telegramディレクティブに渡す必要があります。

@finished
    @telegram('bot-id','chat-id')
@endfinished

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる