Go项目CI/CD全流程:从GitHub Actions到K8s部署
·
Go项目CI/CD全流程:从GitHub Actions到K8s部署
一、整体流程概览
graph LR
A[代码提交] --> B[GitHub Actions]
B --> C{自动化测试}
C -- 通过 --> D[构建Docker镜像]
D --> E[推送至镜像仓库]
E --> F[部署到K8s集群]
C -- 失败 --> G[通知开发者]
二、核心步骤详解
-
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 }} -
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"] -
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
三、关键配置说明
-
GitHub Secrets配置
DOCKER_USER: Docker Hub用户名DOCKER_PASSWORD: Docker Hub密码KUBE_CONFIG: Base64编码的kubeconfig文件
-
镜像版本策略
- 使用Git Commit SHA作为唯一标签:
${{ github.sha }} - 部署时自动替换YAML中的
<IMAGE_TAG>
- 使用Git Commit SHA作为唯一标签:
-
安全最佳实践
- 使用Kubernetes RBAC限制部署权限
- 镜像仓库使用私有仓库
- 敏感信息全部通过Secrets传递
四、完整工作流示例
- 开发者推送代码到main分支
- GitHub Actions自动触发:
- 运行Go单元测试
- 构建多阶段Docker镜像
- 推送镜像到Docker Hub
- 更新Kubernetes集群的Deployment
- Kubernetes滚动更新:
- 创建新Pod(使用新镜像)
- 逐步终止旧Pod
- Service自动负载均衡到新Pod
五、故障排查要点
- 测试失败:检查Go测试覆盖率
go test -coverprofile=coverage.out ./... - 镜像构建失败:检查Docker多阶段构建日志
- 部署失败:查看Kubernetes事件
kubectl describe pod -l app=go-app kubectl logs <pod-name>
注意:实际部署时需根据集群环境调整Service类型(LoadBalancer/NodePort)和资源限制参数。建议添加健康检查探针和HPA自动扩缩容配置。
更多推荐
所有评论(0)