FirebaseでHello worldするまでのメモ

ドキュメント

はじめに: 最初の関数を作成してデプロイする | Firebase

ndenv: Nodeのインストール

Nodeのインストールですが、Firebase側のランタイムバージョンと合わせる必要があり、もしバージョンが合っていない場合、以下のようにWarningが出ます

1
Warning: You're using Node.js v10.10.0 but Google Cloud Functions only supports v6.11.5.

このときはv6.11.5だったので、Node v6.11.5をインストールします

1
2
3
$ cd /path/to/project
$ echo "6.11.5" > .node-version
$ ndenv install

node: Firebase CLIのインストール

1
2
3
$ npm install firebase-cli
$ ./node_modules/.bin/firebase --version
4.2.1

firebase: 使ってみる

ドキュメントに、まずはfirebase initしよう!!って書いてたのでやってみる

1
2
$ ./node_modules/.bin/firebase init
Error: Command requires authentication, please run firebase login

ログインしろって怒られる

1
2
3
4
5
6
7
8
$ ./node_modules/.bin/firebase login

// 訳:Firebaseが匿名のCLI使用法とエラー報告情報を収集できるようにしますか?
? Allow Firebase to collect anonymous CLI usage and error reporting information? Yes

// アクセスして認証を済ませる
Visit this URL on any device to log in:
https://accounts.google.com/o/oauth2/auth?client_id=xxxxxx(以下略)

firebase: プロジェクトの初期化

再トライ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
$ ./node_modules/.bin/firebase init

######## #### ######## ######## ######## ### ###### ########
## ## ## ## ## ## ## ## ## ## ##
###### ## ######## ###### ######## ######### ###### ######
## ## ## ## ## ## ## ## ## ## ##
## #### ## ## ######## ######## ## ## ###### ########

You're about to initialize a Firebase project in this directory:

/var/workspace/firebase-test

Before we get started, keep in mind:

* You are currently outside your home directory

// 訳:どのFirebase CLI機能をこのフォルダに設定しますか? Spaceを押して機能を選択し、Enterを押して選択を確定します。
? Which Firebase CLI features do you want to setup for this folder? Press Space to select features, then Enter to confirm your choices.
-> 今回はFunctionを作るので、Functionを選択します

=== Project Setup

First, let's associate this project directory with a Firebase project.
You can create multiple project aliases by running firebase use --add,
but for now we'll just set up a default project.

? Select a default Firebase project for this directory:
-> プロジェクトを作るか選ぶ

=== Functions Setup

A functions directory will be created in your project with a Node.js
package pre-configured. Functions can be deployed with firebase deploy.

? What language would you like to use to write Cloud Functions? JavaScript
-> JavaScriptを使用

? Do you want to use ESLint to catch probable bugs and enforce style? No
-> ESLint使わない

✔ Wrote functions/package.json
✔ Wrote functions/index.js

? Do you want to install dependencies with npm now? Yes
-> 依存関係のインストールをするかどうかっぽいやつ(とりあえずYes)

======== WARNING! ========

This upgrade of firebase-functions contains breaking changes if you are upgrading from a version below v1.0.0.

To see a complete list of these breaking changes, please go to:

https://firebase.google.com/docs/functions/beta-v1-diff

npm notice created a lockfile as package-lock.json. You should commit this file.
added 497 packages in 22.4s

i Writing configuration info to firebase.json...
i Writing project information to .firebaserc...

✔ Firebase initialization complete!

初期化がおわるとファイルがいくつかできています

1
2
3
4
5
6
$ ls -l functions/
合計 160
-rw-r--r-- 1 vagrant vagrant 303 9月 20 14:54 index.js
drwxr-xr-x 332 vagrant vagrant 12288 9月 20 14:55 node_modules
-rw-r--r-- 1 vagrant vagrant 140874 9月 20 14:55 package-lock.json
-rw-r--r-- 1 vagrant vagrant 412 9月 20 14:54 package.json

firebase: デプロイ

そのままデプロイできそうな雰囲気だったのでデプロイしてみる

1
2
3
4
5
6
7
8
9
10
11
$ ./node_modules/.bin/firebase deploy
=== Deploying to 'project-123456'...

i deploying functions
i functions: ensuring necessary APIs are enabled...
✔ functions: all necessary APIs are enabled
i functions: preparing functions directory for uploading...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/project-123456/overview

デプロイはできましたがこの時点では何も起きません

firebase: Hello world

1
$ vim functions/index.js
1
2
3
4
5
6
7
8
const functions = require('firebase-functions');

// Create and Deploy Your First Cloud Functions
// https://firebase.google.com/docs/functions/write-firebase-functions

exports.helloWorld = functions.https.onRequest((request, response) => {
response.send("Hello from Firebase!");
});

デプロイ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ ./node_modules/.bin/firebase deploy

=== Deploying to 'project-123456'...

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 (40.9 KB) for uploading
✔ functions: functions folder uploaded successfully
i functions: creating Node.js 6 function addMessage(us-central1)...
✔ functions[addMessage(us-central1)]: Successful create operation.
Function URL (addMessage): https://us-central1-project-123456.cloudfunctions.net/addMessage

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/project-123456/overview

この時点で、Firebaseのダッシュボードに反映されます。
Functionのトリガがダッシュボードに記載されているので、アクセスしてHelloが表示されるのを確認します。

こんな感じのURL: https://us-central1-[プロジェクトID].cloudfunctions.net/helloWorld]

作業中のトラブル: ヘルメット(Mackarel)がなかったら即死だった

firebase: 開発環境(ローカル)

デプロイせずにローカルで開発するにはserveを実行します

1
2
3
4
5
6
$ ./node_modules/.bin/firebase serve -p 5000

=== Serving from '/var/workspace/tmp/firebase-test'...

i functions: Preparing to emulate functions.
✔ functions: helloWorld: http://localhost:5000/project-123456/us-central1/helloWorld

firebase: 開発環境(Dockerコンテナ)

Dockerfileを書きました: nobiki/firebase-test

firebase loginfirebase initは今の所自動化出来ないみたい?なので、初回だけ手動でセットアップしてやる必要があります

1
2
3
4
5
$ docker exec -it [コンテナ] bash"
# firebase login"
# firebase init"
# exit"
$ docker restart [コンテナ]"

make containerで済むようにしていますが、詳細な手順を確認する場合はMakefileの方を参照下さい