【Laravel】ジョブの変更が反映されない
Skrumエンジニアの根岸です。
今回は Laravel でジョブを扱う際の要注意事項のお話です。
Laravel でキューワーカーを開始する場合下記のコマンドを実行します。
php artisan queue:work
しかし、上記のコマンドではキューワーカープロセスをバックグラウンドでは実行できないため、サーバー上で常時キューワーカープロセスを実行させるためには Supervisor 等を導入する必要があります。
サーバーに Supervisor をインストールした場合、Supervisor の設定ファイルは下記のような感じで記述します。
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /usr/share/nginx/htm/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/supervisor/worker.log
Supervisor でキューワーカーを稼働させる場合でも、実行しているのは Artisan コマンドです。
ここからが本題です。
Supervisor でキューワーカーが稼働しているサーバーに Laravel プロジェクトがデプロイされているとします。そして、ジョブのソースコードを修正した上でデプロイします。しかし、このままでは新しいジョブのソースコードは反映されず、デプロイ前のソースコードの動作が継続されます。
Laravel のドキュメントにはこう書かれています。
キューワーカは長期間有効なプロセスであり、起動した時点のアプリケーションの状態をメモリに保存することを忘れないでください。その結果、起動後にコードベースの変更に気付くことはありません。したがって、デプロイメントプロセス中で、必ずキューワーカを再起動してください。さらに、アプリケーションによって作成または変更された静的状態は、ジョブ間で自動的にリセットされないことに注意してください。
https://readouble.com/laravel/9.x/ja/queues.html#running-the-queue-worker
つまり、ソースコードにジョブの変更がある場合、デプロイ後に必ず下記のコマンドを実行する必要があります。
php artisan queue:restart
本番サーバーでこのコマンド実行を忘れてしまうと大事故につながる危険性があります。
よって、Jenkins などのデプロイツールを利用している場合は、スクリプトに queue:restart コマンドを入れ込んでしまい、ジョブに変更があろうが無かろうがデプロイ時には必ず restart されるようにする。デプロイツールを利用せず Git から直接プルしている場合などは、デプロイ手順書に記載しておき漏れなくコマンド実行を行う仕組み作りが大切となります。
ドキュメントにはさらっと書いてありますが、障害報告書を書くような事態にならないように十分注意しましょう。