🚀 CI/CD 自动部署模块运维手册
基于 OpenClaw + Claude Code 的端到端研发自动化系统
📑 目录导航
第一章 系统概述
1.1 系统简介
本运维手册详细描述了基于 OpenClaw + Claude Code 构建的端到端研发自动化系统的 CI/CD 自动部署模块。该系统实现了从需求分析、PRD 设计、技术方案设计、API 协议设计、AI 编码、单元测试、集成测试到最终部署的全流程自动化,支持各研发节点的人机协同操作。
1.2 系统特性
| 特性类别 | 描述 | 技术实现 |
|---|---|---|
| 全流程自动化 | 从需求到部署的完整链路自动化 | OpenClaw + Claude Code + Jenkins Pipeline |
| 多角色协同 | 模拟产品经理、架构师、开发工程师等角色 | 多 Agent 协作框架 |
| 人机协同 | 关键节点支持人工审核和干预 | 审批工作流 + 人工确认机制 |
| 容器化部署 | Docker + Kubernetes 容器编排 | KubeSphere 管理平台 |
| 持续集成/持续部署 | 自动化构建、测试、部署流水线 | Jenkins Pipeline + GitOps |
1.3 适用场景
- 敏捷开发团队:快速迭代、频繁发布的互联网产品团队
- 微服务架构:需要管理多个微服务的复杂系统
- DevOps 实践:追求自动化、标准化的运维团队
- AI 辅助开发:希望引入 AI 提升研发效率的组织
第二章 系统架构说明
2.1 整体架构图
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 生成流程
产品经理 Agent 使用 Claude Code 解析原始需求,提取关键信息
将需求拆分为独立的 User Story,遵循 INVEST 原则
详细描述每个功能点的输入、处理逻辑、输出
为每个功能点定义可量化的验收标准 (Acceptance Criteria)
基于模板自动生成标准化 PRD 文档 (Markdown/PDF)
产品经理审核 PRD 文档,提出修改意见或批准进入下一阶段
4.3 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 设计规范
• 资源导向:使用名词复数形式表示资源 (/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 代码生成流程
收集 API 规范、技术方案文档、代码模板、编码规范
Claude Code 根据 API 规范生成 Controller、Service、Model 层骨架代码
基于 PRD 中的业务规则,生成具体实现逻辑
应用设计模式、消除代码异味、提升可读性
静态代码分析、安全漏洞扫描、性能问题检测
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
K8S Namespace
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 集成
• 可视化 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 测试报告
• 所有关键用户旅程测试通过
• 跨浏览器兼容性测试通过 (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 流程
• 代码是否符合编码规范?
• 是否有适当的单元测试覆盖?
• 是否存在安全漏洞或性能问题?
• 代码注释是否清晰完整?
• 是否遵循了设计模式和最佳实践?
• 是否有不必要的复杂性可以简化?
• 错误处理是否完善?
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 故障排查流程
接收来自 Prometheus/AlertManager 的告警通知 (邮件/Slack/钉钉)
查看 Grafana 仪表盘,确认告警范围和影响程度
在 Kibana 中查询相关错误日志,定位问题根源
使用 Jaeger 查看分布式追踪,识别性能瓶颈
根据诊断结果实施修复方案 (回滚/热修复/配置调整)
编写事故报告,制定预防措施,更新运维手册
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:数据丢失或损坏
→ 停止写入操作防止扩散
→ 从备份恢复数据
→ 验证数据一致性
→ 分析原因并制定预防措施