LoginSignup
2
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-01-26

公式サポートはない

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2