Docker & Application

Checklist nghiệm thu pipeline CI/CD trước khi bàn giao

Danh mục kiểm tra nghiệm thu pipeline CI/CD trước khi bàn giao: bảo mật secret, khóa nhánh, timeout, cache Docker và kịch bản cứu hộ khẩn cấp.

Checklist nghiệm thu pipeline CI/CD trước khi bàn giao
MỤC LỤC

3 nguyên tắc cốt lõi khi nghiệm thu pipeline CI/CD

Trước khi rà soát từng dòng cấu hình, toàn bộ quy trình phát hành cần đáp ứng 3 nguyên tắc cốt lõi:

  1. Không có quyền truy cập ngầm định (Zero-Implicit Access): Không nhánh git nào được phép đẩy thẳng mã nguồn lên Production mà không vượt qua các bài kiểm thử tự động và chốt chặn phê duyệt của người phụ trách kỹ thuật.
  2. Không để sót thông tin nhạy cảm trong log (Zero-Leakage Logs): Mọi biến môi trường bí mật, chuỗi kết nối cơ sở dữ liệu và token API phải được che giấu (***) trong toàn bộ màn hình console của runner.
  3. Luôn có đường cứu hộ độc lập (Out-of-Band Break-Glass SOP): Khi dịch vụ CI/CD bên thứ ba hoặc máy chủ runner gặp sự cố gián đoạn, đội ngũ vận hành vẫn có quy trình phát hành bản vá khẩn cấp an toàn qua mạng riêng nội bộ.
Khung 5 trụ cột nghiệm thu pipeline CI/CD

Kiểm soát bảo mật mã nguồn và phân quyền runner

Giai đoạn đầu tiên tập trung bảo vệ kho lưu trữ mã nguồn (Repository) và máy chủ Runner trước các nguy cơ leo thang đặc quyền và rò rỉ credential.

Hạng mục kiểm traPhương thức xác minh thực tếTiêu chuẩn đạt yêu cầuCảnh báo rủi ro nếu bỏ qua
1.1. Khóa nhánh chính (Branch Protection)Chạy lệnh gh api repos/:owner/:repo/branches/main/protectionrequired_approving_review_count >= 1, enforce_admins: true, strict: trueLập trình viên có thể vô tình push trực tiếp commit lỗi lên nhánh Production
1.2. Phân quyền Runner non-rootKiểm tra tiến trình trên máy chủ Runner: ps aux \| grep actions-runnerTiến trình chạy dưới user runner (UID 1001), không chạy dưới quyền rootLỗ hổng trong mã nguồn build có thể tạo điều kiện can thiệp trái phép vào máy chủ Runner (HTS-103)
1.3. Che giấu Secret trong logKiểm tra log các bước build có gọi biến môi trường bí mậtToàn bộ giá trị token và mật khẩu hiển thị dưới dạng *** trên giao diện webLộ chuỗi kết nối cơ sở dữ liệu và API key cho những người có quyền truy cập repository (HTS-100)
1.4. Chặn mã độc từ PR bên ngoàiKiểm tra cài đặt repository: Actions > Fork pull request workflowsChọn Require approval for all outside collaboratorsKẻ tấn công mở Pull Request chứa mã độc để đánh cắp secret nội bộ qua runner
1.5. Quét lỗ hổng thư viện (Security Lint)Tích hợp bước quét Trivy / Snyk trong file workflowChặn đứng tiến trình merge nếu phát hiện lỗ hổng mức CriticalĐưa các thư viện có mã độc hoặc lỗ hổng bảo mật nghiêm trọng lên Production
1.6. Tách biệt quyền môi trườngKiểm tra danh mục Settings > Environments trên GitHubKỹ sư kiểm thử chỉ có quyền đọc secret Staging, không xem được secret ProductionLập trình viên vô tình dùng nhầm cấu hình Production trong môi trường thử nghiệm (HTS-105)

Quản lý tài nguyên, thời gian timeout và xung đột pipeline

Kiểm soát thời gian thực thi và tài nguyên phần cứng giúp ngăn chặn tình trạng một tiến trình lỗi làm nghẽn toàn bộ chu trình phát hành của doanh nghiệp.

Hạng mục kiểm traPhương thức xác minh thực tếTiêu chuẩn đạt yêu cầuCảnh báo rủi ro nếu bỏ qua
2.1. Cấu hình Job TimeoutKiểm tra khai báo timeout-minutes trong từng job workflowMọi job đều có timeout-minutes: 15 (hoặc tối đa 20 phút)Tiến trình kiểm thử bị treo hoặc rơi vào vòng lặp vô hạn sẽ chiếm giữ worker suốt thời gian chờ mặc định (6 giờ)
2.2. Khóa xử lý đồng thời (Concurrency Lock)Khai báo khối concurrency: production-deploy trong file YAMLcancel-in-progress: false, các lượt deploy được xếp hàng tuần tựHai commit merge sát nhau gây ra race condition, bản build cũ ghi đè lên bản build mới
2.3. Giới hạn cgroup cho RunnerKiểm tra cấu hình systemd service: systemctl show actions-runnerCó khai báo MemoryMax=6G, CPUQuota=300% trên máy chủ RunnerMột đợt build chiếm dụng quá nhiều RAM làm ảnh hưởng các tiến trình khác và dễ bị hệ điều hành tắt ngang (OOM Killer)
2.4. Dung lượng đĩa tự doChạy lệnh kiểm tra dung lượng: df -h /var/lib/docker trên Runner NodePhân vùng chứa Docker còn trống tối thiểu 30GBRunner dừng hoạt động đột ngột giữa chừng vì hết ổ đĩa khi tải Docker base image
2.5. Kiểm soát số lượng job song songCấu hình giới hạn worker trong cụm runner nội bộSố job chạy đồng thời không vượt quá số core CPU khả dụngTranh chấp I/O đĩa khiến thời gian build tăng đột biến từ 3 phút lên 25 phút

Tối ưu tốc độ đóng gói và thời gian lưu cache

Một pipeline CI/CD đạt chuẩn cần cân bằng giữa mức độ kiểm soát an toàn và tốc độ phản hồi để không làm gián đoạn nhịp làm việc của đội ngũ phát triển.

Hạng mục kiểm traPhương thức xác minh thực tếTiêu chuẩn đạt yêu cầuCảnh báo rủi ro nếu bỏ qua
3.1. Docker Layer Cache tái sử dụngKiểm tra log build: các tầng thư viện (npm install, composer)Xuất hiện trạng thái CACHED khi không có thay đổi file lockMỗi lần thay đổi mã nguồn đều phải tải lại toàn bộ thư viện từ đầu, làm kéo dài thời gian build
3.2. Tốc độ truyền tải qua mạng nội bộĐo thời gian kéo image từ Private Registry: time docker pullTốc độ kéo đạt ≥ 800 Mbps qua mạng Private VPCKéo image lớn qua đường mạng công cộng mất 5 – 10 phút, làm tăng thời gian downtime
3.3. Dọn dẹp bộ đệm định kỳ (Auto-Prune)Kiểm tra cron job hệ thống: crontab -l -u runnerCron chạy docker system prune -af --filter "until=72h" mỗi đêmDung lượng đĩa cạn kiệt dần do Docker build cache và dangling image tích tụ sau các lần build
3.4. Giới hạn thời gian lưu trữ ArtifactKiểm tra tham số retention-days của bước upload-artifactĐặt giới hạn lưu trữ tối đa 7 ngày đối với tệp test và logLàm phình dung lượng lưu trữ trên GitHub Storage gây phát sinh chi phí không cần thiết
3.5. Độ trễ mạng giữa Runner và Web NodesChạy lệnh ping -c 10 10.0.0.11 từ máy chủ RunnerĐộ trễ mạng nội bộ ổn định ở mức < 1msMạng nội bộ chập chờn khiến lệnh reload container qua SSH bị timeout giữa chừng

Thiết lập chốt chặn kiểm thử và diễn tập rollback

Pipeline không chỉ đưa code lên máy chủ, mà còn là bộ lọc chất lượng tự động ngăn ngừa mã nguồn lỗi tiếp cận người dùng.

Hạng mục kiểm traPhương thức xác minh thực tếTiêu chuẩn đạt yêu cầuCảnh báo rủi ro nếu bỏ qua
4.1. Chốt chặn Test tự độngKiểm tra cấu hình needs: [unit-test, lint] trước job deployCác bài test cốt lõi vượt qua thành công; pipeline dừng ngay khi có lỗiBản build chứa lỗi cú pháp hoặc lỗi logic bị đưa thẳng lên môi trường chạy thực tế
4.2. Kiểm định an toàn Database MigrationSoát xét script migration trong pull requestTuân thủ quy tắc Expand/Contract (HTS-104), có lock_wait_timeout = 5Lệnh ALTER TABLE giữ khóa Exclusive Metadata Lock kéo dài gây nghẽn hàng đợi kết nối và quá tải database
4.3. Thời gian ngâm thử nghiệm trên StagingKiểm tra nhật ký phát hành StagingBản build hoạt động ổn định tối thiểu 24 giờ trên môi trường StagingLỗi rò rỉ bộ nhớ hoặc xung đột dữ liệu chưa kịp lộ diện đã được đưa lên Production
4.4. Chốt chặn phê duyệt thủ công (Approval Gate)Kiểm tra cấu hình Required Reviewers trên GitHub EnvironmentYêu cầu xác nhận phê duyệt từ Tech Lead trước khi job Production chạyLập trình viên có thể tự ý kích hoạt phát hành mà người phụ trách kỹ thuật không biết
4.5. Phân luồng Canary chuẩn xácKiểm tra log Nginx Load Balancer: tail -f access.jsonNginx chuyển hướng chính xác 5% lưu lượng vào Canary node (HTS-106)Lưu lượng phân bổ sai tỷ lệ khiến phiên bản mới phải chịu tải quá mức ngay khi ra mắt
4.6. Diễn tập ngắt mạch RollbackChạy kịch bản giả lập container Canary trả về lỗi 500Nginx tự động ngắt tải về cụm Stable trong < 1s mà không cần gõ lệnh tayPhiên bản lỗi tiếp tục nhận lưu lượng của người dùng nếu không có người trực can thiệp thủ công

Cảnh báo sự cố và cơ chế xử lý khẩn cấp

Khi dịch vụ trung gian gặp sự cố, đội ngũ kỹ thuật phải có kênh thông tin giám sát và kịch bản can thiệp độc lập ngoài luồng.

Quy trình phát hành ngoài luồng khi CI/CD gặp sự cố
Hạng mục kiểm traPhương thức xác minh thực tếTiêu chuẩn đạt yêu cầuCảnh báo rủi ro nếu bỏ qua
5.1. Thông báo trạng thái qua ChatOpsKiểm tra tin nhắn webhook gửi về kênh Telegram/Slack kỹ thuậtTin nhắn nêu rõ: phiên bản commit, người kích hoạt, trạng thái (Success/Fail)Đội ngũ không nắm được thời điểm hệ thống vừa được cập nhật để theo dõi lỗi phát sinh
5.2. Nhật ký kiểm toán triển khai (Audit Trail)Truy vấn bảng log phát hành trên database kiểm toán nội bộGhi nhận đầy đủ: thời điểm deploy, mã SHA git, IP runner, danh sách máy chủ đíchThiếu dữ liệu truy vết khi cần phân tích nguyên nhân gốc sau sự cố phát hành
5.3. Kịch bản cứu hộ độc lập (Break-Glass SOP)Thử nghiệm ngắt kết nối mạng runner và thực hiện deploy thủ côngTriển khai thành công bản vá qua SSH Bastion Jump HostBị gián đoạn hoặc đình trệ quy trình phát hành bản vá khẩn cấp khi dịch vụ CI/CD bên ngoài gặp sự cố
5.4. Danh bạ phân công trách nhiệm (Escalation Path)Rà soát tài liệu trực nhật On-Call của đội ngũCó thông tin liên hệ cụ thể của kỹ sư phụ trách từng tầng (Mạng, Database, Ứng dụng)Chậm trễ trong việc điều phối và xử lý sự cố ngoài giờ do thiếu đầu mối kỹ thuật rõ ràng
5.5. Quy trình thu hồi quyền định kỳĐối soát danh sách tài khoản có quyền truy cập CI/CDĐồng bộ chặt chẽ với Quy trình thu hồi quyền quản trị OffboardingKỹ sư đã nghỉ việc vẫn giữ Personal Access Token có quyền kích hoạt deploy lên Production

Kịch bản cứu hộ khẩn cấp ngoài luồng (Break-Glass SOP)

Trong tình huống khẩn cấp khi dịch vụ GitHub Actions hoặc máy chủ Runner bị mất kết nối, kỹ sư trực hệ thống cần thực hiện phát hành bản vá theo quy trình 4 bước có kiểm soát:

Bước 1: Truy cập máy chủ qua SSH Bastion Jump Host

Sử dụng khóa xác thực đã được cấu hình từ trước để truy cập vào vùng mạng nội bộ qua cổng chỉ định:

bash
ssh -p 2222 -J bastion@jump.example.com deploy@10.0.0.10

Bước 2: Kéo mã nguồn và đóng gói Image tại máy chủ Build cục bộ

Đăng nhập vào máy chủ xây dựng nội bộ, kiểm tra chữ ký commit và đóng gói image:

bash
git verify-commit HEAD
docker build -t 10.0.0.5:5000/app:hotfix-$(date +%Y%m%d%H%M) .
docker push 10.0.0.5:5000/app:hotfix-$(date +%Y%m%d%H%M)

Bước 3: Triển khai tuần tự lên các Web Node

Cập nhật biến môi trường IMAGE_TAG và khởi chạy container mới mà không gián đoạn dịch vụ:

bash
# Cập nhật Web Node 01
ssh deploy@10.0.0.11 "IMAGE_TAG=hotfix-20261027 docker compose up -d web"

# Kiểm tra sức khỏe tiến trình trước khi chuyển sang Node tiếp theo
curl -f http://10.0.0.11:8080/health || exit 1

# Cập nhật Web Node 02
ssh deploy@10.0.0.12 "IMAGE_TAG=hotfix-20261027 docker compose up -d web"

Bước 4: Ghi nhận biên bản sự cố và hoàn trả trạng thái kiểm soát

Ngay sau khi bản vá hoạt động ổn định, kỹ sư chịu trách nhiệm phải ghi lại nhật ký lý do kích hoạt chế độ ngoài luồng và cập nhật lại commit vào nhánh git chính thức ngay khi hệ thống CI/CD khôi phục.

Mẫu biên bản nghiệm thu kỹ thuật (Acceptance Sign-off)

Trước khi chính thức bàn giao quyền phát hành, biên bản nghiệm thu cần được ký nhận bởi Tech Lead đại diện đội ngũ phát triển và Kỹ sư SRE đại diện đội ngũ vận hành:

markdown
# BIÊN BẢN NGHIỆM THU HỆ THỐNG CI/CD PIPELINE
- Dự án: Core Application Backend
- Môi trường áp dụng: Staging & Production (Cụm Multi-Server)
- Ngày thẩm định: 27/10/2026

KẾT QUẢ ĐÁNH GIÁ 5 TRỤ CỘT:
[x] Trụ cột 1: Bảo mật kho mã nguồn, khóa nhánh main, mask secret 100%.
[x] Trụ cột 2: Cấu hình Job Timeout 15m, concurrency lock chống deploy đè.
[x] Trụ cột 3: Docker Buildx layer cache hoạt động, cron prune đĩa định kỳ.
[x] Trụ cột 4: Chốt chặn kiểm thử tự động, migration non-blocking, diễn tập Canary pass.
[x] Trụ cột 5: Cảnh báo Telegram hoạt động, tài liệu Break-Glass SOP sẵn sàng.

KẾT LUẬN: Đủ điều kiện đưa vào vận hành chính thức (Production Ready).
- Đại diện Đội ngũ Vận hành (SRE/DevOps): [Đã ký xác nhận]
- Đại diện Đội ngũ Phát triển (Tech Lead): [Đã ký xác nhận]

Mở rộng năng lực hạ tầng sang phòng vệ thảm họa

Việc hoàn tất nghiệm thu pipeline CI/CD đánh dấu bước hoàn thiện toàn bộ Cụm 3: CI/CD & Chu trình phát hành phần mềm trên hạ tầng doanh nghiệp. Để bảo vệ dữ liệu và duy trì hoạt động kinh doanh liên tục trước các sự cố hạ tầng diện rộng, bạn có thể tiếp tục với các bài viết thuộc chuyên đề Tính liên tục kinh doanh & Phục hồi sau thảm họa (Disaster Recovery):

Nội dung hướng dẫn này có hữu ích với hệ thống của bạn không?

Chia sẻ bài viết hữu ích

Gửi bài viết này cho đồng nghiệp

Đọc tiếp

Bài nên đọc tiếp

Xem tất cả bài về Docker & Application