🚀 SEND MY HEART FLYING TO OUTER SPACE | https://unsplash.com/photos/woWf_VJ7dNs

บันทึกการ deploy Android application ขึ้น firebase app distribute ด้วย fastlane

Supawit R
odds.team
Published in
6 min readJan 1, 2021

--

เร็ว ๆ นี้ได้มีโอกาสต้อง 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

how fastlane works | image from https://fastlane.tools/

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 ส่วน

  1. ติดตั้ง fastlane ให้พร้อม
  2. ยืนยันตัวตนกับ Firebase เพื่อเอา credential มาใช้งาน
  3. สร้าง firebase project
  4. เขียน 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

check fastlane version

ถัดไปจะเป็นการสร้างไฟล์เริ่มต้นให้ fastlane โดยใช้คำสั่ง bundle exec fastlane init

ตัว fastlane จะถามเรา 3 อย่าง

  1. Package name ของโปรเจกต์เราคืออะไร: ก็ตามโปรเจกต์เราเลยฮะ ในที่นี้โปรเจกต์ของผมใช้เป็น odds.team.todolist
  2. ในการที่ fastlane จะ deploy ไป Google play เขาจำเป็นจะต้องมี secret file ที่สามารถ upload ข้อมูลไปยัง Google service ของเราได้ครับ ณ ตรงนี้ยังไม่ได้ใช้อะไรก็สามารถข้ามไปก่อนโดยกด Enter
  3. สุดท้ายเขาจะถามเราว่าจะให้ดาวน์โหลด 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

get firebase token

เมื่อส่ง token ให้ไป จะได้ของกลับมาเป็น refresh token เพื่อให้เราสามารถอัปโหลด APK เข้าไปได้

the command will return refresh token

ให้เรานำ refresh token ที่ได้มาเซ็ต env ให้ FIREBASE_TOKEN โดยพิมพ์ตามนี้

export FIREBASE_TOKEN=<refresh token ที่ได้มา>

เท่านี้ก็พร้อมแล้ว

3. สร้าง firebase project

ส่วนนี้เราจะไปทำบนเบราเซอร์กัน

https://console.firebase.google.com/ 👈 เข้าเว็บโลดด

creating a firebase project

คลิกปุ่ม “Create a project” เลย

enter firebase’s project name

แล้ว Continue ไปเรื่อย จนกว่าจะได้หน้าข้างล่างนี้มา

your project is ready 🎉

กด Continue โลด

firebase project sidebar

เมื่อเข้ามาที่หน้า project แล้ว มองไปทางซ้ายมือคลิกไป Release & Monitor > App Distribution

app distribution !

เข้ามาหน้า App Distribution กดไปที่รูป Android เพื่อไปต่อ

register android app

ถัดไปกรอก package name ของแอปเรา โดยอันนี้ผมจะเพิ่ม suffix เป็น .dev เครื่องนึงจะได้ลงได้ทุก ๆ environment prod, dev, uat

complete reigster android app

ส่วนที่เหลือนั้นผมจะกด 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 ดูครับ

build output

เราได้ 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 และไปที่โปรเจกต์

navigation to project setting page

เลือกที่ icon ฟันเฟือง > Project settings แล้วเลื่อนไป section Your apps

Your app id will appears on “Your apps” section

เอาหละครับ 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

distribute application successfully

ที่เมล์ tester จะเด้งครับ

จะ download APK มาได้แต่ อ๊ะ ๆๆ.. ลืมไปอย่าง เราลืม sign keystore ให้แอปครับ การที่เราไม่ได้ sign เนี่ยจะทำให้เราติดตั้ง app บนเครื่องไม่ได้ ไปดูวิธีทำกัน.

ในที่นี้จะใช้ Android Studio ช่วย generate

  1. ไปที่ Build > Generate Signed Bundle / APK
generate keystore file

เลือกเป็น APK แล้วกด Next

generate keystore for APK

เลือก Create new…

create a new keystore

กรอกข้อมูลให้ครบถ้วน

fill out the information form

ได้ไฟล์มาแล้ว ไปแก้ไข 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)” ซึ่งเป็นทุนที่มอบความรู้ ทักษะและโอกาสดีในการฝึกฝนพัฒนาทักษะที่มีอยู่ให้เฉียบคมมากยิ่งขึ้นครับ ❤️

--

--

Supawit R
odds.team

a developer who love to learn, read, and sleep.