CI/CD คืออะไร การบูรณาการอย่างต่อเนื่องและการส่งมอบอย่างต่อเนื่อง
⚡ สรุปอย่างชาญฉลาด
Continuous Integration คือแนวทางการพัฒนาซอฟต์แวร์ที่สมาชิกในทีมจะรวมงานของตนเข้ากับที่เก็บโค้ดร่วมกันอย่างน้อยวันละครั้ง และทุกครั้งที่มีการคอมมิตโค้ด ระบบจะสร้างและทดสอบโดยอัตโนมัติเพื่อตรวจจับข้อผิดพลาดในการรวมโค้ดตั้งแต่เนิ่นๆ
การบูรณาการอย่างต่อเนื่อง (CI) คืออะไร?
การบูรณาการอย่างต่อเนื่อง เป็นวิธีการพัฒนาซอฟต์แวร์ที่สมาชิกในทีมจะผสานรวมงานของตนอย่างน้อยวันละครั้ง การผสานรวมแต่ละครั้งจะได้รับการตรวจสอบโดยระบบสร้างอัตโนมัติที่ตรวจจับข้อผิดพลาด แนวคิดนี้ถูกนำมาใช้เมื่อกว่าสองทศวรรษที่แล้วเพื่อหลีกเลี่ยง “นรกแห่งการผสานรวม” ซึ่งเกิดขึ้นเมื่อการผสานรวมถูกเลื่อนออกไปจนถึงช่วงท้ายของโครงการ
หลังจากมีการส่งโค้ดเข้าระบบแล้ว ซอฟต์แวร์จะถูกสร้างและทดสอบทันที ในโครงการขนาดใหญ่ที่มีนักพัฒนาจำนวนมาก การส่งโค้ดเข้าระบบจะเกิดขึ้นหลายครั้งต่อวัน ในแต่ละครั้งที่ส่งโค้ดเข้าระบบ โค้ดจะถูกสร้างและทดสอบ หากการทดสอบผ่าน ระบบจะตรวจสอบเวอร์ชันที่สร้างขึ้นเพื่อนำไปใช้งาน และหากการใช้งานสำเร็จ โค้ดจะถูกส่งไปยังระบบการผลิต วงจรการส่งโค้ด การสร้าง การทดสอบ และการใช้งานนี้ดำเนินไปอย่างต่อเนื่อง ซึ่งเป็นที่มาของชื่อเรียกวิธีการนี้
การจัดส่งแบบต่อเนื่อง (CD) คืออะไร?
การจัดส่งแบบต่อเนื่อง เป็นวิธีการทางวิศวกรรมซอฟต์แวร์ที่ทีมพัฒนาซอฟต์แวร์ในรอบการทำงานสั้นๆ และรับประกันว่าสามารถปล่อยใช้งานได้อย่างน่าเชื่อถือได้ตลอดเวลา เป้าหมายคือการสร้าง ทดสอบ และปล่อยซอฟต์แวร์ด้วยความเร็วและความถี่ที่ดี ลดต้นทุน เวลา และความเสี่ยงในการส่งมอบการเปลี่ยนแปลงผ่านการอัปเดตการผลิตบ่อยครั้ง
ความแตกต่างระหว่าง CI และ CD
การบูรณาการอย่างต่อเนื่อง การทดสอบการเปลี่ยนแปลงแต่ละครั้งในโค้ดเบสโดยอัตโนมัติเรียกว่า `test-up-up` ในขณะที่ `continuous delivery` เป็นวิธีการนำการเปลี่ยนแปลง เช่น ฟีเจอร์ใหม่ การกำหนดค่า และการแก้ไขข้อผิดพลาด เข้าสู่ระบบการผลิตได้อย่างปลอดภัยและรวดเร็ว
การพัฒนาโดยไม่ใช้ CI เทียบกับการพัฒนาโดยใช้ CI
| การพัฒนาโดยไม่มี CI | การพัฒนาด้วย CI |
|---|---|
| มีแมลงเยอะมาก | ข้อบกพร่องน้อยลง |
| กระทำไม่บ่อยนัก | กระทำปกติ |
| เผยแพร่ไม่บ่อยและช้า | การเผยแพร่การทำงานปกติ |
| บูรณาการได้ยาก | การผสานรวมที่ง่ายและมีประสิทธิภาพ |
| การทดสอบเกิดขึ้นล่าช้า | การทดสอบเกิดขึ้นตั้งแต่เนิ่นๆ และบ่อยครั้ง |
| ปัญหาแก้ไขได้ยากขึ้น | ปัญหาต่างๆ จะถูกค้นพบและแก้ไขได้เร็วขึ้น |
| ทัศนวิสัยโครงการไม่ดี | การมองเห็นโครงการที่ดีขึ้น |
ความแตกต่างระหว่างการคอมไพล์และการรวมระบบอย่างต่อเนื่อง
ในขณะที่การคอมไพล์ทำหน้าที่เพียงแค่แปลงโค้ดให้เป็นภาษาเครื่อง แต่ CI (Continuous Integration) จะดำเนินการในกิจกรรมที่กว้างกว่านั้นหลายอย่าง:
- การผสานรวมฐานข้อมูล: ช่วยให้ฐานข้อมูลและโค้ดทำงานสอดคล้องกัน และสร้างฐานข้อมูลและข้อมูลทดสอบโดยอัตโนมัติ
- Code การตรวจสอบ: ช่วยให้มั่นใจได้ว่าโค้ดมีคุณภาพที่ดี ตรวจพบปัญหาตั้งแต่เนิ่นๆ และนำแนวปฏิบัติที่ดีที่สุดมาใช้
- การติดตั้งแบบอัตโนมัติ: ช่วยให้คุณสามารถเปิดตัวผลิตภัณฑ์ได้ทุกเมื่อ และทำให้ผลิตภัณฑ์อยู่ในสถานะที่สามารถสาธิตได้อย่างต่อเนื่อง
- การสร้างเอกสาร: หมั่นปรับปรุงเอกสารให้ทันสมัยอยู่เสมอ และจัดทำรายงานการสร้างและตัวชี้วัดต่างๆ
- การรวบรวม: แปลงโค้ดระดับสูงให้เป็นภาษาเครื่องและตรวจสอบให้แน่ใจว่าสามารถคอมไพล์ได้บนทุกแพลตฟอร์มเป้าหมาย
โดยหลักการแล้ว การสร้างโปรแกรมควรทำงานจากบรรทัดคำสั่งแทนที่จะพึ่งพา IDE ควรเกิดขึ้นอย่างต่อเนื่องบนเซิร์ฟเวอร์ CI เฉพาะ (ไม่ใช่การทำงานของ cron) ควรถูกเรียกใช้งานทุกครั้งที่มีการตรวจสอบโค้ด และควรให้ผลตอบรับทันทีโดยไม่ต้องให้ผู้พัฒนาลงมือทำอะไร
คุณต้องเตรียมอะไรบ้างในการดำเนินการกระบวนการปรับปรุงอย่างต่อเนื่อง (CI)?
- ระบบควบคุมเวอร์ชัน (VCS): วิธีการที่เชื่อถือได้ในการรวบรวมและเก็บรักษาการเปลี่ยนแปลงที่เกิดขึ้นกับโครงการของคุณตลอดเวลา
- เครื่องเสมือน: เซิร์ฟเวอร์สำรอง หรืออย่างน้อยหนึ่งเครื่อง เครื่องเสมือน เพื่อสร้างระบบของคุณ
- โซลูชันเครื่องมือ CI แบบโฮสต์: เพื่อหลีกเลี่ยงการจัดการเซิร์ฟเวอร์ โซลูชันแบบโฮสต์จะดูแลกระบวนการทั้งหมดและช่วยให้ปรับขนาดได้ง่ายขึ้น
- เครื่องมือ: หากคุณเลือกใช้แบบโฮสต์เอง ให้ติดตั้งเครื่องมือ CI เช่น Jenkins, TeamCity, Bambooหรือ GitLab
ระบบ Continuous Integration ทำงานอย่างไร?
ตัวอย่างเก่าแก่คือ Nokia ซึ่งเคยใช้กระบวนการที่เรียกว่า nightly build หลังจากที่นักพัฒนาหลายคนทำการคอมมิตโค้ดหลายครั้งในระหว่างวัน ซอฟต์แวร์จะถูกสร้างขึ้นทุกคืน เนื่องจากมีการสร้างเพียงวันละครั้ง การแยกแยะ ระบุ และแก้ไขข้อผิดพลาดในโค้ดเบสขนาดใหญ่จึงเป็นเรื่องยากลำบาก
Later ทีมงานนำระบบ Continuous Integration มาใช้ ซอฟต์แวร์จะถูกสร้างและทดสอบทันทีที่นักพัฒนาส่งโค้ดเข้ามา ดังนั้นข้อผิดพลาดใด ๆ จะถูกตรวจพบได้ทันที และนักพัฒนาที่รับผิดชอบสามารถแก้ไขข้อบกพร่องได้อย่างรวดเร็ว
คุณสมบัติของซีไอ
- ช่วยให้คุณสามารถดูแลรักษาแหล่งเก็บโค้ดต้นฉบับเพียงแหล่งเดียว
- ช่วยให้คุณทดสอบสภาพแวดล้อมจำลองที่ใกล้เคียงกับสภาพแวดล้อมการใช้งานจริง
- ช่วยให้สามารถเข้าถึงเวอร์ชันล่าสุดได้อย่างต่อเนื่อง
- ทำให้กระบวนการสร้าง ทดสอบ และปรับใช้ทั้งหมดปรากฏให้เห็นแก่ผู้เกี่ยวข้องทุกฝ่าย
เหตุใดจึงควรใช้ CI?
- ช่วยให้คุณสร้างซอฟต์แวร์ที่มีคุณภาพดีขึ้นและทำการทดสอบซ้ำได้อย่างแม่นยำ
- ช่วยเพิ่มประสิทธิภาพการส่งมอบงานของทีมวิศวกรรม และช่วยให้นักพัฒนาสามารถทำงานบนฟีเจอร์ต่างๆ ได้พร้อมกัน
- ช่วยเพิ่มความโปร่งใสและการสื่อสารภายในทีม
- ช่วยให้ได้รับผลตอบรับทันทีเมื่อเกิดปัญหา และลดความเสี่ยงโดยทำให้การปรับใช้รวดเร็วและคาดการณ์ได้มากขึ้น
- ช่วยหลีกเลี่ยงความสับสนในนาทีสุดท้ายก่อนวันประกาศผล
แนวปฏิบัติที่ดีที่สุดในการใช้ระบบ CI
- ควรทำการคอมมิตโค้ดตั้งแต่เนิ่นๆ และบ่อยๆ และอย่าคอมมิตโค้ดที่ใช้งานไม่ได้เด็ดขาด
- แก้ไขข้อผิดพลาดในการสร้างทันทีและดำเนินการตามตัวชี้วัด
- สร้างในทุกสภาพแวดล้อมเป้าหมายและสร้างไฟล์ที่ได้จากการสร้างทุกครั้ง
- ทำให้กระบวนการสร้างโปรแกรมเป็นแบบอัตโนมัติ เพื่อไม่ให้ขึ้นอยู่กับ IDE
- สร้างและทดสอบทุกอย่างเมื่อมีการเปลี่ยนแปลง รวมถึงโครงสร้างฐานข้อมูลด้วย
- รักษาความเร็วในการสร้างและใช้การปรับใช้แบบอัตโนมัติ
ข้อเสียของซีไอ
- จำเป็นต้องใช้เวลาในการติดตั้งและฝึกอบรมเบื้องต้นเพื่อให้คุ้นเคยกับการใช้งานเซิร์ฟเวอร์ CI
- ต้องมีการพัฒนากระบวนการทดสอบที่เหมาะสม และชุดทดสอบที่มีคุณภาพนั้นต้องการทรัพยากรจำนวนมาก
- กระบวนการที่คุ้นเคยจะต้องได้รับการปรับเปลี่ยน และจำเป็นต้องมีเซิร์ฟเวอร์และสภาพแวดล้อมเพิ่มเติม
- อาจเกิดช่วงเวลารอคอยเมื่อนักพัฒนาหลายคนต้องการรวมโค้ดของตนในเวลาเดียวกัน
เครื่องมือสำหรับกระบวนการปรับปรุงอย่างต่อเนื่อง (CI)
Jenkins
Jenkins เป็นเครื่องมือการรวมระบบอย่างต่อเนื่องแบบโอเพนซอร์สที่เขียนด้วยภาษาโปรแกรม Javaมันช่วยให้สามารถทดสอบและรายงานการเปลี่ยนแปลงที่เกิดขึ้นในแต่ละส่วนของโค้ดเบสขนาดใหญ่ได้แบบเรียลไทม์ และช่วยให้นักพัฒนาค้นหาและแก้ไขข้อบกพร่องได้อย่างรวดเร็ว พร้อมทั้งทำการทดสอบการสร้างโปรแกรมโดยอัตโนมัติ
Bamboo
Bamboo เป็นเซิร์ฟเวอร์สร้างซอฟต์แวร์แบบบูรณาการอย่างต่อเนื่อง (Continuous Integration) ที่ทำการสร้าง ทดสอบ และเผยแพร่ซอฟต์แวร์โดยอัตโนมัติในที่เดียว ทำงานร่วมกับ Jira ได้อย่างราบรื่น Bitbucket และรองรับเทคโนโลยีมากมาย เช่น Docker, Git, SVN, Mercurial และ AWS
TeamCity
TeamCity เป็นเซิร์ฟเวอร์การรวมระบบอย่างต่อเนื่อง (Continuous Integration Server) ที่มีคุณสมบัติทรงพลังมากมาย ช่วยให้เซิร์ฟเวอร์ CI ทำงานได้อย่างมีประสิทธิภาพและเสถียรแม้ในขณะที่ไม่มีการสร้างบิลด์ใดๆ และช่วยให้ได้คุณภาพโค้ดที่ดีขึ้นสำหรับทุกโครงการ

