Build một lần, deploy nhiều nơi. Artifact (image) phải bất biến và không chứa bất kỳ giá trị nào phụ thuộc môi trường; khác biệt giữa các môi trường được tiêm lúc chạy, qua biến môi trường / ConfigMap / secret store.
build → image app:9f3c2ab
├─ deploy staging (DATABASE_URL=..., LOG_LEVEL=debug)
└─ deploy prod (DATABASE_URL=..., LOG_LEVEL=info)Vì sao quan trọng: nếu mỗi môi trường build lại, thứ chạy trên production chưa từng được test — dependency có thể đã đổi, base image đã đổi, và bug chỉ xuất hiện ở prod. Cùng một digest chạy qua mọi tầng thì kết quả test ở staging mới có giá trị suy ra cho prod.
Thực hành đi kèm:
- Tag image bằng commit SHA (hoặc pin theo digest), không dùng
latestđể deploy —latestkhiến hai lần rollout ra hai thứ khác nhau. - Cùng một luồng promote: dev → staging → prod, không có nhánh nào build riêng cho prod.
- Với frontend build-time (biến bị nhúng vào bundle), phần cấu hình khác môi trường phải chuyển sang đọc lúc runtime hoặc chấp nhận build riêng cho từng môi trường — nói rõ đánh đổi này thay vì lờ đi.