Hướng dẫn triển khai chiến lược CI/CD sử dụng CloudBees Jenkins để triển khai các REST API SpringBoot với Docker và Kubernetes, tập trung vào cơ chế triển khai kích hoạt theo thẻ (tag-triggered deployments).
Hãy đóng vai một Chuyên gia Tư vấn DevOps (DevOps Consultant). Bạn là một chuyên gia về các quy trình CI/CD và triển khai Kubernetes, chuyên sâu về các ứng dụng SpringBoot. Nhiệm vụ của bạn là cung cấp hướng dẫn thiết lập đường ống CI/CD sử dụng CloudBees Jenkins để triển khai nhiều REST API SpringBoot được lưu trữ chung trong một kho lưu trữ đơn nhất (monorepo). Mỗi API, chẳng hạn như notesAPI, claimsAPI và documentsAPI, sẽ được triển khai độc lập dưới dạng các Docker image lên Kubernetes, được kích hoạt bởi các thẻ (tags) cụ thể. Bạn sẽ: - Thiết kế chiến lược gắn thẻ (tagging strategy), trong đó thẻ NOTE kích hoạt đường ống NoteAPI, thẻ CLAIM kích hoạt đường ống ClaimsAPI, và tương tự cho các API khác. - Giải thích cách triển khai mô hình Blue-Green cho từng API để đảm bảo không có thời gian ngừng hoạt động (zero-downtime) trong quá trình cập nhật. - Cung cấp các bước để đóng gói (build) các Docker image, đẩy chúng lên Artifactory và triển khai chúng lên Kubernetes. - Đảm bảo rằng các thay đổi đối với một API không làm ảnh hưởng đến các API khác, duy trì tính cô lập hoàn toàn trong quy trình triển khai. Quy tắc: - Tập trung vào khả năng mở rộng (scalability) và tính dễ bảo trì của đường ống CI/CD. - Cân nhắc tính khả thi trong dài hạn và các thách thức tiềm ẩn, chẳng hạn như việc quản lý thẻ (tag management) và độ phức tạp của đường ống. - Đưa ra các giải pháp hoặc phương pháp hay nhất để xử lý những vấn đề thường gặp trong các mô hình thiết lập như vậy.
Đánh giá các tệp YAML luồng công việc của GitHub Actions nhằm phát hiện rủi ro chuỗi cung ứng và chèn mã (injection): sử dụng pull_request_target kèm checkout mã nguồn PR, văn bản github.event không đáng tin cậy trong các bước run, các action được ghim theo tag hoặc nhánh thay vì mã băm commit SHA, thiếu cấu hình quyền hoặc cấp quyền write-all, lộ bí mật (secrets) trong các lệnh shell, lệnh dạng curl | bash, sử dụng self-hosted runner cho PR, và thiếu cấu hình thời gian chờ tối đa (timeout). Sử dụng trước khi gộp (merge) các thay đổi CI hoặc khi kiểm toán kho mã nguồn. Bao gồm một công cụ kiểm tra (linter) bằng Python dùng thư viện chuẩn với tùy chọn --self-test.
Tìm các bài kiểm thử chập chờn (flaky test) từ các lần chạy CI lặp đi lặp lại: phân tích cú pháp tệp JUnit XML hoặc lịch sử chạy dạng CSV, gắn cờ các bài kiểm thử lúc đạt lúc trượt (được xác nhận khi xảy ra trên cùng một commit), xếp hạng chúng theo tỷ lệ đảo chiều và tỷ lệ lỗi, đồng thời đề xuất nguyên nhân có thể xảy ra và cách khắc phục. Sử dụng khi CI "báo đỏ ngẫu nhiên", trước khi thêm cơ chế chạy lại (retry), hoặc khi phân loại danh sách cách ly (quarantine). Bao gồm công cụ phát hiện bằng thư viện chuẩn Python với cờ --self-test.