ปัญหา ระบบ CI/CD ของระบบงานนั้น ยิ่งเวลาผ่านไป
ทำไมยิ่งทำงานช้าลงเรื่อย ๆ
แถมก็ไม่มีใครมาแก้ไข หรือ ปรับปรุงอีกด้วย
หรือว่ามันไม่มีคุณค่าต่อทีมกันแน่นะ
แต่ทุกคนก็นั่งรอให้ CI/CD ทำงานเสร็จ แล้วรอลุ้นดูผล !!
มันยังไงกันนะ ?
ก่อนแก้ไขหรือปรับปรุง ก็มาดูก่อนว่าขั้นตอนการทำงานเป็นอย่างไร
ขั้นตอนการทำงานประกอบไปด้วย
- Download dependency ต่าง ๆ
- Compile code
- ทำการตรวจสอบ code ด้วย Static code analyzer + Lint + Type checker + Formatter code
- Run unit test
- Run End-to-end test
- Deploy ใน environment ต่าง ๆ
มาดูปัญหาที่เกิดขึ้นบ้างว่ามีอะไร และแก้ไขอย่างไร
- อย่างแรกคนจริง ไม่ใช้ cached อะไรเลย ทั้ง dependency และผลจากการ compile ก่อนหน้า คนจริงต้อง compile แบบ clean ๆ ทั้ง ๆ ที่บ่อยครั้งจะเปลี่ยนแปลงเพียงเล็กน้อยเท่านั้น ผลที่ได้คือ เปลี่ยนนิดเดียวแต่รอนานมาก และนานขึ้นเรื่อย ๆ ตาม code และ dependecy ที่เยอะขึ้น ดังนั้น ความต้องการคือ แก้ไขนิดเดียวก็น่าจะใช้เวลาทำงานไม่นานสิ จึงนำเรื่องของ cached ผลการทำงานก่อนหน้ามาใช้ด้วย ในส่วนนี้ลดเวลาจากหลักนาที เหลือไม่ถึง 5 วินาที
- ต่อมาเรื่องของการ download dependency ที่เยอะ รวมทั้งต้องออก internet อีก ดังนั้นตรงนี้ง่าย ๆ คือ ทำ cached dependecy server ไว้ใช้ภายในซะเลย
- ขั้นตอนการทำงานใน CI/CD จะเป็นแบบ sequencial ทั้งหมด ดังนั้นจึงมานั่งคุยกันใหม่ว่า จะจัดการอย่างไร ขั้นตอนไหน สามารถทำงานแบบพร้อม ๆ กันได้ หรือ แยกกันได้ หรือ งานไหนไม่เกี่ยวข้องกันก็ไม่ต้องรอผล ในส่วนนี้คือการปรับปรุงขั้นตอนการทำงานให้ตรงกับความต้องการปัจจุบันและประโยชน์ให้มากที่สุด แน่นอนว่าใช้เวลาในการคุยนาน แต่เป็นสิ่งที่ควรทำมาก ๆ และบ่อย ๆ
- ขั้นตอนอะไรที่ไม่จำเป็นก็ลบทิ้งไป
- ในส่วนของ End-to-End test จะช้าขึ้นเรื่อย ๆ ดังนั้นจึงเริ่มแยกออกมาอีก server และทำการทดสอบทั้งแบบ parallel และ distributed เพื่อให้รู้ผลได้รวดเร็วและเสถียรที่สุด เนื่องจากการทดสอบในส่วนนี้มักจะเจอ test case ที่ไม่เสถียรเยอะมาก ๆ ซึ่งมันส่งผลต่อความน่าเชื่อถือของ CI/CD อย่างมาก
- ทุกคนจะรอดูผลที่ CI/CD server เป็นหลัก ซึ่งไม่ถูกต้องเลย เพราะว่า มันทั้งช้า และ รอนาน เปลืองเวลาอีก ดังนั้นจึงต้องทำให้ทุกคนสามารถ run บางอย่างบนเครื่องตัวเองให้ได้และผ่านก่อน ก่อนที่จะทำการ commit->push และ PR มายัง source repository ช่วยให้ไม่ต้องมารอดูอะไรมากนัก ในส่วนนี้จะใช้งานพวก Docker มาช่วย
สิ่งที่น่าสนใจคือ CI/CD process เป็นสิ่งที่ควรดูและปรับปรุงอยู่อย่างสม่ำเสมอ
ไม่ใช้ทำแล้วใช้งานแบบนั้นไปตลอดเวลา
เพราะว่า หลาย ๆ อย่างมันสามารถปรับปรุง เปลี่ยนแปลง เพิ่มเติม หรือ ลบทิ้งไปได้
เพื่อให้เหมาะสมกับงานนั้น ๆ
และสิ่งที่สำคัญมาก ๆ คือ CI/CD ต้องทำงานได้อย่างรวดเร็วและมีคุณภาพที่สูง