![]()
![]()
ปัญหาอย่างหนึ่งที่มักพบเจอกับทีมพัฒนาคือ
เครื่องผมเครื่องหนูมันทำงานได้นะ
แต่บนเครื่องจริง ๆ กลับทำงานไม่ถูกต้องหรือทำงานต่างกันไป
ไม่ว่าจะเหตุผลใดก็ตาม
มันก็คือไม่ถูก
ดังนั้นเราจะทำอย่างไรดีละ ?
หนึ่งแนวทางคือ ถ้าทำให้เครื่องนักพัฒนา
มีขั้นตอนการทำงาน มี environment ต่าง ๆ เหมือนหรือคล้ายกับเครื่องจริง ๆ
มันน่าจะดีไม่น้อยนะ
แต่การติดตั้งมันก็ไม่ง่ายนะ
ติดปัญหามากมายทั้ง software ทั้ง CPU/RAM/Network รวมไปถึง configuration
ชีวิตดูลำบากน่าดู
จะติดตั้งระบบ Contunous Integration ก็แลดูจะนานไปหน่อย
ดังนั้นมาติดตั้งระบบ Continuous Integration บนเครื่องกันไปเลย
แน่นอนว่านำ Docker มาใช้งานด้วย
มาดูกันว่าใช้อย่างไร ?
ปัญหาที่ทำให้พบเจอเรื่อง Work on my machine
ประกอบไปด้วย
- ในแต่ละ environment แตกต่างกัน
- มีชุดการทดสอบนะ แต่ว่าเราคนจริงต้อง skip หรือบางคนลบทิ้งไป !!
- มีหลาย ๆ ไฟล์ และ folder ที่มีเฉพาะในเครื่องของนักพัฒนา ขึ้นไปที่อื่นจะรอดได้ไง
- ความผิดพลาดที่เกิดจาก code
ดังนั้นสิ่งที่ทีมพัฒนามักจะสร้างเพื่อแก้ไขหรือลดปัญหาเหล่านี้คือ
การสร้างระบบ Continuous Integration ขึ้นมา
เพื่อช่วยทำให้ทีมพัฒนารู้ตัวได้อย่างรวดเร็ว
ว่ามีข้อผิดพลาดอะไรตรงไหน
จะได้แก้ไขได้อย่างรวดเร็ว
ที่สำคัญระบบนี้ตองทำงานได้อย่างรวดเร็ว
แต่เมื่อระบบเริ่มใหญ่ขึ้น
code เยอะขึ้น
ทีมใหญ่ขึ้น
เวลาในการทำงานของระบบ Continuous Integration ก็จะเริ่มช้าลง
นั่นคือ เรารู้ปัญหาได้ช้าลง
ซึ่งจำเป็นต้องแก้ไขเพื่อให้ทีมและนักพัฒนารู้ได้อย่างรวดเร็ว
แน่นอนว่ามีวิธีการมากมาย
เช่นการเปลี่ยนขั้นตอนการทำงาน
เช่นการเพิ่ม RAM/CPU ให้เยอะและเร็วขึ้น
แต่มีอีกวิธีการหนึ่งที่น่าสนใจคือ
ทำ Local Continuous Integration Server บนเครื่องนักพัฒนาแต่ละคนไปเลย
เพื่อทำให้นักพัฒนามั่นใจว่า
สิ่งที่สร้าง แก้ไข หรือเปลี่ยนแปลงมันผ่านจริง ๆ นะ
ก่อนนะทำการ push/checkin code มายังส่วนกลาง
โดยการติดตั้งเราจะนำ Docker มาใช้ มันง่ายมากนะ
โดยขั้นตอนของนักพัฒนาจะเปลี่ยนไป คือ
- เมื่อทำการแก้ไข code บนเครื่องตาม requirement หนึ่ง ๆ แล้ว
- เมื่อมั่นใจ ตรวจสอบสิ่งต่าง ๆ แล้ว ทำการ run Continuous Integration Server ที่เครื่อง
- เพื่อทำการตรวจสอบสิ่งต่าง ๆ ทั้งการ compile, test
- การทำงานต่าง ๆ อยู่ในโลกของ container
- เมื่อทุกอย่างผ่านแล้ว ก็ทำการ commit/push/checkin code ไปยังส่วนกลางต่อไป
ซึ่งวิธีการนี้จะช่วยเพิ่มความมั่นใจให้กับนักพัฒนาขึ้นอย่างมาก
ลดการ build ที่แดงหรือ fail ในระบบ Continuous Integration ที่อยู่ตรงกลางอีกด้วย
แน่นอนว่า ส่งผลดีต่อทีมอย่างแน่นอน
ขี้โม้มากแล้ว มาลงมือทำกันบ้าง
ถ้าพูดเรื่องของระบบ Continuous Integration กันแล้ว
มักจะพูดถึงแต่
Jenkins
เนื่องจากเป้นเครื่องมือที่ได้รับความนิยม มี community ขนาดใหญ่ เอกสารเพียบ
แต่จะติดตั้งและ configuration มันไม่ง่ายเลย
ดังนั้นขอแนะนำของง่าย ๆ เล็กลงมาหน่อยคือ
Buildpal
โดยที่ Buildpal คือ Continuous Integration Server
ที่สร้างมาในโลกของ container เลย
ดังนั้นมันจึงต้องเล็กและเร็วเป็นธรรมชาติ
สนับสนุนเรื่องของ
Pipeline as a Code
โดยที่ pipeline นั้นทำการเขียนด้วยภาษา JavaScript !!
สามารถกำหนดให้ทำการแบบ sequence หรือ parallel ได้อีกด้วย
แต่โชคไม่ค่อยดีว่า มันพัฒนาด้วยภาษา
Java 8 นะ
รออะไรติดตั้งกันดีกว่า
ติดตั้งง่าย ๆ ผ่าน Docker ไปเลย
โดยตัวอย่างทำการสร้าง Volume container ก่อน
จากนั้นจึงทำการสร้าง container ของ Local Continuous Integration Server กัน
ดังนี้
[gist id="4266b5ee456e09e06109f42636a7f8c6" file="install.txt"]
ทดสอบด้วยการเปิด url
http://localhost:8080/ ใน browser
username=admin
password=admin123
ต่อมาเริ่มสร้าง pipeline หรือขั้นตอนการทำงานกัน
สิ่งที่ต้องการเป็นดังนี้
1. Source code ของ project อยู่ที่
Git repository
2. สร้าง Pipeline สำหรับการ compile + test ด้วย Apache Maven
สามารถสร้างใน Buildpal ได้ดังนี้
1. กำหนด Repository ก่อน
สนับสนุน Git, File system และ Perforce
ให้ทำการกำหนดค่าต่าง ๆ แสดงดังรูป
2. ทำการสร้าง Pipeline
สิ่งที่กำหนดคือ เลือก Repository ที่ต้องการ
เลือกใช้ image ที่ต้องการสำหรับสร้าง container
จากนั้นก็เข้าไป execute คำสั่งต่าง ๆใน container กันแบบสบาย ๆ
มาดูตัวอย่างของการใช้งาน Apache Maven เพื่อ compile + test ระบบแบบง่าย ๆ
แสดงดังรูป
3. ผลการทำงานเป็นดังรูป
โดยรวม ๆ แล้วก็ใช้งานง่ายดีนะ
ทุกอย่างอยู่ในโลกของ container ด้วย Docker กันไปเลย
ลองใช้กันดูนะครับ
ไม่พอใจก็ลบ container ทิ้งไปซะ ง่ายสุด ๆ
ดังนั้นเครื่องใครก็สามารถทำได้นะครับ
ที่สำคัญถ้าทำ Image และไฟล์ต่าง ๆ ให้เหมือนกัน
ก็จะไม่เกิดปัญหาเครื่องผมทำงานได้นะ !!
ขอให้สนุกกับการ coding ครับ