CI/CD với GitHub Actions: Tự động Build & Push Docker Image Redis + Elasticsearch + Backend

Tự động build và push Docker image Redis + Elasticsearch + Backend lên Docker Hub bằng GitHub Actions.

Phần 5: CI/CD với GitHub Actions – Build & Push Docker Image chứa Redis + Elasticsearch + Backend

Tóm tắt: Trong phần trước, chúng ta đã gộp Redis, Elasticsearch và Backend vào một Docker image duy nhất. Giờ là lúc biến quá trình build đó thành một chuỗi CI/CD tự động – mỗi lần bạn push code mới lên GitHub, image sẽ được build và đẩy lên Docker Hub tự động.

1. Mục tiêu

  • Tự động build Docker image từ code repo
  • Tự động push lên Docker Hub sau mỗi lần push/pull request
  • Không cần build bằng tay nữa

2. Điều kiện cần

  • Có tài khoản Docker Hub
  • Có tài khoản GitHub
  • Đã có Dockerfile chuẩn từ các phần trước

3. Tạo GitHub Secrets

  1. Vào GitHub repo của bạn
  2. Chọn Settings > Secrets and variables > Actions
  3. Nhấn New repository secret và tạo:
    • DOCKERHUB_USERNAME – tên tài khoản Docker Hub
    • DOCKERHUB_TOKEN – token truy cập (lấy ở Docker Hub > Security)

4. Tạo file GitHub Actions

Tạo file .github/workflows/docker-publish.yml với nội dung:

name: Build and Push Docker Image

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

jobs:
  build-and-push:
    runs-on: ubuntu-latest

    steps:
      - name: Check out the repository
        uses: actions/checkout@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ secrets.DOCKERHUB_USERNAME }}/allinone-backend:latest

5. Cấu trúc repo chuẩn

your-repo/
├── .github/
│   └── workflows/
│       └── docker-publish.yml
├── Dockerfile
├── index.js
├── package.json
├── supervisord.conf
├── elasticsearch.yml

6. Kiểm tra kết quả

  • Mỗi khi bạn push lên nhánh main, GitHub sẽ tự động:
    1. Checkout code
    2. Login Docker Hub
    3. Build Dockerfile
    4. Push image mới lên Docker Hub
  • Truy cập Docker Hub → Repositories để thấy image mới

7. (Tùy chọn) Gắn tag theo Git commit

Nếu muốn tự động gắn tag theo hash commit hoặc version, bạn có thể chỉnh lại như sau:

tags: ${{ secrets.DOCKERHUB_USERNAME }}/allinone-backend:latest, ${{ secrets.DOCKERHUB_USERNAME }}/allinone-backend:${{ github.sha }}

8. Tổng kết

Bạn đã thiết lập CI/CD chuẩn devops: cứ mỗi lần cập nhật code, Docker image sẽ được build và xuất hiện trên Docker Hub hoàn toàn tự động. Từ đây, bạn có thể dùng image đó để deploy sang staging, production hoặc local nhanh gọn hơn rất nhiều.

🔥 Tiếp theo (gợi ý): Làm phần deploy từ image đó lên VPS hoặc dùng trong Kubernetes.


Blog: www.baotrongit.com

Xin chào! Mình là BaoTrongIT – một lập trình viên đam mê chia sẻ kiến thức lập trình, đặc biệt là về JavaScript, Node.js, NestJS, và các công nghệ backend/frontend hiện đại. Trên blog này, mình thường xuyên đăng tải các bài viết thủ thuật, kinh nghiệm thực chiến, ví dụ minh họa dễ hiểu, giúp bạn tiếp cận và hiểu sâu các khái niệm tưởng như phức tạp trong lập trình.