บันทึกการ deploy Android application ขึ้น firebase app distribute ด้วย fastlane
เร็ว ๆ นี้ได้มีโอกาสต้อง setup android pipeline เพื่อให้คนอื่นในทีมมาโหลดไปเล่นมาทดสอบแอปได้ง่าย ๆ เลยอยากมาเล่าขั้นตอนตรงนี้กัน
Fastlane คือ?
The easiest way to build and release mobile apps.
fastlane handles tedious tasks so you don’t have to.
เป็นเครื่องมือช่วยให้การทำ automate การ deployment และ release process ง่าย (เขาว่างั้น)
concept ของ fastlane มีแค่เรื่องการใส่ lane เข้าไป 1 lane คือการทำงาน 1 เรื่อง เช่น unit test แอป, test การ build, distribute beta test, deploy production แต่จะเน้นไปที่ Continuous Deployment (CD)
โดยที่ 1 lane เราสามารถเขียนคำสั่งได้หลายอย่าง คำสั่งที่ถูกใส่ไปใน lane มี 2 ประเภทคือ เรียกใช้งาน lane อื่น และ action
Firebase App Distribution คือ?
Firebase App Distribution makes distributing your apps to trusted testers painless. By getting your apps onto testers’ devices quickly, you can get feedback early and often. And if you use Crashlytics in your apps, you’ll automatically get stability metrics for all your builds, so you know when you’re ready to ship.
สรุปคือเป็นเครื่องมือช่วยให้เราส่งแอปไม่ว่าจะเป็น iOS หรือ Android ไปให้ QA หรือ Tester ของทีมติดตั้งแบบไว ๆ เพื่อให้ได้ feedback บ่อย ๆ
ขั้นตอนการทำ
แบ่งขั้นตอนการทำเป็น 3 ส่วน
- ติดตั้ง fastlane ให้พร้อม
- ยืนยันตัวตนกับ Firebase เพื่อเอา credential มาใช้งาน
- สร้าง firebase project
- เขียน script และ deploy 🚀
ไปเริ่มกัน ✊
1. ติดตั้ง fastlane ให้พร้อม
สร้างไฟล์ Gemfile ไว้ที่ root ของ project โดยใส่คำสั่งติดตั้ง fastlane ตามนี้
source "https://rubygems.org"gem "fastlane"
note: Gemfile เป็นตัวประกาศ dependency/library ที่จะใช้ในภาษา ruby เหมือน package.json ใน Node.js หรือ pom.xml/build.gradle ใน Java
ถัดไปใช้คำสั่ง sudo bundle install
เพื่อติดตั้ง fastlane เป็นอันเรียบร้อย ตอนนี้ใน project จะมีไฟล์ใหม่ 2 ตัว คือ Gemfile และ Gemfile.lock
ลองเช็คว่าเราติดตั้ง fastlane เรียบร้อยด้วยการพิมพ์ที่ terminal ว่า bundle exec fastlane --version
ถัดไปจะเป็นการสร้างไฟล์เริ่มต้นให้ fastlane โดยใช้คำสั่ง bundle exec fastlane init
ตัว fastlane จะถามเรา 3 อย่าง
- Package name ของโปรเจกต์เราคืออะไร: ก็ตามโปรเจกต์เราเลยฮะ ในที่นี้โปรเจกต์ของผมใช้เป็น odds.team.todolist
- ในการที่ fastlane จะ deploy ไป Google play เขาจำเป็นจะต้องมี secret file ที่สามารถ upload ข้อมูลไปยัง Google service ของเราได้ครับ ณ ตรงนี้ยังไม่ได้ใช้อะไรก็สามารถข้ามไปก่อนโดยกด Enter
- สุดท้ายเขาจะถามเราว่าจะให้ดาวน์โหลด metadata ที่จะใช้ขึ้น Google Play ไหม ก็ No ไปก่อนโดยการพิมพ์ n แล้ว Enter (สามารถทำตอนหลังได้โดยใช้คำสั่ง bundle exec fastlane supply init)
ทำครบขั้นตอนเราจะได้ไฟล์ใหม่มาเพิ่มอีก 2 ไฟล์ครับ คือ fastlane/Appfile และ fastlane/Fastfile
สุดท้ายของขั้นตอนนี้คือการติดตั้ง plugin firebase_app_distribution เพื่อให้เราสามารถใช้ command เพื่อ upload file APK ไปไว้ที่ firebase distribution ได้โดยใช้คำสั่ง
bundle exec fastlane add_plugin firebase_app_distribution
เสร็จเรียบร้อยพร้อมไปขั้นต่อไป
2. ยืนยันตัวตนกับ Firebase เพื่อเอา credential มาใช้งาน
ลงชื่อเข้าใช้ firebase ด้วยคำสั่ง
bundle exec fastlane run firebase_app_distribution_login
มันจะให้ลิงก์เราเพื่อเปิดเว็บไป login firebase ให้ได้ token กลับมาแปะที่ terminal
เมื่อส่ง token ให้ไป จะได้ของกลับมาเป็น refresh token เพื่อให้เราสามารถอัปโหลด APK เข้าไปได้
ให้เรานำ refresh token ที่ได้มาเซ็ต env ให้ FIREBASE_TOKEN โดยพิมพ์ตามนี้
export FIREBASE_TOKEN=<refresh token ที่ได้มา>
เท่านี้ก็พร้อมแล้ว
3. สร้าง firebase project
ส่วนนี้เราจะไปทำบนเบราเซอร์กัน
https://console.firebase.google.com/ 👈 เข้าเว็บโลดด
คลิกปุ่ม “Create a project” เลย
แล้ว Continue ไปเรื่อย จนกว่าจะได้หน้าข้างล่างนี้มา
กด Continue โลด
เมื่อเข้ามาที่หน้า project แล้ว มองไปทางซ้ายมือคลิกไป Release & Monitor > App Distribution
เข้ามาหน้า App Distribution กดไปที่รูป Android เพื่อไปต่อ
ถัดไปกรอก package name ของแอปเรา โดยอันนี้ผมจะเพิ่ม suffix เป็น .dev เครื่องนึงจะได้ลงได้ทุก ๆ environment prod, dev, uat
ส่วนที่เหลือนั้นผมจะกด Next ก่อนเพราะยังไม่ต้องใช้ ข้ามมา Step 4 เป็นอันพร้อมสู่ขั้นถัดไป
4. เขียน script และ deploy 🚀
ตอนที่เรา fastlane init ที่ว่าเราได้ไฟล์มา 2 ไฟล์ คือ Appfile กับ Fastfile เราจะไปเขียน script กันที่ Fastfile ครับ เริ่มต้นประมาณนี้
ผมขอลบ lane beta, deploy ไปก่อน แล้วเพิ่ม lane distribute เพื่อให้ upload ไปที่ firebase app distribute
desc "Deploy a new dev version to the Firebase App Distribution"
lane :distribute do
# code here
end
โดยที่ lane distributeจะใช้ action gradle ในการ build APK
desc "Deploy a new dev version to the Firebase App Distribution"
lane :distribute do
gradle(
task: "clean assemble",
flavor: "dev",
build_type: "Release"
)
end
- task เหมือนเป็น command ที่เราจะต่อหลังคำสั่ง gradle โดยคำสั่ง assemble เพื่อให้ไฟล์ APK
- flavor บอก environment ที่เราจะทำการ build
- build_type ก็คือ build type 5555 เลือกเป็น Release
และอย่าลืมไปใส่ flavor ที่ app/build.gradle ด้วย
android {
...
flavorDimensions "default" productFlavors {
dev {
dimension "default"
applicationIdSuffix ".dev"
}
production {
dimension "default"
}
}
}
ลองรัน command bundle exec fastlane distribute
ดูครับ
เราได้ APK มาแล้วครับ มา ๆ ใกล้ความจริงแล้ว 🥲
เพิ่ม command ถัดไป firebase app distribution ของเรานั่นเอง
desc "Deploy a new dev version to the Firebase App Distribution"
lane :distribute do
gradle(
task: "clean assemble",
flavor: "dev",
build_type: "Release"
)
firebase_app_distribution(
app: "1:123456789:android:abcd1234",
testers: "", # รายชื่อ testers ที่จะได้รับอีเมลให้ดาวน์โหลดแอป
release_notes: "New feature is ready to test"
)
end
ตรง app: "1:123456789:android:abcd1234"
ให้เปลี่ยนเป็น app id ของเราเองนะครับ
แล้วเอา app มาจากไหน??
มาครับไปเอา app id กัน โดยไปที่ console.firebase.google.com และไปที่โปรเจกต์
เลือกที่ icon ฟันเฟือง > Project settings แล้วเลื่อนไป section Your apps
เอาหละครับ copy มาวางเลย หรือจะใส่เป็น env ไว้ก็ได้
firebase_app_distribution(
app: ENV['FIREBASE_APP_ID_ANDROID'],
testers: "bas@odds.team",
release_notes: "New feature is ready to test"
)
ลองรันกันดูอีกทีครับ bundle exec fastlane distribute
ที่เมล์ tester จะเด้งครับ
จะ download APK มาได้แต่ อ๊ะ ๆๆ.. ลืมไปอย่าง เราลืม sign keystore ให้แอปครับ การที่เราไม่ได้ sign เนี่ยจะทำให้เราติดตั้ง app บนเครื่องไม่ได้ ไปดูวิธีทำกัน.
ในที่นี้จะใช้ Android Studio ช่วย generate
- ไปที่ Build > Generate Signed Bundle / APK
เลือกเป็น APK แล้วกด Next
เลือก Create new…
กรอกข้อมูลให้ครบถ้วน
ได้ไฟล์มาแล้ว ไปแก้ไข Fastfile เพิ่ม เพื่อบอกว่า keystore เราอยู่ไหน password อะไร เหมือนเดิมคือเราใส่ไปใน env (KEYSTORE_PATH ใส่เป็น absolute path ครับ export KEYSTORE_PATH=$(pwd)/todolist-dev.jks
)
gradle(
task: "clean assemble",
flavor: "dev",
build_type: "Release",
properties: {
"android.injected.signing.store.file" => ENV['KEYSTORE_PATH'],
"android.injected.signing.store.password" => ENV['STORE_PASSWORD'],
"android.injected.signing.key.alias" => ENV['KEY_ALIAS'],
"android.injected.signing.key.password" => ENV['KEY_PASSWORD'],
}
)
ลองรัน bundle exec fastlane distribute
ก็จะได้รับอีเมลพร้อมให้โหลดแล้วและติดตั้งได้แล้ว
และนี่คือ Fastfile สุดท้ายที่ได้ จะหน้าตาประมาณนี้
ก็เสร็จไปแล้วสำหรับการลองเอา app ขึ้น firebase app distribution สนใจดูด source code เต็มได้ที่นี่ 👇
อยากรู้ว่า fastlane มี actions อะไรให้ใช้งานมั่ง หาได้ที่นี่เล้ย 👇
หากอ่านมาถึงตรงนี้มีอะไรแล้วคิดว่ามีอะไรผิดพลาด หรือตกหล่นอะไร อยากรบกวนช่วยกันคอมเมนต์เข้ามาได้เลยนะครับ หรือสงสัยอะไรอยากถามก็ได้เช่นกัน เพื่อที่เพื่อน ๆ คนอื่นที่มาอ่านบทความนี้จะได้เนื้อหาที่ถูกต้องและสมบูรณ์ครับ 🙂
สุดท้ายนี้ขอลาด้วยคำว่า “สวัสดีปีใหม่ครับผู้อ่าน ขอให้ปี 2021 เป็นปีที่ดีสำหรับทุกคน” แล้วเจอกันบล็อกหน้า 🙏
อ้างอิง
Special Thanks
ขอขอบคุณ “สำนักงานส่งเสริมเศรษฐกิจดิจิทัล (depa)” และคณาจารย์ “คณะเทคโนโลยีสารสนเทศ มจธ. (SIT)” ที่ให้การสนับสนุน “ทุนเพชรพระจอมเกล้าเพื่อพัฒนาเทคโนโลยีและนวัตกรรมดิจิทัล (KMUTT-depa)” ซึ่งเป็นทุนที่มอบความรู้ ทักษะและโอกาสดีในการฝึกฝนพัฒนาทักษะที่มีอยู่ให้เฉียบคมมากยิ่งขึ้นครับ ❤️