CI/CD Handbook: Continuous Integration, Delivery và Deployment với GitHub Actions, Docker và Google Cloud Run
Agenda
Thời gian đọc ước tính: ~25 phút
Learning outcome:
- Phân biệt chính xác ba khái niệm Continuous Integration, Continuous Delivery và Continuous Deployment — không còn dùng lẫn lộn
- Giải thích được vai trò của từng môi trường (local, staging, production) trong vòng đời phần mềm chuyên nghiệp
- Tự tay thiết lập CI/CD workflow bằng GitHub Actions, Docker Hub và Google Cloud Run cho dự án Node.js thực tế
Glossary & Vocabulary
1. Technical Terms (Thuật ngữ kỹ thuật):
| Term | Vietnamese Meaning & Quick Explain |
|---|---|
| CI — Continuous Integration | Tích hợp liên tục — tự động test và gộp code từ feature branch vào nhánh chính sau mỗi thay đổi. |
| Continuous Delivery | Chuyển giao liên tục — tự động deploy lên staging, cần human approval trước khi lên production. |
| Continuous Deployment | Triển khai liên tục — tự động deploy thẳng lên production khi vượt qua automated tests. |
| Pipeline | Chuỗi bước tự động (test → build → deploy) thực thi tuần tự sau mỗi sự kiện trigger. |
| Staging Environment | Môi trường thử nghiệm giống hệt production, dành cho QA team kiểm thử thủ công. |
| Feature Branch | Nhánh code riêng để developer phát triển tính năng mới mà không ảnh hưởng nhánh chính. |
| Service Account (GCP) | Tài khoản đặc biệt cho pipeline tự động xác thực với Google Cloud, không phải tài khoản người dùng. |
| YAML | Ngôn ngữ định dạng dữ liệu dễ đọc, dùng để viết file cấu hình CI/CD workflow. |
2. Vocabulary Support (Từ vựng B1+):
| Word | Meaning in Context |
|---|---|
| Interchangeable (adj) | Có thể hoán đổi cho nhau — dùng để chỉ các khái niệm hay bị nhầm lẫn là giống nhau. |
| Foolproof (adj) | Không thể sai — chỉ cơ chế thiết kế để loại bỏ hoàn toàn lỗi con người. |
| Edge case (n) | Tình huống ngoại lệ hiếm gặp, thường bị bỏ quên khi viết automated tests. |
| Incrementally (adv) | Từng bước nhỏ, tích lũy dần theo thời gian. |
| Rigorous (adj) | Nghiêm ngặt, đòi hỏi độ chính xác cao. |
| Boilerplate (n) | Mã nguồn mẫu chuẩn viết sẵn, tái sử dụng cho nhiều dự án. |
1. CI/CD là gì?

Nếu bạn làm trong lĩnh vực tech, chắc chắn đã gặp các thuật ngữ Continuous Integration (CI), Continuous Delivery (CD) và Continuous Deployment. Ba khái niệm này có vẻ interchangeable nhưng thực chất phục vụ các mục đích khác nhau trong vòng đời phát triển phần mềm.
Bài viết này sẽ giải thích rõ từng khái niệm, sau đó hướng dẫn thực hành xây dựng pipeline hoàn chỉnh bao gồm:
- Setup dự án Node.js với automated tests (Jest)
- Cấu hình CI/CD workflow bằng GitHub Actions
- Build và publish Docker image lên Docker Hub
- Deploy lên staging environment và production environment trên Google Cloud Run
1.1. Continuous Integration (CI) — Tích hợp liên tục
Vấn đề gốc rễ: Hãy tưởng tượng một team 6 developer cùng làm việc trên một project. Anh A đang build login feature, chị B đang fix bug search bar, anh C đang chỉnh dashboard UI — cùng một lúc. Nếu tất cả đều sửa trực tiếp vào cùng một codebase, hậu quả sẽ rất rõ: "Ai vừa làm hỏng app?!"
Để giải quyết, các team dùng Version Control Systems (VCS) như GitHub, GitLab, hoặc BitBucket — nơi mọi người có thể cộng tác an toàn mà không giẫm lên nhau.
CI phù hợp vào quy trình theo từng bước sau:
Bước 1 — The Main Branch (Nhánh chính): Đây là "nguồn sự thật duy nhất" — chứa codebase ổn định đang chạy trên live app. Quy tắc cứng: chỉ code đã được test và approved mới được merge vào đây.
Bước 2 — Feature Branches (Nhánh tính năng): Khi anh A muốn làm tính năng mới, anh tạo một feature branch — bản sao riêng của main branch để anh tinker, viết code, test mà không ảnh hưởng người khác.
Bước 3 — Merging Changes (CI Workflow): Khi anh A hài lòng với feature, CI đảm bảo merge được thực hiện an toàn:
- Automated Tests: CI tools tự động chạy tests trên code của anh A, hoạt động như một bouncer bảo vệ main branch.
- Build Verification: Code được "build" (chuyển thành phiên bản deployable của app) để xác nhận hoạt động đúng.
Hành động merge thường xuyên như vậy chính là Continuous Integration.
1.2. Continuous Delivery (CD) — Chuyển giao liên tục
CI chỉ xử lý feature branch và main branch. Nhưng merge thẳng từ feature vào main (vốn đang chạy live) là rủi ro. Tại sao? Vì automated tests không foolproof — vẫn có những edge cases lọt qua.
Staging branch và staging environment ra đời để giải quyết vấn đề này.
Trước khi đưa thay đổi đến người dùng thật, codebase từ feature branches được merge vào staging branch và deploy lên staging environment — bản sao chính xác của production, chỉ dùng bởi QA team. QA team đóng vai "test driver", chạy platform như người dùng thật để phát hiện lỗi usability, edge cases mà automated tests bỏ sót. Nếu mọi thứ pass, codebase mới được phép lên production.
Quy trình merge vào staging branch và deploy lên staging environment đó chính là Continuous Delivery. Điểm khác biệt then chốt: Continuous Delivery không tự động push lên production — nó dừng lại và chờ QA team hoặc stakeholders quyết định có tiếp tục hay không.
1.3. Continuous Deployment — Triển khai liên tục
Continuous Deployment đưa automation lên mức cao nhất. Sự khác biệt nằm ở bước cuối cùng: không cần manual approval. Sau khi trải qua quy trình rigorous của CI và đã deploy lên staging environment, bước tiếp theo lên production diễn ra tự động khi:
- Một Pull Request (PR) được merge vào main branch
- Một release version mới được tạo
- Một commit được push thẳng vào production branch (ít phổ biến)
1.4. Bảng so sánh ba khái niệm
| Khía cạnh | Continuous Integration | Continuous Delivery | Continuous Deployment |
|---|---|---|---|
| Mục tiêu chính | Merge feature branch vào main/staging | Deploy code đã test lên staging để QA | Tự động deploy lên production |
| Mức độ automation | Tự động hóa test và build | Tự động deploy lên staging sau test | Tự động hoàn toàn lên production |
| Phạm vi test | Automated tests trên feature branch trước khi merge | Automated tests + QA manual testing trên staging | Automated tests là kiểm tra cuối |
| Branch liên quan | Feature → main/staging | Staging branch (bước trung gian) | Main branch → production |
| Môi trường target | CI pipeline (VM) | Staging/test environment | Production/live environment |
| Approval | Không cần | QA team/lead phê duyệt | Không cần — hoàn toàn tự động |
| Trigger | PR được tạo | Push vào staging branch | Publish release hoặc merge vào main |