CI/CD 自动化部署完全指南(一):方案概述与架构设计

DevOps Automator··13 min read·评论

CI/CD 自动化部署完全指南(一):方案概述与架构设计

从手工部署到自动化部署的蜕变之路

为什么需要 CI/CD 自动化?

相信很多团队都经历过这样的痛苦:

  • 每次发布都要手动操作 30-60 分钟 😰
  • 凌晨 2 点发布,手抖输错命令导致线上故障 💥
  • 回滚需要 10-30 分钟,用户投诉如雪片般飞来 📞
  • 没有监控,用户告诉你系统挂了才发现问题 🚨

自动化 CI/CD 能解决这些问题!

对比项 手工部署 自动化 CI/CD
部署时间 30-60 分钟 5-10 分钟
出错概率 高(人为失误) 极低(自动化)
回滚速度 10-30 分钟 10 秒
停机时间 有(5-10 分钟) 零停机
监控覆盖 无或有限 全方位监控

方案概述

本系列将带你从零构建一个企业级 CI/CD 自动化部署方案,包含:

全自动化流程 - 从代码提交到生产部署,无需人工干预
蓝绿部署 - 零停机时间,秒级回滚
安全扫描 - 代码质量、依赖漏洞、镜像安全三层防护
多环境管理 - 开发、测试、生产环境自动化管理
全方位监控 - 应用性能、基础设施、业务指标全流程监控
告警通知 - 多渠道告警(Slack/邮件/钉钉)

技术栈选型

组件 技术 用途
CI/CD 平台 GitHub Actions 自动化流水线
容器化 Docker + Docker Compose 应用容器化
部署策略 蓝绿部署 (Blue-Green) 零停机发布
负载均衡 Nginx 流量切换
监控 Prometheus + Grafana 指标采集与展示
日志 Loki 日志聚合
告警 AlertManager 告警管理

为什么选择这些技术?

  • GitHub Actions:免费、易用、与 GitHub 深度集成
  • Docker + Docker Compose:轻量级、易上手、适合中小项目
  • 蓝绿部署:实现简单、零停机、回滚快速
  • Prometheus + Grafana:业界标准监控组合,生态丰富

架构设计

整体架构图

┌─────────────────────────────────────────────────────────────┐
│                        Git 仓库                             │
│  (main 分支 / develop 分支 / PR)                           │
└────────────────┬────────────────────────────────────────────┘
                 │ git push

┌─────────────────────────────────────────────────────────────┐
│                   GitHub Actions                            │
│  ┌──────────┬──────────┬──────────┬──────────┐            │
│  │ 代码检查  │  单元测试  │  Docker  │  部署    │            │
│  │ 和安全扫描 │          │  构建    │          │            │
│  └──────────┴──────────┴──────────┴──────────┘            │
└────────────────┬────────────────────────────────────────────┘
                 │ 推送镜像

┌─────────────────────────────────────────────────────────────┐
│                   镜像仓库 (阿里云 ACR)                      │
│  your-app:main-abc123                                     │
│  your-app:develop-xyz789                                  │
└────────────────┬────────────────────────────────────────────┘
                 │ 拉取镜像

┌─────────────────────────────────────────────────────────────┐
│              生产服务器 (蓝绿部署)                          │
│  ┌─────────────┐         ┌─────────────┐                  │
│  │  蓝环境      │         │  绿环境      │                  │
│  │  (当前生产)  │ ◄────► │  (新版本)    │                  │
│  │  :3000      │  流量切换 │  :3001      │                  │
│  └─────────────┘         └─────────────┘                  │
│         │                       │                           │
│         └───────────┬───────────┘                           │
│                     ▼                                       │
│              ┌─────────────┐                                │
│              │   Nginx     │                                │
│              │  反向代理    │                                │
│              └──────┬──────┘                                │
│                     │                                        │
│                     ▼                                        │
│              ┌─────────────┐                                │
│              │   用户流量   │                                │
│              └─────────────┘                                │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│                  监控告警系统                                │
│  ┌──────────┬──────────┬──────────┬──────────┐            │
│  │Prometheus│ Grafana  │  Loki    │AlertManager│          │
│  │(指标采集) │ (可视化) │  (日志)  │  (告警)   │            │
│  └──────────┴──────────┴──────────┴──────────┘            │
└─────────────────────────────────────────────────────────────┘

核心流程详解

1️⃣ 开发人员提交代码

# 功能开发
git checkout -b feature/new-feature
# ... 开发 ...
git commit -m "feat: 添加新功能"
git push origin feature/new-feature
 
# 创建 Pull Request
# GitHub Actions 自动运行:代码检查 → 测试 → 构建镜像

2️⃣ GitHub Actions 自动化流水线

流水线分为 5 个阶段:

阶段 1: 代码质量检查

  • ESLint 代码规范检查
  • npm audit 依赖漏洞扫描
  • 依赖许可合规性检查

阶段 2: 自动化测试

  • 单元测试(Jest)
  • 集成测试
  • 测试覆盖率报告

阶段 3: 构建与推送

  • Docker 多阶段构建(减小镜像体积)
  • Trivy 镜像安全扫描
  • 推送到镜像仓库

阶段 4: 自动部署

  • 开发环境(自动部署)
  • 测试环境(自动或手动)
  • 生产环境(手动审批 + 蓝绿部署)

阶段 5: 健康检查

  • 服务健康检测
  • 自动化冒烟测试
  • 失败时自动回滚

3️⃣ 蓝绿部署详解**

这是本方案的核心亮点!

什么是蓝绿部署?

简单来说,就是同时保持两个生产环境:

  • 蓝环境:当前正在服务的生产版本
  • 绿环境:新版本,准备接管流量

部署流程

  1. 部署新版本到绿环境

    # 拉取新版本镜像
    docker pull your-app:main-abc123
     
    # 启动绿环境容器
    docker run -d --name your-app-green -p 3001:3000 your-app:main-abc123
     
    # 等待服务启动
    sleep 15
     
    # 健康检查
    curl -f http://localhost:3001/health || exit 1
  2. 验证绿环境

    # 自动化冒烟测试
    curl http://localhost:3001/api/health
    curl http://localhost:3001/api/version
    # ... 更多验证 ...
  3. 切换流量(秒级完成)

    # 修改 Nginx 配置,指向绿环境
    cp /etc/nginx/conf.d/green.conf /etc/nginx/conf.d/active.conf
     
    # 重载 Nginx(无需停机)
    nginx -s reload
  4. 停止蓝环境

    # 绿环境运行正常,停止蓝环境
    docker stop your-app-blue
     
    # 重命名容器(为下次部署准备)
    docker rename your-app-green your-app-blue

回滚流程(如果绿环境出问题):

# 秒级回滚:切换回蓝环境
cp /etc/nginx/conf.d/blue.conf /etc/nginx/conf.d/active.conf
nginx -s reload
 
# 停止绿环境
docker stop your-app-green

蓝绿部署的优势

零停机时间 - 流量切换只需几秒
秒级回滚 - 出现问题时立即恢复
易于验证 - 绿环境可以充分测试后再切换
风险可控 - 蓝环境一直保持可用状态


流水线配置详解

GitHub Actions 流水线(核心代码片段)

name: CI/CD Pipeline
 
on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]
 
jobs:
  # Job 1: 代码质量检查和安全扫描
  security-and-quality:
    runs-on: ubuntu-latest
    steps:
      - name: 检出代码
        uses: actions/checkout@v3
 
      - name: 代码 Lint 检查
        run: npm run lint
 
      - name: 安全漏洞扫描
        run: npm audit --audit-level=high
 
  # Job 2: 自动化测试
  test:
    needs: security-and-quality
    runs-on: ubuntu-latest
    steps:
      - name: 运行单元测试
        run: npm test
 
      - name: 上传测试覆盖率
        uses: actions/upload-artifact@v3
        with:
          name: coverage-report
          path: coverage/
 
  # Job 3: 构建 Docker 镜像
  build:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - name: 构建并推送镜像
        uses: docker/build-push-action@v4
        with:
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
 
      - name: 镜像安全扫描
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: ${{ steps.meta.outputs.tags }}
          severity: 'CRITICAL,HIGH'
 
  # Job 4: 部署到生产环境(蓝绿部署)
  deploy-prod:
    needs: build
    if: github.ref == 'refs/heads/main'
    environment:
      name: production
      url: https://your-domain.com
    steps:
      - name: 蓝绿部署 - 准备新版本
        uses: appleboy/ssh-action@v0.1.5
        with:
          host: ${{ secrets.PROD_SERVER_HOST }}
          username: ${{ secrets.PROD_SERVER_USER }}
          key: ${{ secrets.PROD_SERVER_SSH_KEY }}
          script: |
            # 拉取新版本镜像
            docker pull ${{ needs.build.outputs.image-tag }}
            
            # 启动新版本容器(绿环境)
            docker stop your-app-green || true
            docker rm your-app-green || true
            docker run -d --name your-app-green \
              -p 3001:3000 \
              ${{ needs.build.outputs.image-tag }}
            
            # 健康检查
            sleep 15
            curl -f http://localhost:3001/health || exit 1
 
      - name: 蓝绿部署 - 切换流量
        uses: appleboy/ssh-action@v0.1.5
        with:
          host: ${{ secrets.PROD_SERVER_HOST }}
          username: ${{ secrets.PROD_SERVER_USER }}
          key: ${{ secrets.PROD_SERVER_SSH_KEY }}
          script: |
            # 使用 nginx 切换流量到绿环境
            sudo cp /etc/nginx/conf.d/green.conf /etc/nginx/conf.d/active.conf
            sudo nginx -s reload
            
            # 停止旧版本(蓝环境)
            docker stop your-app-blue || true

Docker 多阶段构建(优化镜像体积)

# 阶段1: 构建阶段
FROM node:18-alpine AS builder
 
WORKDIR /app
 
# 复制依赖文件并安装(利用 Docker 缓存)
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
 
# 复制源代码
COPY . .
 
# 运行构建(如果有构建步骤)
RUN npm run build --if-present
 
# 阶段2: 生产镜像
FROM node:18-alpine
 
# 添加非 root 用户(提高安全性)
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nodejs -u 1001
 
WORKDIR /app
 
# 从构建阶段复制产物
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/public ./public
 
# 切换到非 root 用户
USER nodejs
 
# 暴露端口
EXPOSE 3000
 
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
  CMD node -e "require('http').get('http://localhost:3000/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})" || exit 1
 
# 启动应用
CMD ["node", "dist/server.js"]

优化效果

  • 镜像体积:从 1.2GB → 150MB(减少 87%)
  • 构建时间:利用缓存,第二次构建快 60%
  • 安全性:非 root 用户运行,减小攻击面

Nginx 蓝绿切换配置

Nginx 配置(核心部分)

http {
    # 上游服务器 - 蓝环境(当前生产)
    upstream blue {
        server app-blue:3000;
    }
    
    # 上游服务器 - 绿环境(新版本)
    upstream green {
        server app-green:3000;
    }
    
    # 主配置
    server {
        listen 80;
        server_name _;
        
        # 健康检查端点
        location /health {
            access_log off;
            return 200 "healthy\n";
            add_header Content-Type text/plain;
        }
        
        # 主要应用流量
        location / {
            # 动态选择上游(通过变量控制)
            set $upstream_choice "blue";
            proxy_pass http://$backend;
            
            # 代理配置
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
            # 超时配置
            proxy_connect_timeout 5s;
            proxy_send_timeout 60s;
            proxy_read_timeout 60s;
        }
    }
    
    # 蓝绿切换辅助配置(通过包含不同文件切换)
    include /etc/nginx/conf.d/active.conf;
}

流量切换原理

  1. 默认状态active.confblue.conf(流量到蓝环境)
  2. 部署新版本
    • 启动绿环境容器
    • 健康检查通过后
    • active.conf 指向 green.conf
    • 执行 nginx -s reload(无缝切换)
  3. 回滚
    • active.conf 指回 blue.conf
    • 执行 nginx -s reload

下一步

在系列的下一篇文章中,我们将详细介绍:

  • 📖 快速开始:10 分钟完成环境搭建
  • ⚙️ 配置说明:每个参数的详细解释
  • 🚀 使用指南:日常开发流程和部署操作

如果你等不及,可以查看完整的文档:

👉 完整 CI/CD 自动化部署方案文档


总结

本文介绍了:

  1. 为什么需要 CI/CD 自动化 - 解决手工部署的痛点
  2. 方案概述 - 6 大核心特性和技术栈选型
  3. 架构设计 - 整体架构和蓝绿部署详解
  4. 核心配置 - GitHub Actions 和 Docker 配置示例

通过这套方案,你的团队将实现:

✅ 部署频率提升 6-10 倍
✅ 部署出错率降低 90%+
✅ 回滚时间从 30 分钟降到 10 秒
✅ 零停机发布,用户无感知

下一篇预告:《CI/CD 自动化部署完全指南(二):快速开始与配置详解》


如果觉得这篇文章对你有帮助,欢迎点赞、收藏、转发! 🙏

有任何问题或建议,欢迎在评论区留言讨论!

评论

评论需要填写昵称和邮箱。评论内容将公开显示。

评论区加载中...