Cache dependency trong CI: cách làm pipeline nhanh gấp nhiều lần

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Một pipeline chạy mười lăm phút khiến cả nhóm sốt ruột và bắt đầu bỏ qua nó. Phần lớn thời gian thường đi vào việc tải lại thư viện giống hệt lần trước. Cache là cách đơn giản nhất để cắt bớt phần lãng phí này.

Vì sao CI chậm?

Mỗi lần chạy, CI thường dùng một máy sạch. Nghĩa là mọi thứ phải làm từ đầu: tải image, cài thư viện, biên dịch. Trong khi đó, danh sách thư viện của bạn có thể không đổi suốt nhiều ngày. Cache lưu kết quả của những việc lặp lại để lần sau dùng ngay.

Nguyên tắc: khóa cache theo nội dung

Cache chỉ hiệu quả khi đúng và mới. Cách phổ biến là tạo khóa (key) dựa trên băm file khóa phiên bản như package-lock.json, composer.lock hay requirements.txt. Khi file đổi thì khóa đổi, cache cũ không bị dùng nhầm. Khi file không đổi, cache được tái sử dụng.

Ví dụ GitHub Actions

Với Node.js, action cài đặt có sẵn tùy chọn cache:

- uses: actions/setup-node@v4
  with:
    node-version: 20
    cache: npm
- run: npm ci

Với PHP và Composer, bạn dùng action cache chung và tự chọn khóa:

- uses: actions/cache@v4
  with:
    path: ~/.composer/cache
    key: composer-${{ hashFiles('composer.lock') }}
    restore-keys: composer-
- run: composer install --no-interaction --prefer-dist

Dòng restore-keys cho phép dùng cache gần đúng nhất nếu khóa chính chưa có, nên vẫn tiết kiệm được phần lớn thời gian khi chỉ đổi vài thư viện.

Ví dụ GitLab CI

cache:
  key:
    files:
      - package-lock.json
  paths:
    - .npm/

script:
  - npm ci --cache .npm --prefer-offline

Ở đây ta cache thư mục cache của npm thay vì node_modules, vì npm ci luôn xóa node_modules trước khi cài.

Cache lớp của Docker

Nếu pipeline build image Docker, hãy sắp xếp Dockerfile để các lớp ít đổi nằm trước:

COPY package*.json ./
RUN npm ci
COPY . .

Ngoài ra, nhiều công cụ build hỗ trợ lưu cache lớp sang registry hoặc bộ nhớ của CI để tái sử dụng giữa các lần chạy. Hãy đọc tài liệu của công cụ bạn dùng để chọn đúng cấu hình.

Những cách khác để rút ngắn pipeline

  1. Chạy job song song: lint, unit test, kiểm tra kiểu có thể chạy cùng lúc.
  2. Chỉ chạy khi cần: nếu chỉ sửa tài liệu thì bỏ qua build nặng bằng điều kiện đường dẫn.
  3. Dừng sớm: đặt bước nhanh nhất (lint) lên đầu để thất bại sớm.
  4. Dùng image nhỏ: tải nhanh hơn.
  5. Chia nhỏ test: tách bộ test lớn ra nhiều job chạy song song.

Cẩn thận với cache bẩn

Cache hỏng hoặc cũ có thể gây lỗi khó hiểu kiểu 'máy local chạy được, CI lỗi'. Khi nghi ngờ, hãy thử xóa cache hoặc đổi tiền tố khóa để buộc tạo lại. Không nên cache thứ chứa bí mật, vì cache có thể được chia sẻ giữa nhiều job.

Đo trước khi tối ưu

Xem thời gian từng bước trong log để biết bước nào chậm nhất. Đừng tối ưu theo cảm giác. Thường chỉ một hai bước chiếm phần lớn thời gian, và cache đúng chỗ đó là đủ để thấy khác biệt rõ rệt.

Kết luận

Khóa cache theo file khóa phiên bản, cache thư mục tải về, sắp xếp Dockerfile hợp lý và chạy song song là bốn bước đơn giản giúp pipeline nhanh lên đáng kể. Một pipeline nhanh là pipeline mà cả nhóm sẵn lòng dùng.

Nếu muốn tìm hiểu sâu hơn về tối ưu quy trình build và triển khai, bạn có thể xem các khóa học tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment