บันทึกนักพัฒนา: Deploy Firebase Cloud Functions with Bitbucket Pipelines
สวัสดีครับ กลับมาอีกครั้งกับบทความที่เกี่ยวกับ Firebase คราวนี้จะไม่ได้เน้นไปที่ Product ของ Firebase ตรง ๆ อย่างเดียว แต่จะเป็นการใช้งานประกอบกับ Tool อื่น ๆ ด้วยครับ
ในบทความนี้ จะเป็นเรื่องของการ สั่ง Deploy Firebase Cloud Functions ผ่านทาง CI tool จาก Atlassian ที่ชื่อว่า Bitbucket Pipelines ครับ
ส่วนรายละเอียดคร่าวของแต่ละตัว มีดังนี้ครับ
Firebase Cloud Functions
Cloud Functions ถือได้ว่าเป็นของดีมาก ๆ ตัวนึงของ Firebase ที่ทาง Google ทำออกมาก ความสามารถหลัก ๆ ของ Cloud Functions คือเราสามารถเขียนโค๊ด (Node.js) แล้วเอาโค๊ดขึ้นไปรันบน Infrastructure ของ Google ได้เลย โดยโค๊ดของจะรับ Trigger ได้หลายแบบ ไม่ว่าจะเป็นแบบ Direct call หรือ Background call ครับ
รายละเอียดเต็ม ๆ ตามไปอ่าได้ที่ รู้จัก Cloud Functions for Firebase ตั้งแต่ Zero จนเป็น Hero นะครับ
Bitbucket Pipelines
Bitbucket Pipelines เป็น CI tool ตัวหนึ่ง ซึ่งทำงานคู่กับตัว VCS ของ Bitbucket เอง รายละเอียดเต็มขอให้ตามไปอ่านได้ที่ ลองทำ CI/CD ด้วย Bitbucket Pipelines + DigitalOcean นะครับ
CI — Continuous Integration
คือกระบวนการสำหรับการรวบรวม Source code ที่มีการพัฒนาแยกส่วนกันอย่างอัตโนมัติ โดยจะทำอย่างไรก็ได้ เพื่อให้มั่นใจได้ว่า ไม่มี Source code ส่วนใดที่จะส่งผลให้ Source code ส่วนอื่น ๆ พัง หรือสูญหายเสียหาย
Let’s do it
เราต้องใช้ของสำคัญ 4 สิ่งมากประกอบกัน คือ
- Firebase account
- Bitbucket account
- Cloud Functions project
- Bitbucket repo
(1), (2) และ (4) ไม่น่าจะมีปัญหากันอยู่แล้วนะครับ
ส่วน (3) ตัว Project structure ผมจะวาง Directory functions ไว้ใน Root directory ของ Project และทุกอย่างที่เกี่ยวกับ Function ก็จะวางไว้ใน Functions directory ทั้งหมด
หน้าตา Project structure ก็จะประมาณนี้นะครับ
Note: Command ทั้งหมด จะอ้างอิงตาม Project structure นี้ครับ
สำหรับขั้นตอน มีดังต่อไปนี้ครับ
- เอา Firebase token ออกมา ผ่าน Firebase CLI
- สร้างไฟล์ bitbucket-pipelines.yml
- เปิดใช้งาน Bitbucket pipeline
เอา Firebase token ออกมา ผ่าน Firebase CLI
เริ่มกันที่ตัว Fireblase CLI กันก่อนนะครับ เราต้องเอา Token ออกมาใช้ เพื่อให้ CI tool สามารถสั่งงาน Firebase ได้ ด้วยคำสั่ง
firebase login:ci
ตัว CLI จะให้เราทำ Authenticate ผ่านหน้าเว็บ หลังจากเราทำเสร็จแล้ว ตัว Command line จะแสดงข้อความประมาณนี้ครับ
✔ Success! Use this token to login on a CI server:<FIREBASE_TOKEN>Example: firebase deploy --token "$FIREBASE_TOKEN"
ตรงนี้ให้เก็บ Token ไว้ให้ดี เพราะเราต้องเราไปใช้ต่อด้วย
สร้างไฟล์ bitbucket-pipelines.yml
จากนั่นเราต้องสร้างไฟล์ bitbucket-pipelines.yml ไว้ที่ Project root directory หน้าตาแบบนี้ครับ
อธิบาย
บรรทัดที่ 1 เอา image node:8-alpine มาเป็น Container สำหรับรัน Pipeline นี้
บรรทัดที่ 4–5 ตั้งให้ Pipeline ทำงานเมื่อมี Tag ที่ชื่อว่า release-production-*
Note ท่าที่ผมใช้คือ จะติด Tag release-production-{YYYYMMDDHHmmSS} เพื่อจะได้เข้าใจง่าย ๆ ว่าสั่งไปตอนไหน
บรรทัดที่ 8 เพื่อบอก Deployment tool ว่า สั่ง Deploy ไป Production นะ อ่านเพิ่มเติมที่นี่
บรรทัดที่ 9–12 ทำงานคู่กับ บรรทัดที่ 21–23 สั่งให้ Pipeline ทำ Cache ใน Directory ที่เราสั่งไว้ อ่านเพิ่มเติมที่นี่
บรรทัดที่ 14 เป็นคำสั่งติดตั้ง firebase-tools แบบ Global เพื่อให้สั่งบรรทัดที่ 18 ได้
บรรทัดที่ 15 เปลี่ยน Directory ไปที่ functions เนื่องจากไฟล์ package.json ของเราอยู่ในนั้น
บรรทัดที่ 16 สั่ง npm i เพื่อจะเอา eslint เพราะเดี๋ยวตอนสั่ง Firebase Deploy จะต้องใช้ด้วย
Note ตรงนี้ถ้ามีทำ Test อะไรไว้ก็สามารถสั่งต่อไปได้เลยครับ
บรรทัดที่ 17 เปลี่ยน Directory กลับไปที่ Parent
บรรทัดที่ 18 สั่ง Firebase Deploy ด้วย Token ที่เราเตรียมไว้
เปิดใช้งาน Bitbucket pipeline
ตอนนี้เราจะต้องไปทำต่อใน Bitbucket ครับ
เข้าไปที่ Repo setting ของเรา ให้มองหา Pipeline setting ครับ
Settings เข้าไปเปิด pipeline ในนี้
Repository variables เอา Token มาใส่ในนี้
Tag and push to origin, then magic goes here
เมื่อเตรียมของพร้อมแล้ว ก็ลองติด Tag ดูครับ แล้วตามเข้าไปดูบน Bitbucket ว่า Pipeline เราทำงานได้มั้ย
ถ้าทำงานได้สำเร็จ ก็จะได้เห็นประมาณนี้ครับ
พอดูรายละเอียดของ Pipeline เราจะเห็นว่ามันจะทำงานตามคำสั่งที่เราเตรียมไว้ พร้อมกับบอกเวลาด้วยว่า แต่ละคำสั่งใช้เวลาไปเท่าไร
ส่วนเรื่อง Cache เราจะเห็นว่าระบบได้ทำ Cache ให้เราไว้ 2 ที่ตามที่เราสั่งไว้ครับ
เอาไปใช้กับ CI tool ตัวอื่น ๆ
โดยหลักแล้ว แค่มี Firebase token ที่ถูกต้อง กับใช้คำสั่งของ Firebase CLI ได้ถูก ก็ใช้ได้แน่นอนครับ เห็น Tool ดัง ๆ เค้าทำ Doc สำหรับ Firebase ให้ด้วย
หวังว่าบทความนี้น่าจะเป็นประโยชน์กับทุกท่านนะครับ
สวัสดีครับ