🚀 CI/CD 自动部署模块运维手册

基于 OpenClaw + Claude Code 的端到端研发自动化系统

版本:v1.0 | 更新日期:2026 年 3 月 14 日 | 适用环境:生产环境

第一章 系统概述

1.1 系统简介

本运维手册详细描述了基于 OpenClaw + Claude Code 构建的端到端研发自动化系统的 CI/CD 自动部署模块。该系统实现了从需求分析、PRD 设计、技术方案设计、API 协议设计、AI 编码、单元测试、集成测试到最终部署的全流程自动化,支持各研发节点的人机协同操作。

🎯 核心目标:构建一个高度自动化的智能研发系统,通过 AI Agents 模拟不同研发角色的工作流程,实现研发效率的最大化和质量的可控化。

1.2 系统特性

特性类别 描述 技术实现
全流程自动化 从需求到部署的完整链路自动化 OpenClaw + Claude Code + Jenkins Pipeline
多角色协同 模拟产品经理、架构师、开发工程师等角色 多 Agent 协作框架
人机协同 关键节点支持人工审核和干预 审批工作流 + 人工确认机制
容器化部署 Docker + Kubernetes 容器编排 KubeSphere 管理平台
持续集成/持续部署 自动化构建、测试、部署流水线 Jenkins Pipeline + GitOps

1.3 适用场景

  • 敏捷开发团队:快速迭代、频繁发布的互联网产品团队
  • 微服务架构:需要管理多个微服务的复杂系统
  • DevOps 实践:追求自动化、标准化的运维团队
  • AI 辅助开发:希望引入 AI 提升研发效率的组织

第二章 系统架构说明

2.1 整体架构图

需求输入
PRD 设计 Agent
技术方案 Agent
API 设计 Agent
AI Coding Agent
Unit Test Agent
集成测试 Agent
CI/CD Pipeline
Docker 构建
K8S 部署
UI 自动化测试
生产发布

2.2 核心技术栈

🔧 基础平台层

OpenClawClaude CodePython 3.12Node.js

提供 AI Agent 运行环境和任务编排能力,支持多模型接入(Claude、GPT、本地模型)

🏗️ CI/CD 引擎层

JenkinsJenkins PipelineGitGitLab/GitHub

负责代码构建、测试执行、镜像打包、部署触发等自动化流程

🐳 容器化层

DockerDocker ComposeHarbor

应用容器化封装,提供一致的运行环境和快速部署能力

☸️ 编排管理层

KubernetesKubeSphereHelm

容器编排、服务发现、负载均衡、自动扩缩容、配置管理

🧪 测试自动化层

PytestJUnitSeleniumPlaywrightPostman/Newman

单元测试、集成测试、API 测试、UI 自动化测试全栈覆盖

2.3 数据流向

📊 数据流转路径:
需求文档 → PRD 文档 → 技术设计文档 → API 规范 → 源代码 → 测试报告 → Docker 镜像 → K8S 部署配置 → 生产环境

第三章 研发角色 Agents 配置

3.1 Agent 角色定义

系统定义了以下核心研发角色 Agents,每个 Agent 都有明确的职责边界和工作流程:

📋 产品经理 Agent (Product Manager Agent)

职责:需求分析、PRD 文档生成、用户故事拆解、优先级排序

输入:原始需求描述、市场调研数据、用户反馈

输出:标准化 PRD 文档、功能列表、验收标准

工具链:Claude Code + PRD 模板库 + 需求管理数据库

🏛️ 系统架构师 Agent (System Architect Agent)

职责:技术选型、系统架构设计、技术风险评估、性能预估

输入:PRD 文档、技术约束条件、现有系统架构

输出:技术方案文档、架构图、技术栈说明、风险评估报告

工具链:Claude Code + 架构模式库 + 技术决策矩阵

⚙️ 后端工程师 Agent (Backend Engineer Agent)

职责:后端技术方案设计、数据库设计、API 设计、代码实现

输入:技术方案文档、业务逻辑说明

输出:后端代码、数据库 Schema、API 文档、单元测试

工具链:Claude Code + 代码模板库 + ORM 工具 + 测试框架

🎨 前端工程师 Agent (Frontend Engineer Agent)

职责:前端技术方案设计、UI/UX 实现、组件开发、状态管理

输入:技术方案文档、设计稿、API 接口文档

输出:前端代码、组件库、样式文件、E2E 测试

工具链:Claude Code + React/Vue 模板 + UI 组件库 + 构建工具

🔌 API 设计师 Agent (API Designer Agent)

职责:RESTful API 设计规范制定、接口文档生成、Mock 服务搭建

输入:业务需求、数据模型、前后端技术方案

输出:OpenAPI/Swagger 规范、Mock 数据、接口测试用例

工具链:OpenAPI Generator + Swagger UI + Postman

🧪 测试工程师 Agent (QA Engineer Agent)

职责:测试策略制定、测试用例生成、自动化测试脚本编写、质量报告

输入:PRD 文档、API 文档、源代码

输出:测试计划、测试用例、自动化测试脚本、测试报告

工具链:Pytest + Selenium + Playwright + Allure

🚀 DevOps 工程师 Agent (DevOps Engineer Agent)

职责:CI/CD Pipeline 配置、Docker 镜像构建、K8S 部署配置、监控告警

输入:源代码、测试报告、部署配置要求

输出:Jenkinsfile、Dockerfile、K8S YAML、监控仪表盘

工具链:Jenkins + Docker + Kubernetes + Prometheus + Grafana

3.2 Agent 协作机制

协作阶段 参与 Agents 交付物 审批节点
需求分析 产品经理 Agent PRD 文档 人工审核
技术设计 架构师 Agent + 后端 Agent + 前端 Agent 技术方案文档 技术评审会
API 设计 API 设计师 Agent + 前后端 Agent API 规范文档 自动校验
代码开发 后端 Agent + 前端 Agent 源代码 Code Review
测试验证 测试工程师 Agent 测试报告 质量门禁
部署发布 DevOps Agent 生产环境 变更审批

第四章 需求到 PRD 设计流程

4.1 需求输入规范

# 需求输入模板 (requirement_input.md)
## 需求基本信息
- 需求标题: [简洁描述需求]
- 需求类型: [新功能 | 功能优化 | Bug 修复 | 技术债务]
- 优先级: [P0 | P1 | P2 | P3]
- 期望上线时间: YYYY-MM-DD

## 业务背景
[描述需求的业务背景、解决的问题、目标用户]

## 功能描述
[详细描述需要实现的功能点]

## 验收标准
- [ ] 标准 1: ...
- [ ] 标准 2: ...
- [ ] 标准 3: ...

## 约束条件
[技术约束、时间约束、资源约束等]

4.2 PRD 生成流程

1
需求解析

产品经理 Agent 使用 Claude Code 解析原始需求,提取关键信息

2
用户故事拆解

将需求拆分为独立的 User Story,遵循 INVEST 原则

3
功能规格定义

详细描述每个功能点的输入、处理逻辑、输出

4
验收标准细化

为每个功能点定义可量化的验收标准 (Acceptance Criteria)

5
PRD 文档生成

基于模板自动生成标准化 PRD 文档 (Markdown/PDF)

6
人工审核确认

产品经理审核 PRD 文档,提出修改意见或批准进入下一阶段

4.3 PRD 文档模板

📄 PRD 文档结构:
1. 文档修订记录
2. 项目概述 (背景、目标、范围)
3. 用户角色与权限
4. 功能需求详述 (按模块划分)
5. 非功能需求 (性能、安全、兼容性)
6. 数据需求 (数据模型、数据流转)
7. 接口需求 (内部接口、外部接口)
8. 验收标准汇总
9. 附录 (术语表、参考资料)

第五章 前后端技术方案设计

5.1 后端技术方案设计

后端设计要素

  • 技术栈选型:语言 (Python/Java/Go/Node.js)、框架 (Spring Boot/Django/FastAPI/Express)
  • 架构模式:MVC、DDD、微服务、事件驱动
  • 数据库设计:关系型 (MySQL/PostgreSQL)、NoSQL (MongoDB/Redis)
  • 中间件选型:消息队列 (Kafka/RabbitMQ)、缓存 (Redis)、搜索引擎 (Elasticsearch)
  • 安全设计:认证 (JWT/OAuth2)、授权 (RBAC)、加密 (AES/RSA)
  • 性能优化:连接池、异步处理、分库分表、CDN

5.2 前端技术方案设计

前端设计要素

  • 技术栈选型:框架 (React/Vue/Angular)、构建工具 (Vite/Webpack)
  • 状态管理:Redux/Vuex/Zustand/Recoil
  • UI 组件库:Ant Design/Material-UI/Element Plus
  • 路由方案:React Router/Vue Router
  • 样式方案:CSS Modules/Tailwind CSS/Styled Components
  • 性能优化:代码分割、懒加载、虚拟列表、Service Worker

5.3 技术方案文档生成

# 技术方案设计 Prompt 模板
ROLE: 你是一位资深系统架构师
TASK: 根据 PRD 文档设计完整的技术方案

INPUT:
- PRD 文档内容
- 现有技术栈约束
- 性能指标要求

OUTPUT REQUIREMENTS:
1. 系统架构图 (使用 Mermaid 语法)
2. 技术栈详细说明及选型理由
3. 数据库 ER 图设计
4. 核心模块划分与职责说明
5. 接口设计原则
6. 安全设计方案
7. 性能优化策略
8. 部署架构说明
9. 技术风险评估与应对方案

FORMAT: Markdown 文档,包含图表和代码示例

第六章 API 接口开发协议设计

6.1 API 设计规范

🔌 RESTful API 设计原则:
• 资源导向:使用名词复数形式表示资源 (/users, /orders)
• HTTP 方法语义化:GET(查询)、POST(创建)、PUT(更新)、DELETE(删除)
• 状态码规范:200(成功)、201(创建)、400(请求错误)、401(未授权)、404(不存在)、500(服务器错误)
• 版本控制:URL 路径中包含版本号 (/api/v1/users)
• 统一响应格式:{code, message, data, timestamp}

6.2 OpenAPI 规范生成

# OpenAPI 3.0 规范示例
openapi: 3.0.0
info:
  title: 用户管理系统 API
  version: 1.0.0
  description: 提供用户管理的完整 API 接口

servers:
  - url: https://api.example.com/v1

paths:
  /users:
    get:
      summary: 获取用户列表
      parameters:
        - name: page
          in: query
          schema:
            type: integer
            default: 1
        - name: limit
          in: query
          schema:
            type: integer
            default: 20
      responses:
        '200':
          description: 成功返回用户列表
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserList'
    
    post:
      summary: 创建新用户
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateUserRequest'
      responses:
        '201':
          description: 用户创建成功

components:
  schemas:
    User:
      type: object
      properties:
        id:
          type: string
          format: uuid
        username:
          type: string
        email:
          type: string
          format: email
        createdAt:
          type: string
          format: date-time

6.3 Mock 服务搭建

API 设计师 Agent 自动生成 Mock 服务,支持前后端并行开发:

# 使用 Prism 启动 Mock 服务
$ prism mock openapi.yaml

# 或使用 Postman Mock Server
$ newman run collection.json --environment mock-env.json

第七章 AI Coding 自动化开发

7.1 代码生成流程

1
上下文准备

收集 API 规范、技术方案文档、代码模板、编码规范

2
代码骨架生成

Claude Code 根据 API 规范生成 Controller、Service、Model 层骨架代码

3
业务逻辑填充

基于 PRD 中的业务规则,生成具体实现逻辑

4
代码优化重构

应用设计模式、消除代码异味、提升可读性

5
代码审查检查

静态代码分析、安全漏洞扫描、性能问题检测

7.2 代码生成 Prompt 模板

# 后端代码生成 Prompt
ROLE: 你是一位资深后端开发工程师
TASK: 根据 API 规范和技术方案生成后端代码

CONTEXT:
- 技术栈:Python 3.12 + FastAPI + SQLAlchemy + PostgreSQL
- 编码规范:PEP 8, Google Python Style Guide
- 项目结构:遵循 DDD 分层架构

INPUT:
- OpenAPI 规范文档
- 数据库 Schema 设计
- 业务逻辑说明

REQUIREMENTS:
1. 生成完整的 CRUD 操作代码
2. 包含输入验证和数据校验
3. 实现异常处理和日志记录
4. 添加类型注解 (Type Hints)
5. 编写 Docstring 文档字符串
6. 遵循依赖
7. 生成对应的单元测试代码

OUTPUT: 完整的 Python 源文件,可直接运行

7.3 代码质量管理

⚠️ 代码质量门禁:
• 代码覆盖率 ≥ 80%
• 静态分析零严重问题 (SonarQube)
• 无安全漏洞 (Bandit/Semgrep)
• 循环复杂度 ≤ 10
• 重复代码率 ≤ 5%

第八章 Unit Test 单元测试

8.1 测试策略

测试金字塔模型

  • 单元测试 (70%):针对函数、方法、类的测试,快速执行
  • 集成测试 (20%):测试模块间交互、API 接口、数据库操作
  • E2E 测试 (10%):模拟真实用户场景的端到端测试

8.2 单元测试生成

# Python Pytest 单元测试示例
import pytest
from app.services.user_service import UserService
from app.models.user import User

class TestUserService:
    @pytest.fixture
    def user_service(self, mock_db):
        return UserService(mock_db)

    def test_create_user_success(self, user_service):
        """测试成功创建用户"""
        user_data = {
            "username": "test_user",
            "email": "test@example.com",
            "password": "SecurePass123!"
        }
        
        result = user_service.create_user(user_data)
        
        assert result.success is True
        assert result.user.username == "test_user"
        assert result.user.email == "test@example.com"

    def test_create_user_duplicate_email(self, user_service, existing_user):
        """测试创建重复邮箱的用户"""
        user_data = {
            "username": "another_user",
            "email": existing_user.email,
            "password": "SecurePass123!"
        }
        
        result = user_service.create_user(user_data)
        
        assert result.success is False
        assert "email already exists" in result.error.message

    @pytest.mark.parametrize("invalid_email", [
        "invalid-email",
        "missing@domain",
        "@missing-local.com",
    ])
    def test_create_user_invalid_email(self, user_service, invalid_email):
        """参数化测试:无效邮箱格式"""
        user_data = {
            "username": "test_user",
            "email": invalid_email,
            "password": "SecurePass123!"
        }
        
        result = user_service.create_user(user_data)
        
        assert result.success is False
        assert "invalid email format" in result.error.message

8.3 测试执行与报告

# 执行单元测试并生成报告
$ pytest tests/unit/ --cov=app --cov-report=html --cov-report=xml

# 生成 Allure 测试报告
$ pytest tests/ --alluredir=./allure-results
$ allure serve ./allure-results

# CI 环境中的测试执行
$ pytest tests/unit/ -v --junitxml=test-results.xml --cov=app --cov-fail-under=80
✅ 单元测试通过标准:
• 所有测试用例 100% 通过
• 代码覆盖率 ≥ 80% (行覆盖率)
• 无 Flaky Tests (不稳定测试)
• 测试执行时间 < 5 分钟

第九章 集成测试自动化

9.1 集成测试范围

集成测试覆盖场景

  • API 集成测试:验证前后端接口调用、参数传递、响应格式
  • 数据库集成测试:验证 CRUD 操作、事务处理、数据一致性
  • 第三方服务集成:验证支付网关、短信服务、邮件服务等外部依赖
  • 消息队列集成:验证异步消息处理、事件驱动流程
  • 缓存集成测试:验证 Redis 缓存读写、过期策略、缓存穿透处理

9.2 测试环境管理

# Docker Compose 测试环境配置
version: '3.8'
services:
  app:
    build: .
    environment:
      - DATABASE_URL=postgresql://test:test@db:5432/testdb
      - REDIS_URL=redis://redis:6379
    depends_on:
      - db
      - redis
  
  db:
    image: postgres:15
    environment:
      - POSTGRES_DB=testdb
      - POSTGRES_USER=test
      - POSTGRES_PASSWORD=test
    volumes:
      - ./tests/fixtures/init.sql:/docker-entrypoint-initdb.d/init.sql
  
  redis:
    image: redis:7-alpine
  
  test-runner:
    build: .
    command: pytest tests/integration/ -v
    environment:
      - DATABASE_URL=postgresql://test:test@db:5432/testdb
      - REDIS_URL=redis://redis:6379
    depends_on:
      - db
      - redis

9.3 API 集成测试示例

# Postman Collection + Newman 执行
const pm = require('postman-collection');
const collection = new pm.Collection(require('./api-tests.json'));

# Newman CLI 执行
$ newman run api-tests.json \
  --environment test-env.json \
  --reporters cli,junit,htmlextra \
  --reporter-junit-export test-results.xml \
  --reporter-htmlextra-export test-report.html

# Python Requests 集成测试
import requests
import pytest

class TestUserAPI:
    BASE_URL = "http://localhost:8000/api/v1"
    
    def test_user_crud_flow(self):
        """测试用户 CRUD 完整流程"""
        # 1. 创建用户
        create_resp = requests.post(
            f"{self.BASE_URL}/users",
            json={"username": "test", "email": "test@example.com"}
        )
        assert create_resp.status_code == 201
        user_id = create_resp.json()["data"]["id"]
        
        # 2. 查询用户
        get_resp = requests.get(f"{self.BASE_URL}/users/{user_id}")
        assert get_resp.status_code == 200
        
        # 3. 更新用户
        update_resp = requests.put(
            f"{self.BASE_URL}/users/{user_id}",
            json={"username": "updated"}
        )
        assert update_resp.status_code == 200
        
        # 4. 删除用户
        delete_resp = requests.delete(f"{self.BASE_URL}/users/{user_id}")
        assert delete_resp.status_code == 204

第十章 Jenkins + Docker + K8S 自动部署

10.1 CI/CD Pipeline 架构

代码提交
Git Push
代码检查
Lint/Scan
单元测试
Pytest/JUnit
构建镜像
Docker Build
推送镜像
Harbor Registry
集成测试
API/E2E
部署 Staging
K8S Namespace
UI 自动化测试
人工审批
部署 Production
Rolling Update
健康检查
Readiness Probe
监控告警
Prometheus

10.2 Jenkins Pipeline 配置

// Jenkinsfile - 声明式 Pipeline
pipeline {
    agent {
        kubernetes {
            yaml '''
                apiVersion: v1
                kind: Pod
                spec:
                  containers:
                  - name: maven
                    image: maven:3.9-openjdk-17
                    command:
                    - cat
                    tty: true
                  - name: docker
                    image: docker:24-dind
                    securityContext:
                      privileged: true
                  - name: kubectl
                    image: bitnami/kubectl:latest
                    command:
                    - cat
                    tty: true
            '''
        }
    }
    
    environment {
        REGISTRY = 'harbor.company.com'
        REGISTRY_CREDENTIAL_ID = 'harbor-credentials'
        KUBECONFIG_CREDENTIAL_ID = 'kubeconfig'
        DOCKER_IMAGE = "${REGISTRY}/project/${APP_NAME}:${BUILD_NUMBER}"
    }
    
    stages {
        stage('Checkout') {
            steps {
                checkout scm
                script {
                    env.GIT_COMMIT_SHORT = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
                }
            }
        }
        
        stage('Code Quality Check') {
            parallel {
                stage('Lint') {
                    steps {
                        sh 'python -m flake8 app/'
                        sh 'python -m black --check app/'
                    }
                }
                stage('Security Scan') {
                    steps {
                        sh 'bandit -r app/ -f json -o bandit-report.json'
                        archiveArtifacts artifacts: 'bandit-report.json'
                    }
                }
            }
        }
        
        stage('Unit Test') {
            steps {
                sh 'pytest tests/unit/ --cov=app --cov-report=xml --junitxml=test-results.xml'
                junit 'test-results.xml'
                publishCoverage adapters: [coberturaAdapter('coverage.xml')]
            }
        }
        
        stage('Build Docker Image') {
            steps {
                script {
                    withDockerRegistry([credentialsId: REGISTRY_CREDENTIAL_ID, url: "https://${REGISTRY}"]) {
                        sh "docker build -t ${DOCKER_IMAGE} ."
                        sh "docker push ${DOCKER_IMAGE}"
                    }
                }
            }
        }
        
        stage('Deploy to Staging') {
            steps {
                withKubeConfig([credentialsId: KUBECONFIG_CREDENTIAL_ID]) {
                    sh """
                        kubectl set image deployment/${APP_NAME} \
                          ${APP_NAME}=${DOCKER_IMAGE} \
                          -n staging
                        kubectl rollout status deployment/${APP_NAME} -n staging --timeout=300s
                    """
                }
            }
        }
        
        stage('Integration Test') {
            steps {
                sh 'pytest tests/integration/ -v --junitxml=integration-results.xml'
                junit 'integration-results.xml'
            }
        }
        
        stage('UI Automation Test') {
            steps {
                sh 'playwright test --reporter=html'
                archiveArtifacts artifacts: 'playwright-report/**/*'
            }
        }
        
        stage('Manual Approval') {
            steps {
                timeout(time: 24, unit: 'HOURS') {
                    input message: '是否部署到生产环境?', 
                          ok: '部署',
                          submitter: 'admin,release-manager'
                }
            }
        }
        
        stage('Deploy to Production') {
            steps {
                withKubeConfig([credentialsId: KUBECONFIG_CREDENTIAL_ID]) {
                    sh """
                        kubectl set image deployment/${APP_NAME} \
                          ${APP_NAME}=${DOCKER_IMAGE} \
                          -n production
                        kubectl rollout status deployment/${APP_NAME} -n production --timeout=600s
                    """
                }
            }
            post {
                success {
                    slackSend channel: '#deployments',
                              color: 'good',
                              message: ":white_check_mark: ${APP_NAME} 已成功部署到生产环境 (版本:${BUILD_NUMBER})"
                }
                failure {
                    slackSend channel: '#deployments',
                              color: 'danger',
                              message: ":x: ${APP_NAME} 生产部署失败 (版本:${BUILD_NUMBER})"
                }
            }
        }
    }
    
    post {
        always {
            cleanWs()
        }
        failure {
            emailext subject: "构建失败:${JOB_NAME} [${BUILD_NUMBER}]",
                     body: "请查看:${BUILD_URL}",
                     to: 'team@company.com'
        }
    }
}

10.3 Dockerfile 配置

# 多阶段构建 Dockerfile
# Stage 1: 构建阶段
FROM python:3.12-slim as builder

WORKDIR /app

# 安装构建依赖
RUN apt-get update && apt-get install -y \\
    gcc \\
    libpq-dev \\
    && rm -rf /var/lib/apt/lists/*

# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt

# 复制源代码
COPY . .

# Stage 2: 运行阶段
FROM python:3.12-slim

WORKDIR /app

# 创建非 root 用户
RUN useradd --create-home --shell /bin/bash appuser

# 从构建阶段复制已安装的包和代码
COPY --from=builder /root/.local /home/appuser/.local
COPY --from=builder /app /app

# 设置环境变量
ENV PATH=/home/appuser/.local/bin:$PATH \\
    PYTHONUNBUFFERED=1 \\
    PYTHONDONTWRITEBYTECODE=1

# 切换用户
USER appuser

# 暴露端口
EXPOSE 8000

# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \\
    CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')" || exit 1

# 启动命令
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

10.4 Kubernetes 部署配置

# Kubernetes Deployment YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  namespace: production
  labels:
    app: myapp
    version: v1.0.0
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: myapp
        version: v1.0.0
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "8000"
    spec:
      serviceAccountName: myapp-sa
      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
      containers:
      - name: myapp
        image: harbor.company.com/project/myapp:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8000
          protocol: TCP
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: url
        - name: REDIS_URL
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: redis-url
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /ready
            port: 8000
          initialDelaySeconds: 5
          periodSeconds: 5
          timeoutSeconds: 3
          failureThreshold: 3
        volumeMounts:
        - name: config-volume
          mountPath: /app/config
      volumes:
      - name: config-volume
        configMap:
          name: app-config
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchLabels:
                  app: myapp
              topologyKey: kubernetes.io/hostname

---
# Kubernetes Service
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
  namespace: production
spec:
  selector:
    app: myapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8000
  type: ClusterIP

---
# Kubernetes Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  namespace: production
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - myapp.example.com
    secretName: myapp-tls
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-service
            port:
              number: 80

10.5 KubeSphere 集成

🎯 KubeSphere 优势:
• 可视化 DevOps 流水线管理
• 多租户权限隔离
• 内置监控告警系统 (Prometheus + Grafana)
• 应用商店 (Helm Charts)
• 日志聚合查询 (ELK Stack)
• 服务网格 (Istio 集成)
• 多集群管理

第十一章 UI 自动化测试验收

11.1 测试框架选择

推荐技术栈

PlaywrightSelenium 4CypressTestCafe

推荐:Playwright - 支持多浏览器 (Chromium/Firefox/WebKit)、自动等待、网络拦截、截图/录屏、Trace viewer

11.2 Playwright 测试示例

# Playwright 配置 (playwright.config.ts)
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  testDir: './tests/e2e',
  timeout: 30 * 1000,
  expect: {
    timeout: 5000
  },
  fullyParallel: true,
  forbidOnly: !!process.env.CI,
  retries: process.env.CI ? 2 : 0,
  workers: process.env.CI ? 1 : undefined,
  reporter: [['html'], ['junit', { outputFile: 'test-results.xml' }]],
  
  use: {
    baseURL: 'http://localhost:3000',
    trace: 'on-first-retry',
    screenshot: 'only-on-failure',
    video: 'retain-on-failure',
  },

  projects: [
    {
      name: 'chromium',
      use: { ...devices['Desktop Chrome'] },
    },
    {
      name: 'firefox',
      use: { ...devices['Desktop Firefox'] },
    },
    {
      name: 'webkit',
      use: { ...devices['Desktop Safari'] },
    },
    {
      name: 'Mobile Chrome',
      use: { ...devices['Pixel 5'] },
    },
  ],

  webServer: {
    command: 'npm run start',
    url: 'http://localhost:3000',
    timeout: 120 * 1000,
  },
});
# E2E 测试用例示例
import { test, expect } from '@playwright/test';

test.describe('用户登录流程', () => {
  test.beforeEach(async ({ page }) => {
    await page.goto('/login');
  });

  test('成功登录并跳转到首页', async ({ page }) => {
    // 填写登录表单
    await page.fill('input[name="email"]', 'test@example.com');
    await page.fill('input[name="password"]', 'SecurePass123!');
    
    // 提交表单
    await page.click('button[type="submit"]');
    
    // 验证跳转
    await expect(page).toHaveURL('/dashboard');
    
    // 验证欢迎信息
    await expect(page.locator('.welcome-message'))
      .toContainText('Welcome, Test User');
  });

  test(async ({ page }) => {
    await page.fill('input[name="email"]', 'test@example.com');
    await page.fill('input[name="password"]', 'WrongPassword');
    
    await page.click('button[type="submit"]');
    
    // 验证错误提示
    await expect(page.locator('.error-message'))
      .toContainText('Invalid email or password');
    
    // 验证 URL 未变化
    await expect(page).toHaveURL('/login');
  });
});

test.describe('用户管理功能', () => {
  test('创建新用户完整流程', async ({ page }) => {
    // 登录
    await page.goto('/login');
    await page.fill('input[name="email"]', 'admin@example.com');
    await page.fill('input[name="password"]', 'AdminPass123!');
    await page.click('button[type="submit"]');
    
    // 导航到用户管理页面
    await page.click('a[href="/users"]');
    
    // 点击新建用户按钮
    await page.click('button:has-text("New User")');
    
    // 填写用户信息
    await page.fill('input[name="username"]', 'new_user');
    await page.fill('input[name="email"]', 'newuser@example.com');
    await page.selectOption('select[name="role"]', 'editor');
    
    // 保存
    await page.click('button:has-text("Save")');
    
    // 验证成功提示
    await expect(page.locator('.toast-success'))
      .toContainText('User created successfully');
    
    // 验证用户出现在列表中
    await expect(page.locator('tr:has-text("new_user")'))
      .toBeVisible();
  });
});

11.3 视觉回归测试

# 视觉回归测试示例
test('首页视觉回归测试', async ({ page }) => {
  await page.goto('/');
  
  // 截取全屏截图并与基准对比
  await expect(page).toHaveScreenshot('homepage.png', {
    fullPage: true,
    maxDiffPixels: 100, // 允许的最大差异像素数
  });
});

test('登录页面视觉回归测试', async ({ page }) => {
  await page.goto('/login');
  
  // 截取特定元素截图
  await expect(page.locator('.login-form'))
    .toHaveScreenshot('login-form.png');
});

11.4 测试报告

✅ UI 测试验收标准:
• 所有关键用户旅程测试通过
• 跨浏览器兼容性测试通过 (Chrome/Firefox/Safari)
• 响应式布局测试通过 (桌面/平板/手机)
• 无障碍访问测试通过 (WCAG 2.1 AA)
• 性能指标达标 (LCP < 2.5s, FID < 100ms, CLS < 0.1)

第十二章 人机协同机制

12.1 人机协同节点

研发阶段 AI 自动化程度 人工介入点 审批方式
需求分析 70% 需求确认、优先级调整 PRD 评审会议
技术设计 60% 架构决策、技术选型 技术评审委员会
代码开发 80% Code Review、复杂逻辑审核 Git Merge Request
测试验证 90% 测试用例审核、边界场景补充 测试报告审批
部署发布 85% 生产发布审批、回滚决策 变更管理委员会

12.2 人工审批工作流

# Jenkins 人工审批配置
stage('Production Deployment Approval') {
    steps {
        timeout(time: 24, unit: 'HOURS') {
            input message: '生产环境部署审批',
                  ok: '批准部署',
                  submitter: 'release-managers',
                  submitterParameter: 'APPROVER'
        }
    }
    post {
        success {
            script {
                currentBuild.description = "Approved by ${APPROVER} for production deployment"
            }
        }
    }
}

# GitLab MR 审批配置 (.gitlab-ci.yml)
deployment_prod:
  stage: deploy
  script:
    - echo "Deploying to production..."
  environment:
    name: production
    url: https://app.example.com
  when: manual
  only:
    - main
  allow_failure: false
  variables:
    DEPLOY_ENV: production

12.3 Code Review 流程

📝 Code Review 检查清单:
• 代码是否符合编码规范?
• 是否有适当的单元测试覆盖?
• 是否存在安全漏洞或性能问题?
• 代码注释是否清晰完整?
• 是否遵循了设计模式和最佳实践?
• 是否有不必要的复杂性可以简化?
• 错误处理是否完善?

12.4 异常处理与人机切换

⚠️ 人机切换触发条件:
• AI 生成的代码连续 3 次未通过测试
• 检测到高风险安全漏洞
• 性能指标低于阈值 50%
• 业务逻辑复杂度超出 AI 处理能力
• 收到人工干预请求 (紧急 Bug 修复、特殊需求)

第十三章 运维监控与故障处理

13.1 监控体系架构

监控层次

  • 基础设施监控:CPU、内存、磁盘、网络 (Node Exporter)
  • 容器监控:Pod 状态、资源使用、重启次数 (cAdvisor)
  • 应用监控:QPS、延迟、错误率、业务指标 (Prometheus Client)
  • 日志监控:应用日志、访问日志、错误日志 (ELK Stack)
  • 链路追踪:分布式追踪、性能瓶颈分析 (Jaeger/Zipkin)

13.2 Prometheus 监控配置

# Prometheus 配置 (prometheus.yml)
global:
  scrape_interval: 15s
  evaluation_interval: 15s

rule_files:
  - "alerts/*.yml"

scrape_configs:
  - job_name: 'kubernetes-nodes'
    kubernetes_sd_configs:
      - role: node
    relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)

  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)

  - job_name: 'myapp'
    static_configs:
      - targets: ['myapp-service.production.svc:8000']

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - alertmanager:9093

13.3 告警规则配置

# AlertManager 告警规则 (alerts.yml)
groups:
- name: myapp-alerts
  rules:
  - alert: HighErrorRate
    expr: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.05
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "高错误率告警"
      description: "应用 {{ $labels.instance }} 的错误率超过 5% (当前值:{{ $value | humanizePercentage }})"

  - alert: HighLatency
    expr: histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) > 1
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "高延迟告警"
      description: "应用 {{ $labels.instance }} 的 P95 延迟超过 1 秒 (当前值:{{ $value | humanizeDuration }})"

  - alert: PodCrashLooping
    expr: rate(kube_pod_container_status_restarts_total[15m]) * 60 * 5 > 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "Pod 频繁重启"
      description: "Pod {{ $labels.pod }} 在 5 分钟内重启超过 {{ $value }} 次"

  - alert: HighMemoryUsage
    expr: container_memory_usage_bytes / container_spec_memory_limit_bytes > 0.9
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "内存使用率过高"
      description: "容器 {{ $labels.container }} 内存使用率超过 90% (当前值:{{ $value | humanizePercentage }})"

13.4 故障排查流程

1
告警接收

接收来自 Prometheus/AlertManager 的告警通知 (邮件/Slack/钉钉)

2
初步诊断

查看 Grafana 仪表盘,确认告警范围和影响程度

3
日志分析

在 Kibana 中查询相关错误日志,定位问题根源

4
链路追踪

使用 Jaeger 查看分布式追踪,识别性能瓶颈

5
问题修复

根据诊断结果实施修复方案 (回滚/热修复/配置调整)

6
复盘总结

编写事故报告,制定预防措施,更新运维手册

13.5 常用运维命令

# Kubectl 常用命令
# 查看 Pod 状态
$ kubectl get pods -n production -o wide

# 查看 Pod 详情
$ kubectl describe pod myapp-xxx -n production

# 查看 Pod 日志
$ kubectl logs -f myapp-xxx -n production

# 进入 Pod 调试
$ kubectl exec -it myapp-xxx -n production -- /bin/bash

# 滚动重启 Deployment
$ kubectl rollout restart deployment/myapp -n production

# 回滚到上一版本
$ kubectl rollout undo deployment/myapp -n production

# 查看资源使用情况
$ kubectl top pods -n production
$ kubectl top nodes

# 端口转发本地调试
$ kubectl port-forward svc/myapp-service 8080:80 -n production

# Docker 常用命令
# 查看容器日志
$ docker logs -f myapp-container

# 进入容器
$ docker exec -it myapp-container /bin/bash

# 查看容器资源使用
$ docker stats myapp-container

# Jenkins 常用命令
# 通过 CLI 触发构建
$ java -jar jenkins-cli.jar -s http://jenkins.example.com build my-job

# 查看构建队列
$ java -jar jenkins-cli.jar -s http://jenkins.example.com list-changes my-job

13.6 备份与恢复策略

💾 备份策略:
数据库备份:每日全量备份 + 每小时增量备份 (保留 30 天)
配置文件备份:Git 版本控制 + 对象存储冗余
镜像备份:Harbor 镜像仓库多副本 + 异地灾备
日志备份:ELK 热数据 7 天 + 冷数据归档 90 天

🔄 恢复流程:
1. 评估故障影响范围
2. 选择最近的可用备份点
3. 执行数据恢复操作
4. 验证数据完整性
5. 恢复服务并监控

13.7 应急预案

🚨 紧急情况处理:
场景 1:生产环境大规模故障
→ 立即启动应急预案
→ 通知相关干系人
→ 执行服务降级或熔断
→ 必要时回滚到稳定版本

场景 2:安全漏洞被利用
→ 隔离受影响系统
→ 阻断攻击源 IP
→ 修复漏洞并重新部署
→ 安全审计与加固

场景 3:数据丢失或损坏
→ 停止写入操作防止扩散
→ 从备份恢复数据
→ 验证数据一致性
→ 分析原因并制定预防措施