blog.dopana

Back

1. Bài toán: Tại sao CI/CD lại chậm và tốn kém?#

Theo mặc định, khi CI chạy, nó thường làm hai việc tốn kém:

  1. Chạy toàn bộ test suite: Dù bạn chỉ sửa một dòng code nhỏ ở một file component, phần lớn các hệ thống CI vẫn quét và chạy hàng trăm, hàng ngàn test case không liên quan.
  2. Checkout hời hợt (Shallow clone): GitHub Actions mặc định sử dụng fetch-depth: 1, nghĩa là nó chỉ tải về commit mới nhất mà không kéo theo lịch sử git. Điều này giúp checkout nhanh, nhưng lại làm “mù” các công cụ cần so sánh sự khác biệt giữa các nhánh (như main và nhánh hiện tại).

2. Vũ khí tối ưu: Vitest --changed kết hợp fetch-depth: 0#

Vitest --changed là gì?#

Vitest cung cấp một flag cực kỳ mạnh mẽ là --changed. Khi được kích hoạt, Vitest sẽ tự động dò xem file nào đã thay đổi so với một nhánh gốc (thường là main) và chỉ chạy các test file liên quan trực tiếp hoặc gián tiếp đến các file đó.

Nút thắt cổ chai: Tại sao cần fetch-depth: 0?#

Vì Vitest dựa vào Git history để biết file nào đã thay đổi, nếu GitHub Actions dùng mặc định (fetch-depth: 1), Vitest sẽ không tìm thấy lịch sử để so sánh với nhánh main và báo lỗi hoặc không lọc được test.

Đó là lý do bạn bắt buộc phải cấu hình actions/checkout với fetch-depth: 0 (tải toàn bộ lịch sử git hoặc đủ sâu) để Vitest có dữ liệu lịch sử mà đối chiếu.

- uses: actions/checkout@v4
  with:
    fetch-depth: 0
yaml

3. Siêu nạp tốc độ với Bun Runtime#

Thay vì dùng Node.js truyền thống cùng npm/yarn, việc tích hợp Bun vào toàn bộ chuỗi quy trình sẽ mang lại một cú hích hiệu suất kinh hoàng:

  • Cài đặt dependencies (bun install): Nhanh hơn từ 10 đến 30 lần so với npm.
  • Chạy test (bun x vitest): Tận dụng tốc độ thực thi mã JavaScript/TypeScript tối ưu của Bun.

4. Xây dựng cấu hình GitHub Actions hoàn chỉnh#

Dưới đây là một mẫu file workflow (.github/workflows/ci.yml) hoàn chỉnh kết hợp cả ba yếu tố trên:

5. Lợi ích thu được#

Khi áp dụng mô hình này vào dự án, bạn sẽ thấy rõ các thay đổi tích cực:

  • Tiết kiệm thời gian CI đáng kể: Thời gian chạy test cho một PR nhỏ có thể giảm từ vài phút xuống chỉ còn vài giây, vì chỉ các test case liên quan mới được thực thi.
  • Tăng tốc độ feedback: Lập trình viên không phải chờ đợi mòn mỏi để biết code của mình có pass hay không.
  • Tối ưu tài nguyên: Giảm tải thời gian sử dụng runner trên GitHub Actions, tiết kiệm chi phí nếu bạn dùng runner riêng hoặc các gói mở rộng.

Tổng kết#

Việc tối ưu hóa CI/CD không đòi hỏi những kiến trúc phức tạp quá tầm. Đôi khi, chỉ bằng cách kết hợp thông minh giữa tính năng thông minh sẵn có của Vitest (--changed), cấu hình đúng đắn lịch sử Git (fetch-depth: 0) và sức mạnh của Bun runtime, bạn đã có thể lột xác toàn bộ quy trình phát triển sản phẩm của mình.

Hãy thử áp dụng ngay vào dự án tiếp theo và cảm nhận sự khác biệt!

Tài liệu tham khảo#