deployerの話の続きです。今回はユーザー定義のタスク(レシピとも言う)の話です。タスクはdeployerを使って対象のホストに入って実行できるコマンドです。ちなみに前回のdep run daterunはdeployerが定義したタスクです。

Laravelアプリをダウンさせるタスクを定義

このブログの読者はもちろんLaravelユーザーなので、そのアプリのダウンのコマンドをdeployerのタスクの例として定義します。


namespace Deployer;

import('hosts.yml');

desc('メンテナンスモードにする');
task('app:down', function () {
    cd('{{deploy_path}}');
    $secret = run('echo $RANDOM | md5sum | head -c 10'); // ランダムなキーを生成
    $result = run("php artisan down --secret=$secret");
    writeln($result);
});

上において、cd('{{deploy_path}}')は、hosts.ymlで定義したホストにおいてLaravelのアプリが存在するパス名です。
つまり、まずそこへcdしてからphp artisan downを実行ということです。

前回定義した、hosts.ymlは以下です。

hosts:
  production:
    hostname: www.larajapan.com
    remote_user: deployer
    deploy_path: ~/example

  staging:
    hostname: staging.larajapan.com
    remote_user: deployer
    deploy_path: ~/example

さきのタスクを実行すると、

$ dep app:down

Select hosts: (comma separated)
  [0] staging
  [1] production
 > 0
task app:down
[staging]
   INFO  Application is now in maintenance mode.

   INFO  You may bypass maintenance mode via [http://staging.larajapan.com/040538d125].

ここで大事なのは、上のphp artisan down --secret=の実行は、そこで与えられたシークレットキーを知るユーザーのみダウンしていない状態でLaravelのアプリへのアクセスを許します。 今回のようにランダムな覚えにくいシークレットキーを生成すると、それをいちいちタイプするのは面倒ですよね。しかし、Laravelのdownコマンドは実行後にそのリンクを親切に出力してくれます。そのために、先のタスクの定義において、writeln($result)として画面に出力するのが重要となります。

タスクを強化

app:downのタスクは先に見せたように、ローカルから対象のマシンにsshを手動で実行することなく簡単にリモートで操作できてしまいます。その便利さは時には過ち実行も起きやすいということです。実行する前に確認のプロンプトも追加しましょう。 deployerでは、確認のプロンプトはaskConfirmation()の関数が使えます。

...
desc('メンテナンスモードにする');
task('app:down', function () {

   // 以下が追加した部分です。
    $host = currentHost()->getAlias();
    if (! askConfirmation("<comment>$host</comment>のホストをメンテナンスモードにしますか?", false)) {
        writeln('<error>実行はキャンセルされました.</error>');
        exit(1);
    }

    cd('{{deploy_path}}');
    $secret = run('echo $RANDOM | md5sum | head -c 10'); // ランダムなキーを生成
    $result = run("php artisan down --secret=$secret");
    writeln($result);
});

実行してみましょう。

Select hosts: (comma separated)
  [0] staging
  [1] production
 > 0
task app:down
[staging] stagingのホストをメンテナンスモードにしますか? [y/N] n
[staging] 実行はキャンセルされました.
ERROR: Task app:down failed!

上では、小文字のnをタイプすることで実行をキャンセルできます。もちろん大文字のNでも同じです。
ちなみに、[y/N]とNが大文字表示されているのは、デフォルトがNoということで、単にnやNをタイプせずにリターンキーを押すことでもキャンセルとなります。

確認のプロンプトを入れることで過ちの防止となりましたが、確認の上で実行としたときに、実行後に本当にアプリがダウンとなったか確かめたいですね。それは、php artisan aboutに表示されるMaintenance Modeの行を見ることで確認できます。

desc('メンテナンスモードにする');
task('app:down', function () {
    $host = currentHost()->getAlias();
    if (! askConfirmation("<comment>$host</comment>のホストをメンテナンスモードにしますか?", false)) {
        writeln('<error>実行はキャンセルされました.</error>');
        exit(1);
    }

    cd('{{deploy_path}}');
    $secret = run('echo $RANDOM | md5sum | head -c 10');
    $result = run("php artisan down --secret=$secret");
    writeln($result);

    // 以下でダウンされていか確認
    $result = run('php artisan about | grep -i maintenance');
    writeln($result);
});

実行してみましょう。

Select hosts: (comma separated)
  [0] staging
  [1] production
 > 0
task app:down
[staging] stagingのホストをメンテナンスモードにしますか? [y/N] y
[staging]
   INFO  Application is now in maintenance mode.

   INFO  You may bypass maintenance mode via [http://localhost/3d895d8b57].
[staging]   Maintenance Mode ................................................... ENABLED

ENABLEDはメンテナンスモードとなって落ちているということで、実行は成功です。OFFと表示されていればダウンとならなかったということで異常が起こったということです。

メルマガ購読の申し込みはこちらから。

By khino