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:
Checkout code
- Sử dụng action
actions/checkout@v4
để lấy code
- Sử dụng action
Setup Docker Buildx
- Cấu hình Docker Buildx để build image
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
Build và Push Docker Image
- Build image với tag latest
- Push image lên Docker Hub
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 HubDOCKER_PASSWORD
: Password Docker HubEC2_HOST
: IP hoặc hostname của EC2 instanceSSH_PRIVATE_KEY
: Private key để SSH vào EC2
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:
- Build ứng dụng
- Tạo Docker image
- Push image lên Docker Hub
- Deploy lên EC2 instance
- 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
Chưa có Github Workflow