GitHub Actions cho người mới: tự động chạy kiểm thử mỗi khi đẩy code

  • author-image

    Nguyễn Đình Cường

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

Mỗi lần đẩy code, bạn có nhớ chạy kiểm thử trước không? GitHub Actions giúp việc đó diễn ra tự động: ngay khi bạn push hoặc mở Pull Request, một máy chủ sẽ cài thư viện, chạy test và báo kết quả. Bài này hướng dẫn tạo workflow CI đầu tiên cho dự án Node.js.

CI là gì và vì sao nên dùng

CI (Continuous Integration) là thói quen tích hợp code thường xuyên và tự động kiểm tra mỗi lần tích hợp. Lợi ích rõ nhất: phát hiện lỗi sớm, không ai phải nhớ chạy test bằng tay, và đồng đội yên tâm khi xem xét Pull Request vì đã có dấu xanh hoặc đỏ. Với repository công khai, GitHub Actions có chế độ sử dụng miễn phí; với repository riêng tư có hạn mức nhất định, bạn nên xem chính sách hiện hành.

Các khái niệm cần biết

  • Workflow: một quy trình tự động, định nghĩa trong file YAML tại thư mục .github/workflows/.
  • Event: sự kiện kích hoạt, ví dụ push, pull_request, hoặc theo lịch.
  • Job: nhóm các bước chạy trên cùng một máy ảo (runner).
  • Step: từng bước, có thể là lệnh shell hoặc một action dựng sẵn.
  • Action: đoạn tự động hóa tái sử dụng, ví dụ actions/checkout.

Bước 1: Chuẩn bị dự án có test

Giả sử bạn có dự án Node.js với file package.json định nghĩa lệnh test. Ví dụ tối giản dùng bộ chạy test có sẵn của Node:

{
  "name": "ci-demo",
  "version": "1.0.0",
  "scripts": {
    "test": "node --test"
  }
}

Tạo file sum.js và sum.test.js:

// sum.js
function sum(a, b) {
  return a + b;
}
module.exports = { sum };

// sum.test.js
const test = require('node:test');
const assert = require('node:assert');
const { sum } = require('./sum');

test('cộng hai số', () => {
  assert.strictEqual(sum(2, 3), 5);
});

Chạy npm test trên máy để chắc chắn test qua trước khi đưa vào CI.

Bước 2: Viết workflow

Tạo file .github/workflows/ci.yml:

name: CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18, 20]

    steps:
      - name: Lấy mã nguồn
        uses: actions/checkout@v4

      - name: Cài Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: npm

      - name: Cài thư viện
        run: npm ci

      - name: Chạy kiểm thử
        run: npm test

Giải thích: khối on khai báo workflow chạy khi push hoặc mở PR vào nhánh main. matrix chạy cùng job với nhiều phiên bản Node để biết code có tương thích không. actions/checkout tải code về runner. setup-node cài Node và bật bộ nhớ đệm npm để lần sau nhanh hơn. Lệnh npm ci cài đúng theo file khóa package-lock.json, phù hợp cho CI hơn npm install; vì vậy hãy chắc rằng bạn đã commit file khóa. Phiên bản của các action (như @v4) có thể thay đổi theo thời gian, hãy tham khảo tài liệu để dùng bản mới.

Bước 3: Đẩy code và xem kết quả

git add .
git commit -m "Thêm workflow CI"
git push origin main

Vào tab Actions của repository để xem workflow chạy. Bấm vào một lần chạy, rồi vào từng job và step để đọc log. Dấu tích xanh nghĩa là thành công, dấu x đỏ là có bước thất bại và log sẽ cho bạn biết lý do.

Bước 4: Bảo vệ nhánh chính

Trong Settings > Branches, bạn có thể tạo quy tắc yêu cầu CI phải xanh thì mới được gộp Pull Request. Đây là cách biến CI từ "gợi ý" thành "rào chắn" thật sự.

Dùng bí mật an toàn

Đừng viết khóa API hay mật khẩu vào file workflow. Lưu chúng trong Settings > Secrets and variables > Actions và dùng qua cú pháp ${{ secrets.TEN_BI_MAT }}. Chú ý các workflow chạy từ fork có hạn chế truy cập bí mật vì lý do an toàn.

Lỗi thường gặp

  • Sai thụt lề YAML: YAML dùng dấu cách, không dùng tab, nên một chỗ lệch có thể làm cả file hỏng.
  • Thiếu package-lock.json: npm ci báo lỗi.
  • Test qua ở máy nhưng đỏ trên CI: thường do khác phiên bản, thiếu biến môi trường, hoặc phụ thuộc đường dẫn kiểu Windows.
  • Workflow không chạy: file đặt sai thư mục hoặc nhánh không khớp phần on.

Kết luận

Chỉ với một file YAML ngắn, bạn có hệ thống kiểm thử tự động chạy trên nhiều phiên bản Node. Từ đây có thể mở rộng thêm bước lint, build, và sau cùng là triển khai tự động (CD).

Để học CI/CD và quy trình DevOps trọn vẹn, hãy khám phá các khóa học tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment