Skip to content

CI/CD 持续集成核心功能实现

这是一个最小但完整的 CI/CD 持续集成实现,展示了 CI/CD 的核心概念和实现方式。

项目结构

cicd-system/
├── .github/
│   └── workflows/
│       ├── ci.yml         # CI 工作流
│       └── cd.yml         # CD 工作流
├── src/
│   ├── app.js            # 应用代码
│   └── app.test.js      # 测试代码
├── scripts/
│   ├── test.js           # 测试脚本
│   └── deploy.js         # 部署脚本
├── Dockerfile           # Dockerfile
├── docker-compose.yml   # Docker Compose
├── jest.config.js       # Jest 配置
└── README.md

安装依赖

bash
npm install

运行测试

bash
npm test

核心功能

1. CI 工作流

实现代码检查、测试和构建。

2. CD 工作流

实现自动化部署到服务器。

3. 测试脚本

实现单元测试和集成测试。

4. 部署脚本

实现 Docker 容器部署。

使用示例

本地测试

bash
# 运行代码检查
npm run lint

# 运行测试
npm test

# 生成覆盖率报告
npm run test:coverage

CI/CD 流程

bash
# 提交代码
git add .
git commit -m "feat: add new feature"
git push

# GitHub Actions 自动触发 CI/CD

部署到服务器

bash
# 构建镜像
docker build -t myapp:latest .

# 运行容器
docker run -d -p 3000:3000 --name myapp myapp:latest

# 健康检查
curl http://localhost:3000/health

可扩展功能点

1. 多环境部署

实现多环境配置:

yaml
# TODO: 实现多环境部署
jobs:
  deploy-staging:
    environment: staging
    steps:
      - name: 部署到测试环境
        run: |
          docker pull myapp:latest
          docker run -d --name myapp-staging -p 3001:3000 myapp:latest

  deploy-production:
    environment: production
    needs: deploy-staging
    steps:
      - name: 部署到生产环境
        run: |
          docker pull myapp:latest
          docker run -d --name myapp -p 3000:3000 myapp:latest

2. 回滚机制

实现自动回滚:

javascript
// TODO: 实现回滚机制
async function rollback(previousVersion) {
  console.log(`Rolling back to version: ${previousVersion}`);
  
  // 停止当前容器
  await stopContainer();
  
  // 启动旧版本
  await startContainer(previousVersion);
  
  // 健康检查
  await healthCheck();
}

3. 通知机制

实现部署通知:

yaml
# TODO: 实现通知机制
- 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 }}

4. 性能测试

集成性能测试:

javascript
// TODO: 实现性能测试
async function runPerformanceTest() {
  const { performance } = require('perf_hooks');
  
  const start = performance.now();
  
  // 运行测试
  await runLoadTest();
  
  const end = performance.now();
  const duration = end - start;
  
  console.log(`Performance test completed in ${duration}ms`);
  
  if (duration > 1000) {
    throw new Error('Performance test failed');
  }
}

5. 安全扫描

集成安全扫描:

yaml
# TODO: 集成安全扫描
- name: 运行安全扫描
  uses: aquasecurity/trivy-action@master
  with:
    image-ref: ${{ secrets.DOCKER_USERNAME }}/myapp:latest
    format: 'sarif'
    output: 'trivy-results.sarif'

- name: 上传扫描结果
  uses: github/codeql-action/upload-sarif@v2
  with:
    sarif_file: 'trivy-results.sarif'

下一步

查看 05-lesson-plan.md 了解详细的课程计划。


架构师AI杜公众号二维码

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