Commit ปุ๊ป Deploy ปั๊ป ภาคสอง — Cloud Build และ Firebase Project
ถ้าใครเคยได้อ่านบทความก่อนของเรา คงเข้าใจว่าการใช้ 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 ได้เลย
เมื่อเราเข้ามาแล้ว เราก็สามารถตั้งชื่อ 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
หากชื่นชอบบทความนี้ก็ฝากปรบมือให้กำลังใจด้วยนะคะ