Help us understand the problem. What is going on with this article?

[Firebase] 複数 project の rules を管理して deploy するには?

More than 1 year has passed since last update.

公式サポートはない

この 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 が環境で違うくなるケースてそんなないから、あまり必要ない知識説はある、、

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away