Giới thiệu
Khi phát triển phần mềm ở quy mô lớn, việc tự động hóa quy trình build, test và deploy là yếu tố sống còn để đảm bảo tốc độ phát triển và chất lượng sản phẩm. Đó chính là lý do CI/CD trở thành một phần không thể thiếu trong mọi quy trình DevOps hiện đại.
Bài viết này sẽ hướng dẫn chi tiết cách xây dựng CI/CD pipeline sử dụng GitHub Actions và Docker. Từ việc cấu hình GitHub Actions cho đến cách build, push Docker image và triển khai lên server – bạn sẽ có một pipeline hoàn chỉnh để đưa ứng dụng vào production một cách tự động và an toàn.
CI/CD là gì?
- CI (Continuous Integration): Tích hợp liên tục – mọi thay đổi trong mã nguồn sẽ được kiểm thử tự động ngay khi push lên repository.
- CD (Continuous Deployment/Delivery): Triển khai liên tục – các thay đổi sau khi qua kiểm thử sẽ được tự động triển khai lên môi trường staging hoặc production.
Mục tiêu của CI/CD là giúp đội ngũ:
- Phát hiện lỗi sớm hơn
- Giảm rủi ro khi deploy
- Tăng tốc độ phát hành phiên bản mới
Tại sao chọn GitHub Actions và Docker?

GitHub Actions
GitHub Actions là công cụ tích hợp sẵn trong GitHub, cho phép bạn tạo workflow tự động:
- Không cần cài đặt thêm công cụ CI như Jenkins hay CircleCI
- Hỗ trợ nhiều ngôn ngữ và môi trường
- Có cộng đồng lớn với hàng ngàn action sẵn dùng
Docker
Docker giúp bạn đóng gói ứng dụng cùng với môi trường chạy, giúp:
- Tạo môi trường nhất quán ở mọi máy và mọi server
- Dễ dàng quản lý version
- Tăng tính linh hoạt khi deploy
Sự kết hợp giữa Docker + GitHub Actions sẽ mang lại một quy trình CI/CD đơn giản nhưng mạnh mẽ.
Cấu trúc repository mẫu
.
├── .github/
│ └── workflows/
│ └── ci-cd.yml # File định nghĩa pipeline CI/CD
├── app/
│ └── main.py # Mã nguồn ứng dụng (ví dụ Python)
├── Dockerfile # Dockerfile để build image
└── README.md
Viết GitHub Actions workflow cho CI/CD
name: CI/CD Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
- name: Build Docker image
run: docker build -t yourdockerhubuser/yourapp:${{ github.sha }} .
- name: Push Docker image
run: docker push yourdockerhubuser/yourapp:${{ github.sha }}
- name: Deploy to VPS
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
docker pull yourdockerhubuser/yourapp:${{ github.sha }}
docker stop yourapp || true
docker rm yourapp || true
docker run -d --name yourapp -p 80:80 yourdockerhubuser/yourapp:${{ github.sha }}
Cấu hình GitHub Secrets:
Bạn cần thêm các thông tin sau vào GitHub repository:
DOCKER_USERNAME
: tài khoản Docker HubDOCKER_PASSWORD
: mật khẩu Docker HubSSH_HOST
: IP hoặc domain của serverSSH_USER
: user để ssh vào serverSSH_KEY
: SSH private key (không có passphrase)
Truy cập: Settings > Secrets and variables > Actions → New repository secret
Thêm bước kiểm thử tự động (Unit Test)
Ví dụ nếu bạn dùng Python và pytest:
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run tests
run: pytest tests/
Thêm các bước này trước khi build Docker image, để đảm bảo chỉ build khi code qua kiểm thử.
Triển khai tự động với Docker
Trên server của bạn cần:
- Đã cài đặt Docker
- Cho phép SSH key từ GitHub Actions
- Có sẵn cấu hình firewall cho cổng 80/443 (nếu deploy web)
Bạn có thể thay đoạn deploy bằng bất kỳ công cụ khác như Ansible, Kubernetes, AWS ECS, hoặc thậm chí CapRover.
Tối ưu CI/CD pipeline
1. Tối ưu tốc độ build
- Sử dụng Docker layer caching
- Tách nhỏ Dockerfile thành nhiều lớp hợp lý
- Dùng Alpine hoặc base image nhẹ hơn
2. Triển khai nhiều môi trường
on:
push:
branches:
- main # deploy production
- staging # deploy staging
3. Gửi thông báo sau khi deploy
Bạn có thể tích hợp Slack, Discord hoặc Email:
- name: Notify on Slack
uses: slackapi/slack-github-action@v1.24.0
with:
payload: '{"text":"Deploy thành công phiên bản mới!"}'
Kết luận:
Sự kết hợp giữa CI/CD, GitHub Actions và Docker là giải pháp đơn giản, dễ tiếp cận nhưng rất mạnh mẽ cho bất kỳ team phát triển nào. Bằng cách tự động hóa quy trình kiểm thử, build và triển khai, bạn sẽ tiết kiệm được thời gian, giảm thiểu lỗi sản xuất, và tăng tốc độ release sản phẩm.
Hãy bắt đầu từ pipeline đơn giản, sau đó từng bước mở rộng để phù hợp với nhu cầu riêng của bạn.
Nguồn tham khảo: