🚀 后端技术方案标准模板

基于 OpenClaw + Claude Code 的端到端研发自动化系统
📋 文档版本:v1.0.0 📅 创建日期:2026-03-13 👥 适用角色:后端开发工程师、架构师、Tech Lead 🔄 流程阶段:需求→PRD→技术方案→API 开发
📑 文档目录
📊
项目概览与背景
Project Overview & Background
🎯 项目目标
  • 构建端到端研发自动化系统,实现从需求到部署的全流程自动化
  • 集成 OpenClaw 进行数据采集与处理
  • 利用 Claude Code 进行智能代码生成与审查
  • 支持多角色 Agents 协同工作(产品、开发、测试、运维)
  • 实现人机协同的研发流程,提升研发效率 60%+
📐 技术栈选型
Python 3.12 FastAPI PostgreSQL 15
Redis 7 RabbitMQ Docker
Kubernetes KubeSphere Jenkins
👥 适用角色
  • 后端开发工程师:技术方案实施、API 开发
  • 系统架构师:架构设计评审、技术选型
  • Tech Lead:方案审核、代码 Review
  • DevOps 工程师:部署配置、CI/CD 流水线
  • 测试工程师:接口测试、集成测试
📋 输出产物
  • ✅ 系统架构设计文档
  • ✅ 数据库 ER 图与表结构设计
  • ✅ API 接口定义文档(OpenAPI/Swagger)
  • ✅ 部署配置文件(Dockerfile, K8s YAML)
  • ✅ CI/CD 流水线配置(Jenkinsfile)
  • ✅ 单元测试与集成测试用例
💡 使用说明:本模板为标准化技术方案设计框架,实际项目中需根据具体业务需求进行调整和补充。每个章节都包含详细的填写指南和示例。
🏗️
系统架构设计
System Architecture Design

2.1 整体架构图

API Gateway
Kong / Nginx
路由、限流、认证
Load Balancer
HAProxy / ALB
负载均衡
用户服务
User Service
认证、授权、用户管理
需求管理服务
Requirement Service
需求收集、PRD 生成
任务拆解服务
Task Decomposition
AI 驱动的任务分解
代码生成服务
Code Generation
Claude Code 集成
消息队列
RabbitMQ / Kafka
异步任务、事件驱动
缓存服务
Redis Cluster
会话、热点数据
搜索引擎
Elasticsearch
全文检索、日志分析
主数据库
PostgreSQL
事务型数据
文档数据库
MongoDB
非结构化数据
对象存储
MinIO / S3
文件、 artifacts
容器编排
Kubernetes
KubeSphere 管理
监控系统
Prometheus + Grafana
指标监控
日志系统
ELK Stack
日志收集分析

2.2 微服务拆分

服务名称 职责描述 技术栈 端口 依赖服务
auth-service 用户认证、JWT 令牌管理、RBAC 权限控制 FastAPI + Redis 8001 PostgreSQL, Redis
requirement-service 需求收集、分析、PRD 文档生成 FastAPI + LangChain 8002 PostgreSQL, MongoDB
task-decomposition-service 基于 AI 的任务拆解、工作流编排 FastAPI + OpenClaw 8003 RabbitMQ, PostgreSQL
code-generation-service Claude Code 集成、代码生成与审查 FastAPI + Claude API 8004 MinIO, RabbitMQ
testing-service 单元测试、集成测试、UI 自动化测试 FastAPI + pytest 8005 PostgreSQL, Selenium Grid
deployment-service CI/CD 流水线、Docker 镜像构建、K8s 部署 FastAPI + Kubernetes Client 8006 Jenkins, K8s API
monitoring-service 系统监控、告警、日志聚合 FastAPI + Prometheus 8007 Prometheus, Elasticsearch

2.3 技术架构决策记录 (ADR)

📝 ADR-001: API 框架选型

决策:选择 FastAPI 作为主要 Web 框架

理由:

  • 原生异步支持,高性能
  • 自动生成 OpenAPI 文档
  • 类型提示完善,减少错误
  • 与 Python 3.12+ 完美兼容

状态:已采纳

📝 ADR-002: 数据库选型

决策:PostgreSQL + MongoDB 混合使用

理由:

  • PostgreSQL:强一致性事务场景
  • MongoDB:灵活 schema 的文档存储
  • 两者互补,满足不同业务需求

状态:已采纳

📝 ADR-003: 消息队列选型

决策:RabbitMQ 作为主要消息中间件

理由:

  • 成熟稳定,社区活跃
  • 支持多种消息模式
  • 与 Python 生态集成良好
  • 运维成本低

状态:已采纳

📝 ADR-004: 容器编排

决策:Kubernetes + KubeSphere

理由:

  • K8s 行业标准,生态丰富
  • KubeSphere 提供友好 UI 和管理功能
  • 支持自动扩缩容、滚动更新
  • 多云部署能力

状态:已采纳

💾
数据库设计
Database Design

3.1 ER 图(实体关系图)

核心实体关系:User → Project → Requirement → Task → CodeArtifact → TestResult
👤 User (用户)
id, username, email
role, department
📁 Project (项目)
id, name, description
status, created_by
📋 Requirement (需求)
id, title, content
priority, project_id
✅ Task (任务)
id, name, type
status, assignee_id
💻 CodeArtifact (代码制品)
id, file_path, content
version, task_id
🧪 TestResult (测试结果)
id, test_type, result
coverage, artifact_id

3.2 核心表结构设计

# 1. 用户表 (users)
CREATE TABLE users (
    id              UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    username        VARCHAR(50) UNIQUE NOT NULL,
    email           VARCHAR(100) UNIQUE NOT NULL,
    password_hash   VARCHAR(255) NOT NULL,
    role            VARCHAR(20) NOT NULL DEFAULT 'developer',
    department      VARCHAR(50),
    status          VARCHAR(20) DEFAULT 'active',
    created_at      TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at      TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    last_login_at   TIMESTAMP WITH TIME ZONE,
    
    INDEX idx_users_username (username),
    INDEX idx_users_email (email),
    INDEX idx_users_role (role)
);

# 2. 项目表 (projects)
CREATE TABLE projects (
    id              UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name            VARCHAR(100) NOT NULL,
    description     TEXT,
    status          VARCHAR(20) DEFAULT 'planning',
    tech_stack      JSONB,
    created_by      UUID REFERENCES users(id),
    start_date      DATE,
    end_date        DATE,
    created_at      TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at      TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_projects_status (status),
    INDEX idx_projects_created_by (created_by)
);

# 3. 需求表 (requirements)
CREATE TABLE requirements (
    id              UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    project_id      UUID REFERENCES projects(id) ON DELETE CASCADE,
    title           VARCHAR(200) NOT NULL,
    content         TEXT NOT NULL,
    priority        VARCHAR(20) DEFAULT 'medium',
    status          VARCHAR(20) DEFAULT 'draft',
    prd_document_id UUID,
    created_by      UUID REFERENCES users(id),
    assigned_to     UUID REFERENCES users(id),
    created_at      TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at      TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_requirements_project (project_id),
    INDEX idx_requirements_status (status),
    INDEX idx_requirements_priority (priority)
);

# 4. 任务表 (tasks)
CREATE TABLE tasks (
    id                  UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    requirement_id      UUID REFERENCES requirements(id) ON DELETE CASCADE,
    name                VARCHAR(200) NOT NULL,
    description         TEXT,
    task_type           VARCHAR(30) NOT NULL,
    status              VARCHAR(20) DEFAULT 'pending',
    priority            VARCHAR(20) DEFAULT 'medium',
    assigned_to         UUID REFERENCES users(id),
    estimated_hours     DECIMAL(5,2),
    actual_hours        DECIMAL(5,2),
    parent_task_id      UUID REFERENCES tasks(id),
    dependency_ids      UUID[],
    metadata            JSONB,
    created_at          TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at          TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    completed_at        TIMESTAMP WITH TIME ZONE,
    
    INDEX idx_tasks_requirement (requirement_id),
    INDEX idx_tasks_status (status),
    INDEX idx_tasks_assigned_to (assigned_to),
    INDEX idx_tasks_type (task_type)
);

# 5. 代码制品表 (code_artifacts)
CREATE TABLE code_artifacts (
    id              UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    task_id         UUID REFERENCES tasks(id) ON DELETE CASCADE,
    file_path       VARCHAR(500) NOT NULL,
    file_name       VARCHAR(200) NOT NULL,
    content         TEXT,
    language        VARCHAR(30),
    version         VARCHAR(20) DEFAULT '1.0.0',
    storage_url     VARCHAR(500),
    checksum        VARCHAR(64),
    generated_by    VARCHAR(50) DEFAULT 'claude_code',
    review_status   VARCHAR(20) DEFAULT 'pending',
    created_by      UUID REFERENCES users(id),
    created_at      TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_artifacts_task (task_id),
    INDEX idx_artifacts_language (language),
    INDEX idx_artifacts_version (version)
);

# 6. 测试结果表 (test_results)
CREATE TABLE test_results (
    id                  UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    artifact_id         UUID REFERENCES code_artifacts(id) ON DELETE CASCADE,
    test_type           VARCHAR(30) NOT NULL,
    test_framework      VARCHAR(50),
    total_tests         INTEGER,
    passed_tests        INTEGER,
    failed_tests        INTEGER,
    skipped_tests       INTEGER,
    coverage_percent    DECIMAL(5,2),
    execution_time_ms   INTEGER,
    error_message       TEXT,
    report_url          VARCHAR(500),
    status              VARCHAR(20) DEFAULT 'completed',
    executed_by         UUID REFERENCES users(id),
    executed_at         TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_test_results_artifact (artifact_id),
    INDEX idx_test_results_type (test_type),
    INDEX idx_test_results_status (status)
);

# 7. 部署记录表 (deployments)
CREATE TABLE deployments (
    id                  UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    project_id          UUID REFERENCES projects(id),
    artifact_ids        UUID[],
    environment         VARCHAR(30) NOT NULL,
    version             VARCHAR(20) NOT NULL,
    status              VARCHAR(20) DEFAULT 'pending',
    k8s_namespace       VARCHAR(50),
    k8s_deployment_name VARCHAR(100),
    jenkins_build_id    VARCHAR(50),
    deployed_by         UUID REFERENCES users(id),
    started_at          TIMESTAMP WITH TIME ZONE,
    completed_at        TIMESTAMP WITH TIME ZONE,
    rollback_to         UUID REFERENCES deployments(id),
    
    INDEX idx_deployments_project (project_id),
    INDEX idx_deployments_environment (environment),
    INDEX idx_deployments_status (status)
);

3.3 索引优化策略

🔍 复合索引设计
  • idx_tasks_status_assignee: (status, assigned_to) - 任务查询优化
  • idx_requirements_project_status: (project_id, status) - 项目需求筛选
  • idx_artifacts_task_version: (task_id, version) - 版本追溯
⚡ 性能优化
  • 大表分区:按时间范围对 test_results 分区
  • 部分索引:只索引活跃数据
  • 覆盖索引:减少回表查询
  • 定期 VACUUM ANALYZE
📊 数据归档策略
  • 历史数据:90 天后归档到冷存储
  • 日志数据:保留 180 天
  • 审计数据:永久保留
  • 自动清理 Job:每日凌晨执行

3.4 MongoDB 文档结构

// 1. PRD 文档集合 (prd_documents)
{
    "_id": ObjectId("..."),
    "requirement_id": UUID("..."),
    "title": "用户管理系统 PRD",
    "version": "1.0.0",
    "sections": [
        {
            "section_id": "overview",
            "title": "产品概述",
            "content": "...",
            "ai_generated": true
        },
        {
            "section_id": "features",
            "title": "功能列表",
            "content": "...",
            "features": [
                {"id": "F001", "name": "用户注册", "priority": "high"}
            ]
        }
    ],
    "metadata": {
        "generated_by": "claude_code",
        "generated_at": ISODate("2026-03-13T10:00:00Z"),
        "reviewed_by": ["user_id_1", "user_id_2"],
        "status": "approved"
    },
    "created_at": ISODate("2026-03-13T10:00:00Z"),
    "updated_at": ISODate("2026-03-13T10:00:00Z")
}

// 2. API 接口定义集合 (api_definitions)
{
    "_id": ObjectId("..."),
    "service_name": "user-service",
    "openapi_version": "3.0.3",
    "endpoints": [
        {
            "path": "/api/v1/users",
            "method": "POST",
            "summary": "创建用户",
            "request_schema": {...},
            "response_schema": {...},
            "authentication": "bearer"
        }
    ],
    "generated_from_task": UUID("..."),
    "created_at": ISODate("2026-03-13T10:00:00Z")
}
🔌
API 接口设计
API Interface Design

4.1 API 设计规范

📐 规范说明:所有 API 遵循 RESTful 设计原则,使用 OpenAPI 3.0 规范进行文档化,支持自动生成 Swagger UI。
🌐 URL 命名规范
  • 使用小写字母和连字符:/api/v1/user-profiles
  • 资源名使用复数形式:/users, /projects
  • 版本号包含在路径中:/api/v1/
  • 嵌套资源不超过 3 层:/projects/{id}/tasks
📝 HTTP 方法语义
  • GET: 获取资源(幂等)
  • POST: 创建资源
  • PUT: 全量更新资源(幂等)
  • PATCH: 部分更新资源
  • DELETE: 删除资源(幂等)
📦 响应格式标准
  • 统一 JSON 响应结构
  • 包含状态码、消息、数据
  • 分页信息标准化
  • 错误码统一管理
🔐 认证授权
  • JWT Bearer Token
  • Token 有效期:2 小时
  • Refresh Token: 7 天
  • RBAC 权限控制

4.2 核心 API 接口列表

模块 方法 端点 描述 认证
认证模块 POST /api/v1/auth/login 用户登录,返回 JWT Token
POST /api/v1/auth/register 用户注册
POST /api/v1/auth/refresh 刷新 Access Token
POST /api/v1/auth/logout 用户登出
需求管理 GET /api/v1/requirements 获取需求列表(支持分页、筛选)
POST /api/v1/requirements 创建新需求
GET /api/v1/requirements/{id} 获取需求详情
PUT /api/v1/requirements/{id} 更新需求
DELETE /api/v1/requirements/{id} 删除需求
任务管理 GET /api/v1/tasks 获取任务列表
POST /api/v1/tasks/decompose AI 驱动的任务拆解
PATCH /api/v1/tasks/{id}/status 更新任务状态
POST /api/v1/tasks/{id}/assign 分配任务给开发者
代码生成 POST /api/v1/code/generate 基于任务生成代码
POST /api/v1/code/review AI 代码审查
GET /api/v1/code/artifacts/{id} 获取代码制品
PUT /api/v1/code/artifacts/{id}/review 提交代码审查结果
测试管理 POST /api/v1/tests/unit 执行单元测试
POST /api/v1/tests/integration 执行集成测试
GET /api/v1/tests/results/{id} 获取测试结果
GET /api/v1/tests/coverage 获取代码覆盖率报告
部署管理 POST /api/v1/deployments 触发部署流程
GET /api/v1/deployments 获取部署历史
GET /api/v1/deployments/{id}/logs 获取部署日志
POST /api/v1/deployments/{id}/rollback 回滚部署

4.3 请求/响应示例

# 示例 1: 创建需求 (POST /api/v1/requirements)

# Request:
{
    "title": "实现用户登录功能",
    "content": "需要实现基于 JWT 的用户登录功能,支持邮箱和密码验证",
    "project_id": "550e8400-e29b-41d4-a716-446655440000",
    "priority": "high",
    "metadata": {
        "estimated_hours": 8,
        "tags": ["authentication", "security"]
    }
}

# Response (201 Created):
{
    "code": 201,
    "message": "需求创建成功",
    "data": {
        "id": "660e8400-e29b-41d4-a716-446655440001",
        "title": "实现用户登录功能",
        "status": "draft",
        "created_at": "2026-03-13T10:30:00Z"
    }
}

# 示例 2: AI 任务拆解 (POST /api/v1/tasks/decompose)

# Request:
{
    "requirement_id": "660e8400-e29b-41d4-a716-446655440001",
    "decomposition_strategy": "role_based",
    "target_roles": ["backend", "frontend", "tester"]
}

# Response (200 OK):
{
    "code": 200,
    "message": "任务拆解完成",
    "data": {
        "requirement_id": "660e8400-e29b-41d4-a716-446655440001",
        "tasks": [
            {
                "id": "770e8400-e29b-41d4-a716-446655440010",
                "name": "[后端] 设计用户认证 API",
                "type": "backend",
                "description": "实现 JWT 认证相关的 API 接口",
                "estimated_hours": 4
            },
            {
                "id": "770e8400-e29b-41d4-a716-446655440011",
                "name": "[后端] 实现密码加密逻辑",
                "type": "backend",
                "description": "使用 bcrypt 进行密码哈希",
                "estimated_hours": 2
            },
            {
                "id": "770e8400-e29b-41d4-a716-446655440012",
                "name": "[前端] 开发登录页面 UI",
                "type": "frontend",
                "estimated_hours": 3
            },
            {
                "id": "770e8400-e29b-41d4-a716-446655440013",
                "name": "[测试] 编写认证模块测试用例",
                "type": "testing",
                "estimated_hours": 2
            }
        ],
        "total_estimated_hours": 11,
        "generated_by": "openclaw_ai"
    }
}

# 示例 3: 代码生成 (POST /api/v1/code/generate)

# Request:
{
    "task_id": "770e8400-e29b-41d4-a716-446655440010",
    "language": "python",
    "framework": "fastapi",
    "specifications": {
        "include_tests": true,
        "include_docs": true,
        "coding_standards": "pep8"
    }
}

# Response (200 OK):
{
    "code": 200,
    "message": "代码生成成功",
    "data": {
        "artifact_id": "880e8400-e29b-41d4-a716-446655440020",
        "files": [
            {
                "path": "src/routes/auth.py",
                "lines_of_code": 156,
                "storage_url": "s3://artifacts/..."
            },
            {
                "path": "tests/test_auth.py",
                "lines_of_code": 89,
                "storage_url": "s3://artifacts/..."
            }
        ],
        "generated_by": "claude_code_v2",
        "generation_time_ms": 3450
    }
}

4.4 错误码规范

错误码 HTTP 状态码 描述 解决方案
ERR_400_001 400 请求参数验证失败 检查请求参数格式和必填字段
ERR_401_001 401 未授权访问 检查 JWT Token 是否有效
ERR_403_001 403 权限不足 确认用户角色权限
ERR_404_001 404 资源不存在 检查资源 ID 是否正确
ERR_409_001 409 资源冲突(如重复创建) 检查是否存在重复数据
ERR_500_001 500 服务器内部错误 查看服务器日志,联系运维
ERR_503_001 503 服务暂时不可用 稍后重试,检查服务状态
🔒
安全与权限设计
Security & Authorization Design
🛡️ 认证机制
  • JWT (JSON Web Token) 认证
  • Access Token 有效期:2 小时
  • Refresh Token 有效期:7 天
  • Token 黑名单机制(Redis 存储)
  • 支持多设备登录管理
👮 RBAC 权限模型
  • 超级管理员:系统全部权限
  • 项目管理员:项目管理、成员管理
  • 开发者:代码开发、任务执行
  • 测试工程师:测试执行、Bug 提交
  • 访客:只读权限
🔐 数据安全
  • 敏感数据加密存储(AES-256)
  • 密码哈希(bcrypt,cost=12)
  • 传输层加密(TLS 1.3)
  • 数据库连接加密(SSL)
  • 密钥管理系统(HashiCorp Vault)
🚨 安全防护
  • SQL 注入防护(参数化查询)
  • XSS 攻击防护(输入过滤)
  • CSRF 防护(Token 验证)
  • 速率限制(Rate Limiting)
  • IP 白名单/黑名单

5.1 JWT Token 结构

# JWT Payload 示例
{
    "sub": "550e8400-e29b-41d4-a716-446655440000",
    "username": "zhangsan",
    "email": "zhangsan@example.com",
    "role": "developer",
    "permissions": [
        "tasks:read",
        "tasks:write",
        "code:read",
        "code:write"
    ],
    "iat": 1710324000,
    "exp": 1710331200,
    "iss": "rd-automation-system",
    "aud": "rd-api",
    "jti": "unique-token-id-12345"
}

5.2 权限矩阵

资源/操作 超级管理员 项目管理员 开发者 测试工程师 访客
用户管理 ✅ CRUD
项目管理 ✅ CRUD ✅ CRUD ✅ Read ✅ Read ✅ Read
需求管理 ✅ CRUD ✅ CRUD ✅ CRUD ✅ Read ✅ Read
任务执行 ✅ All ✅ All ✅ Assigned ✅ Testing
代码提交 ✅ All ✅ All ✅ Own
测试执行 ✅ All ✅ All ✅ Unit ✅ All
部署操作 ✅ All ✅ Prod ✅ Dev
系统配置
性能优化策略
Performance Optimization
🚀 缓存策略
  • 多级缓存:L1(本地) + L2(Redis)
  • 热点数据:用户信息、配置数据
  • 缓存失效:TTL + 主动失效
  • 缓存穿透:Bloom Filter
  • 缓存雪崩:随机 TTL
📊 数据库优化
  • 读写分离(主从复制)
  • 连接池配置(PgBouncer)
  • 查询优化(EXPLAIN 分析)
  • 慢查询日志监控
  • 定期 VACUUM 维护
🔄 异步处理
  • 消息队列解耦(RabbitMQ)
  • 后台任务处理(Celery)
  • 事件驱动架构
  • 批量操作优化
  • 延迟任务支持
🌐 CDN 与静态资源
  • 静态资源 CDN 加速
  • 资源压缩(Gzip/Brotli)
  • 浏览器缓存策略
  • 图片懒加载
  • HTTP/2 协议支持

6.1 性能指标目标

指标 目标值 警戒值 测量方式
API P95 响应时间 < 200ms > 500ms Prometheus
API P99 响应时间 < 500ms > 1000ms Prometheus
数据库查询时间 < 50ms > 200ms 慢查询日志
缓存命中率 > 90% < 70% Redis Stats
系统可用性 > 99.9% < 99.5% Uptime Monitoring
错误率 < 0.1% > 1% Error Tracking
并发用户数 > 1000 - Load Testing
吞吐量 (QPS) > 500 - Prometheus

6.2 Redis 缓存配置

# Redis 配置示例
# 缓存键命名规范
user:profile:{user_id}              # 用户信息
project:details:{project_id}        # 项目详情
requirement:list:{project_id}       # 需求列表
task:assigned:{user_id}             # 用户分配的任务
api:rate_limit:{ip}:{endpoint}      # API 限流
session:{session_id}                # 会话数据
token:blacklist:{jti}               # Token 黑名单

# TTL 配置(秒)
USER_PROFILE_TTL = 3600             # 1 小时
PROJECT_DETAILS_TTL = 1800          # 30 分钟
API_RESPONSE_TTL = 300              # 5 分钟
SESSION_TTL = 604800                # 7 天
TOKEN_BLACKLIST_TTL = 7200          # 2 小时
🚀
部署与运维方案
Deployment & Operations

7.1 CI/CD 流水线设计

1
代码提交 (Git Push)
开发者推送代码到 Git 仓库,触发 Webhook
2
代码质量检查
运行 Linter、Formatter、静态代码分析(SonarQube)
3
单元测试
执行 pytest 单元测试,覆盖率需 > 80%
4
构建 Docker 镜像
基于 Dockerfile 构建镜像,推送到镜像仓库
5
部署到开发环境
自动部署到 K8s 开发命名空间
6
集成测试
执行 API 集成测试、UI 自动化测试
7
人工审批
Tech Lead 审批通过后方可发布生产
8
部署到生产环境
蓝绿部署/金丝雀发布,逐步切流
9
监控与告警
实时监控指标,异常自动告警

7.2 Jenkinsfile 示例

// Jenkinsfile for Backend Service
pipeline {
    agent {
        kubernetes {
            yaml """
                apiVersion: v1
                kind: Pod
                spec:
                  containers:
                  - name: docker
                    image: docker:24-dind
                    command: ["cat"]
                    tty: true
                    securityContext:
                      privileged: true
                  - name: kubectl
                    image: bitnami/kubectl:latest
                    command: ["cat"]
                    tty: true
            """
        }
    }

    environment {
        REGISTRY = 'registry.example.com'
        IMAGE_NAME = 'rd-automation/backend-service'
        KUBE_NAMESPACE_DEV = 'rd-dev'
        KUBE_NAMESPACE_PROD = 'rd-prod'
    }

    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }

        stage('Code Quality') {
            steps {
                sh 'pip install flake8 black mypy'
                sh 'flake8 src/'
                sh 'black --check src/'
                sh 'mypy src/'
            }
        }

        stage('Unit Test') {
            steps {
                sh 'pip install -r requirements.txt'
                sh 'pytest tests/ --cov=src --cov-report=xml --cov-fail-under=80'
            }
            post {
                always {
                    junit 'reports/*.xml'
                    publishHTML([
                        allowMissing: false,
                        alwaysLinkToLastBuild: true,
                        keepAll: true,
                        reportDir: 'htmlcov',
                        reportFiles: 'index.html',
                        reportName: 'Coverage Report'
                    ])
                }
            }
        }

        stage('Build Docker Image') {
            steps {
                script {
                    env.BUILD_TAG = "${env.BUILD_NUMBER}-${env.GIT_COMMIT.take(7)}"
                    sh "docker build -t ${REGISTRY}/${IMAGE_NAME}:${BUILD_TAG} ."
                    sh "docker tag ${REGISTRY}/${IMAGE_NAME}:${BUILD_TAG} ${REGISTRY}/${IMAGE_NAME}:latest"
                }
            }
        }

        stage('Push to Registry') {
            steps {
                withCredentials([usernamePassword(credentialsId: 'docker-registry', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {
                    sh "echo ${DOCKER_PASS} | docker login ${REGISTRY} -u ${DOCKER_USER} --password-stdin"
                    sh "docker push ${REGISTRY}/${IMAGE_NAME}:${BUILD_TAG}"
                    sh "docker push ${REGISTRY}/${IMAGE_NAME}:latest"
                }
            }
        }

        stage('Deploy to Dev') {
            steps {
                sh "kubectl set image deployment/backend-service backend-service=${REGISTRY}/${IMAGE_NAME}:${BUILD_TAG} -n ${KUBE_NAMESPACE_DEV}"
                sh "kubectl rollout status deployment/backend-service -n ${KUBE_NAMESPACE_DEV} --timeout=300s"
            }
        }

        stage('Integration Test') {
            steps {
                sh 'pytest tests/integration/ --base-url=http://backend-service.rd-dev.svc.cluster.local:8000'
            }
        }

        stage('Manual Approval') {
            steps {
                input message: 'Deploy to Production?', ok: 'Approve'
            }
        }

        stage('Deploy to Prod') {
            steps {
                sh "kubectl set image deployment/backend-service backend-service=${REGISTRY}/${IMAGE_NAME}:${BUILD_TAG} -n ${KUBE_NAMESPACE_PROD}"
                sh "kubectl rollout status deployment/backend-service -n ${KUBE_NAMESPACE_PROD} --timeout=600s"
            }
        }
    }

    post {
        success {
            echo 'Pipeline completed successfully!'
        }
        failure {
            echo 'Pipeline failed!'
            slackSend channel: '#deployments', message: "Build failed: ${env.JOB_NAME} ${env.BUILD_NUMBER}"
        }
        always {
            cleanWs()
        }
    }
}

7.3 Kubernetes 部署配置

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-service
  namespace: rd-prod
  labels:
    app: backend-service
    version: v1.0.0
spec:
  replicas: 3
  selector:
    matchLabels:
      app: backend-service
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: backend-service
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "8000"
    spec:
      containers:
      - name: backend-service
        image: registry.example.com/rd-automation/backend-service:latest
        ports:
        - containerPort: 8000
          name: http
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: url
        - name: REDIS_URL
          valueFrom:
            secretKeyRef:
              name: redis-credentials
              key: url
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1Gi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8000
          initialDelaySeconds: 5
          periodSeconds: 5
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchLabels:
                  app: backend-service
              topologyKey: kubernetes.io/hostname

---
# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: backend-service
  namespace: rd-prod
spec:
  selector:
    app: backend-service
  ports:
  - port: 80
    targetPort: 8000
    protocol: TCP
  type: ClusterIP

---
# hpa.yaml (Horizontal Pod Autoscaler)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: backend-service-hpa
  namespace: rd-prod
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: backend-service
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

7.4 监控与告警

📈 监控指标
  • 应用指标:QPS、响应时间、错误率
  • 系统指标:CPU、内存、磁盘、网络
  • 业务指标:活跃用户、任务完成率
  • 数据库指标:连接数、慢查询、锁等待
🔔 告警规则
  • CPU 使用率 > 80% 持续 5 分钟
  • 内存使用率 > 85% 持续 5 分钟
  • 错误率 > 1% 持续 3 分钟
  • P95 响应时间 > 1s 持续 5 分钟
  • Pod 重启次数 > 3 次/小时
📊 日志管理
  • 集中式日志收集(Filebeat)
  • 日志存储(Elasticsearch)
  • 日志可视化(Kibana)
  • 日志保留策略:30 天热存储
🛠️ 运维工具
  • KubeSphere:K8s 管理平台
  • Grafana:监控仪表盘
  • Prometheus:指标采集
  • Alertmanager:告警管理