in Technology

เริ่มต้นทำ CI/CD – Automation Deployment ด้วย Git และ Jenkins (3 – จบ)

ความเดิมสองตอนก่อนคือ วิธีติดตั้ง Jenkin และ วิธีใช้ PHPUnit เพื่อทำ Automation Test ซึ่งเราก็ได้เห็นภาพของ CI (Continuous Integration) กันมาแล้ว มาบล็อกครั้งนี้เป็นตอนสุดท้ายของซีรี่ “เริ่มต้นทำ CI/CD” ก็คือ หลังจากเขียนโค้ดและทดสอบผ่านทั้งหมด เราจะให้ Jenkins นำโค้ดที่ทำเข้าสู่ Production Server ให้อัตโนมัติ (Automation Deployment)

จัดการสิทธิเพื่อใช้ Deployment

ขั้นตอนนี้จะให้นำ SSH Key ของ Jenkins ไปทำความรู้จักกับ Bitbucket
ก่อนอื่น ทำการตรวจสอบก่อนเลยว่า user jenkins ใน server เรา เชื่อมต่อ bitbucke.org ได้ไหม ด้วยคำสั่ง

$ sudo -u jenkins ssh -vT [email protected]

ให้ดูบรรทัดท้ายๆ ถ้ามันมี username ที่เราใช้บน Bitbucket แปลว่ามันรู้จักกันแล้ว

แต่ถ้าขึ้นว่า Permission Denied  ให้ทำการ copy public key ไปไว้บน bitbucket ครับ โดยวิธีการดู Jenkins public key คือ

$ sudo vi /var/lib/jenkins/.ssh/id_rsa.pub

เป็นอันเสร็จเรียบร้อย

สร้างโฟลเดอร์เว็บไซต์ และไฟล์คำสั่ง Deployment

ไฟล์เว็บไซต์ผมจะเก็บไว้ที่ /var/www/test_ci_cd และเมื่อมีโฟลเดอร์แล้ว ให้ clone project ลงมาทั้งหมด

$ sudo mkdir /var/www/test_ci_cd

$ sudo git clone [email protected]:few/test-project.git .

ทำการสร้างไฟล์เพื่อใช้ Deployment ซึ่งในที่นี้ผมใช้ชื่อ deploy.php

$ sudo vi /var/www/test_ci_cd/deploy.php

ในไฟล์มีโค้ดประมาณนี้

ซึ่งเป็นโค้ดที่ Jenkins จะเอาไว้ใช้งาน โดยมีขั้นตอนคือ

  1. เข้าโฟลเดอร์ที่เก็บเว็บไซต์ (หรือเก็บไฟล์ deploy.php)
  2. ทำการล้างไฟล์เก่าออกทั้งหมด (optional)
  3. ดึงไฟล์ล่าสุดที่มีการเปลียนแปลงและผ่านการทำสอบแล้ว ลงมาบน server

จากนั้นทำการบันทึก ก็เสร็จแล้ว

เพิ่ม Config Deployment บน Jenkins

เข้าไปที่ Project ที่เราใช้ทำงาน จากนั้นเพิ่มในส่วนของ Build จุดเดียวกับที่ตั้งให้ทำ PHPUnit ดังนี้

ซึ่ง folder path และชื่อไฟล์ ให้เปลี่ยนไปตามที่เราตั้งค่าไว้ด้วยนะ

ลองทดสอบ Automation Deployment

ตอนนี้ไฟล์ที่ผมใช้ทดสอบทำงานบวกเลขได้ตามปกติ และไฟล์ test unit ผมก็ยังใช้งานได้ตามปกติ
ผมจะลองเพิ่มข้อความบนไฟล์ calculate.php โดยยังไม่ได้แก้ไขอะไร เพื่อดูว่าระบบไหลไปได้ถูกต้องหรือไม่

echo 'Hi, automate test and deploy (success, all test case)';

จากนั้นให้ Push เข้าสู่ระบบ

ลองเปิดดูบน Jenkins จะต้องพบว่ามัน Success

จากนั้นลองเปิดบนเว็บไซต์ Production ที่เราได้เตรียมไว้ จะต้องแสดงข้อความที่เพิ่มขึ้นมา

แปลว่า ระบบ Jenkins ทำการทำการ Automate Test และเมื่อทดสอบ Unit Test ผ่านทั้งหมด ก็ได้ Automate Deploy ให้เราเรียบร้อยแล้ววว

คราวนี้ มาลองทดสอบกรณีที่ Unit Test ทำงานไม่ผ่านบ้าง
โดยผมได้แก้สูตรคิดเลข จาก บวก เป็น หาร ดังนั้น Unit Test ที่ผมทำการทดสอบไว้ทั้งหมดจะผิดทันที เพราะคำตอบมันเป็นผลลัพธ์ของการบวกเท่านั้น
และผมได้ทำการแก้ไขข้อความด้วยว่า จะเกิดการ fail, all test case

เช่นเดิม แก้ไขเสร็จ ทำการ git push ขึ้นไปบน Bitbucket

จากนั้นเมื่อไปดูบน Jenkins มันจะแสดงข้อความ FAILURES ขึ้นมา เพราะ Unit Test เราไม่ผ่าน

ดังนั้น ไฟล์บน Procution ก็จะไม่มีอะไรเปลี่ยนแปลง เพราะเมื่อ Unit Test ไม่ผ่าน มันจะไม่ไปเรียกไฟล์ deployment ทำต่อ

สรุป

จากที่ได้ลองผิดลองถูกทำมาจนครบ ทำให้เห็นภาพได้ชัดเจนเลยครับว่า Continuous Integration และ Continuous Deployment มันสะดวกและเร็วขึ้นมาก ช่วยส่งเสริมกับเรื่องการส่งมอบงานเป็นรอบและส่งให้ได้ไว เพื่อให้มีการ feedback เร็ว ดังนั้น การเสียเวลาศึกษาและตั้งระบบขึ้นมาอีกสักหน่อย มันจะช่วยงานเราได้ในระยะยาว

แต่อย่างที่ชื่อเรื่องบอกนะครับ นี่เป็นเพียงการเริ่มต้น ดังนั้นขั้นตอนที่เราจะใช้งานจริงๆ อาจจะมีมากกว่านี้ที่ต้องเพิ่มขึ้น ทั้งการเพิ่ม Security, การเพิ่มเรื่องของ Test, การ git push ไปพักไว้ที่ dev branch ก่อน, การ Deploy ไปยัง Stating Server เพื่อทำ Acceptant Test แล้วค่อย merge git เข้าสู่ master branch และ deploy Production … ผมก็คงเขียนไม่หมด เอาเป็นว่า ไปเผชิญโลกกว้างกันดูครับ

(รูปจาก http://www.bogotobogo.com/DevOps/DevOps_CI_CD_Pipeline_Sample.php)

ดังนั้น วิธีการของผมก็ไม่ใช่สิ่งที่ดีที่สุด ถ้าหากผิดพลาดประการใด หรือมีคำแนะนำเพิ่มเติม มาแลกเปลี่ยนกันได้ครับ และกราบขอคำชี้แนะด้วยคร้าบบ..

เว็บอ้างอิง

ซี่รี่ “เริ่มต้นทำ CI/CD”