Mục tiêu: mỗi commit đi qua một chuỗi stage tự động, chỉ artifact đã qua kiểm tra mới lên được production.
Các stage theo thứ tự
1. Lint / format: chặn sớm lỗi style, chạy nhanh nhất trước.
2. Test: unit test + integration test; fail thì dừng luôn (fail fast).
3. Build: build một artifact bất biến duy nhất (Docker image, jar) và gắn tag theo commit SHA. Build một lần, tái dùng cho mọi môi trường — không build lại ở prod.
4. Scan: quét bảo mật dependency (SCA) và image (Trivy/Snyk); có thể quét bí mật bị lộ.
5. Deploy staging: tự động deploy artifact lên môi trường giống prod, chạy smoke test.
6. Deploy prod: qua gate/approval thủ công cho môi trường prod.
Nguyên tắc
- Artifact bất biến: chính image đã test ở staging là image lên prod — khác biệt duy nhất là config qua biến môi trường.
- Secrets: không hardcode trong repo. Inject qua secret store của CI (GitHub Actions Secrets, Vault); phân quyền theo environment.
- Gate: dùng environment protection rule (required reviewers) cho prod; staging thì tự động.
Sai lầm hay gặp: build lại ở mỗi stage (mất tính tái lập); test chậm dồn hết vào một job; đẩy secret vào image; không có smoke test sau deploy.