公式サポートはない
この issue みたいに development/staging/production で firebase.json の出し分けをしたいと思っても、それはサポートされていない...
つまり、例えば firestore なら firestore.rules
の1ファイルだけが全プロジェクトの deploy 元として使われる。
これは環境別に rules を分けたい時に辛い。
**firestore_devlopment.rules
, firestore_production.rules
みたいに管理しする方法。
hooks で頑張る
幸いにも firebase deploy
には hook 機能があるので、 predeploy
で頑張ればいける。
何をしたかというと、predeploy のタイミングで firestore.rules
を上書くようにした。
1) rules 定義
環境ごとにファイルを作って定義。
- firestore_development.rules
- firestore_staging.rules
- firestore_production.rules
2) firebase.json の編集
firebase.json
{
"firestore": {
"predeploy": "./predeploy_firestore.sh",
"rules": "firestore.rules",
"indexes": "firestore.indexes.json"
}
}
こんな感じで predeploy を追加。
3) スクリプトを書く
predeploy_firestore.sh
#!/bin/sh
environment="" # development, staging, production
# get environment (ex: "FooBar_development")
if [[ $GCLOUD_PROJECT =~ ^FooBar_([a-z]+)$ ]]; then # 雑な正規表現
environment=${BASH_REMATCH[1]}
else
exit
fi
# overwrite 'firestore.rules' file
echo "${environment} 用の rules を firestore.rules にコピーします..."
cp firestore_${environment}.rules firestore.rules
echo "firestore.rules の上書きが完了しました。"
# Slack に通知
curl -X POST --data-urlencode "payload={\"channel\": \"#firebase\", \"text\": \"*$GCLOUD_PROJECT* の \`firestore.rules\` を更新します...\"}" [webhook url]
ポイントは、Firebase の hooks で使える環境変数 $GCLOUD_PROJECT
を見ている点。
4) deploy
$ firebase use Foobar_staging
$ firebase deploy --only firestore:rules
おわりに
そもそも rule が環境で違うくなるケースてそんなないから、あまり必要ない知識説はある、、