12 Factor - konlawatit/SWDEV-BBP-PLUS GitHub Wiki

1. CODEBASE

Source Code ที่ดี ควรมีที่เก็บเพียงที่เดียว เพื่อลดความสับสนว่าโค้ดล่าสุดอยู่ที่ไหน และนำ Source Code Management เข้ามาปฏบิติตาม พร้อมทั้งใช้งาน Version Control ต่างๆ และต้องพร้อม Build และ Deploy สู่ Environment ต่างๆเสมอ ไม่ว่าจะ Development Server หรือ Production Server

2. DEPENDENCY

ควรระบุ Dependencies ให้ชัดเจนว่าเราจะใช้ Package อะไร version ไหนเพื่อป้องกันความผิดพลาดไปในตัว

3. CONFIG

จัดการ Environment Variable ทุกตัวของทุกระบบที่มีเพื่อไม่ให้สับสน เข้าใจได้ง่าย และปลอดภัย เช่น การจัดการข้อมูลที่ระบุถึง Resource ต่างๆ

4. Backing Services

Service ต่างๆหรืออะไรก็ตามที่เราไปเรียกใช้ใน Application Software จะต้องสามารถนำมาเสียบแทนที่ได้ โดยที่ระบบของเรายังคงต้องรันได้ และ ต้องไม่มีการแก้ไข Code ใด ๆ

5. BUILD / RELEASE / RUN

การ Deploy ออกเป็น 3 ขั้นตอน

1.Build - แปลง Source Code ไปเป็นซอฟต์แวร์ที่พร้อมจะทำงาน (executable)

2.Release - นำซอฟต์แวร์ที่ได้จากขั้นตอน Build มารวมกับ Config เพื่อเตรียมนำไปใช้งาน

3.Run - นำซอฟต์แวร์ที่ได้ไปรันใน Environment ต่าง ๆ

การ Build/Release จะต้องถอยกลับได้(Rollback) ถ้าพังในขั้นตอนใดขั้นตอนหนึ่ง การจะเดินหน้าหรือถอยหลังจะต้องถูกกำหนดด้วย Release ID ที่ไม่ซ้ำกัน และทำ Software versioning ที่เก็บซอฟต์แวร์เวอร์ชั่นต่างๆ ไว้ หรือเรียกว่า Artifacts Repository หรือ Binary Repository

6. PROCESSES

ทำงานแบบ Stateless Process ไม่ควรเก็บข้อมูลต่าง ๆ เช่น เก็บ Session เอาไว้ที่ Server ที่ User เข้ามาเนื่องจากการเข้ามาของ User ในครั้งต่อ ๆ ไปอาจจะไม่ได้เข้ามาที่เครื่องเดิมก็ได้ ดังนั้นเมื่อมีความจำเป็นจะต้องการเก็บข้อมูลใด ๆ ก็ควรที่จะเก็บเอาไว้ใน Backing service แทน

7. PORT BINDING

ระบุว่า Service แต่ละตัวใช้ Port อะไร จากนั้นเวลาเรียกใช้ ก็ไม่ต้องไปสนใจว่าอยู่ที่ IP Address ไหน รู้แค่ว่า ถ้าอยู่วง Network เดียวกัน แต่ต่อด้วย Port นี้ จะต้องได้ Service นี้เสมอ

8. CONCURRENCY

สามารถปรับ Scale ได้

9. DISPOSABILITY

ควรที่จะ Fast startup และเมื่อมีความต้องการที่จะ Stop service ก็ควรที่จะทำ Graceful shutdown

10. DEV/PROD PARITY

อธิบายถึงการทำ Environment ให้มีความแตกต่างกันน้อยที่สุด เช่น Development/SIT/UAT กับ Production ใช้ซอร์ฟแวร์และเวอร์ชั่นเดียวกันมี Config ใกล้เคียงกันทุกอย่าง เป็นต้น รวมถึงการทำ Deployment จาก Environment หนึ่งไปยังอีก Environment หนึ่งจะต้องทำได้ไว แบ่งได้เป็น 3 เรื่อง ดังนี้

  • The time gap : แต่เดิมที่นักพัฒนาต้องใช้เวลาเป็นวัน สัปดาห์ หรือเดือน เพื่อนำ Application เข้าสู่ Production จะต้องลดช่องว่างเหล่านี้ ให้เหลือเพียงชั่วโมงหรือนาทีให้ได้
  • The personnel gap : แต่เดิมนักพัฒนาต้องเขียนโค้ด ส่งให้ทีม Tester และส่งให้ทีม Infrastructure Deploy ซึ่งการส่งกันไปๆมาๆ ก็จะต้องลดช่องว่างด้วยการทำ ให้จบเกือบทั้งหมดได้ด้วยนักพัฒนาเท่านั้น
  • The tools gap : แต่เดิมนักพัฒนาใช้ Nginx, SQLite, OSX บนเครื่องตัวเอง แต่พอไปขึ้นที่ Production กลายเป็น Apache, MySQL, Linux ก็จะต้องลดช่องว่างเหล่านี้ได้ด้วยการทำให้เครื่องของนักพัฒนาหรือ Development Environment ทั้งหมด มีความเหมือนกับ Production มากที่สุด

11. LOGS

ควรเก็บ Logs ในรูแบบของ stdout (Standard Output) จากนั้นนำซอฟต์แวร์อื่นมาจัดการในเรื่องของการบันทึก Logs อีกที ทำให้เมื่อต้องการที่จะดู Logs ย้อนหลัง เราสามารถที่จะไปย้อนดูได้ที่ระบบ Logs ได้อีกครั้ง ซึ่งเป็นการทำงานที่ไวและครอบคลุมกว่า

12. ADMIN PROCESSES

ควรมีคำสั่งแยกสำหรับการทำงานในระดับ Admin เช่น Database Migration โดยที่จะไม่เกี่ยวข้องกับแอปพลิเคชันของเรา และจะต้องอยู่ในโค้ดชุดเดียวกับที่ใช้ทำงานในแอปพลิเคชัน หรือก็คือต้องเป็น Release เดียวกัน อีกทั้งจะต้องถูกทำลายหลังจากใช้งานเสร็จสิ้น