Laravelでステージング環境と本番環境の差分対応するには
まえがき
Laravelに限らず、業務でWeb案件をやっていると、ステージング環境と本番環境で色々な差分が出ます。
ライブラリや外部サービス、特殊な装置との連携など、どうにもできない部分もありますが、なるべく差がでないように工夫したいものです。
もしステージング環境が完全に本番環境の先を進んでいるだけなら、まだ管理しやすいのですが、クライアントの都合やら、テスト完了のタイミングやらで、課題のマージ状況が交差するのが現実です。
失敗パターン
ステージング環境をdevelopブランチ、本番環境をmasterブランチとしたGit運用を行っていました。
masterブランチからfeatureブランチを切り、developブランチへマージしてステージング環境へデプロイし、クライアントからOKが出たらmasterブランチにもマージして本場環境へマージしていました。
しかし、これだと片方にマージ漏れが起きやすいし、深刻なバグだから修正コードできたら直ちに本番環境にデプロイしてって言われたりして、マージ手順が崩れたりします。
しばらくして揃えようとしてもコンフリクトだらけで手動マージせざるをえなくなり、どれが新しいコードかもわからなくなったりしていました。
改善策
git運用
まず、デプロイするのは環境に関係なくreleaseブランチを切って行うようにしました。
そして基本的にはステージング環境も本番環境もmasterブランチから生やしたreleaseブランチにHEADを振り向けておきます。
materにマージする前の動作確認をステージング環境に適用するため、featureブランチから直接releaseブランチを切ってもいいです。
問題なければそのfeatureブランチをmasterブランチへマージします。
ようするに、クライアントのGoサインに関係なく修正が完了したらすべてmasterにマージします。
環境変数を利用する。
上記のgit運用だと、本番環境とステージング環境がほぼ同じになってしまい差分を吸収できていません。
そこで環境変数を利用します。
Laravelは.envで環境を識別できるので、これを利用してソースコードに分岐を埋め込みます。
実はcomposerさえ使えればdotenvライブラリを利用すればlaravelじゃなくても環境変数は使えますが、laravelの場合は特に安全に利用できます。
.envのキー APP_ENVをそのまま借りて事足りるならそれを使いましょう。
他にも独自の識別キーがほしければ他のキーと重複しない限り、自由に追加できます。
例えば.envにクライアントからOKが出ているか示すスイッチを埋め込むとしましょう。
こんな風に追記します。
CLIENT_OK=true
次にapp/configフォルダ以下のファイルにキーと値を追記します。
元からあるファイルに追記してもいいし、新しく作ってもいいです。
env関数は.envの値を読み込む関数です。基本は文字列型として解釈されますが、true・falseと書いているものは真偽値として解釈されます。
<?php
return [
'client_ok' => env('CLIENT_OK'),
];' => env('CLIENT_OK'),
];
そしたら、Controllerなどでconfig関数を使えるようになります。
php artisan tinkerで以下を入力して値が取得できていれば成功。
取れていない場合はphp artisan optimzeでキャッシュを更新しましょう。
config('gosign.client_ok',true); // デフォルトをtrueに設定
あとは、この値を使って以下のように分岐するだけです。
if(config('gosign.client_ok')) {
// この環境で実行しても良いコード
} else {
// else文は不要かもしれないし、代わりにモック用のダミーコードを実行させるかもしれない。
}
余談ですが、configフォルダの中に定数を書き込む方法がネットに紹介されていたりしますが、バッドハックなのでやめましょう。
その記事が出た頃はまだLaravelのコツがあまり出回っていなかったので仕方ないのですが、今はConstクラスを作る方法が紹介されていてそちらのほうが優れていますし、Laravel10とかのPHP8.1系以降ではenumも使えます。
おわりに
今回は破綻しにくい運用のコツを紹介しました。
configを使う以外にもDBにシステムオプションテーブルのようなものを作ってフラグとする手法もあります。
運用手法は長い年月をかけて進化していきます。
失敗を繰り返しながら、git flowなどを取り入れたりして、破綻しずらい運用を目指しましょう。
株式会社ONE WEDGE
【Serverlessで世の中をもっと楽しく】 ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
Discussion