TL;DR
firebaseのhostingでfirebase deploy
をするとそのままデプロイされるのを防ぐためにシェルを噛ませる。
(3/15追記: pre-deployは全てのプロジェクトに適応されるのでうまくいかなかったので修正しました)
やりたかったこと
一つのfirebaseプロジェクトで、ステージング、プロダクションの2環境へホスティングしたい。
この際firebase deploy
を実行するとステージング、プロダクション両方にファイルが上がってしまうため、念の為一度確認をさせてから実行させる。
やったこと
firebase.json
を以下のようにそれぞれ設定します。
https://firebase.google.com/docs/hosting/multisites を参考に連想配列で定義。
hosting: {[ { "public": "public", "site": "staging", ... }, { "public": "public", "site": "production", ... }, ]}
package.json
にそれぞれデプロイコマンドを定義します。
``json
{
"scripts": {
"deploy" : "firebase deploy --only hosting:production",
"deploy-stg" : "firebase deploy --only hosting:staging"
}
}
本来npmコマンドを忠実に実行すれば両方のサイトにファイルが上がることはないのですが、`firebase deploy`を実行すれば両方の環境にファイルが上がってしまいます。 なんとなく事故る可能性を感じたので先程のfirebase.jsonに一工夫加えます。
hosting: {[ { "public": "public", "site": "staging" ... }, { "public": "public", "site": "production", "predeploy" : "sh ./shell/confirm.sh" ... }, ]}
hostingにはデプロイ前とデプロイ後のトリガーがあるので、production環境のみshellを実行させるようにします。
read -n1 -p "本番環境にデプロイしますが、よろしいですか? (y/N): " yn if [[ $yn = [yY] ]]; then exit 0 else exit 1 fi
こうすることで、`firebase deploy`や`npm run deploy`時に確認を促されるようになり、本番環境に誤ってファイルを上げてしまうことを防ぐことが出来ます! # まとめ プロジェクト分けたほうが、もしかしたら早いかもですが1プロジェクトでサクッと終わらせたいときにはおすすめかなと。