GitHub Actions CI/CD: quy trình deploy website an toàn

Nội dung

Hướng dẫn xây pipeline GitHub Actions CI/CD cho website: build, test, cache dependency, đóng artifact, deploy staging/production và quản lý secret an toàn.

Bạn đã bao giờ deploy website bằng cách kéo file thủ công, sửa nhanh trên production rồi hy vọng mọi thứ vẫn ổn chưa? Cách đó có thể chạy được lúc team còn nhỏ, nhưng chỉ cần một lần quên build, quên file môi trường hoặc push nhầm branch là website có thể lỗi ngay.

CI/CD giúp bạn biến việc build, test và deploy thành một quy trình có kiểm soát. Bài này không cố biến bạn thành DevOps engineer trong một buổi; mục tiêu là giúp bạn có một pipeline đủ an toàn cho website doanh nghiệp. Cùng làm gọn nhé!

CI/CD quy trình deploy website an toàn
CI/CD giúp website deploy theo quy trình thay vì thao tác cảm tính.

Tóm tắt nhanh

  • CI/CD là cách tự động hóa build, test và deploy dựa trên workflow trong repository.
  • Pipeline tối thiểu cho website nên có trigger, install dependency, build, test, cache, artifact và deploy staging.
  • Production deploy nên có secret quản lý đúng, environment riêng và approval gate nếu website quan trọng.
  • Cache giúp pipeline nhanh hơn nhưng cần chú ý cache key và dữ liệu nhạy cảm.
  • Đừng bật auto deploy production nếu team chưa có rollback, backup và quyền truy cập được phân tách.

CI/CD là gì?

CI/CD là cách dùng workflow trong GitHub để tự động chạy các bước như cài dependency, build, test, đóng artifact và deploy khi có sự kiện như push hoặc pull request. Thay vì nhớ từng lệnh thủ công, bạn mô tả quy trình trong file YAML để GitHub runner thực thi.

GitHub Docs mô tả Actions như nền tảng tự động hóa workflow ngay trong GitHub repository [1]. Với website, điều này đặc biệt hữu ích vì đa số lỗi deploy đến từ thao tác lặp lại: quên chạy build, dùng sai phiên bản Node.js, thiếu file static, deploy nhầm branch hoặc copy thiếu thư mục.

CI là phần kiểm tra liên tục: mỗi khi có thay đổi, pipeline chạy build/test để phát hiện lỗi sớm [2]. CD là phần đưa bản đã kiểm tra sang môi trường deploy, có thể là staging hoặc production [3]. Nếu triển khai đúng, CI/CD không làm bạn mất kiểm soát; nó giúp bạn kiểm soát tốt hơn.

Nếu team của bạn đang có nhiều lỗi Git căn bản, hãy xử lý nền tảng trước. Bài các lỗi Git thường gặp sẽ giúp team hiểu branch, commit và pull request rõ hơn trước khi tự động hóa deploy.

Sơ đồ CI/CD từ commit đến production
CI/CD biến các bước deploy lặp lại thành workflow có kiểm soát.

Khi nào website doanh nghiệp cần CI/CD?

Bạn nên triển khai CI/CD khi website có nhiều người cùng sửa, có build step, có staging hoặc có rủi ro kinh doanh nếu deploy lỗi. Nếu website chỉ là landing page tĩnh ít thay đổi, pipeline có thể rất đơn giản; nếu là WooCommerce, SaaS hoặc web app, pipeline cần chặt hơn.

Những dấu hiệu nên làm CI/CD:

  • Team thường xuyên quên chạy build trước khi deploy.
  • Website có frontend framework như React, Vue, Next.js hoặc Astro.
  • Có nhiều branch, pull request và review code.
  • Có staging nhưng việc đẩy staging vẫn thủ công.
  • Production từng lỗi vì deploy nhầm file hoặc nhầm môi trường.
  • Team cần audit ai deploy, deploy lúc nào và commit nào đang chạy.

Ngược lại, nếu một website brochure chỉ cập nhật vài lần mỗi quý, bạn có thể bắt đầu bằng CI đơn giản: kiểm format, build thử và tạo artifact. Chưa cần deploy tự động ngay. Đây là điều mình khuyên nhiều team nhỏ: tự động hóa phần kiểm trước, rồi mới tự động hóa phần đưa lên production.

Bảng quyết định khi nào nên dùng CI/CD
Không phải website nào cũng cần auto deploy production ngay từ đầu.

Pipeline tối thiểu gồm những bước nào?

Một pipeline CI/CD tối thiểu nên có trigger, checkout code, setup runtime, install dependency, build, test và lưu kết quả. Với website Node.js, GitHub Docs có hướng dẫn riêng cho building and testing Node.js, gồm chọn version, install dependencies, build/test và packaging artifacts [4].

Ví dụ workflow tối giản cho website frontend có thể như sau:

name: Kiem tra website

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

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Lay ma nguon
        uses: actions/checkout@v4

      - name: Cai Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm

      - name: Cai dependency
        run: npm ci

      - name: Build website
        run: npm run build

      - name: Chay test
        run: npm test -- --runInBand

Điểm quan trọng là pipeline phải phản ánh đúng cách team build local. Nếu local dùng npm ci nhưng pipeline dùng npm install, kết quả có thể lệch. Nếu production cần biến môi trường, đừng hardcode vào repository; hãy dùng secrets hoặc environment variables.

Nếu bạn từng gặp lỗi push bị từ chối hoặc nhánh không đồng bộ, đọc thêm bài git push bị rejected. CI/CD chỉ ổn khi Git workflow nền tảng đủ rõ.

Pipeline CI/CD tối thiểu cho website
Pipeline tối thiểu nên kiểm được bản build trước khi deploy.

Cache và artifact dùng ra sao?

Cache giúp pipeline chạy nhanh hơn bằng cách tái sử dụng dependency, còn artifact là gói kết quả build cần lưu hoặc chuyển sang bước deploy. Hai khái niệm này dễ bị nhầm, nhưng mục đích khác nhau.

GitHub Docs giải thích dependency caching có cache key, cơ chế match key, setup actions cho package manager và các giới hạn truy cập cache [5]. Với Node.js, cách đơn giản là dùng actions/setup-node với cache: npm. Cách này đủ tốt cho phần lớn website nhỏ.

Artifact nên dùng khi bạn cần lưu thư mục build như dist, build hoặc .next để kiểm tra, tải về hoặc chuyển sang job deploy. Ví dụ:

      - name: Luu ban build
        uses: actions/upload-artifact@v4
        with:
          name: website-build
          path: dist/

Guardrail quan trọng: đừng cache thư mục chứa secret, file cấu hình production hoặc output có dữ liệu nhạy cảm. Cache là công cụ tăng tốc, không phải nơi lưu trạng thái bảo mật.

So sánh cache và artifact trong CI/CD
Cache và artifact giải quyết hai nhu cầu khác nhau trong pipeline.

Deploy staging và production nên tách thế nào?

Staging và production nên dùng environment riêng, secrets riêng và điều kiện deploy riêng. Tách môi trường giúp bạn test bản build trên dữ liệu gần thật trước khi ảnh hưởng người dùng thật.

Một cách triển khai dễ hiểu:

  • Pull request: chỉ build và test, không deploy.
  • Push vào branch develop: deploy staging.
  • Push hoặc tag release từ main: deploy production sau approval.

Với website doanh nghiệp, staging nên có URL riêng, có basic auth nếu cần, và không index trên Google. Production nên yêu cầu người có trách nhiệm duyệt nếu deploy có thể ảnh hưởng doanh thu, form lead hoặc checkout. Đây là chỗ GitHub Environments và deployment protection rules rất hữu ích.

Nếu website của bạn có quy trình từ thiết kế sang code, bài Figma to Code Workflow sẽ giúp nối phần thiết kế, review UI và deploy thành một luồng rõ hơn.

Tách staging và production trong CI/CD
Staging và production cần secrets, quyền và điều kiện deploy riêng.

Secret và permission cần kiểm gì?

Secret trong Actions cần được lưu trong GitHub Secrets hoặc environment secrets, không để trong code, log hoặc artifact. Đây là phần quyết định pipeline có an toàn hay không.

Checklist ngắn:

  • Không commit file .env, khóa SSH, token API hoặc mật khẩu FTP.
  • Dùng secret riêng cho staging và production.
  • Token deploy chỉ có quyền tối thiểu cần thiết.
  • Không in secret ra log bằng lệnh debug.
  • Production environment nên có approval gate.
  • Thay token ngay nếu nghi ngờ lộ.

Nếu team từng lỡ để file nhạy cảm vào repository, hãy xử lý trước khi bật deploy tự động. Bài .gitignore không hoạt động giải thích vì sao file đã tracked vẫn bị Git theo dõi và cách bỏ tracking an toàn.

Checklist trước khi bật auto deploy

Trước khi bật auto deploy production, bạn cần có pipeline ổn định, rollback rõ ràng, backup đáng tin và quyền deploy được phân tách. Auto deploy không phải mục tiêu cuối cùng; mục tiêu là deploy nhanh hơn mà ít rủi ro hơn.

  1. Pull request đã chạy build và test bắt buộc.
  2. Staging deploy tự động và có người kiểm.
  3. Production dùng environment riêng và secret riêng.
  4. Rollback có tài liệu: revert commit, redeploy artifact cũ hoặc restore bản backup.
  5. Thông báo deploy gửi vào Slack, email hoặc hệ thống nội bộ.
  6. Log deploy ghi rõ commit SHA, người approve và thời điểm.
  7. Không có secret trong repository, artifact hoặc log.

Kết luận: CI/CD không cần phức tạp ngay từ đầu. Hãy bắt đầu bằng CI kiểm build/test, sau đó thêm staging deploy, rồi mới cân nhắc production deploy có approval. Làm theo lộ trình này, team nhỏ vẫn có thể deploy chuyên nghiệp mà không tự tạo thêm rủi ro.

Nguồn tham khảo

  1. GitHub Docs: Actions
  2. GitHub Docs: Continuous integration
  3. GitHub Docs: Continuous deployment
  4. GitHub Docs: Building and testing Node.js
  5. GitHub Docs: Caching dependencies to speed up workflows

Các câu hỏi thường gặp

CI/CD có miễn phí không?

Actions có quota tùy loại tài khoản và repository. Với website nhỏ, nhu cầu build/test thường không quá lớn, nhưng bạn vẫn nên theo dõi usage nếu pipeline chạy nhiều hoặc build nặng.

Website WordPress có dùng CI/CD được không?

Có. WordPress có thể dùng CI/CD cho theme, plugin, asset build, kiểm PHP lint và deploy qua SSH hoặc rsync. Tuy nhiên database và uploads cần quy trình riêng, không nên deploy như source code thông thường.

Có nên deploy thẳng production khi push main không?

Chỉ nên làm khi pipeline ổn định, test đủ, có rollback và team hiểu rõ rủi ro. Với website quan trọng, mình khuyên dùng staging trước và production có approval gate.

Cache dependency có làm pipeline sai kết quả không?

Có thể nếu cache key thiết kế sai hoặc dependency lockfile không được dùng đúng. Với Node.js, hãy ưu tiên lockfile và dùng cache theo package manager chính thức.

CI/CD có thay thế review code không?

Không. CI/CD giúp kiểm tự động và deploy nhất quán, nhưng review code vẫn cần để kiểm logic, trải nghiệm, bảo mật và thay đổi nghiệp vụ.

Bạn có thể bắt đầu bằng một workflow chỉ build và test pull request trong tuần này. Khi nó ổn định, hãy thêm staging deploy. Đó là bước nhỏ nhưng thay đổi lớn trong cách team kiểm soát website.

Tú Anh

Cây bút chính tại VietnamTutor

Bài viết cùng chuyên mục

.gitignore không hoạt động: nguyên nhân và cách sửa

Bài viết giúp bạn kiểm tra vì sao .gitignore không hoạt động, sửa lỗi file đã tracked và dùng git check-ignore để debug pattern.

Git push bị rejected: cách sửa non-fast-forward

Bài viết giải thích vì sao git push bị rejected, cách đọc lỗi non-fast-forward và quy trình xử lý an toàn trước khi push lại.

Git reset revert restore: chọn lệnh đúng

Bài viết so sánh git reset, git revert và git restore theo mục đích sử dụng: sửa staging area, khôi phục file, undo commit chưa push

Git commit vào nhánh sai: cách chuyển an toàn

Bài viết hướng dẫn xử lý git commit vào nhánh sai theo từng tình huống: commit chưa push, đã push, nhiều commit liên tiếp hoặc branch

TypeScript cho website doanh nghiệp: API, form và lỗi

TypeScript cho website doanh nghiệp đáng dùng khi bạn cần kiểm soát API contract, form schema, CMS payload và cấu hình môi trường. Bài này giúp

React Server Components performance: khi nào nên dùng?

React Server Components performance không phải phép màu. Bài này giúp bạn biết khi nào RSC giảm JavaScript thật, khi nào làm kiến trúc phức tạp

Git commit nhầm file: bỏ file khỏi commit an toàn

Bài viết hướng dẫn xử lý git commit nhầm file theo từng tình huống: chưa commit, đã commit chưa push, đã push lên remote, hoặc lỡ

Git reflog: khôi phục commit đã mất an toàn

Bài viết hướng dẫn dùng git reflog để khôi phục commit đã mất sau reset, rebase, amend hoặc xóa nhánh. Bạn sẽ biết cách đọc reflog,

Git pull bị conflict: cách sửa không mất code

Bài viết hướng dẫn cách xử lý git pull bị conflict theo từng bước: kiểm tra trạng thái, sửa file xung đột, test lại và hoàn

Next.js production performance: chọn SSR, SSG, ISR hay Edge

Bài viết giúp developer và tech lead chọn cách render phù hợp để tối ưu Next.js production performance mà không làm kiến trúc phức tạp quá

Nâng cấp Laravel 13: Checklist 10 bước cần kiểm tra

Hướng dẫn nâng cấp Laravel 13 chi tiết với checklist 10 bước. Từ kiểm tra PHP 8.3, cập nhật dependencies, đến xử lý lỗi thường gặp

Hardening Laravel production: Checklist bảo mật cần làm

Checklist hardening Laravel production toàn diện. Từ cấu hình server, database, SSL đến security headers, rate limiting và monitoring.