![build]()
![build]()
วันนี้มีโอกาสได้แบ่งปันความรู้เรื่อง Continuous Integration (CI)
สำหรับปรับปรุงคุณภาพของการพัฒนา Software ให้ดีขึ้น
โดยหัวใจของ CI นั้นประกอบไปด้วย 2 คำคือ
- Continuous หรือ Frequent คือ ทำบ่อย ๆ อย่างต่อเนื่อง
- Integrate หรือ Merge คือ การรวมกันของสิ่งต่าง ๆ ในระบบ
รวมกันก็หมายความว่า ให้ทำการรวมกันบ่อย ๆ อย่างต่อเนื่อง
มีคำถามที่น่าสนใจคือ
- อะไรที่ต้องนำมารวมกันบ้าง ?
- ทำการรวมกันที่ไหน ?
ตอบได้ง่าย ๆ คือ
- source code ไงล่ะ
- รวมกันที่ Version Control System หรือ Repository ไงละ
ดังนั้น CI เป็นกระบวนการที่นำการเปลี่ยนแปลงต่าง ๆ ของ source code
ไปรวมกันไว้ที่ Version Control System บ่อย ๆ และ อย่างต่อเนื่อง
ปล. ถ้าใครไม่ใช้งาน Version Control System เช่น Git, SVN เป็นต้น
ก็น่าจะบาปอย่างแรงส์ !!
สิ่งที่ขาดไม่ได้เลยในกระบวนการของ CI คือ คำว่าคุณภาพ
เราจะรู้ได้อย่างไรว่า แต่ละการเปลี่ยนแปลงนั้น
- ระบบยังสามารถทำงานได้อย่างถูกต้องหรือไม่ ?
- ระบบยังสามารถทำงานได้ตามความคาดหวังหรือไม่ ?
ขอเน้นย้ำว่าทุกการเปลี่ยนแปลงนะ
หนึ่งในนั้นคือ การทดสอบนั่นเอง
แน่นอนว่า ต้องเป็นการทดสอบแบบอัตโนมัติอย่างแน่นอน (Automated testing)
ไม่ว่าจะเป็น Unit testing, Integration testing และ Functional testing
ส่งผลให้สามารถทดสอบได้บ่อย ๆ
ส่งผลให้สามารถรู้สถานะของระบบได้ตลอดเวลา
ส่งผลให้ได้ feedback ของระบบอยู่อย่างเสมอ ไม่ว่าจะดีหรือร้าย
ทำให้ทุกคนเห็นความคืบหน้าของการพัฒนา
มาดูกันหน่อยว่าขั้นตอนใน CI ควรเป็นอย่างไรบ้าง ?
อาจจะเรียกว่า
Continuous Integration Process
หรือบางคนอาจจะเรียกว่า
Build pipeline
ซึ่งผมขออธิบายตั้งแต่เรื่องพัฒนาของ Developer แต่ละคนกันเลย
มีขั้นตอนดังนี้
- Developer แต่ละคนต้องสามารถ build, test และ run ระบบที่เครื่องตัวเองได้
- เมื่อทำการพัฒนา feature เสร็จ แน่นอนว่าต้องมีชุดการทดสอบแบบอัตโนมัติด้วยเสมอ
- Developer ต้องทำการ build, test และ run บนเครื่องของตัวเอง เพื่อทำให้แน่ใจว่าระบบทำงานได้ถูกต้อง
- Developer ต้องทำการ build, test และ run บนเครื่องของตัวเอง เพื่อทำให้แน่ใจว่าสิ่งที่เปลี่ยนแปลงไม่กระทบส่วนอื่น ๆ
- ให้ทำการดึง source code ล่าสุดจาก Repository ของระบบ เพื่อตรวจสอบว่ามีการเปลี่ยนแปลงหรือไม่
- ถ้ามีการเปลี่ยนแปลงก็ให้ทำการรวม หรือ merge ที่เครื่องของ Devleoper ก่อน จากนั้นจึงทำการ build, test และ run อีกรอบ
- แต่ถ้าเกิดปัญหา หรือ ข้อขัดแย้งต่าง ๆ ก็ให้ทำการแก้ไขที่เครื่อง Developer ก่อนเสมอ
- เมื่อทุกอย่างผ่านทั้งหมด ให้ทำการส่งการเปลี่ยนแปลงไปยัง Repository กลาง
- เมื่อ Repository กลางมีการเปลี่ยนแปลง จะต้องมีระบบ CI ทำการ build, test และ run อีก เพื่อทำให้มั่นใจต่อระบบ
- แต่ถ้าเกิดความผิดพลาดบนระบบ CI จะทำการแจ้งไปยังทีมพัฒนา เพื่อให้ทุกคนหยุด เพื่อทำการแก้ไขให้ผ่าน
- เมื่อทุกอย่างบนระบบ CI ทำงานเรียบร้อยก็สามารถส่งผลลัพธ์ไปยังส่วนการทำงานอื่นต่อไป เช่น การทดสอบ และ การ deploy หรือส่งต่อไปยังระบบ Continuous Delivery เป็นต้น
โดยกระบวนการต่าง ๆ เหล่านี้
น่าจะทำให้เรา ทีม และ คนอื่น ๆ มีความเชื่อมั่นต่อระบบมากขึ้น
บางครั้งอาจจะช่วยลดคำพูดต่าง ๆ ลงไปเยอะ เช่น
- ระบบจะไม่พังจริง ๆ หรอ ?
- สิ่งที่แก้ไขจะไม่กระทบส่วนอื่น ๆ จริงหรอ ?
- เสร็จจริง ๆ หรอ ?
- .....
มาดูประโยชน์ของ Continuous Integration กันบ้าง
- รู้และเห็นข้อผิดพลาดได้อย่างรวดเร็ว
- ลดจำนวน Bug ลงไป
- ทำให้ทุกคนทุกทีมเห็นความคืบหน้าของการพัฒนา
- ทำให้เราเห็นขั้นตอนการพัฒนา
- ทำให้เราเห็นขั้นตอนการทดสอบ
- ทำให้เราเห็นปัญหา และ ปรังปรุงได้อย่างทันท่วงที
- ลดค่าใช้จ่ายในเรื่องต่าง ๆ ทั้งการแก้ไขข้อผิดพลาด ทั้งการทดสอบซ้ำ ๆ ทั้งปัญหาจากความเข้าใจผิดต่าง ๆ
ถ้าอยากรู้ว่าจริงหรือไม่ ก็ให้ลงมือทำด้วยมือของตัวเองสิ
ปล.
การทดสอบแบบอัตโนมัตินั้น
ควรครอบคลุมทั้ง Functional และ Non-functional requirement
โดย Continuous Integration (CI) นั้น
เป็นพื้นฐานที่สำคัญอย่างยิ่งของ Continuous Delivery และ Continuous Deployment
ทำให้เราพร้อมที่จะ deploy และ release ระบบงานได้ตามที่ต้องการ
โดยเรื่องคุณภาพนั้นมันไม่สามารถต่อรองได้เลย
ต้อง Build-in อยู่ในทุกขั้นตอนของการพัฒนา
สามารถอ่านเรื่อง
10 แนวปฏิบัติที่ดีของ Continuous Integration ได้
ปิดท้ายด้วยเรื่องของเครื่องมือสำหรับระบบ CI
ก็ลองไปดูเพิ่มเติ่มได้ที่
List of CI Tools
แต่เหนือสิ่งอื่นใดทุกสิ่งทุกอย่างมันถูกสร้างมาจากคน
ดังนั้นเรื่องคุณภาพของคนจึงสำคัญอย่างมาก