android-ci
วันนี้นั่งสร้างระบบ Continuous Integration (CI) สำหรับ Android app นิดหน่อย
เพื่อทำการ integrate ส่วนการทำงานต่าง ๆ เข้าด้วยกัน
ทำการ build และ ทดสอบระบบแบบอัตโนมัติ
ทำให้เรารู้ข้อผิดพลาด เพื่อทำการแก้ไขได้อย่างรวดเร็ว

ดังนั้นมาดูกันว่าจะทำการสร้างระบบ CI อย่างไรกันบ้าง ?

เริ่มจาก CI Server มีอะไรให้ใช้บ้าง ?

ถ้าที่ผมใช้ประจำก็คือ Jenkins
เป็น Opensource
มัน Free
มี plugin ให้ใช้เพียบ
เอกสารเยอะ
สามารถทำการติดตั้งที่ server ของเราเองได้

ถามว่ามีเครื่องมืออื่น ๆ อีกไหม ?
ตอบได้เลยว่ามากมาย
ตัวอย่างเช่น
ถ้าเป็นระบบ opensource ก็ใช้ TravisCI ได้
ซึ่งเป็น Free cloud service
หรือถ้ามีเงินก็ซื้อพวก TeamCity มาใช้ก็ได้
ซึ่งมีความสามารถที่เยอะกว่าและดีกว่าแน่นอน

ดังนั้นจะเลือกเครื่องมืออะไรก็ดูว่าระบบงานของคุณเป็นอย่างไร ?
ต้องการอะไรบ้าง ?
เพื่อให้ได้สิ่งที่เหมาะสมนะครับ

สิ่งที่ต้องคิดและออกแบบเสมอคือ flow/process หรือขั้นตอนการทำงานของ CI ?

หรือบางครั้งจะเรียกว่า build pipeline หรือ build process
ตั้งแต่การดึง source code ใน version ที่ต้องการ
ไปจนถึงการ build, test และ deploy
เพื่อทำให้เรามั่นใจในการทำงานของระบบ
ว่ามีคุณภาพมากเพียงพอ ที่ทำให้เรามีความมั่นใจหรือไม่ ?
แนะนำให้ทำการคิดและออกแบบก่อนสร้างเสมอนะครับ
ตัวอย่างเช่น

  • ขั้นตอนที่ 1 ทำการดึง code จาก version control ใน brach ที่ต้องการ
  • ขั้นตอนที่ 2 ทำการวิเคราะห์ source code ด้วยเครื่องมือพวก Static Code Analysis
  • ขั้นตอนที่ 3 ทำการทดสอบ Unit test
  • ขั้นตอนที่ 4 ทำการทดสอบ User Interface test
  • ขั้นตอนที่ 5 ทำการทดสอบ End-to-End test
  • ขั้นตอนที่ 6 ทำการทดสอบStress test
  • ขั้นตอนที่ 7 ทำการสร้างไฟล์ APK สำหรับการ deploy
  • ขั้นตอนที่ 8 ทำการ deploy ระบบ

เมื่อเราสามารถคิดและออกแบบระบบการทำงานของ CI Server ได้แล้ว
จากนั้นจึงทำการเลือกเครื่องมือที่จะใช้งานตามความต้องการต่อไป
โดยขั้นตอนจะมากจะน้อยก็อยู่ที่ความต้องการล้วน ๆ

เครื่องมือในแต่ละขั้นตอนก็เยอะแยะ แต่ขอสรุปเท่าที่ใช้ก็แล้วกัน

1. การวิเคราะห์ source code

Android Lint
ทำการตรวจสอบทั้งไฟล์ java และ xml ต่าง ๆ ใน Android project
ช่วยดูทั้งเรื่องจุดที่มีโอกาสจะเกิด bug
การตรวจสอบความถูกต้องของการตั้งชื่อ การใช้งาน
เรื่องของ security และ performance
เรื่องของ usability และ accessibility อีกต่างหาก

Facebook Infer
ช่วยตรวจสอบเรื่องของ Null pointer exception และ resource leak
เพื่อทำให้เรามั่นใจใน code มากยิ่งขึ้น

และยังมีเครื่องมืออื่น ๆ ซึ่ง Java developer น่าจะรู้จักเช่น

2. การทดสอบ

โดยใน Android นั้นมีเครื่องมือการทดสอบมาให้ครบเลย

  • Unit Testing ใช้ jUnit4
  • แต่ถ้าใน code ที่ทดสอบ Unit testing มี library ของ Android แล้วจะไม่สามารถทดสอบได้ ต้องใช้ Instrumentation test ของ Android แทนนะครับ
  • UI Testing ใช้งาน Espresso
  • End-to-End Testing สามารถใช้ได้ทั้ง Appium และ Calabash
  • Stress Testing ใช้งาน Monkey test ซึ่งเขียน shell script ง่าย ๆ ก็ใช้ได้แล้ว

โดยการทำงานตั้งแต่การ build, test, สร้างไฟล์ APK และ deploy นั้น
จะทำงานผ่าน gradle ทั้งหมดเลย

แน่นอนว่าแต่ละขั้นตอนจะถูกกำหนดไว้ใน CI Server นั่นเอง

เมื่อใดก็ตามที่ code ใน version control มีการเปลี่ยนแปลง
CI Server จะทำงานตามขั้นตอนต่าง ๆ เหล่านี้แบบอัตโนมัติ
มันน่าจะทำให้ทีมพัฒนารู้สึกดีขึ้นมาบ้าง