Trong phát triển phần mềm hiện đại, đặc biệt với Cloud-Native, Microservices và CI/CD, việc quản lý mã nguồn đóng vai trò quan trọng không kém việc viết code.
Nguyên tắc đầu tiên của 12-Factor App Methodology là:
Đây là nền tảng giúp ứng dụng dễ phát triển, tự động hóa và triển khai nhất quán trên mọi môi trường.
Codebase là gì?
Codebase là toàn bộ mã nguồn của một ứng dụng, được quản lý trong một hệ thống quản lý phiên bản (Version Control System – VCS) như:
Mọi thay đổi đều được theo dõi thông qua commit, branch và tag, giúp dễ dàng kiểm soát lịch sử phát triển và phối hợp giữa các thành viên trong nhóm.
Centralized VCS và Distributed VCS
Có hai mô hình quản lý mã nguồn phổ biến.
Centralized Version Control
Ví dụ:
Đặc điểm:
Ưu điểm là dễ quản lý và theo dõi thay đổi, nhưng phụ thuộc nhiều vào máy chủ trung tâm.
Distributed Version Control
Ví dụ:
Đặc điểm:
Đây là mô hình được sử dụng rộng rãi trong GitHub, GitLab và Bitbucket, đồng thời là nền tảng của hầu hết các quy trình DevOps hiện nay.
One Codebase – Many Deploys
Một ứng dụng chỉ nên có một codebase duy nhất, nhưng có thể được triển khai lên nhiều môi trường khác nhau.
Ví dụ:
Điều thay đổi giữa các môi trường không phải là mã nguồn, mà là:
Nhờ vậy, cùng một phiên bản ứng dụng có thể hoạt động phù hợp với từng môi trường mà không cần duy trì nhiều bản mã nguồn khác nhau.
Ví dụ đúng
Một ứng dụng Web có cấu trúc:
Git Repository
│
├── Development
├── Testing
├── Staging
└── Production
Tất cả các môi trường đều sử dụng cùng một codebase.
Khác biệt chỉ nằm ở:
Đây là mô hình lý tưởng cho CI/CD.
Ví dụ sai
Một số dự án lớn trước đây thường tách mã nguồn như:
WebApp-Test
WebApp-Staging
WebApp-Production
Hoặc:
Git Repo A
Git Repo B
Git Repo C
Trong khi cả ba repository thực chất vẫn là cùng một ứng dụng.
Cách làm này gây ra nhiều vấn đề:
12-Factor App khuyến nghị tránh mô hình này.
Còn mã nguồn dùng chung thì sao?
Nhiều ứng dụng cần sử dụng chung một số chức năng, ví dụ:
12-Factor App không cấm chia sẻ mã nguồn.
Tuy nhiên, phần mã dùng chung nên được tách thành một codebase độc lập, đóng gói thành thư viện hoặc package có phiên bản riêng và được các ứng dụng khác khai báo như một dependency.
Cách tiếp cận này giúp mỗi ứng dụng vẫn giữ nguyên nguyên tắc One Application – One Codebase, đồng thời tái sử dụng được các thành phần chung mà không tạo ra sự phụ thuộc chồng chéo.
Liên hệ với GitFlow và CI/CD
Nguyên tắc "One Codebase" không có nghĩa tất cả môi trường phải chạy cùng một commit.
Trong thực tế:
Tất cả vẫn xuất phát từ một repository duy nhất, chỉ khác nhau ở branch, tag hoặc commit được lựa chọn để triển khai. Điều này giúp việc kiểm soát phiên bản, rollback và tự động hóa trong CI/CD trở nên đơn giản và đáng tin cậy hơn.
Kết luận
Nguyên tắc đầu tiên của 12-Factor App có vẻ đơn giản nhưng là nền tảng cho mọi quy trình DevOps hiện đại:
Khi tuân thủ nguyên tắc này, doanh nghiệp sẽ dễ dàng xây dựng CI/CD Pipeline, quản lý phiên bản hiệu quả và triển khai ứng dụng nhất quán trên các nền tảng Cloud, Container và Kubernetes.
Nguyên tắc đầu tiên của 12-Factor App Methodology là:
One Codebase, Many Deploys
Một Codebase – Nhiều môi trường triển khai
Một Codebase – Nhiều môi trường triển khai
Đây là nền tảng giúp ứng dụng dễ phát triển, tự động hóa và triển khai nhất quán trên mọi môi trường.
Codebase là gì?
Codebase là toàn bộ mã nguồn của một ứng dụng, được quản lý trong một hệ thống quản lý phiên bản (Version Control System – VCS) như:
- Git
- Subversion (SVN)
- Mercurial
Mọi thay đổi đều được theo dõi thông qua commit, branch và tag, giúp dễ dàng kiểm soát lịch sử phát triển và phối hợp giữa các thành viên trong nhóm.
Centralized VCS và Distributed VCS
Có hai mô hình quản lý mã nguồn phổ biến.
Centralized Version Control
Ví dụ:
- Subversion (SVN)
Đặc điểm:
- Chỉ có một máy chủ trung tâm lưu toàn bộ mã nguồn.
- Lập trình viên checkout mã từ máy chủ.
- Mọi thay đổi được commit trực tiếp về máy chủ trung tâm.
Ưu điểm là dễ quản lý và theo dõi thay đổi, nhưng phụ thuộc nhiều vào máy chủ trung tâm.
Distributed Version Control
Ví dụ:
- Git
Đặc điểm:
- Mỗi lập trình viên có một bản sao đầy đủ của repository.
- Bao gồm toàn bộ lịch sử commit.
- Có thể làm việc ngoại tuyến và đồng bộ khi cần.
Đây là mô hình được sử dụng rộng rãi trong GitHub, GitLab và Bitbucket, đồng thời là nền tảng của hầu hết các quy trình DevOps hiện nay.
One Codebase – Many Deploys
Một ứng dụng chỉ nên có một codebase duy nhất, nhưng có thể được triển khai lên nhiều môi trường khác nhau.
Ví dụ:
- Development
- Testing
- Staging
- Production
Điều thay đổi giữa các môi trường không phải là mã nguồn, mà là:
- Cấu hình
- Dữ liệu
- Secret
- Environment Variables
Nhờ vậy, cùng một phiên bản ứng dụng có thể hoạt động phù hợp với từng môi trường mà không cần duy trì nhiều bản mã nguồn khác nhau.
Ví dụ đúng
Một ứng dụng Web có cấu trúc:
Git Repository
│
├── Development
├── Testing
├── Staging
└── Production
Tất cả các môi trường đều sử dụng cùng một codebase.
Khác biệt chỉ nằm ở:
- Database Connection String
- API Endpoint
- Secret
- Feature Flag
- Environment Variables
Đây là mô hình lý tưởng cho CI/CD.
Ví dụ sai
Một số dự án lớn trước đây thường tách mã nguồn như:
WebApp-Test
WebApp-Staging
WebApp-Production
Hoặc:
Git Repo A
Git Repo B
Git Repo C
Trong khi cả ba repository thực chất vẫn là cùng một ứng dụng.
Cách làm này gây ra nhiều vấn đề:
- Khó đồng bộ thay đổi.
- Dễ phát sinh khác biệt giữa các môi trường.
- Pipeline CI/CD trở nên phức tạp.
- Khó rollback.
- Khó kiểm soát phiên bản.
12-Factor App khuyến nghị tránh mô hình này.
Còn mã nguồn dùng chung thì sao?
Nhiều ứng dụng cần sử dụng chung một số chức năng, ví dụ:
- Thư viện xác thực.
- Logging.
- Encryption.
- Common Utilities.
12-Factor App không cấm chia sẻ mã nguồn.
Tuy nhiên, phần mã dùng chung nên được tách thành một codebase độc lập, đóng gói thành thư viện hoặc package có phiên bản riêng và được các ứng dụng khác khai báo như một dependency.
Cách tiếp cận này giúp mỗi ứng dụng vẫn giữ nguyên nguyên tắc One Application – One Codebase, đồng thời tái sử dụng được các thành phần chung mà không tạo ra sự phụ thuộc chồng chéo.
Liên hệ với GitFlow và CI/CD
Nguyên tắc "One Codebase" không có nghĩa tất cả môi trường phải chạy cùng một commit.
Trong thực tế:
- Developer có thể làm việc trên Feature Branch.
- Testing triển khai từ một nhánh hoặc commit đã được kiểm thử.
- Staging sử dụng phiên bản gần với Production.
- Production chỉ triển khai các bản phát hành đã được phê duyệt.
Tất cả vẫn xuất phát từ một repository duy nhất, chỉ khác nhau ở branch, tag hoặc commit được lựa chọn để triển khai. Điều này giúp việc kiểm soát phiên bản, rollback và tự động hóa trong CI/CD trở nên đơn giản và đáng tin cậy hơn.
Kết luận
Nguyên tắc đầu tiên của 12-Factor App có vẻ đơn giản nhưng là nền tảng cho mọi quy trình DevOps hiện đại:
- Một ứng dụng chỉ có một codebase.
- Một codebase có thể triển khai lên nhiều môi trường.
- Mã nguồn dùng chung nên được tách thành thư viện hoặc package độc lập.
- Khác biệt giữa các môi trường nên được quản lý bằng cấu hình, không phải bằng việc tạo nhiều bản mã nguồn.
Khi tuân thủ nguyên tắc này, doanh nghiệp sẽ dễ dàng xây dựng CI/CD Pipeline, quản lý phiên bản hiệu quả và triển khai ứng dụng nhất quán trên các nền tảng Cloud, Container và Kubernetes.