จัดการกับ Legacy Project ด้วย Docker, Jenkins, Git และความขี้เกียจ

วันนี้ ผมจำเป็นต้องทำการขึ้นระบบและ Support Software ที่ตัวเองทำขึ้นมาเมื่อ 2-3 ปีที่แล้ว แต่ด้วยความที่มัน Legacy ไปแล้ว จะเขียนใหม่ก็คงไม่คุ้มทุน เลยพยายามหาวิธีจัดการมันให้อยู่หมัด และง่ายที่สุด

ตอนแรกลังเลว่าจะใช้ VM ในการจัดการ Environment ที่ใช้ในการทำงานของระบบดีไหม แต่ด้วยความที่คิดอยู่แล้วว่า ถ้าใช้ VM นี่ มันดูใหญ่ไปนะ เลยไปลอง Search Image ของ Docker ดู

ด้วยความที่ Software ตัวที่ผมเขียนขึ้นมา มัน Base อยู่บน Ubuntu 14.04 มาตั้งแต่แรก แล้วด้วยที่สวรรค์เข้าข้างผม Docker ยังมี Base Image ของ Ubuntu 14.04 ให้เลือกใช้งานอยู่ ไม่รอช้า ผมก็เริ่มเขียนไฟล์ Dockerfile ขึ้นมาทันที

Software ของผมมี 3 ส่วนใหญ่ๆครับ คือ

  1. Web Application : ที่พัฒนาด้วยภาษา PHP (อันนี้น่าจะไม่มีปัญหาอยู่แล้ว เพราะ Docker มี Image ของ PHP ให้เลือกใช้งานได้หลากหลายอยู่)

  2. FreeRADIUS : ใช้ในส่วนของการจัดการการเข้าสู่ระบบ (ใครที่รู้จักเจ้านี่ คงจะพอทราบแล้วหล่ะครับ ว่า Software ที่ผมทำ เป็น Software อะไร) (ประเด็นอยู่ที่เจ้านี่เลย)

  3. Database (MySQL) : อันนี้ผมเลือกใช้เป็น MariaDB อยู่โดยปกติอยู่แล้ว จึงไม่มีปัญหาอะไร

อย่างที่พูดไปตอนแรกครับ ประเด็นอยู่ที่ FreeRADIUS เนี่องจากว่า Config ของ FreeRADIUS 2 กับ FreeRADIUS 3 นั้น ค่อนข้างแตกต่างกันพอสมควร ยากที่จะ Migrate แน่ๆ (Project ผมใช้ FreeRADIUS 2) เลยตกลงจะยังใช้ FreeRADIUS 2 อยู่

และด้วยความที่ขี้เกียจและเริ่มโดนเร่งมาแหละ ผมเลยพยายามหาอะไรที่ลดความยุ่งยากให้น้อยที่สุด ขึ้นงานได้เร็วที่สุด แล้วก็ได้ข้อสรุปครับ

  1. เลือกใช้ Docker นี่แหละ ในการจัดการ Environment เขียน Code ไม่กี่บรรทัดก็ได้ Environment ที่ต้องการแหละ ง่ายดี
  2. ใช้ Git นี่แหละ เอาไว้สำหรับเก็บ Config ต่างๆ (เพราะ Config ส่วนใหญ่เป็น Static และไม่ Sensitive อยู่แล้ว ยกเว้นเรื่อง Database อันนี้ไว้แก้กันทีหลังด้วย Entrypoint script)
  3. ใช้ Jenkins ในการทำ CI/CD พอ Git Push อะไรขึ้นมา ก็เอามาสร้าง Docker Image พร้อมส่ง Image ขึ้น Registry แล้วก็เอา Docker Image ล่าสุด ติดตั้งลงเครื่อง Test ซะเลย ง่ายดี

หลังจากใช้งานจริง

พอใช้จริง บอกเลยว่า มันโครตสะดวกมากๆ ที่ไม่ต้องไปกดคำสั่งอะไรมากมายบนเครื่อง Server แค่เขียน Code ก็ได้ทุกอย่างตามที่ต้องการแหละ ที่จริงผมคิดไว้ว่า ช่วงเวลาในการ Build ตอนอยู่บน Jenkins น่าจะใช้เวลานานอยู่ แต่ผลที่ออกมาผิดคาดครับ ใช้เวลาในขั้นตอนที่อยู่บน Jenkins นั้นน้อยมาก เป็นที่น่าพอใจครับ

ประโยชน์ของสิ่งที่ทำวันนี้

  1. ง่าย สะดวก รวดเร็ว เพราะทุกอย่างเป็น Automate ชีวิตนี่ดีขึ้นมาทันตาเห็นมาก เขียน Code อย่างเดียว ก็ได้ Environment ที่ต้องการได้ (ขอบคุณ Jenkins และ Docker ไว้ ณ โอกาสนี้ครับ)
  2. มี Backup และ Version Control ของ Config ต่างๆ (เพราะมันใช้ Git หนิ เรื่องแบบนี้ งานถนัดของ Git เค้าอยู่แล้ว)
  3. เวลาดูละคร (เนื่องจากเป็น Automate ผมจึงได้สนุกกับละครย้อนหลังได้เต็มอิ่มขึ้น อิอิ)

นี่คือประโยชน์จากความขี้เกียจของผมเองหล่ะ ได้มาจากความขี้เกียจล้วนๆ