

Tối ưu workflow GitHub Actions: Mẹo CI/CD nhanh hơn để triển khai ứng dụng hiệu quả
GitHub Actions đã trở thành công cụ không thể thiếu trong phát triển phần mềm hiện đại, cho phép tự động hóa quy trình CI/CD từ việc build và test cho tới triển khai và giám sát. Tối ưu hóa workflow GitHub Actions không chỉ giúp tiết kiệm thời gian mà còn giảm chi phí compute và tăng độ tin cậy của quy trình phát triển.
Cách GitHub Actions hoạt động và tại sao cần tối ưu

GitHub Actions cho phép tự động hóa quy trình phát triển phần mềm bằng cách xác định workflow trong file YAML. Mỗi workflow bao gồm một hoặc nhiều jobs, và mỗi job có thể chạy trên các runner khác nhau. Tuy nhiên, workflow không được tối ưu có thể dẫn tới:
- Thời gian chờ lâu vì các job được thực hiện tuần tự thay vì song song
- Tài nguyên compute bị lãng phí vì các bước không cần thiết vẫn được thực hiện
- Thiếu lưu trữ và tái sử dụng artifacts giữa các jobs
- Không tận dụng caching để giảm thời gian build lặp lại
Mẹo tối ưu workflow GitHub Actions cho CI/CD nhanh hơn
1. Tận dụng thực hiện song song và chiến lược ma trận (matrix strategy)
Thay vì chạy các test cho các phiên bản khác nhau của Node.js tuần tự, sử dụng ma trận để thực hiện song song:
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x, 18.x, 20.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- run: npm test
Điều này cho phép chạy tests cho 3 phiên bản Node.js cùng lúc, giảm thời gian tổng thời gian test đáng kể so với chạy tuần tự.
2. Sử dụng cache để giảm thời gian cài đặt dependencies
Cache các thư viện Node.js (node_modules) hoặc Python (virtualenv) để tránh cài đặt lại trong mỗi workflow run:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Cache node modules
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- run: npm ci
- run: npm run build
Cache có thể giảm thời gian cài đặt dependencies từ vài phút xuống dưới 10 giây khi không có thay đổi trong package-lock.json.
3. Tối ưu việc sử dụng artifacts và lưu trữ kết quả giữa các jobs
Thay vì xây dựng lại cùng một file trong nhiều jobs khác nhau, sử dụng artifacts để lưu trữ và tái sử dụng kết quả:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: npm run build
- uses: actions/upload-artifact@v3
with:
name: build-files
path: dist/
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/download-artifact@v3
with:
name: build-files
path: ./dist
- run: ./deploy.sh
4. Chọn runner phù hợp và sử dụng self-hosted runners khi cần thiết
GitHub cung cấp các loại runner khác nhau:
– GitHub-hosted runners: Ubuntu, Windows, macOS (mặc định)
– Self-hosted runners: Máy chủ tùy chỉnh trong cơ sở hạ tầng của bạn
Đối với các workload đặc biệt (cần phần cứng cụ thể, giấy phép phần mềm nội bộ, hoặc yêu cầu bảo mật cao), self-hosted runners có thể tiết kiệm chi phí và tăng hiệu suất.
Ví dụ thực tế: Workflow CI/CD tối ưu cho ứng dụng web
Dưới đây là workflow CI/CD tối ưu cho một ứng dụng web React:
name: CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x, 18.x]
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm test
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Cache node modules
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- run: npm run build
- uses: actions/upload-artifact@v3
with:
name: production-build
path: build/
deploy:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v3
- uses: actions/download-artifact@v3
with:
name: production-build
path: ./build
- name: Deploy to Firebase
run: firebase deploy --only hosting
env:
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
Các lỗi thường gặp và cách khắc phục
| Lỗi | Nguyên nhân | Giải pháp |
|---|---|---|
| Workflow chạy quá lâu | Thiếu parallelism, không sử dụng cache | Thêm strategy matrix, sử dụng actions/cache |
| Không thể truy cập secrets | Secrets chưa được cấu hình trong repository settings | Thêm secrets trong Settings > Secrets > Actions |
| Artifacts không được truyền giữa jobs | Thiếu phụ thuộc job hoặc sử dụng download-artifact sai cách | Thêm dependencies và sử dụng đúng cách download-artifact |
| Self-hosted runner không kết nối | Firewall chặn kết nối, token không đúng | Kiểm tra kết nối mạng và cấu hình lại runner token |
Công cụ và dịch vụ hỗ trợ tối ưu GitHub Actions
- GitHub Actions Dashboard: Theo dõi thời gian chạy workflow và tìm bottleneck
- act: Công cụ chạy GitHub Actions local để test trước khi push
- GitHub Marketplace: Tìm kiếm actions đã được tối ưu như caching, notifications, deployment
- Workflow Visualizer: Extensions giúp hiển thị cấu trúc workflow trong IDE
Kết luận: Xây dựng quy trình CI/CD hiệu quả và bền vững
Tối ưu workflow GitHub Actions là một quá trình liên tục, cần theo dõi và điều chỉnh thường xuyên. Bằng cách kết hợp ma trận chiến lược, caching, artifacts tối ưu và lựa chọn runner phù hợp, các đội phát triển có thể giảm thời gian CI/CD từ vài giờ xuống dưới 15 phút cho hầu hết các dự án.
Lưu ý quan trọng: Luôn kiểm tra và cải thiện. Sử dụng GitHub Actions Dashboard để phát hiện các bước chậm và áp dụng các mẹo trên để tiếp tục tối ưu hóa quy trình phát triển phần mềm của bạn.
Nguồn: GitHub Engineering Blog, GitHub Actions Documentation, How GitHub Actions Powers GitHub
