Commit ปุ๊ป Deploy ปั๊ป ภาคสอง — Cloud Build และ Firebase Project

Nicha Rojsrikul
Nextzy
Published in
3 min readSep 21, 2019
Cloud Build + Firestore

ถ้าใครเคยได้อ่านบทความก่อนของเรา คงเข้าใจว่าการใช้ Cloud Build ให้ build และ deploy เซิฟเวอร์อัตโนมัติทุกครั้งที่เรา commit ขึ้น GitHub มันง่ายมากๆ และทำให้คุณภาพการทำงานของเราดีขึ้นมาก

มาในบทความนี้ เราก็จะใช้ Cloud Build ในการ build และ deploy อัตโนมัติเหมือนเดิม แต่ใช้กับ Firebase Project แทน

Build and Deploy Firebase Project

ก่อนอื่นเราต้องทราบก่อนว่า Firebase Project คืออะไร Firebase Project คือ GCP project ที่ใช้เซอร์วิสของ Firebase ด้วย ซึ่งอาจจะเป็น Firestore, Firebase Hosting, Firebase Functions หรืออื่นๆ แต่ทั้งหมดจะต้องถูก deploy ขึ้นผ่าน Firebase CLI

ทีนี้วิธีการ deploy Firebase project นั้นก็ไม่ยากเลย เพราะใช้เพียงคำสั่งเดียวเท่านั้น คือ

firebase deploy

หรือถ้าในโปรเจ็คมีเซอร์วิสของ Firebase หลายอย่าง เราสามารถ deploy แค่บางส่วนได้ด้วยคำสั่ง

firebase deploy --only <firebase service>

ซึ่งเมื่อเรารันคำสั่ง Firebase CLI ก็จะ build และ deploy ให้เราได้เลย แต่จะทำยังไงดีละ ถ้าเราอยากให้ Cloud Build รันคำสั่งนี้อัตโนมัติทุกครั้งที่เรา commit?

หากใครเคยอ่านในบทความที่แล้ว การใช้ Cloud Build นั้นไม่ยากเลย เพียงแค่สร้างไฟล์ cloudbuild.yaml และสร้าง Trigger บน GCP console แค่นั้นเอง ซึ่ง cloudbuild.yaml จะเป็นเสมือนชุดคำสั่งให้ Cloud Build ทำตาม แต่ถ้าเราอยากใช้ Cloud Build กับ Firebase Project จะมีขั้นตอนเพิ่มเติมขึ้นมา นั่นก็คือการสร้าง Firebase Image มาใช้เองนั่นเอง

1. สร้าง Firebase Image

เวลา Cloud Build ทำงาน คำสั่งจะถูกเรียกใน Docker Image ที่ระบุไว้ ซึ่งพวกคำสั่งที่ใช้ npm หรือ yarn ก็จะมี Docker Image อยู่แล้ว สามารถเรียกใช้ได้เลย แต่ตอนนี้ยังไม่มี official Docker Image สำหรับ Firebase CLI เพราะฉะนั้นเราต้องสร้างเพิ่มขึ้นมาเอง

วิธีการสร้างนั้นก็ไม่ยาก เราต้องสร้างเพียง 2 ไฟล์เท่านั้นคือ cloudbuild.yaml และ Dockerfile นั้นเอง ซึ่งเราจะวางไว้ในโฟลเดอร์เดียวกัน แต่แยกออกมาจากโฟลเดอร์ของโปรเจ็ค

ไฟล์ cloudbuild.yaml ก็จะมีหน้าตาดังนี้

steps:
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/firebase', '.']
images:
- 'gcr.io/$PROJECT_ID/firebase'

ซึ่งจะบอกให้ Cloud Build รันคำสั่งแค่อันเดียวคือ docker build -t gcr.io/$PROJECT_ID/firebase . ซึ่งก็คือให้ Docker เข้าไปในโฟลเดอร์ gcr.io/$PROJECT_ID/firebase และสร้าง image ไว้ในโฟลเดอร์นั้นๆ

และส่วนของ images: นั้นกำลังบอกให้เอา image ทั้งหมดที่เราสร้างขึ้นมาอัพขึ้น Container Registry ด้วย ซึ่งจะทำให้เราสามารถนำไปใช้ต่อได้

ส่วน Dockerfile ก็จะมีหน้าตาดังนี้

FROM node:10RUN npm install -g firebase-toolsENTRYPOINT ["/usr/local/bin/firebase"]

ซึ่งเป็นการบอกให้ Docker ลง firebase-tools ภายใน image นั่นเอง

เมื่อสร้างทั้งสองไฟล์เสร็จแล้ว ให้เรารันคำสั่งต่อไปนี้

gcloud builds submit --config=cloudbuild.yaml

เราก็จะได้ image ที่มี Firebase ในตัวมาไว้ใช้งานแล้ว ถึงเราจะต้องเสียเวลาเล็กน้อยมาสร้างเอง แต่เราก็สามารถเลือกเวอร์ชั่นของ firebase-tools มาใช้ได้เลย

เมื่อสร้าง Firebase image เรียบร้อยแล้ว เรามาเริ่มทำให้ Firebase project ของเรา deploy อัตโนมัติกันเลยดีกว่า

2. สร้าง cloudbuild.yaml

ใน cloudbuild.yaml เราจะเขียนชุดคำสั่งที่ Cloud Build ต้องทำตามเพื่อ deploy Firebase project ของเรา ซึ่งหลักๆก็คือ firebase deploy -P $PROJECT_ID --token $_FIREBASE_TOKEN หากมีขั้นตอนอื่นๆก็ใส่เข้าไปใน steps: ด้วยเลย

steps:
- name: 'gcr.io/cloud-builders/yarn'
- name: 'gcr.io/$PROJECT_ID/firebase'
args: ['deploy', '-P', '$PROJECT_ID', '$_FIREBASE_TOKEN']

เมื่อสร้างเสร็จเรียบร้อยแล้ว เราสามารถทดลองเลยก็ได้ว่าไฟล์นี้ใช้ได้มั้ย โดยรันคำสั่งเดียวกับคำสั่งในขั้นตอนที่แล้ว ก็คือ gcloud builds submit --config=cloudbuild.yaml --substitutions _FIREBASE_TOKEN=<Firebase token here> ซึ่งเราจะได้ Firebase token จากคำสั่ง firebase login:ci

ขั้นตอนต่อไปเราก็จะสร้าง Trigger ใน Cloud Build ให้ deploy ทุกครั้งที่มี commit ใหม่บน GitHub กัน

3. สร้าง Cloud Build Trigger

เหมือนกับในบททความที่แล้ว ให้เราเข้าไปใน GCP Console และเข้าไปที่ Cloud Builds > Trigger เพื่อไปสร้าง Trigger เมื่อเข้าไปแล้วก็กด Add Trigger ได้เลย

GCP Console Add Trigger page

เมื่อเราเข้ามาแล้ว เราก็สามารถตั้งชื่อ Trigger ได้เลย และเลือก Build Configuration ซึ่งขอให้เราเลือก Cloud Build configuration (yaml or json) และบอกตำแหน่งของ cloudbuild.yaml ของเรา

หลังจากนั้น ตรง Substitution variables ให้เราใส่ _FIREBASE_TOKEN เข้าไป ละ value ของมันคือ Firebase token ที่เราได้จากคำสั่ง firebase login:ci หลังจากนั้นก็กด Create trigger ได้เลย

เมื่อเสร็จเรียบร้อยแล้ว ก็อย่าลืมไปให้ permission กับ service account ด้วยเหมือนในบทความที่แล้ว (ถ้าเคยทำแล้วก็ไม่ต้องทำใหม่) โดยให้เราเข้าไปหน้า IAM and Admin page บน GCP console แล้วหาอีเมลที่ลงท้ายด้วย @cloudbuild.gserviceaccount.com เมื่อหาอีเมลนี้เจอแล้ว เราก็ต้องติด Permission 2 อย่าง คือ Cloud Run Admin และ Service Account User จากนั้นเราก็กด Save ได้เลย

ทีนี้ Cloud Build ก็จะ deploy Firebase Project ให้เราอัตโนมัติแล้ว

ส่งท้าย

ถึงจะมีขั้นตอนเพิ่มขึ้นมา แต่ก็เห็นว่าไม่ยากเลยที่จะใช้ Cloud Build กับ Firebase Project

ถ้าอยากดูตัวอย่างการใช้ Cloud Build กับ Firebase Project ที่ใช้ Firebase Hosting กับ React App ก็สามารถเข้าไปดูได้เลยในโปรเจ็ค slack-oauth-example โฟลเดอร์ frontend

หากชื่นชอบบทความนี้ก็ฝากปรบมือให้กำลังใจด้วยนะคะ

--

--