Go项目CI/CD全流程:从GitHub Actions到K8s部署

一、整体流程概览
graph LR
A[代码提交] --> B[GitHub Actions]
B --> C{自动化测试}
C -- 通过 --> D[构建Docker镜像]
D --> E[推送至镜像仓库]
E --> F[部署到K8s集群]
C -- 失败 --> G[通知开发者]

二、核心步骤详解
  1. GitHub Actions配置

    name: Go CI/CD
    on: [push]
    
    jobs:
      test:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v4
        - name: Setup Go
          uses: actions/setup-go@v4
          with:
            go-version: '1.21'
        - name: Run Tests
          run: go test -v ./...
    
      build-push:
        needs: test
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v4
        - name: Build Docker Image
          run: docker build -t ${{ secrets.DOCKER_USER }}/go-app:${{ github.sha }} .
        - name: Push to Docker Hub
          run: |
            echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USER }} --password-stdin
            docker push ${{ secrets.DOCKER_USER }}/go-app:${{ github.sha }}
    
      deploy:
        needs: build-push
        runs-on: ubuntu-latest
        steps:
        - name: Deploy to Kubernetes
          uses: azure/k8s-deploy@v4
          with:
            namespace: production
            manifests: k8s/deployment.yaml
            images: |
              ${{ secrets.DOCKER_USER }}/go-app:${{ github.sha }}
            kubeconfig: ${{ secrets.KUBE_CONFIG }}
    

  2. Dockerfile示例

    # 构建阶段
    FROM golang:1.21-alpine AS builder
    WORKDIR /app
    COPY . .
    RUN CGO_ENABLED=0 GOOS=linux go build -o /bin/app
    
    # 运行阶段
    FROM alpine:latest
    COPY --from=builder /bin/app /app
    EXPOSE 8080
    ENTRYPOINT ["/app"]
    

  3. Kubernetes部署文件 (k8s/deployment.yaml)

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: go-app
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: go-app
      template:
        metadata:
          labels:
            app: go-app
        spec:
          containers:
          - name: go-app
            image: <DOCKER_USER>/go-app:<IMAGE_TAG>  # GitHub Actions自动替换
            ports:
            - containerPort: 8080
            resources:
              limits:
                cpu: "500m"
                memory: "512Mi"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: go-app-service
    spec:
      selector:
        app: go-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: LoadBalancer
    

三、关键配置说明
  1. GitHub Secrets配置

    • DOCKER_USER: Docker Hub用户名
    • DOCKER_PASSWORD: Docker Hub密码
    • KUBE_CONFIG: Base64编码的kubeconfig文件
  2. 镜像版本策略

    • 使用Git Commit SHA作为唯一标签:${{ github.sha }}
    • 部署时自动替换YAML中的<IMAGE_TAG>
  3. 安全最佳实践

    • 使用Kubernetes RBAC限制部署权限
    • 镜像仓库使用私有仓库
    • 敏感信息全部通过Secrets传递
四、完整工作流示例
  1. 开发者推送代码到main分支
  2. GitHub Actions自动触发:
    • 运行Go单元测试
    • 构建多阶段Docker镜像
    • 推送镜像到Docker Hub
    • 更新Kubernetes集群的Deployment
  3. Kubernetes滚动更新:
    • 创建新Pod(使用新镜像)
    • 逐步终止旧Pod
    • Service自动负载均衡到新Pod
五、故障排查要点
  1. 测试失败:检查Go测试覆盖率
    go test -coverprofile=coverage.out ./...
    

  2. 镜像构建失败:检查Docker多阶段构建日志
  3. 部署失败:查看Kubernetes事件
    kubectl describe pod -l app=go-app
    kubectl logs <pod-name>
    

注意:实际部署时需根据集群环境调整Service类型(LoadBalancer/NodePort)和资源限制参数。建议添加健康检查探针和HPA自动扩缩容配置。

更多推荐