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

Cửa sổ gvim 7.3 trên Linux với thanh menu File, Edit, Tools, Buffers, Window, Help và nội dung tệp vimrc

Vim là gì? Chế độ soạn thảo và phím tắt cho lập trình viên

Vim là gì? Chế độ soạn thảo và phím tắt cho lập trình viên Vim là trình soạn thảo văn bản chạy trong terminal, nổi tiếng với các chế độ…

Xem thêm
Sơ đồ Bloom filter trong bộ nhớ đứng trước kho lưu trữ trên đĩa, loại bỏ các lần truy cập đĩa không cần thiết

Bloom filter là gì? Cấu trúc dữ liệu xác suất chống trùng lặp

Bloom filter là gì? Cấu trúc dữ liệu xác suất chống trùng lặp Bloom filter là cấu trúc dữ liệu xác suất dùng một mảng bit và nhiều hàm băm…

Xem thêm
Bảng so sánh bốn định dạng ảnh động GIF, WebP, APNG và TGS theo giới hạn màu, hỗ trợ kênh alpha, khả năng co giãn và mức nén

WebP là gì? Cách chuyển ảnh sang WebP để tăng tốc website

WebP là định dạng ảnh do Google công bố năm 2010, được thiết kế để thay thế JPEG, PNG và GIF trên web nhờ nén nén có tổn hao và…

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