Firebase App Distribute กับ Circleci
เข้าประเด็นเลย… เมื่อไม่กี่วันมานี้ทาง Firebase เองได้ปล่อยบริการใหม่ที่ชื่อว่า App Distribution จะอธิบายพอสังเขป คือ เป็นตัวช่วยให้ Mobile Developer ทั้ง Android และ iOS ให้ทำการ Delivery Application ให้กับทีมงานทำการทดสอบได้สะดวกและรวดเร็วทันใจ 🔥
ถ้าหากใครเคยใช้ Crashlytics Beta มาแล้วล่ะก็คงจะเข้าใจ เพราะลักษณะของการทำงานมันเหมือนกัน วันนี้ผมก็เลยจะขอมาแชร์ในส่วนของการ Config CI/CD ด้วย Circleci ให้สามารถ Deploy Android App ไปยัง Firebase App Distribution
สิ่งที่ควรรู้ก่อน
ใครเข้าใจอยู่แล้วก็ข้ามไปได้เลยครับ 😎
จากบทความเกี่ยวกับ Firebase App Distribution เครื่องมือตัวนี้จะมีวิธีการ Distribute ด้วยกันอยู่ 4 วิธี ได้แก่
- Firebase Console
- Firebase CLI
- Fastlane
- 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/
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 คงทำออกมาแน่นอน โดยรวมก็ถือของเขาดีจริง