Skip to content

CI/CD 持续集成课程计划

课程概述

本课程分为 8 节课,每节课 20-40 分钟,总时长约 120-150 分钟。通过理论讲解和实践操作,深入理解 CI/CD 的实现方法。

第 1 课:课程介绍与环境准备(5 分钟)

学习目标

  • 了解课程内容和目标
  • 配置 GitHub Actions
  • 准备测试项目

课程内容

  1. 课程介绍

    • CI/CD 的特点
    • 自动化交付的优势
    • 课程结构安排
  2. 环境准备

    • 创建 GitHub 仓库
    • 配置 GitHub Actions
    • 准备测试项目

实践操作

bash
# 初始化项目
git init
git add .
git commit -m "Initial commit"

# 推送到 GitHub
git remote add origin https://github.com/username/repo.git
git push -u origin main

预期输出

✅ GitHub 仓库创建成功
✅ 代码推送到 GitHub

第 2 课:CI 基础(15 分钟)

学习目标

  • 理解 CI 核心概念
  • 掌握 GitHub Actions 语法
  • 学习代码检查

课程内容

  1. CI 核心概念

    • 持续集成
    • 自动化测试
    • 快速反馈
  2. GitHub Actions

    • 工作流语法
    • 触发条件
    • 步骤定义
  3. 代码检查

    • ESLint
    • Prettier
    • 代码风格

实践操作

yaml
# .github/workflows/ci.yml
name: CI

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  lint:
    name: 代码检查
    runs-on: ubuntu-latest
    
    steps:
      - name: 检出代码
        uses: actions/checkout@v3
      
      - name: 设置 Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
          cache: 'npm'
      
      - name: 安装依赖
        run: npm ci
      
      - name: 运行 ESLint
        run: npm run lint

测试验证

bash
git add .github/workflows/ci.yml
git commit -m "Add CI workflow"
git push

预期输出

✅ CI workflow 运行成功

第 3 课:自动化测试(15 分钟)

学习目标

  • 理解测试策略
  • 掌握单元测试
  • 学习集成测试

课程内容

  1. 测试策略

    • 单元测试
    • 集成测试
    • 端到端测试
  2. 单元测试

    • Jest 框架
    • 测试覆盖率
    • Mock 和 Stub
  3. 集成测试

    • 测试环境
    • 数据库测试
    • API 测试

实践操作

javascript
// app.test.js
const request = require('supertest');
const app = require('./app');

describe('API 测试', () => {
  test('GET /health', async () => {
    const response = await request(app).get('/health');
    expect(response.status).toBe(200);
    expect(response.body.status).toBe('ok');
  });

  test('GET /api/users', async () => {
    const response = await request(app).get('/api/users');
    expect(response.status).toBe(200);
    expect(Array.isArray(response.body)).toBe(true);
  });
});
yaml
# 添加测试任务
test:
  name: 测试
  runs-on: ubuntu-latest
  
  steps:
    - name: 检出代码
      uses: actions/checkout@v3
    
    - name: 设置 Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18'
        cache: 'npm'
    
    - name: 安装依赖
      run: npm ci
    
    - name: 运行单元测试
      run: npm run test:unit
    
    - name: 运行集成测试
      run: npm run test:integration

测试验证

bash
npm test

预期输出

✅ 所有测试通过

第 4 课:构建和打包(15 分钟)

学习目标

  • 理解构建流程
  • 掌握 Docker 镜像构建
  • 学习产物管理

课程内容

  1. 构建流程

    • 代码编译
    • 资源打包
    • 优化压缩
  2. Docker 镜像

    • Dockerfile 编写
    • 多阶段构建
    • 镜像优化
  3. 产物管理

    • 上传产物
    • 版本管理
    • 缓存策略

实践操作

yaml
# 添加构建任务
build:
  name: 构建
  runs-on: ubuntu-latest
  needs: [lint, test]
  
  steps:
    - name: 检出代码
      uses: actions/checkout@v3
    
    - name: 设置 Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18'
        cache: 'npm'
    
    - name: 安装依赖
      run: npm ci
    
    - name: 构建应用
      run: npm run build
    
    - name: 上传构建产物
      uses: actions/upload-artifact@v3
      with:
        name: dist
        path: dist/

测试验证

bash
npm run build

预期输出

✅ 构建成功

第 5 课:CD 基础(20 分钟)

学习目标

  • 理解 CD 核心概念
  • 掌握自动化部署
  • 学习部署策略

课程内容

  1. CD 核心概念

    • 持续部署
    • 自动化发布
    • 零停机部署
  2. 自动化部署

    • Docker 部署
    • SSH 部署
    • Kubernetes 部署
  3. 部署策略

    • 蓝绿部署
    • 金丝雀发布
    • 滚动更新

实践操作

yaml
# .github/workflows/cd.yml
name: CD

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    name: 部署
    runs-on: ubuntu-latest
    
    steps:
      - name: 检出代码
        uses: actions/checkout@v3
      
      - name: 设置 Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
          cache: 'npm'
      
      - name: 安装依赖
        run: npm ci
      
      - name: 构建应用
        run: npm run build
      
      - name: 部署到服务器
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USERNAME }}
          key: ${{ secrets.SERVER_SSH_KEY }}
          script: |
            cd /app
            git pull
            npm ci --production
            npm run build
            pm2 restart app

测试验证

bash
git push origin main

预期输出

✅ 部署成功

第 6 课:健康检查和监控(15 分钟)

学习目标

  • 理解健康检查机制
  • 实现应用监控
  • 学习告警通知

课程内容

  1. 健康检查

    • 健康检查端点
    • 依赖检查
    • 自动恢复
  2. 应用监控

    • 指标收集
    • 日志收集
    • 性能监控
  3. 告警通知

    • Slack 通知
    • 邮件通知
    • 短信通知

实践操作

javascript
// 健康检查端点
app.get('/health', async (req, res) => {
  try {
    // 检查数据库连接
    await db.query('SELECT 1');
    
    // 检查 Redis 连接
    await redis.ping();
    
    res.json({ status: 'ok', timestamp: Date.now() });
  } catch (error) {
    res.status(503).json({ status: 'error', message: error.message });
  }
});
yaml
# 添加健康检查
- name: 健康检查
  run: |
    sleep 10
    curl -f http://${{ secrets.SERVER_HOST }}:3000/health || exit 1

测试验证

bash
curl http://localhost:3000/health

预期输出

{"status":"ok","timestamp":1234567890}

第 7 课:回滚和通知(20 分钟)

学习目标

  • 理解回滚机制
  • 实现自动回滚
  • 学习部署通知

课程内容

  1. 回滚机制

    • 版本管理
    • 自动回滚
    • 手动回滚
  2. 部署通知

    • 成功通知
    • 失败通知
    • 进度通知
  3. 审计日志

    • 部署记录
    • 操作日志
    • 变更历史

实践操作

yaml
# 添加回滚和通知
- name: 部署到服务器
  id: deploy
  uses: appleboy/ssh-action@master
  continue-on-error: true
  with:
    host: ${{ secrets.SERVER_HOST }}
    username: ${{ secrets.SERVER_USERNAME }}
    key: ${{ secrets.SERVER_SSH_KEY }}
    script: |
      cd /app
      git pull
      npm ci --production
      npm run build
      pm2 restart app

- name: 回滚
  if: failure() && steps.deploy.outcome == 'failure'
  uses: appleboy/ssh-action@master
  with:
    host: ${{ secrets.SERVER_HOST }}
    username: ${{ secrets.SERVER_USERNAME }}
    key: ${{ secrets.SERVER_SSH_KEY }}
    script: |
      cd /app
      git checkout HEAD~1
      npm ci --production
      npm run build
      pm2 restart app

- name: 通知部署成功
  if: success()
  uses: 8398a7/action-slack@v3
  with:
    status: ${{ job.status }}
    text: '部署成功!'
    webhook_url: ${{ secrets.SLACK_WEBHOOK }}

- name: 通知部署失败
  if: failure()
  uses: 8398a7/action-slack@v3
  with:
    status: ${{ job.status }}
    text: '部署失败!'
    webhook_url: ${{ secrets.SLACK_WEBHOOK }}

测试验证

bash
# 触发部署失败
git push origin main

预期输出

✅ 回滚成功

第 8 课:总结与扩展(15 分钟)

学习目标

  • 回顾课程内容
  • 总结核心概念
  • 探索扩展方向

课程内容

  1. 课程回顾

    • CI 基础
    • 自动化测试
    • 构建和打包
    • CD 基础
    • 健康检查和监控
    • 回滚和通知
  2. 核心概念总结

    • 持续集成
    • 持续部署
    • 自动化测试
    • 自动化部署
  3. 扩展方向

    • 多环境部署
    • 回滚机制
    • 通知机制
    • 性能测试
    • 安全扫描

实践操作

bash
# 运行所有测试
npm test

# 思考如何扩展功能
# 实现多环境部署、回滚机制等功能

预期输出

✅ 所有测试通过

学习成果

完成本课程后,你将能够:

  1. ✅ 理解 CI/CD 的核心概念
  2. ✅ 配置 GitHub Actions
  3. ✅ 实现自动化测试
  4. ✅ 实现自动化部署
  5. ✅ 实现健康检查和监控

参考资源

下一步

完成本课程后,你可以继续学习:

  • Kubernetes 部署
  • 微服务架构
  • 云原生应用

所有教学材料已保存。准备录制。


架构师AI杜公众号二维码

扫描二维码关注"架构师AI杜"公众号,获取更多技术内容和最新动态