Continuous Integration (CI): รวมโค้ดอย่างต่อเนื่อง
จากบทที่แล้ว เราได้เน้นย้ำถึงความสำคัญของวัฒนธรรม DevOps โดยเฉพาะการทำงานร่วมกันและการสื่อสารที่มีประสิทธิภาพ ซึ่งเป็นรากฐานสำคัญในการนำ DevOps ไปใช้จริง ในบทนี้ เราจะมาเจาะลึกถึงหนึ่งในแนวปฏิบัติหลักของ DevOps ที่ช่วยสนับสนุนวัฒนธรรมดังกล่าว นั่นคือ Continuous Integration (CI) หรือการรวมโค้ดอย่างต่อเนื่อง
ความหมายและประโยชน์ของ CI
Continuous Integration (CI) คือแนวปฏิบัติในการพัฒนาซอฟต์แวร์ที่นักพัฒนาทำการรวมโค้ดที่เขียนขึ้น (merge) เข้ากับ repository กลาง (เช่น Git) บ่อยครั้ง อย่างน้อยวันละครั้ง หรือหลายครั้งต่อวัน เมื่อมีการรวมโค้ดแล้ว ระบบจะทำการสร้าง (build) และทดสอบโค้ดโดยอัตโนมัติ เพื่อตรวจสอบว่าการเปลี่ยนแปลงที่เกิดขึ้นไม่ทำให้เกิดปัญหาหรือข้อผิดพลาด
ทำไม CI ถึงสำคัญ? ลองนึกภาพสถานการณ์ที่นักพัฒนาหลายคนทำงานบน feature ต่างๆ แยกกันเป็นเวลานาน โดยไม่ได้รวมโค้ดเข้าด้วยกัน เมื่อถึงเวลาที่จะรวมโค้ดทั้งหมดเข้าด้วยกัน อาจเจอปัญหาความขัดแย้ง (conflict) ของโค้ดจำนวนมาก, bug ที่คาดไม่ถึง, และเสียเวลาในการแก้ไขเป็นอย่างมาก CI เข้ามาช่วยแก้ปัญหานี้ได้ด้วยการ:
- ลดความเสี่ยงในการรวมโค้ด: การรวมโค้ดบ่อยๆ ทำให้ตรวจพบปัญหาได้เร็วขึ้นและแก้ไขได้ง่ายกว่า
- ปรับปรุงคุณภาพซอฟต์แวร์: การทดสอบอัตโนมัติช่วยให้มั่นใจได้ว่าโค้ดที่รวมเข้ามามีคุณภาพและทำงานได้ตามที่คาดหวัง
- เพิ่มความเร็วในการพัฒนา: การแก้ไขปัญหาได้เร็วขึ้นและการทำงานร่วมกันที่ราบรื่นขึ้นช่วยให้ทีมพัฒนาสามารถส่งมอบซอฟต์แวร์ได้เร็วขึ้น
- ลดภาระงานของนักพัฒนา: ระบบ CI ช่วยจัดการงานสร้างและทดสอบโค้ดโดยอัตโนมัติ ทำให้นักพัฒนามีเวลาโฟกัสกับการเขียนโค้ดมากขึ้น
เครื่องมือ CI ที่นิยมใช้
มีเครื่องมือ CI มากมายให้เลือกใช้ แต่ที่ได้รับความนิยมและใช้งานกันอย่างแพร่หลาย ได้แก่:
- Jenkins: เป็นเครื่องมือ CI แบบโอเพนซอร์สที่ได้รับความนิยมมากที่สุด มี plugin ให้เลือกใช้มากมาย ทำให้สามารถปรับแต่งให้เข้ากับความต้องการของแต่ละโครงการได้
- GitLab CI: เป็นส่วนหนึ่งของ GitLab platform ซึ่งเป็นเครื่องมือบริหารจัดการ source code ที่ครบวงจร GitLab CI ช่วยให้การตั้งค่า CI pipeline เป็นเรื่องง่ายและสามารถทำงานร่วมกับ GitLab features อื่นๆ ได้อย่างราบรื่น
- GitHub Actions: เป็นเครื่องมือ CI/CD ที่ทำงานบน GitHub platform โดยตรง ช่วยให้การสร้าง workflow อัตโนมัติเป็นเรื่องง่ายและสะดวก
- CircleCI: เป็นเครื่องมือ CI/CD บนคลาวด์ที่ใช้งานง่ายและมีความยืดหยุ่นสูง เหมาะสำหรับโครงการขนาดเล็กและขนาดใหญ่
- Travis CI: เป็นเครื่องมือ CI ที่เน้นการใช้งานกับโครงการโอเพนซอร์ส มีความเรียบง่ายและใช้งานง่าย
ในบทความนี้ เราจะเน้นการใช้งาน Jenkins เป็นหลัก เนื่องจากเป็นเครื่องมือที่ได้รับความนิยมและมีความยืดหยุ่นสูง
การตั้งค่า CI Pipeline ด้วย Jenkins
ขั้นตอนที่ 1: ติดตั้งและตั้งค่า Jenkins
ก่อนอื่น คุณต้องติดตั้ง Jenkins บน server ของคุณ สามารถดาวน์โหลดและติดตั้ง Jenkins ได้จาก เว็บไซต์ Jenkins หลังจากติดตั้งเสร็จเรียบร้อยแล้ว ให้เริ่มต้น Jenkins และทำตามขั้นตอนการตั้งค่าเริ่มต้น เช่น การสร้าง user และการติดตั้ง plugin ที่จำเป็น
ขั้นตอนที่ 2: สร้าง Jenkins Job
หลังจากติดตั้ง Jenkins แล้ว ให้สร้าง Jenkins Job ใหม่ ซึ่งเป็นหน่วยการทำงานพื้นฐานใน Jenkins Job แต่ละ job จะกำหนดขั้นตอนต่างๆ ที่ Jenkins จะต้องทำ เช่น การดึงโค้ดจาก repository, การสร้าง (build) โค้ด, การทดสอบโค้ด, และการส่งมอบ (deploy) โค้ด
- เข้าสู่ระบบ Jenkins
- คลิกที่ "New Item"
- ใส่ชื่อ Job (เช่น "MyProject-CI")
- เลือก "Freestyle project" หรือ "Pipeline" (เราจะใช้ "Freestyle project" ในตัวอย่างนี้)
- คลิก "OK"
ขั้นตอนที่ 3: กำหนด Source Code Management
ในส่วน "Source Code Management" ให้เลือก Git และใส่รายละเอียดของ repository ของคุณ เช่น URL ของ repository, branch ที่ต้องการติดตาม, และ credentials (ถ้าจำเป็น)
Repository URL: https://github.com/your-username/your-project.git
Branches to build: */main
ขั้นตอนที่ 4: กำหนด Build Triggers
ในส่วน "Build Triggers" ให้กำหนดเงื่อนไขที่จะทำให้ Jenkins เริ่มทำการ build โดยอัตโนมัติ ที่นิยมใช้กันคือ "Poll SCM" ซึ่งจะให้ Jenkins ตรวจสอบ repository เป็นระยะๆ ว่ามีการเปลี่ยนแปลงหรือไม่ ถ้ามีการเปลี่ยนแปลง Jenkins จะเริ่มทำการ build
Schedule: H/5 * * * * (ตรวจสอบทุก 5 นาที)
ขั้นตอนที่ 5: กำหนด Build Steps
ในส่วน "Build Steps" ให้กำหนดขั้นตอนต่างๆ ที่ Jenkins จะต้องทำในการ build โค้ด ตัวอย่างเช่น ถ้าคุณใช้ Maven ในการ build Java project คุณสามารถเพิ่ม "Invoke top-level Maven targets" step และระบุ goals ที่ต้องการ เช่น "clean install"
Goals: clean install
ถ้าคุณใช้ Node.js คุณสามารถใช้ "Execute shell" step และรันคำสั่งต่างๆ เช่น:
npm install
npm test
ขั้นตอนที่ 6: กำหนด Post-build Actions
ในส่วน "Post-build Actions" ให้กำหนดสิ่งที่ Jenkins จะทำหลังจาก build เสร็จสิ้น เช่น การส่ง email แจ้งผลการ build, การ archive artifacts, หรือการ deploy โค้ด
ขั้นตอนที่ 7: บันทึกและรัน Job
หลังจากกำหนดค่าต่างๆ เสร็จเรียบร้อยแล้ว ให้บันทึก Job และคลิกที่ "Build Now" เพื่อเริ่มทำการ build ครั้งแรก Jenkins จะดึงโค้ดจาก repository ของคุณ, ทำตามขั้นตอน build ที่คุณกำหนด, และแจ้งผลการ build ให้คุณทราบ
กรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย
กรณีใช้งานจริง: สมมติว่าคุณกำลังพัฒนา web application โดยใช้ Node.js และ Git คุณสามารถตั้งค่า Jenkins CI pipeline ให้ทำงานดังนี้:
- นักพัฒนา push code ไปยัง Git repository
- Jenkins ตรวจพบการเปลี่ยนแปลงและเริ่มทำการ build
- Jenkins รันคำสั่ง
npm installเพื่อติดตั้ง dependencies - Jenkins รันคำสั่ง
npm testเพื่อรัน unit tests - ถ้า tests ผ่าน Jenkins จะสร้าง Docker image ของ application
- Jenkins push Docker image ไปยัง Docker registry
- Jenkins deploy Docker image ไปยัง staging environment
ข้อผิดพลาดที่พบบ่อย:
- Code conflicts: นักพัฒนาควรรวมโค้ดบ่อยๆ เพื่อหลีกเลี่ยง code conflicts ที่ซับซ้อน
- Broken builds: ตรวจสอบ logs ของ Jenkins อย่างละเอียดเพื่อหาสาเหตุของ broken builds
- Failing tests: แก้ไข tests ที่ failing ก่อนที่จะรวมโค้ด
- Incorrect configuration: ตรวจสอบ Jenkins Job configuration อย่างละเอียดเพื่อหลีกเลี่ยงข้อผิดพลาดในการ build
- Insufficient resources: ตรวจสอบให้แน่ใจว่า Jenkins server มี resources เพียงพอสำหรับการ build
สรุป
Continuous Integration (CI) เป็นแนวปฏิบัติที่สำคัญในการพัฒนาซอฟต์แวร์ที่ช่วยลดความเสี่ยง, ปรับปรุงคุณภาพ, และเพิ่มความเร็วในการพัฒนา การใช้เครื่องมือ CI เช่น Jenkins ช่วยให้การตั้งค่า CI pipeline เป็นเรื่องง่ายและสามารถปรับแต่งให้เข้ากับความต้องการของแต่ละโครงการได้ การนำ CI ไปใช้จริงอาจต้องเผชิญกับความท้าทายต่างๆ แต่การแก้ไขปัญหาอย่างสม่ำเสมอและการปรับปรุงกระบวนการอย่างต่อเนื่องจะช่วยให้ทีมพัฒนาสามารถใช้ประโยชน์จาก CI ได้อย่างเต็มที่
ในบทถัดไป เราจะมาพูดถึง Continuous Delivery (CD) ซึ่งเป็นส่วนต่อขยายของ CI ที่ช่วยให้การส่งมอบซอฟต์แวร์เป็นไปอย่างรวดเร็วและอัตโนมัติ