CI/CD Pipelines với GitHub Actions và Docker: Hướng Dẫn Triển Khai Tự Động Từ A-Z

3 min read

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 Hub
  • DOCKER_PASSWORD: mật khẩu Docker Hub
  • SSH_HOST: IP hoặc domain của server
  • SSH_USER: user để ssh vào server
  • SSH_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:

https://dev.to/dhaval_upadhyay_30f8292a8/upload-docker-code-using-cicd-pipeline-of-github-action-549g

Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *