Xin chào ! Nếu đây là lần đầu tiên bạn đến với diễn đàn, xin vui lòng danh ra một phút bấm vào đây để đăng kí và tham gia thảo luận cùng VnPro.
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 12-Factor App – Codebase: Một ứng dụng chỉ nên có một nguồn mã nguồn duy nhất

    Trong phát triển phần mềm hiện đại, đặc biệt với Cloud-Native, MicroservicesCI/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à:
    One Codebase, Many Deploys
    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.
    Attached Files
    Đặng Quang Minh, CCIE#11897 (Enterprise Infrastructure, Wireless, Automation, AI), CCSI#31417

    Email : dangquangminh@vnpro.org
    https://www.facebook.com/groups/vietprofessional/
Working...
X