# Tổng quan về CI/CD

### CI (Continuous Integration)

****Khái niệm:****<span style="white-space: pre-wrap;"> Là thực hiện tự động hoá việc tích hợp cấc thay đổi từ một hoặc nhiều vào một kho chứa (repository) chung duy nhất.</span>

****Mục tiêu:****<span style="white-space: pre-wrap;"> Tự động hoá một quy trình khi developer commit và push code lên repository. Quy trình này thường bao gồm:</span>  
<span style="white-space: pre-wrap;">- </span>****Checkout code:****<span style="white-space: pre-wrap;"> Lấy mã nguồn mới nhất</span>  
<span style="white-space: pre-wrap;">- </span>****Build:****<span style="white-space: pre-wrap;"> Build thành file sản phẩm có thể chạy được (apk, exe,...)</span>  
<span style="white-space: pre-wrap;">- </span>****Test:****<span style="white-space: pre-wrap;"> Chạy kiểm thử để đảm bảo các thay đổi không gây ra lỗi.</span>

****Lợi ích:****<span style="white-space: pre-wrap;"> Phát hiện sớm các xung đột và lỗi tích hợp, đảm bảo code ở nhánh chính luôn ở trạng thái ổn định và có thể build được.</span>

### CD (Continuous Delivery/Deployment)

****Khái niệm:****<span style="white-space: pre-wrap;"> Mở rộng từ CI, CD là tự động hoá việc phát hành phầm mềm đã được build và kiểm tử thành công. CD có 2 khái niệm con:</span>  
<span style="white-space: pre-wrap;">- </span>****Continuous Delivery:****<span style="white-space: pre-wrap;"> Sau khi CI thành công. Sản phẩm sẽ được tự động đóng gói và chuẩn bị sẵn sàng cho triển khai ra môi trường thực tế. Tuy nhiên, bước triển khai ra môi trường thực tếcần có sự phê duyệt thủ công.</span>  
<span style="white-space: pre-wrap;">- </span>****Continuous Deployment:**** Hệ thống tự động triển khai phiên bản build thành công ra môi trường production màkhông cần phê duyệt thủ công.

****Mục tiêu:****Giảm thiểu rủi ro và công sứctrong quá trình phát triển sản phẩm. Đảm bảo mọi bản build thành công đều có thể đượcphát hành một cách nhanh chóng và đáng tin cậy.

****Lợi ích:****Tăng tốcphát triển tính năng và bản vá lỗi tới người dùng,giảm thiểu lỗido con người trong quá trình phát triển thủ công.

### Tại sao cần CI/CD

Phát triển game với Unity có những đặc thù kiến CI/CD trở nên cực kỳ hữu ích:  
<span style="white-space: pre-wrap;">- </span>****Tối ưu thời gian:**** Với những dự án lớn, nhiều assets thường sẽ mất nhiều thời gian để build. Việc tự động hoá giúp giải phóng máy tính của developer, build bằng các máy chuyên dụng.  
<span style="white-space: pre-wrap;">- </span>****Build đa nền tảng:**** Unity hỗ trợ build đa nền tảng. CI/CD cho phép tự động hoá việc build cho tất cả các nền tảng một cách nhất quán.  
<span style="white-space: pre-wrap;">- </span>****Quản lý môi trường build:****<span style="white-space: pre-wrap;"> Mỗi nền tảng yêu cầu các SDK và cấu hình môi trường riêng. CI/CD giúp đảm bảo môi trường build luôn được thiết lập đúng và nhất quán.</span>  
<span style="white-space: pre-wrap;">- </span>****Đảm bảo chất lượng:****<span style="white-space: pre-wrap;"> Tự động chạy Unity Test Framework trong pipeline CI giúp phát hiện lỗi sớm hơn.</span>  
<span style="white-space: pre-wrap;">- </span>****Cải thiện sự hợp tác:****<span style="white-space: pre-wrap;"> Đảm bảo rằng mọi thành viên trong team luôn làm việc trên một code base có thể build được và đã qua kiểm thử cơ bản.</span>  
<span style="white-space: pre-wrap;">- </span>****Phát hành nhanh chóng và nhất quán:****<span style="white-space: pre-wrap;"> Tự động hoá việc tạp các bản build cho QA, beta testers hoặc phát hành chính thức lên các cửa hàng ứng dụng.</span>

### Các thành phần của hệ thống CI/CD cho Unity.

<span style="white-space: pre-wrap;">- </span>****Version Control System:****<span style="white-space: pre-wrap;"> Hệ thống quản lý phiên bản (GitHub, Gitlab, Bitbucket...). Đây là nơi lưu trữ code cũng như điểm khởi đầu để kích hoạt pipeline CI/CD/</span>  
****- CI/CD platform:****<span style="white-space: pre-wrap;"> Dịch vụ hoặc phần mềm điều phối toàn bộ quy trình (Jenkins, Gitlab CI/CD, Github Action, Unity Cloud Build, Azure DevOps...)</span>  
<span style="white-space: pre-wrap;">- </span>****Build Agent/Runner:****<span style="white-space: pre-wrap;"> Máy tính (vật lý hoặc ảo) được cài đặt Unity Editor, các SDK cần thiết và phần mềm của CI/CD platform để thực thi các công việc build và test.</span>  
<span style="white-space: pre-wrap;">- </span>****Testing Framework:****<span style="white-space: pre-wrap;"> Unity Test Framework để viết test và chạy các bài kiểm thử tự động.</span>  
<span style="white-space: pre-wrap;">- </span>****Artifact Storage****: Nơi lưu trữ các sản phẩm được build.