[Firebase] デプロイ対象を一部のサービスに限定する

小ネタです。 Firebaseでは特に何も考えずCLIでfirebase deployコマンドを実行するとプロジェクト内のすべてのファイルをデプロイしてくれちゃいます。意図した物であればもちろん良いのですが、例えばHostingだけ、もしくはCloudFunctionsだけといった場合には--onlyオプションを活用します。

書式

基本的には以下の書式です。

$ firebase deploy --only [サービス名]

サービス名として指定できるのは以下です。

  • hosting
  • functions
  • database
  • storage
  • firestore

実行例

Hostingだけ

特定のファイルだけ、といったことはできないようです。

$ firebase deploy --only hosting

CloudFunctionsだけ

CloudFunctionsも同じですが、こちらはさらに細かい指定ができます。

$ firebase deploy --only functions

以下のようにコロン(:)を挟んで関数名を指定することで、その関数だけデプロイが可能です。

$ firebase deploy --only functions:foo

同時に複数の関数を指定する場合はカンマ(,)で区切ります。

$ firebase deploy --only functions:foo,functions:bar

Firestoreだけ

Firestoreも細かい指定が可能です。ルールとインデックスの設定を分けてデプロイできます。rules, indexesを付けない場合は両方ともデプロイ対象となります。

$ firebase deploy --only firestore
$ firebase deploy --only firestore:rules
$ firebase deploy --only firestore:indexes

合わせ技

複数のサービスをまたがって指定したい場合は、単純にカンマで区切るだけです。

$ firebase deploy --only hosting,functions

CloudFunctionsの関数指定で高速化するか

関数が増えてくるとデプロイ速度がどんどん遅くなって来るわけですが、--onlyオプションで高速化するのか実験してみました。というのも感覚的には速くなりそうなもんですが、あまり実感が得られなかったため実際に試してみることにしました。

ここでは5つの関数を作成し、その中の1つをデプロイします。

すべてデプロイ (--only functions)

CloudFunctionsをすべてデプロイすると、今回は1分24秒かかりました。

$ time firebase deploy --only functions

=== Deploying to 'test-f76bc'...

i  deploying functions
i  functions: ensuring necessary APIs are enabled...
✔  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (31.84 KB) for uploading
✔  functions: functions folder uploaded successfully
i  functions: updating Node.js 8 function checkChatMessage(asia-northeast1)...
i  functions: updating Node.js 8 function appleidCallBack(us-central1)...
i  functions: updating Node.js 8 function sayGroot(us-central1)...
i  functions: updating Node.js 8 function sayNyanpass(us-central1)...
i  functions: updating Node.js 8 function sayEcho(us-central1)...
✔  functions[checkChatMessage(asia-northeast1)]: Successful update operation. 
✔  functions[sayGroot(us-central1)]: Successful update operation. 
✔  functions[appleidCallBack(us-central1)]: Successful update operation. 
✔  functions[sayNyanpass(us-central1)]: Successful update operation. 
✔  functions[sayEcho(us-central1)]: Successful update operation. 

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/test-f76bc/overview
firebase deploy --only functions  4.47s user 0.99s system 6% cpu 1:24.59 total

一部分をデプロイ (--only functions:sayEcho)

CloudFunctionsの関数を1つだけデプロイすると、こちらも1分24秒!まさかの変化なし!

$ time firebase deploy --only functions:sayEcho

=== Deploying to 'test-f76bc'...

i  deploying functions
i  functions: ensuring necessary APIs are enabled...
✔  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (31.84 KB) for uploading
✔  functions: functions folder uploaded successfully
i  functions: current functions in project: appleidCallBack(us-central1), sayEcho(us-central1), sayGroot(us-central1), sayNyanpass(us-central1), checkChatMessage(asia-northeast1)
i  functions: uploading functions in project: sayEcho(us-central1)
i  functions: updating Node.js 8 function sayEcho(us-central1)...
✔  functions[sayEcho(us-central1)]: Successful update operation. 

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/test-f76bc/overview
firebase deploy --only functions:sayEcho  4.43s user 1.22s system 6% cpu 1:24.21 total

まとめ

デプロイ対象の関数を絞っても速度的な変化は期待できないようですね。 あくまでデプロイ対象を絞るだけという考えで挑むのが良さそうです。

参考ページ