Deploy Cloud Functions from GitHub via Travis CI
看完了這一篇文章「Deploy to Firebase Hosting from GitHub」,這一篇教的是如何透過 Travis CI 完成自動化部署網站到 Firebase Hosting,爬了文好像很少文章在教 Cloud Functions 的自動部署,於是與同事研究一下設定方式,也順利試出來了。
自動化流程
Local → GitHub → Travis CI → Cloud Functions
設定
這裡假定我們已經有以下事前準備:
- GitHub 已建立好專案 Repository
- Firebase 已有專案
本機 Firebase 專案
首先,先輸入以下指令,取得token。
firebase login:ci

複製畫面中的 token,這是要給 Travis CI 使用。
接下來,在 Cloud Functions 的資料夾中,建立 .travis.yml 設定檔,輸入以Travis CI Job LifeCycle 指令設定。
文中我們會使用到兩個變數,一個是「$PROJECT_ID」,另一個是「$FIREBASE_TOKEN」。
PROJECT_ID 假如說不想要公開專案的ID的話,可以與 FIREBASE_TOKEN 一樣,在 Travis CI 端設定。
Travis CI 設定
到 Travis CI 網站後,使用 GitHub 帳號登入,登入成功之後就會自動同步你的公開 Repo,點選「+」新增我們上面要設定的 Cloud Functions 專案。
假如說想要使用私有的專案的話,Travis 有另外的 pro 方案付費使用。

接下來我們要設定剛剛提到的兩個變數「PROJECT_ID」與「FIREBASE_TOKEN」,在畫面中有一個區塊是「Environment Variables」,依照 Key Value的格式填入即可。
到目前為止我們就已經告一個段落,不過結束了嗎?還沒!
Travis CI Job LifeCycle 指令設定
這裡可能要參照一下官方說明文件邊看。
laguage: node_js
由於 Cloud Functions 目前只支援「Node 8」、「Python 3.7」與「Go」,而這個專案是使用Node v8.9.4的版本去寫的,故在 laguage 設定這裡要填寫 node_js。
node_js:
- "8"
Cloud Functions 執行版本是8,故 node_js 填寫8,若是6版本的話就填6。
branches:
only:
- master
這裡多設定 branches 是因為我只希望 master 有commit時才觸發做執行,當然還有其他設定,就要看官方文件了。
before_install:
- cd functions
在安裝指令前,Cloud Functions的資料夾結構會多一層,故要先往下移動到functions的資料夾內。
install:
- npm install -g firebase-tools
- npm install -g typescript
- npm install
- echo "npm install done !!"
在安裝指令下,這裡寫了三個部分,
第一個是安裝 firebase-tools 工具,這樣才能使用 firebase 指令。
第二個是 typescript,因為這個專案是 TypeScript為基礎,需要經過 tsc 轉譯成 js 才能進行部署。
第三個是安裝 package.json 中所有有使用到的套件。
script:
- npm run build
- echo "build done !!"
- firebase deploy --only functions --project $PROJECT_ID --token $FIREBASE_TOKEN
- echo "Project Deployed!"
最後這個部分則是要透過 Travis CI 幫我們部署至 GCP Cloud Functions,有嘗試了官方文件中 Google Firebase 篇的設定,但一直無法順利推上,爬文查了一下後大部分的文章都是教使用如何推至 Hosting 的設定,只好先退而求其次,土法煉鋼使用原本的部署指令,這裡需要上面的兩個變數「PROJECT_ID」、「FIREBASE_TOKEN」,並在變數前上錢字號「$」。
到這裡我們就完成了自動部署的動作了,只要 master 分支有Commit 到 GitHub,那 Travis CI 就會自動幫我們編譯並部署了。
不過呢,好像少了點什麼?
這整個流程其實還需要再加上「單元測試」,才算是完成整個的自動化部屬。
這個部分等以後寫 sky-blog 自架部落格後再來補寫流程吧。