Tạm biệt "Deploy bằng tay": Làm chủ quy trình CI/CD với GitHub Actions từ con số 0
Chào anh em Viblo!
Nếu anh em đã từng đi qua cái thời kỳ "nguyên thủy" của việc đưa code lên server: Nào là nén file zip, dùng FileZilla đẩy code qua FTP, hay khá hơn chút là SSH vào server gõ lệnh git pull, chạy build rồi khởi động lại service... thì chắc chắn anh em đều hiểu cảm giác tim đập chân run mỗi lần deploy. Sai một dấu phẩy, quên một biến môi trường (Environment Variable) là nguyên con server lăn đùng ra chết giữa đêm.
Để giải quyết bài toán "code chạy ngon trên máy em nhưng toang trên server", thế giới sinh ra khái niệm CI/CD. Và hôm nay, chúng ta sẽ cùng mổ xẻ cách xây dựng một luồng CI/CD tự động hóa hoàn toàn bằng GitHub Actions – một công cụ "hàng nhà trồng" cực kỳ bá đạo của GitHub.
1. CI/CD rốt cuộc là cái quái gì?
Đừng để mấy thuật ngữ tiếng Anh làm anh em rối trí. Hãy hiểu đơn giản thế này:
- CI (Continuous Integration - Tích hợp liên tục): Là lúc anh em code xong, gõ git push đẩy code lên nhánh main. Ngay lập tức, một con bot sẽ tự động nhảy vào kéo code của anh em về, cài đặt thư viện, và chạy toàn bộ Unit Test. Nếu code có lỗi, nó sẽ báo đỏ chót và chặn không cho đi tiếp. Bước này đảm bảo code mới không "đá" code cũ.
- CD (Continuous Deployment - Triển khai liên tục): Sau khi con bot CI báo "Pass test", một con bot khác sẽ lấy cục code sạch sẽ đó, build ra bản chạy cuối cùng (ví dụ đóng gói thành Docker Image) và đẩy thẳng lên Server Production rồi khởi động lại hệ thống.
Anh em chỉ việc push code và đi pha tách cà phê, mọi thứ còn lại hệ thống tự lo.
2. Tại sao lại là GitHub Actions?
Trước đây, để làm CI/CD, chúng ta thường phải dựng một con server Jenkins riêng (cấu hình lằng nhằng, cài plugin mệt nghỉ) hoặc dùng CircleCI, TravisCI.
Nhưng từ khi GitHub Actions ra mắt, nó thay đổi hoàn toàn cuộc chơi:
- Tích hợp sẵn: Không cần cài đặt server hay liên kết tài khoản bên thứ ba. Nó nằm ngay trong tab "Actions" trên repo GitHub của bạn.
- Miễn phí: Cho các private repo (với giới hạn số phút chạy khá hào phóng) và hoàn toàn miễn phí cho open-source.
- Hệ sinh thái khủng: Bạn cần deploy lên AWS? Cần gửi thông báo qua Telegram? Cần build ảnh Docker? Tất cả đều có sẵn các "Action" (script viết sẵn) trên chợ ứng dụng của GitHub, chỉ việc copy về xài.
3. "Giải phẫu" một Workflow GitHub Actions thực tế
Để hệ thống hoạt động, bạn chỉ cần tạo một file .yml nằm trong thư mục .github/workflows/ của dự án.
Giả sử chúng ta đang xây dựng một hệ thống backend đòi hỏi xử lý đồng thời (concurrency) cao bằng Golang, dưới đây là một kịch bản CI/CD chuẩn mực:
name: Backend Go CI/CD Pipeline
# 1. Định nghĩa "Cò súng" (Trigger): Khi nào thì chạy?
on:
push:
branches:
- main # Chỉ chạy khi có code mới đẩy lên nhánh main
# 2. Các công việc cần làm (Jobs)
jobs:
# Bước CI: Build và Test
build-and-test:
runs-on: ubuntu-latest # Chạy trên máy ảo Ubuntu do GitHub cấp
steps:
# Lấy code từ repo về máy ảo
- name: Checkout Source Code
uses: actions/checkout@v3
# Cài đặt môi trường Golang
- name: Setup Go
uses: actions/setup-go@v4
with:
go-version: '1.21'
# Cài thư viện và chạy Test
- name: Install Dependencies
run: go mod download
- name: Run Unit Tests
run: go test -v ./...
# Bước CD: Deploy lên Server (Chỉ chạy khi CI thành công)
deploy-to-server:
needs: build-and-test # Điều kiện ràng buộc
runs-on: ubuntu-latest
steps:
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/my-go-backend
git pull origin main
go build -o server .
systemctl restart go-backend
4. Những "Bí kíp sinh tồn" khi setup GitHub Actions
Nhìn đoạn code trên thì có vẻ dễ, nhưng khi mang vào thực chiến, anh em cần lưu ý những điểm "chết người" sau:
- Tuyệt đối không hard-code thông tin nhạy cảm: Mật khẩu server, IP database, API Keys... KHÔNG bao giờ được ghi thẳng vào file .yml. Hãy lưu chúng vào mục Settings > Secrets and variables > Actions trên GitHub. Trong code, gọi nó ra bằng cú pháp ${{ secrets.TEN_BIEN }}. Điều này giúp bảo mật tuyệt đối, dù repo có bị lộ cũng không ai lấy được key của bạn.
- Bài toán tốc độ - Đừng quên Caching (Bộ nhớ đệm): Mỗi lần chạy Workflow, GitHub sẽ cấp cho bạn một cái máy ảo mới tinh. Nếu dự án của bạn (ví dụ Node.js với thư mục node_modules khổng lồ) cứ tải đi tải lại hàng ngàn thư viện thì việc build sẽ mất đến cả chục phút. Hãy sử dụng action actions/cache để lưu lại các thư viện này, lần sau build sẽ nhanh như chớp.Chia nhỏ và cô lập (Isolation): Đừng nhồi nhét mọi thứ vào một file duy nhất. Hãy chia ra: một workflow chạy khi tạo Pull Request (chỉ chạy Test để review), và một workflow khác chạy khi Merge vào main (tiến hành Deploy).
Lời kết
Việc thiết lập CI/CD bằng GitHub Actions ban đầu có thể khiến anh em tốn một vài giờ để mày mò, đọc log lỗi, và sửa file YAML. Nhưng giá trị nó mang lại là một sự an tâm tuyệt đối trong suốt vòng đời dự án. Máy móc không bao giờ biết mệt mỏi, không bao giờ gõ nhầm lệnh và luôn tuân thủ đúng quy trình.
Anh em đang dùng luồng CI/CD nào cho dự án của mình? Hãy cùng chia sẻ cấu hình xịn xò nhất của anh em ở phần bình luận bên dưới nhé! Happy coding!
All Rights Reserved