Firebase App Distribute กับ Circleci

Jedsada Tiwongvorakul
20Scoops CNX
Published in
3 min readSep 30, 2019
circleci + firebase app distribute workflow (thx Wutti Tarn)

เข้าประเด็นเลย… เมื่อไม่กี่วันมานี้ทาง Firebase เองได้ปล่อยบริการใหม่ที่ชื่อว่า App Distribution จะอธิบายพอสังเขป คือ เป็นตัวช่วยให้ Mobile Developer ทั้ง Android และ iOS ให้ทำการ Delivery Application ให้กับทีมงานทำการทดสอบได้สะดวกและรวดเร็วทันใจ 🔥

Introduction Firebase App Distribution VDO

ถ้าหากใครเคยใช้ Crashlytics Beta มาแล้วล่ะก็คงจะเข้าใจ เพราะลักษณะของการทำงานมันเหมือนกัน วันนี้ผมก็เลยจะขอมาแชร์ในส่วนของการ Config CI/CD ด้วย Circleci ให้สามารถ Deploy Android App ไปยัง Firebase App Distribution

สิ่งที่ควรรู้ก่อน

  1. CI/CD คืออะไร?
  2. Firebase App Distribution คืออะไร?
  3. Circleci คืออะไร?
  4. Fastlane คืออะไร?

ใครเข้าใจอยู่แล้วก็ข้ามไปได้เลยครับ 😎

จากบทความเกี่ยวกับ Firebase App Distribution เครื่องมือตัวนี้จะมีวิธีการ Distribute ด้วยกันอยู่ 4 วิธี ได้แก่

  1. Firebase Console
  2. Firebase CLI
  3. Fastlane
  4. Gradle

ซึ่งถ้าหากจะทำผ่าน CI จะมีวิธีแบบ Fastlane กับ Gradle ที่เหมาะสมที่สุด ซึ่งบทความนี้จะเลือกวิธีที่ 3 ทำผ่าน Fastlane บน Circleci เอาล่ะไปดูวิธีการกันเลย ✌️

Step 1: ทำการตั้งค่าให้กับ Fastlane

ทำการ Initialize Fastlane เข้าไปในโปรเจ็คด้วยคำสั่ง fastlane init

เมื่อทำตามขั้นตอนของ Fastlane เรียบร้อยแล้วก็จะเห็นไฟล์ที่เพิ่มเข้ามาในโปรเจ็คของ
เราดังนี้
.
├── Gemfile
├── Gemfile.lock
├── fastlane
│ ├── Appfile
│ └── Fastfile
└── ...

ทำการเพิ่ม Plugin ของ Firebase App Distribution ในไฟล์ Gemfile ตามด้านล่างนี้

source "https://rubygems.org"

gem "fastlane"
gem 'fastlane-plugin-firebase_app_distribution'

เมื่อทำการเพิ่ม Plugin แล้วให้ทำการ Update Bundle ด้วยคำสั่ง bundle update

สุดท้ายของขั้นตอนนี้ให้ทำการสร้าง Lane ของการ Build และ Distribution ของ Application ในไฟล์ที่ชื่อว่า Fastfile ดังนี้

desc "Build Application"
lane :build do
gradle(task: "clean assembleDebug")
end

desc "Deploy a new version to Firebase Distribute Application"
lane :deploy_firebase do |options|
firebase_app_distribution(
app: "********************",
groups: "tester",
apk_path: "app/build/outputs/apk/debug/app-debug.apk",
firebase_cli_path: $FIREBASE_CLI_PATH
)
end

build: เอาไว้สำหรับการ Build Application แบบ Debug
deploy_firebase: เอาไว้สำหรับการ Deploy Application ขึ้น Firebase

คำอธิบายสำหรับ Parameter ของ firebase_app_distribution

  • app: app id ของโปรเจ็คสามารถเข้าไปดูได้ที่ Firebase Console
  • groups: กลุ่มของผู้ทดสอบ app ของเราในตัวอย่างคือกลุ่มที่ชื่อว่า tester
  • apk_path: path ของไฟล์ .apk ที่เราต้องการส่งให้กับผู้ทดสอบ
  • firebase_cli_path: path ของ firebase cli tools ที่เราได้ทำการ installed ตรงนี้เดี๋ยวเราจะทำการ set path ผ่าน environment ตรง Circleci แทนจะเห็นได้ว่าการใช้ Fastlane ก็หนีไม่พ้นที่จะต้องใช้ firebase cli อยู่ดีวิธีแบบ Gradle ก็ต้องใช้นะครับบอกใบ้ให้เลย

Step 2: Authentication ด้วย Firebase CLI Tools เพื่อเอา firebase token มาใช้งาน

ขั้นตอนนี้จะทำผ่านเครื่องของเราเองนะครับ

// ให้ทำการ install firebase tools cli ผ่าน npm packagenpm i -g firebase-tools// ให้ทำการ login ผ่าน firebase cli เพื่อพ่น token ออกมาfirebase login:ci

เมื่อใช้คำสั่ง firebase login:ci ก็พ่นลิงค์ออกมาให้เราใน terminal ให้คลิกเพื่อทำการ Authentication เมื่อทำตามขั้นตอนเสร็จเรียบร้อยเราก็จะได้ firebase token ออกมาให้ทำการ copy ไว้ก่อน เพราะเดี๋ยวเราต้องนำไปใช้กับ Server CI 🚀

Step 3: สร้างไฟล์ Config ของ Circleci ขึ้นมาในโปรเจ็ค .circleci/config.yml ตามตัวอย่างด้านล่าง

จุดสังเกตที่ 1 คือ image ของ docker ที่เราใช้จะมี node ติดมาด้วยเพราะเราจำเป็นต้อง install firebase cli tools ผ่าน npm package บน Server CI หากใครรู้สึกไม่ชอบวิธีนี้ก็ลองไปใช้วิธีแบบ Gradle ดูนะครับซึ่งเหตุผลที่ผมไม่ใช้เพราะว่ามันจำเป็นต้องเอา private key ของ Service Account ไปไว้ในโปรเจ็คด้วยอันนี้อันตรายหน่อยผมขอผ่านสำหรับวิธีแบบ Gradle

จุดสังเกตที่ 2 คือ อย่างที่กล่าวไว้ข้างต้นว่า ไม่ว่าจะเป็นวิธีแบบ Fastlane หรือ Gradle ก็จำเป็นต้องใช้ Firebase CLI Tools ดังนั้นจำเป็นต้อง install ลงบน Server CI ของเราด้วย

ซึ่งในไฟล์ Config นี้เราสามารถทำ Condition ได้ เช่น ถ้าเป็น branch develop ให้ deploy app ไปที่ firebase แต่ถ้าเป็น master ให้ deploy ไปที่ google play store เป็นต้น อันนี้สามารถศึกษาเพิ่มเติมได้นะครับ หรือ Comment ถามมาได้ครับ

เอาล่ะทำการ Push Code ไปยัง Repository บน Github

Step 4: Setup Environment ของ Circleci

เมื่อทำการสร้าง Repository บน Github พร้อมกับทำการ Push Code ขึ้นมาแล้วก็ทำการ Setup Project บน Circleci สามารถ Follow ตาม Link ด้านล่างได้เลยครับ

หากว่า FAILED ไม่ต้องตกใจนะครับเพราะเรายังไม่ได้ทำการ Setup Environment ให้กับโปรเจ็คโดยไปที่เมนู Settings Environment Variables แล้วทำการเพิ่มตัวแปรลงไป 2 ตัวได้แก่

  • FIREBASE_TOKEN คือ token ที่ได้จากขั้นตอนที่ 2
  • FIREBASE_CLI_PATH คือ path ของ firebase cli tools ในที่นี้คือ /usr/local/lib/node_modules/firebase-tools/lib/bin/
ตัวอย่างการเพิ่ม Environment บน Circleci

Step 5: ทำการ Rerun Workflow บน Circleci เพื่อทดสอบการตั้งค่า

ถ้า Follow ทุกอย่างถูกต้องก็จะได้แบบนี้

ลองมาดูที่ Firebase Console ตรงเมนู App Distribution

จากนั้น Firebase ก็ส่ง Email ไปบอกยังกลุ่มผู้ทดสอบของเราว่า Application พร้อมสำหรับการทดสอบแล้ว แนบมากับ Link ดาวน์โหลดพร้อมกับแนะนำให้ลง app ของทาง Firebase เองที่มีชื่อว่า App Tester เพื่อสะดวกและง่ายในการ Tracking Version ของ Application ของเราได้อีก สะดวกและสบายจริงๆ (เหมือนกับ Crashlytics Beta ของ Fabric เป๊ะ)

Conclusion

ถ้าหากใคร Happy ดีกับ Crashlytics Beta ก็ไม่จำเป็นต้องย้ายมาใช้ แต่ถ้าหากใครเบื่อแล้วกับกลิ่นเดิมๆ หรือใช้บริการของ Firebase อยู่หรือยังไม่มี Tools สำหรับการ Delivery งานให้กับทีมแล้วละก็หันมาใช้ตัวนี้ดีกว่า เพราะว่าทุกอย่างสามารถจัดการได้ที่หน้า Firebase Console ที่เดียวทำให้สะดวกและรวดเร็ว และสิ่งสำคัญเลยคือเราสามารถทำการลด Tools ลงไปได้ 👍

มาดูข้อเสียกันบ้างสำหรับตอนนี้เท่าที่ผมเจอก็คือเรื่องของการส่ง Notification เมื่อมีการ Deploy App Version ใหม่จะส่ง Noti มาทาง Email ซึ่งข้อนี้ Crashlytics Beta ได้เปรียบเพราะว่าจะ Noti ผ่านแอพเลย แต่คิดว่าอีกไม่นานหรอกแอพ App Tester ของ Firebase คงทำออกมาแน่นอน โดยรวมก็ถือของเขาดีจริง

Happy Firebase 🔥

--

--