GitHub Actions tự động hoá CI/CD: workflow, cache, secrets

Giao diện danh sách workflow GitHub Actions hiển thị trạng thái chạy thành công của các pipeline tự động

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ặc uses (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.

Giao diện danh sách workflow GitHub Actions hiển thị trạng thái chạy thành công của các pipeline tự động
Danh sách workflow GitHub Actions với trạng thái chạy (Nguồn: Wikimedia Commons)

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.

Logo GitHub đặt trong phần giới thiệu nền tảng lưu trữ mã nguồn tích hợp GitHub Actions
Nền tảng GitHub nơi workflow được lưu trữ và chạy tự động (Nguồn: Wikimedia Commons)

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.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Dọn dẹp ổ đĩa: lệnh và công cụ giải phóng dung lượng ổ cứng

Dọn dẹp ổ đĩa: lệnh và công cụ giải phóng dung lượng ổ cứng Trong quá trình sử dụng, ổ đĩa máy tính tích tụ dần các file tạm, bản…

Xem thêm

Cách thay ổ cứng HDD bằng SSD: hướng dẫn cài đặt chi tiết

Cách thay ổ cứng HDD bằng SSD: hướng dẫn cài đặt chi tiết Thay ổ cứng HDD bằng SSD là cách nâng cấp máy tính hiệu quả nhất, giúp thời…

Xem thêm

Nmap là gì: hướng dẫn quét mạng và phát hiện lỗ hổng bảo mật

Nmap là gì: quét mạng từ dòng lệnh Nmap (Network Mapper) là công cụ quét mạng mã nguồn mở dùng để phát hiện thiết bị, dịch vụ và lỗ hổng…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất