Xây Dựng CI/CD Pipeline cho Ứng Dụng Go với Docker và GitHub Actions

21 tháng 05, 2025 - 13 lượt xem

Giới thiệu

Trong bài viết này, chúng ta sẽ tìm hiểu cách xây dựng một pipeline CI/CD hoàn chỉnh cho một ứng dụng web Go đơn giản. Pipeline này sẽ tự động build, test, và deploy ứng dụng lên một EC2 instance thông qua Docker và GitHub Actions.

1. Ứng dụng Go

Ứng dụng của chúng ta là một web server đơn giản được xây dựng bằng framework Gin:

package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{
            "message": "Hello from Go Web App on Docker!",
        })
    })
    r.Run(":8080")
}

Ứng dụng này:

  • Sử dụng Gin framework để xử lý HTTP requests
  • Có một endpoint đơn giản trả về JSON response
  • Chạy trên port 8080

2. Dockerfile

Chúng ta sử dụng multi-stage build để tối ưu kích thước image:

# Build stage
FROM golang:1.24.3 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .

# Final stage
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]

Dockerfile này:

  • Sử dụng multi-stage build để giảm kích thước image cuối cùng
  • Stage đầu tiên build ứng dụng Go
  • Stage thứ hai chỉ chứa binary đã build và chạy ứng dụng
  • Sử dụng Alpine Linux làm base image cho stage cuối

3. GitHub Actions Workflow

Workflow CI/CD được định nghĩa trong .github/workflows/deploy.yml:

Trigger

on:
  push:
    branches:
      - main

Workflow sẽ chạy mỗi khi có push vào nhánh main.

Các bước trong workflow:

  1. Checkout code

    • Sử dụng action actions/checkout@v4 để lấy code
  2. Setup Docker Buildx

    • Cấu hình Docker Buildx để build image
  3. Login to Docker Hub

    • Đăng nhập vào Docker Hub để push image
    • Sử dụng secrets để bảo mật thông tin đăng nhập
  4. Build và Push Docker Image

    • Build image với tag latest
    • Push image lên Docker Hub
  5. Deploy to EC2

    • Sử dụng SSH action để kết nối tới EC2 instance
    • Cài đặt Docker và Nginx nếu chưa có
    • Cấu hình Nginx làm reverse proxy
    • Pull và chạy container mới
    • Dọn dẹp các image cũ

4. Cấu hình Nginx

Nginx được cấu hình làm reverse proxy:

server {
    listen 80;
    server_name _;

    location / {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

5. Các Secrets cần thiết

Để workflow hoạt động, bạn cần cấu hình các secrets sau trong GitHub repository:

  • DOCKER_USERNAME: Username Docker Hub
  • DOCKER_PASSWORD: Password Docker Hub
  • EC2_HOST: IP hoặc hostname của EC2 instance
  • SSH_PRIVATE_KEY: Private key để SSH vào EC2
Github Actions secrets and variables
Github Actions secrets and variables

Kết luận

Pipeline CI/CD này cung cấp một giải pháp hoàn chỉnh để tự động hóa quá trình build và deploy ứng dụng Go. Mỗi khi có thay đổi được push lên nhánh main, GitHub Actions sẽ tự động:

  1. Build ứng dụng
  2. Tạo Docker image
  3. Push image lên Docker Hub
  4. Deploy lên EC2 instance
  5. Cấu hình Nginx làm reverse proxy

Điều này giúp quá trình phát triển và triển khai ứng dụng trở nên nhanh chóng và đáng tin cậy hơn.

Bình luận

avatar
Trịnh Minh Cường 2025-05-21 08:25:19.666471 +0000 UTC

Chưa có Github Workflow

Avatar
* Vui lòng trước khi bình luận.
Ảnh đại diện
  0 Thích
0