1. yamacraft
Changes in tags
Changes in body
Source | HTML | Preview
@@ -42,10 +42,11 @@
```
`firebase init`でデフォルト連打してプロジェクトを作成すると default 枠が作られているので、これを意図的に削除しておきます。デプロイ先を明示的に指定することで、デプロイ先間違えという事故を防ぐためです。
```shell-session
+# develop環境へdeployを実施する
$ firebase use develop
$ firebase deploy
```
## CI用に認証トークンを用意する
@@ -79,10 +80,11 @@
```
ここで取得した認証トークンを使うことで、ログインしていない環境からでもFirebase CLIを使うことができます。
```shell-session
+# tokenを利用してdevelop環境でdeployを実施
$ firebase use develop --token 1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ firebase deploy --token 1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
### 認証トークンは「Firebaseのプロジェクトに紐づくトークン」ではない
@@ -161,15 +163,38 @@
name: deploy
command: |
docker-compose -f ./deploy-develop-compose.yml up --build
```
+## deployの動作について
+
+`firebase deploy` を実行すると、プロジェクト内でdeploy対象となる各機能(Hosting、Database Rules(+Firestore Rules)、Storage Rules、Cloud Functions)のデプロイが実行されます。この中でひとつでもdeployに失敗すると、全てのdeployは中断されます。また、既にdeployに成功している機能もロールバックされます。
+
+これはDatabaseやStorageのRulesの更新と同時にHostingやCloud Functionsをデプロイしたい場合には有効ですが、こうした仕様であることは留意する必要があります。
+
+個別で確実にdeployを終わらせたい場合は、 `firebase deploy --only [hosting|functions|database|storage]` で機能ごとにdeployすればいいですが、普通使うことはないと思います。
+
+ただCircle CI2.0だとたまにtimeoutエラーでコケることがあったので、自分は`--only`で別個でアップさせる設定を利用することもあります。
+
+全般的に言えることですが、`firebase deploy`はdeployに失敗してもsuccessが返ってくるため、deployの終了通知がきてもCircleCIのログを見て確認が必要です…。不便。
+
+```Dockerfile:deploy.dockerfile
+#(省略)
+
+CMD cd functions && npm install && cd ../ \
+ && firebase use ${FIREBASE_PROJECT} --token ${FIREBASE_TOKEN} \
+ && firebase deploy --only database --token ${FIREBASE_TOKEN} \
+ && firebase deploy --only firestore --token ${FIREBASE_TOKEN} \
+ && firebase deploy --only storage --token ${FIREBASE_TOKEN} \
+ && firebase deploy --only hosting --token ${FIREBASE_TOKEN} \
+ && firebase deploy --only functions --token ${FIREBASE_TOKEN}
+```
+
## 機能ごとにリポジトリを分けるべきか
今回紹介したデプロイでは、ひとつのリポジトリにHosting、DatabaseやStorageのRule、Cloud Functionsがすべて入ったリポジトリの場合、全部まるごとデプロイします。当然ながらその場合、不要な部分のデプロイも走ってしまい、無駄な時間ができてしまいます。
-いちおう、`firebase deploy --only [hosting|functions|database|storage]`とすれば部分的なデプロイ可能です。変更点をチェックして、必要な部分デプロイの判断をするやり方を知っているのであれば、その対応をするのが一番かもしれません。
-ちなみに私はやり方を知りません…。
+変更点をチェックして、必要な部分デプロイの判断をするやり方を知っているのであれば、その対応をするのが一番かもしれません。ちなみに私はやり方を知りません…。
-そうでない場合、いきなり複数のリポジトリに分けると管理がたいへんな気がするので、いったんはCloud Functionsとその他、で分けるぐらいでも良いかもしれません。
+そうでない場合、いきなり複数のリポジトリに分けても管理が大変だと思います。一番デプロイに時間がかかるのはCloud Functionsなので、やるにしてもまずはCloud Functionsとその他、ぐらいで分けるぐらいでも良いかもしれません。
以上です。