Tag Archives: CircleCI

เข้าใกล้ Continuous Deployment ไปอีกหนึ่งก้าว

ช่วงนี้มีความสุขมากกับโปรเซสการ deploy code ขึ้น production ของบริษัทที่เริ่มเข้ารูปเข้ารอยเสียที หลังจากถกเถียงกันมาหลายเดือน ตอนนี้สามารถ deploy ได้ทุกวันแล้ว สาเหตุที่ชอบ ให้ deploy บ่อยๆ คือ

  1. ได้รับ feedback ของ feature ที่พัฒนาไปอย่างรวดเร็ว ไม่นานจนต้อง switch ไปทำอย่างอื่นจนลืม และทำให้ไม่ต้องทำงานพร้อมๆ กันหลายๆ เรื่อง
  2. ถ้ามีปัญหาอะไรหลังจาก deploy ก็สามารถหาสาเหตุได้ง่าย เพราะจำนวน change ในแต่ละรอบน้อย
  3. เวลาจะ hotfix อะไร ไม่ต้องกังวลเรื่องความต่างของ version มาก
  4. ตอบฝ่าย business และ support ได้ง่ายขึ้นว่า fix หรือ feature อะไรจะ live เมื่อไหร่

โปรเซสก็ไม่มีอะไรมาก ได้แรงบันดาลใจส่วนใหญ่มาจาก Github flow ตามนี้

  1. Dev เริ่ม implement feature ใช้เวลาเฉลี่ยต่อ story ประมาณครึ่งวัน
  2. พอทำเสร็จก็ merge master ล่าสุดเข้าที่ branch นี้
  3. จากนั้นก็ deploy ไปที่ sandbox server ให้ PM มาดูว่าตรงตามความต้องการหรือยัง ถ้ายังก็กลับไปแก้ใหม่เรื่อยๆ จนผ่าน
  4. เปิด pull-request branch ให้คนมา review ตรงนี้จะแก้เฉพาะ code style ไม่แก้ตัว behavior ของ feature แล้ว
  5. ในขณะเดียวกัน CI ก็จะดึง branch นั้นไป run test ทั้งหมด ถ้า fail ก็ fix กันไป ตรงนี้ใช้ service ของ CircleCI
  6. พอ test ผ่าน และมีคน review 2-3 คนแล้วก็จะ merge เข้า master
  7. ถ้าทุกคนทำตามขั้นตอนที่ผ่านมาทั้งหมด ก็จะทำให้ master อยู่ในสถานะพร้อม deploy เสมอ
  8. ก่อนเวลาหนึ่งชั่วโมง deploy ขึ้น staging server ให้ QA ทำ smoke test
  9. ถึงเวลาก็ deploy ขึ้น production
  10. ตรวจสอบ error log กับ performance stats

ฟีเจอร์ไหนที่ทาง business ต้องการให้มีการประกาศก่อนที่จะ release ก็จะใช้วิธีการซ่อนเอาไว้ด้วย feature toggle ซึ่งตรงนี้ใช้ rollout ช่วย ก็คือทุกอย่างจะถูก deploy ขึ้นไปบน production server หมด เมื่อถึงเวลาที่ต้องการจึงค่อย activate เจ้าตัว rollout นี้ยังช่วยในเรื่องการ activate ให้เฉพาะ staff หรือ beta user ได้ทดลองใช้ feature ก่อนจะเปิดให้ทุก user ใช้ได้อีกด้วย

การ deploy บ่อยๆ จะเป็นไปไม่ได้เลยถ้ามี down time ระหว่าง deploy นาน ระบบที่บริษัทตอนนี้ใช้ preboot ที่ทาง Heroku มีให้ ก็เลยสะดวกหน่อย แต่ก็ยังมีปัญหาอยู่หากต้องมีการ migrate database schema

อีกสิ่งหนึ่งที่ยังทำให้หงุดหงิดใจอยู่คือ test suite นี่มัน run ทั้งหมดนานไปหน่อย บน CircleCI ใช้เวลาประมาณ 30 – 40 นาที ถ้ารัน parallel บน SSD ที่บริษัทใช้ประมาณ 15 นาที ถ้า test เร็วขึ้นกว่านี้ได้จะดีมากๆๆๆ

Advertisements