
GitHub Actions là hệ thống tự động hoá tích hợp và triển khai (CI/CD) tích hợp sẵn trong mọi kho mã nguồn trên GitHub. Chỉ cần một file YAML đặt trong .github/workflows/, bạn có thể tự động build, chạy test, đóng gói và triển khai ứng dụng mỗi khi có commit hoặc pull request — không cần cấu hình Jenkins hay CircleCI.
Cấu trúc một workflow
Mỗi workflow là một file YAML trong thư mục .github/workflows/, đuôi .yml hoặc .yaml. Cấu trúc gồm 4 thành phần chính:
- Event (sự kiện kích hoạt):
push,pull_request,schedule(cron),workflow_dispatch(chạy tay),release. - Job: một đơn vị công việc, chạy trên một runner.
- Step: các bước nhỏ trong job, từ
run(shell script) hoặcuses(action có sẵn). - Runner: máy thực thi — GitHub-hosted hoặc self-hosted.
Ví dụ tối thiểu:
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm test
Cú pháp đầy đủ theo workflow syntax reference.

Matrix strategy: chạy song song nhiều phiên bản
Thay vì viết lặp lại job cho từng phiên bản Node hay Python, dùng strategy.matrix để GitHub tự sinh ra nhiều job song song — rất tiện khi bạn cần test trên nhiều phiên bản runtime cùng lúc:
strategy:
fail-fast: false
matrix:
node: [18, 20, 22]
os: [ubuntu-latest, macos-latest]
include:
- node: 22
os: windows-latest
fail-fast: false giúp một job lỗi không chặn các job còn lại — bạn vẫn biết lỗi xảy ra trên cấu hình nào.
Cache và Artifacts
Không có cache, mỗi job đều tải lại node_modules hoặc Docker layer từ đầu — mất thời gian và tiền. actions/cache giải quyết việc này:
- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-
Nguyên tắc: path là thư mục cần lưu, key là khoá duy nhất theo hệ điều hành + hash file khoá phụ thuộc, restore-keys cho phép khôi phục bản cache gần nhất khi khoá chính không tồn tại (tức là cache “gần đúng” thay vì phải build lại từ đầu).
Khác với cache, Artifacts dùng để chia sẻ kết quả giữa các job — ví dụ job build xuất file, job test tải file đó về thay vì build lại:
- uses: actions/upload-artifact@v4
with:
name: binary
path: ./dist/
Secrets: quản lý thông tin nhạy cảm
Không bao giờ hardcode token hay mật khẩu trong file YAML. Dùng GitHub Secrets — giá trị được mã hoá, chỉ hiển thị trong log khi bạn in ra, và tự động ẩn khỏi pull request đến từ fork:
env:
API_KEY: ${{ secrets.DEPLOY_API_KEY }}
steps:
- run: ./deploy.sh
env:
TOKEN: ${{ secrets.NPM_TOKEN }}
Lưu ý quan trọng: secret ở cấp repository không dùng được trong workflow chạy cho pull request từ fork — đây là thiết kế bảo mật chống lộ secret qua PR độc hại.
Self-hosted runner
GitHub-hosted runner (ubuntu-latest, macos-latest, windows-latest) có sẵn nhưng giới hạn phút chạy theo gói thuê bao, và không vào được mạng nội bộ. Khi cần build lên thiết bị riêng, truy cập database nội bộ, hoặc chạy thử nghiệm trên phần cứng đặc biệt (GPU, thiết bị IoT), bạn dùng self-hosted runner — chỉ cần chạy lệnh cấu hình trên máy đó, nó tự báo đăng ký với repo và nhận job.
Concurrency: tránh chạy trùng
Trong nhóm nhiều người commit đồng thời, bạn không muốn 3 workflow deploy chạy chồng lên nhau gây xung đột. Khối concurrency cho phép huỷ hoặc chờ job đang chạy:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
Biến github.ref làm mỗi nhánh một group riêng — job của nhánh đang mở sẽ bị huỷ khi có commit mới, nhưng workflow của main không ảnh hưởng.
Reusable workflows và Composite action
Khi nhiều repo dùng chung pipeline, reusable workflows cho phép gọi một workflow ở repo khác:
jobs:
build:
uses: org-name/build-repo/.github/workflows/ci.yml@main
secrets: inherit
Cùng cơ chế, composite action gom nhiều step thành một action duy nhất trong action.yml, tiện cho việc thiết lập môi trường lặp đi lặp lại.
Kinh nghiệm thực tế
- Pin action theo commit SHA thay vì tag
@v4: tag có thể bị di chuyển, commit SHA thì bất biến — đây là khuyến nghị chính thức cho workflow production. - Tách job theo ranh giới logic, không theo số lệnh shell — dễ cache và chạy song song.
- Đặt timeout cho job để tránh job treo tiêu tốn phút tính phí:
timeout-minutes: 15. - Dùng
permissions:khai báo quyền tối thiểu cho từng job thay vì để mặc định rộng. - Workflow chạy thử nghiệm thử trên pull request từ fork không có secrets — đừng thiết kế test phụ thuộc deploy key.
Workflow hoàn chỉnh ví dụ
name: Build và Deploy
on:
push:
branches: [main]
workflow_dispatch:
concurrency:
group: deploy-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm run build
- uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
deploy:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/download-artifact@v4
with:
name: dist
path: dist/
- run: ./deploy.sh
env:
API_KEY: ${{ secrets.DEPLOY_API_KEY }}
Ở đây needs: build tạo phụ thuộc giữa job, if chỉ deploy khi đang ở nhánh main, secrets được truyền qua env ở đúng phạm vi cần thiết.

Kết luận
GitHub Actions đã trở thành lựa chọn mặc định cho CI/CD nhờ tích hợp trực tiếp với GitHub, không cần phần cứng riêng và có hệ sinh thái action lớn. Nếu mới bắt đầu, hãy bắt đầu từ workflow test đơn giản rồi dần thêm cache, matrix và artifact — đừng viết một pipeline 200 dòng ngay từ đầu.
Tài liệu chính thức: docs.github.com/en/actions.
Từ khóa chính: GitHub Actions, CI/CD, workflow YAML, .github/workflows, matrix strategy, actions/cache, artifacts, secrets, self-hosted runner, concurrency, composite action, reusable workflows.
