web analytics

Deploy Flutter ด้วย App Center

สวัสดีผู้อ่านครับ ผมมีโอกาสได้ใช้งาน Flutter ร่วมกับ App Center เป็นเครื่องมือตัวหนึ่งที่น่าสนใจในการทำ CI/CD สำหรับ mobile app จึงอยากจะเขียนบล็อกแชร์เรื่องนี้ครับ

ปัญหา

ก่อนอื่นขอเล่าถึงปัญหาก่อน เพื่อนๆเคยพัฒนาแอปแล้วต้องส่งแอปให้ Tester ทดสอบใช่ไหมครับ ถ้าไม่มีเครื่องมือมาช่วยเลยก็กินแรง เหนื่อยอยู่เหมือนกัน ดังนั้นต้องหาตัวช่วย เช่น DevOp มาช่วยเรา เพียงเรา Push code ไปที่ Git สักที่ แล้วมันทำ CI/CD ให้เรา จากนั้น Tester ก็ดาวน์โหลดแอปมาใช้งานได้เลย หนึ่งในเครื่องมือนั้นคือ App Center ที่มาช่วยแก้ปัญหาตรงนี้

App Center คืออะไร

App Center เป็นเครื่องมือ cloud solution จาก Microsoft สำหรับ DevOps ช่วย build และ test แอป พร้อมส่งแอปให้กับ Tester ในทันที หรือจะ publish ขึ้น App Store เลยก็ได้ โดยการทำงานของ App Center จะเชื่อมกับ Repository ใน Source Control เช่น Gitlab , Github (ในตัวอย่างนี้ผมจะใช้ Gitlab นะ)

ก่อนอื่น สมัครใช้งาน App Center ได้ที่
https://appcenter.ms/

สร้างโปรเจคสำหรับ Android

เข้าไปที่ App Center แล้วสร้างโปรเจคของเรา ในที่นี้ ผมจะสร้างเป็น Android ก่อน โดยเลือก Platform เป็น Java/Kotlin

จากนั้น เมื่อเข้ามาที่ project ที่เราสร้าง จะมี Getting Started ต่างๆ ตรงนี้ถ้าใช้ Flutter ให้ข้ามไปเลย ไม่ต้องทำก็ได้

แก้ไข Git Ignore

ไปที่ไฟล์ android/.gitignore ใน Flutter project ของเรา

Git ignore คือไฟล์ที่เก็บรายละเอียดว่าไฟล์ไหนที่ Git ไม่ต้องสนใจ ส่วนใหญ่จะเป็นไฟล์ที่ไม่จำเป็น หรือ compile แล้ว ซึ่งหนึ่งใน default ของ git ignore จะมี Gradlew อยู่ด้วย เป็น script ของ Gradle ตัวนึง ซึ่งเรา App Center จำเป็นต้องใช้ build แอป ดังนั้นเราต้องแก้ git ignore ไม่ให้มี grabrew จะได้ไฟล์ gitignore ประมาณนี้

/.gradle
/captures/
/local.properties
GeneratedPluginRegistrant.java

App Center Build Script (Android)

ต่อมา เราจะต้องเขียน script เพื่อให้ App Center รันคำสั่ง Flutter หรือทำอะไรบางอย่างตามที่เราต้องการ เรียกว่า Build script ในตัวอย่างนี้เราจะรันคำสั่งให้ไป clone Flutter พร้อมกับ build app

โดย build script จะมี 3 ไฟล์ คือ post-clone, pre-build, post-build ในที่เราจะรัน script หลังจาก clone repository แล้ว
ให้สร้างไฟล์ app-center-post-clone.sh ในโฟลเดอร์ android/app/src

ในไฟล์ appcenter-post-clone.sh เขียน script ดังนี้

#!/usr/bin/env bash
# place this script in project/android/app/
cd ..
# fail if any command fails
set -e
# debug log
set -x

cd ..

git clone -b stable https://github.com/flutter/flutter.git
export PATH=`pwd`/flutter/bin:$PATH

flutter channel stable
flutter doctor
flutter pub get
flutter build apk --release

# copy the APK where AppCenter will find it
mkdir -p android/app/build/outputs/apk/; mv build/app/outputs/apk/release/app-release.apk $_

การทำงานคร่าวๆ คือ เมื่อเรา push code แล้ว App Center จะรัน build script ของเราทันที ซึ่งคือการ ดาวน์โหลด Flutter SDK ดาวน์โหลด dependencies ต่างๆ แล้วรันคำสั่ง flutter build ซึ่งจะใช้เวลาราวๆประมาณ 10-20 นาทีในการทำงานแต่ละครั้ง

รายละเอียดเพิ่มเติมเกี่ยวกับ Build Script
https://docs.microsoft.com/en-us/appcenter/build/custom/scripts/

Push Code ไปที่ Gitlab

ในตัวอย่างนี้ ผมใช้ Gitlab เป็นที่เก็บ Source code โปรเจค Flutter ของผม ซึ่งจะขอข้ามขั้นตอนวิธี push code นะ
จากนั้น ที่ App Center ให้เรา connect Repository ที่ต้องการ

ผมแนะนำว่า ให้แยก branch สำหรับ App Center โดยเฉพาะนะ
เวลาที่เราต้องการ ให้ App Center ทำงาน ให้ merge

Signed Build (Android)

ขั้นตอนถัดไป คือเราจะต้องกำหนด Build config ใน App Center สังเกตว่าที่ build scripts จะมี Post-clone แสดงอยู่ตามที่เราเขียน script ไว้ โดยในหน้านี้เราสามารถกำหนดได้ว่าต้องการ build ตอนไหน เช่น build ทันทีทุกครั้งที่มี code push เข้ามา

จุดสำคัญ คือ Sign Build ให้เรากำหนด keystore ของเรา หรือถ้าใครเก็บ keystore ไว้ใน Git และ config gradle สำหรับ release ไว้แล้วก็สามารถเลือก My Gradle setting are entirely set…

จุดสุดท้ายคือให้เรากำหนด Distribute ให้ส่งอีเมลไปแจ้ง Tester ตามที่เรากำหนด ซึ่ง default App Center จะกำหนดอยู่ใน Groups ที่ชื่อว่า Collaborators

จากนั้นกด Save and Build แล้วรอ App Center ทำงานสักครู่ ประมาณ 10-15 นาที

ถ้า build สำเร็จ ไม่มี error
status จะเป็น BUILT สีเขียวแบบนี้

จากนั้น เราจะได้รับ email สำหรับดาวน์โหลดแอปจาก App Center แบบนี้

โดยเราสามารถเพิ่ม อีเมล tester ได้ที่เมนู Setting > People

สร้างโปรเจค iOS

ทำฝั่ง iOS กันต่อ โดย Platform เลือกเป็น Objective-C / Swift

จากนั้นจะพบหน้าจอ Getting Started
ตรงนี้ให้ข้ามไปได้เลย ไม่ต้องทำก็ได้นะ

App Center Build Script (iOS)

กลับมาที่โฟลเดอร์ Flutter ของเรา เราต้องกำหนด build script ให้กับ iOS
ให้สร้างไฟล์ appcenter-post-clone.sh ที่โฟลเดอร์ ios

เขียน script ดังนี้

#!/usr/bin/env bash
#Place this script in project/ios/

# fail if any command fails
set -e
# debug log
set -x

pod setup

cd ..
git clone -b stable https://github.com/flutter/flutter.git
export PATH=`pwd`/flutter/bin:$PATH

flutter channel stable
flutter doctor
flutter pub get

echo "Installed flutter to `pwd`/flutter"

flutter build ios --release --no-codesign

จากนั้นทำตามขั้นตอนเดียวกับ Android คือ Connect Repository และกำหนด Build Config ใน App Center สามารถเลือก Xcode verison ตามต้องการได้ หากถูกต้อง จะมี Post-clone แสดงที่ใน build script ด้วย

Signed Build (iOS)

ที่ Sign builds เราจะต้องกำหนด 2 สิ่ง คือ Provisioning Profile และ Certificate
โดยไฟล์ Provisioning Profile สามารถโหลดได้จาก เมนู Profile ในเว็บ Apple Developer

ส่วนไฟล์ Certificate สามารถโหลดจาก Keychains ใน Mac ของเรา
ก่อนอื่นเราต้องดูก่อนว่า ตอนเรา build release เราใช้ Certificate อะไร
วิธีคือให้เปิด Xcode โปรเจค iOS ของเรา ไปที่เมนู Signing & Capabilities
แล้วดูที่ส่วน Release ตรง Signing Certificate ว่า Certificate ที่ใช้ชื่อว่าอะไร

จากนั้นเปิดโปรแกรม Keychains ใน Mac
มองหา Certificate ที่มีชื่อเดียวกันกับ ที่ใช้ใน Xcode ของเรา
ให้คลิกขวา เลือก Export…

จากนั้นจะมีหน้าจอให้เรา Save ไฟล์ certificate นามสกุล .p12

ซึ่งจะต้องกำหนดรหัสผ่านให้กับ Certificate
โดยรหัสผ่านนี้ เราจะต้องไปใส่ที่ App Center นั่นเอง

จากนั้นกลับมาที่ Build config ใน App Center ให้กำหนด Certificate ทุกอย่างให้เรียบร้อย
แล้วกด Save & Build รอดูผลลัพธ์

ตรงจุดนี้ถ้ามี Error ให้ลองแก้ตาม Output ที่ปรากฏใน Console
โดยแนะนำว่าให้ Build Release ใน Xcode บนเครื่องเราให้สำเร็จก่อน

ผลลัพธ์

หลังจากลองใช้งาน App Center มาสักพัก ถือว่าตอบโจทย์ผมมาก เพราะผลลัพธ์ของเราคือ Tester จะได้อีเมลสำหรับดาวน์โหลดแอปหลังจาก เรา push code ไปที่ Gitlab (รอ Build 10-20 นาที) ดังนั้นเมื่อมีแอปเวอร์ชันใหม่ Tester สามารถทดสอบแอปได้อย่างสะดวกรวดเร็ว

ค่าบริการ

บริการ App Center ฟรี แต่จำกัดเวลาในการ build 240 นาทีต่อเดือน และ 120 นาทีต่อ build
ซึ่งหากเราใช้ build Flutter ก็จะได้ราวๆ 12 ครั้งต่อเดือนเท่านั้น

หากเราต้องการใช้งานแบบไม่จำกัดเวลา เราจะต้องจ่าย $40 ต่อเดือน ประมาณ 1,900 บาท
แต่ก็จะ build ได้ทีละโปรเจค หากต้องการเพิ่ม concurrency เพื่อให้สามารถ build พร้อมๆกันได้ จะต้องเพิ่มอีก $40 ต่อ build concurrency

รายละเอียด
https://visualstudio.microsoft.com/app-center/pricing/

ตอนนี้ผมลองใช้บริการแบบ $40/เดือน อยู่ครับ จะได้ build ได้ไม่จำกัดเวลา
โดยการชำระเงินจะเชื่อมกับ Azure Subscription หากใครที่ใช้ Azure อยู่แล้วจะสะดวกมากๆ

เทียบกับ Codemagic

Codemagic เป็นบริการคู่แข่งในรูปแบบเดียวกัน น่าสนใจที่หากเอามาเทียบกัน

สังเกตว่า App Center ยังไม่รองรับ Flutter แบบเป็นทางการเสียทีเดียว คือจะรองรับเป็น iOS , Android Native ซึ่งจะต่างจากคู่แข่งอย่าง Codemagic ที่มีตัวเลือก Flutter ให้เลย และ codemagic ยังสะดวกกว่าที่สามารถปรับแต่ง VM ได้ด้วย ในขณะที่ App Center ไม่มีตัวเลือก แต่ codemagic จะมีค่าบริการสูงกว่าหากใช้งานในโปรเจคที่ใหญ่ขึ้น คือถ้าใช้เกิน 500 นาที จะคิดค่าบริการเริ่มต้นนาทีละ $0.038 ต่อนาที หรือประมาณนาทีละ 1.25 บาท (Standard) หรือเหมาจ่ายเพื่อให้ไม่จำกัดเวลา จะต้องจ่ายถึง $299 ต่อเดือน ซึ่งค่อนข้างสูงสำหรับทีมเล็กๆ ในขณะที่ App Center จ่ายแบบจบๆต่อเดือน build ไม่จำกัดเวลา ในราคา $40

รายละเอียด codemagic
https://codemagic.io/pricing/

จบแล้ว

บล็อกนี้มาแชร์เกี่ยวกับ Flutter ร่วมกับ App Center ครับ เครื่องมือที่ช่วยให้การ build Flutter App ทั้ง iOS Android ไปถึงมือ Tester ได้อย่างสะดวกรวดเร็ว ในบล็อกถัดไปจะพาไปลองเล่น Codemagic ครับ

ขอบคุณที่ติดตามอ่านจนจบครับ (:

อ่านต่อเลย เรื่อง Codemagic !