วันนี้นั่งสร้างระบบ 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 จะทำงานตามขั้นตอนต่าง ๆ เหล่านี้แบบอัตโนมัติ
มันน่าจะทำให้ทีมพัฒนารู้สึกดีขึ้นมาบ้าง