作为 产品经理 Agent,
我希望 能够接收原始需求输入并自动生成结构化 PRD 文档,
以便于 快速将模糊需求转化为可执行的产品规格说明。
验收标准:
- 支持自然语言需求输入(文本/语音转文字)
- 自动识别功能点、业务规则、约束条件
- 生成符合标准模板的 PRD 文档(含用户故事、业务流程、原型描述)
- 输出前需经过人工确认环节(人机协同)
基于 OpenClaw + Claude Code 的端到端研发自动化系统
构建一个基于 OpenClaw(任务编排引擎)+ Claude Code(AI 编程助手)的端到端研发自动化系统,实现从需求分析到生产部署的全流程自动化,支持各研发角色的岗位 Agents 协同工作,在关键节点保留人机协同能力,提升研发效率 10 倍以上。
| 范围 | 包含内容 | 不包含内容 |
|---|---|---|
| 需求阶段 | 需求收集、分析、PRD 自动生成 | 市场调研、竞品分析 |
| 设计阶段 | 技术方案设计、API 协议设计、原型生成 | UI/UX 创意设计 |
| 开发阶段 | AI Coding、单元测试生成、代码审查 | 手工编码(除非人机协同模式) |
| 测试阶段 | 单元测试、集成测试、UI 自动化测试 | 性能测试、安全渗透测试 |
| 部署阶段 | CI/CD 流水线、容器化部署、K8S 编排 | 基础设施 provisioning |
作为 产品经理 Agent,
我希望 能够接收原始需求输入并自动生成结构化 PRD 文档,
以便于 快速将模糊需求转化为可执行的产品规格说明。
验收标准:
作为 系统架构师 Agent,
我希望 基于 PRD 自动生成后端技术方案设计文档,
以便于 明确系统架构、技术选型、数据库设计、接口规范。
验收标准:
作为 前端开发 Agent,
我希望 基于 PRD 和原型规范生成前端技术方案,
以便于 明确组件结构、状态管理、路由设计、API 对接方案。
验收标准:
作为 后端开发 Agent,
我希望 根据 API 接口协议自动生成 CRUD 代码和业务逻辑,
以便于 快速实现 RESTful API 服务。
验收标准:
作为 前端开发 Agent,
我希望 根据原型规范和 API 协议生成前端页面代码,
以便于 快速构建用户界面并完成数据对接。
验收标准:
作为 测试工程师 Agent,
我希望 自动生成单元测试、集成测试和 UI 自动化测试脚本,
以便于 确保代码质量和功能正确性。
验收标准:
作为 DevOps 工程师 Agent,
我希望 自动配置 CI/CD 流水线并完成容器化部署,
以便于 实现代码提交到生产环境的自动化发布。
验收标准:
作为 项目经理(人类),
我希望 在关键节点进行人工审核和决策,
以便于 控制项目风险并确保方向正确。
验收标准:
| 阶段 | 输入 | 处理过程 | 输出 | 责任人 | 人机协同点 |
|---|---|---|---|---|---|
| 1. 需求收集 | 业务方口头/文档需求 | OpenClaw 解析需求,Claude Code 提取关键信息 | 原始需求清单 | 产品经理 | 需求优先级确认 |
| 2. PRD 设计 | 原始需求清单 | PM Agent 生成用户故事、业务流程、原型描述 | 结构化 PRD 文档 | 产品经理 Agent | PRD 评审与批准 |
| 3. 技术方案 | PRD 文档 | 架构师 Agent 设计系统架构、数据库、接口 | 技术方案设计文档 | 架构师 Agent | 架构方案评审 |
| 4. API 协议 | 技术方案文档 | 前后端 Agent 协商生成 OpenAPI 规范 | API 接口文档 (Swagger) | 前后端开发 Agent | 接口评审会议 |
| 5. AI Coding | API 文档 + 技术方案 | Claude Code 生成前后端代码 | 源代码 + 单元测试 | 前后端开发 Agent | Code Review |
| 6. 单元测试 | 源代码 | QA Agent 生成并执行单元测试 | 测试报告(覆盖率) | 测试工程师 Agent | 阈值设定(≥80%) |
| 7. 集成测试 | 通过单元测试的代码 | QA Agent 执行 API 集成测试 | 集成测试报告 | 测试工程师 Agent | 缺陷修复确认 |
| 8. CI/CD | 通过测试的代码 | DevOps Agent 触发 Jenkins Pipeline | Docker 镜像 | DevOps 工程师 Agent | 部署审批 |
| 9. K8S 部署 | Docker 镜像 | DevOps Agent 部署到 KubeSphere | 运行中的应用 | DevOps 工程师 Agent | 生产环境发布 |
| 10. UI 验收 | 部署的应用 | QA Agent 执行 UI 自动化测试 | 验收测试报告 | 测试工程师 Agent | 最终验收签字 |
| 功能 ID | 功能名称 | 描述 | 优先级 |
|---|---|---|---|
| F-REQ-001 | 需求导入 | 支持文本、Word、Excel、语音转文字等多种需求输入格式 | P0 |
| F-REQ-002 | 需求解析 | 使用 NLP 技术自动提取功能点、业务规则、约束条件 | P0 |
| F-REQ-003 | 需求分类 | 自动将需求归类为功能性需求、非功能性需求、技术需求 | P1 |
| F-REQ-004 | 需求追溯 | 建立需求 -PRD- 设计 - 代码 - 测试的双向追溯矩阵 | P1 |
| 功能 ID | 功能名称 | 描述 | 优先级 |
|---|---|---|---|
| F-PRD-001 | 用户故事生成 | 基于需求自动生成标准格式的用户故事(As a...I want...So that...) | P0 |
| F-PRD-002 | 业务流程建模 | 自动生成 BPMN 流程图或 UML 活动图 | P0 |
| F-PRD-003 | 原型描述生成 | 生成页面原型文字描述和交互说明 | P1 |
| F-PRD-004 | 验收标准定义 | 为每个用户故事生成 Given-When-Then 格式的验收标准 | P0 |
| F-PRD-005 | PRD 版本管理 | 支持 PRD 多版本对比和变更历史追溯 | P1 |
| 功能 ID | 功能名称 | 描述 | 优先级 |
|---|---|---|---|
| F-ARCH-001 | 架构模式推荐 | 根据业务复杂度推荐单体/微服务/Serverless 架构 | P0 |
| F-ARCH-002 | 技术栈选型 | 基于团队技术栈和项目需求推荐编程语言、框架、中间件 | P0 |
| F-ARCH-003 | 数据库设计 | 生成 ER 图、建表 SQL、索引优化建议 | P0 |
| F-ARCH-004 | 架构图生成 | 自动生成系统架构图、部署架构图、数据流图 | P1 |
| F-ARCH-005 | 风险评估 | 识别技术风险点并提供缓解措施建议 | P2 |
| 功能 ID | 功能名称 | 描述 | 优先级 |
|---|---|---|---|
| F-CODE-001 | 后端代码生成 | 基于 API 协议生成 Controller、Service、DAO 层代码 | P0 |
| F-CODE-002 | 前端代码生成 | 基于原型规范生成 React/Vue 组件和页面 | P0 |
| F-CODE-003 | 单元测试生成 | 为生成的代码自动编写单元测试用例 | P0 |
| F-CODE-004 | 代码审查 | 使用 SonarQube 等工具进行代码质量检查 | P1 |
| F-CODE-005 | 代码重构建议 | 识别代码异味并提供重构建议 | P2 |
| 功能 ID | 功能名称 | 描述 | 优先级 |
|---|---|---|---|
| F-TEST-001 | 单元测试执行 | 自动运行单元测试并生成覆盖率报告 | P0 |
| F-TEST-002 | 集成测试生成 | 基于 API 文档生成 Postman/Newman 测试集合 | P0 |
| F-TEST-003 | UI 测试生成 | 使用 Playwright/Cypress生成UI自动化测试脚本 | P0 |
| F-TEST-004 | 测试报告生成 | 聚合各阶段测试结果生成综合质量报告 | P1 |
| F-TEST-005 | 缺陷自动诊断 | 分析测试失败原因并定位问题代码 | P2 |
| 功能 ID | 功能名称 | 描述 | 优先级 |
|---|---|---|---|
| F-DEPLOY-001 | Jenkins Pipeline 生成 | 自动生成声明式 Pipeline 脚本 | P0 |
| F-DEPLOY-002 | Docker 镜像构建 | 生成 Dockerfile 并构建优化后的镜像 | P0 |
| F-DEPLOY-003 | K8S 资源配置 | 生成 Deployment、Service、Ingress、ConfigMap 等 YAML | P0 |
| F-DEPLOY-004 | 多环境管理 | 支持 dev/test/staging/prod多环境配置和部署 | P1 |
| F-DEPLOY-005 | 灰度发布 | 支持蓝绿部署、金丝雀发布策略 | P2 |
| F-DEPLOY-006 | 自动回滚 | 部署失败时自动回滚到上一稳定版本 | P1 |
| 要素类别 | 规范要求 | 示例值 |
|---|---|---|
| 色彩系统 | 主色、辅助色、中性色、语义色定义 | Primary: #1890ff, Success: #52c41a, Warning: #faad14, Error: #f5222d |
| 字体规范 | 字体家族、字号、字重、行高 | Font: 'Inter', -apple-system; H1: 32px/Bold; Body: 14px/Regular |
| 间距系统 | 基于 8px 栅格系统的间距规范 | Spacing: 8px, 16px, 24px, 32px, 48px, 64px |
| 圆角规范 | 按钮、卡片、输入框等圆角值 | Small: 4px, Medium: 8px, Large: 12px, Full: 999px |
| 阴影层级 | 不同 elevation 的阴影效果 | Shadow1: 0 2px 8px rgba(0,0,0,0.1); Shadow3: 0 8px 24px rgba(0,0,0,0.15) |
| 组件库 | 使用的 UI 组件库及版本 | Ant Design 5.x / Element Plus 2.x / Material UI 5.x |
# 页面原型描述模板(YAML 格式) page_id: user_management page_name: 用户管理页面 route: /admin/users layout: AdminLayout components: - id: search_bar type: SearchBar position: top fields: - {name: username, label: 用户名,type: input} - {name: role, label: 角色,type: select, options: [admin, user, guest]} - {name: status, label: 状态,type: radio, options: [active, inactive]} - id: action_toolbar type: Toolbar position: top-right actions: - {label: 新增用户,icon: plus, action: openModal('create')} - {label: 批量删除,icon: delete, action: batchDelete} - {label: 导出 Excel, icon: export, action: exportData} - id: user_table type: DataTable dataSource: GET /api/v1/users columns: - {key: id, title: ID, width: 80} - {key: username, title: 用户名,width: 150} - {key: email, title: 邮箱,width: 200} - {key: role, title: 角色,width: 100, render: badge} - {key: status, title: 状态,width: 100, render: switch} - {key: created_at, title: 创建时间,width: 180} - {key: actions, title: 操作,width: 200, render: actionButtons} pagination: pageSize: 20 showSizeChanger: true - id: create_modal type: Modal title: 新增用户 form: - {field: username, label: 用户名,required: true, validator: minLength(3)} - {field: email, label: 邮箱,required: true, validator: email} - {field: password, label: 密码,required: true, type: password} - {field: role, label: 角色,type: select, required: true} submit: POST /api/v1/users interactions: - trigger: row.click action: navigateTo('/admin/users/{id}') - trigger: delete.click action: confirmDelete → DELETE /api/v1/users/{id} - trigger: status.switch action: PATCH /api/v1/users/{id}/status
| 交互类型 | 触发条件 | 反馈方式 | 异常处理 |
|---|---|---|---|
| 表单提交 | 用户点击提交按钮 | 显示 loading 状态 → 成功 Toast/失败 Alert | 字段级错误提示 + 聚焦到第一个错误字段 |
| 数据删除 | 用户点击删除按钮 | 弹出二次确认对话框 | 取消操作/确认后显示删除结果 |
| 列表刷新 | 下拉刷新或筛选条件变化 | 显示骨架屏或 loading 动画 | 超时 30s 显示重试按钮 |
| 文件上传 | 拖拽或选择文件 | 显示上传进度条 | 格式错误/大小超限即时提示 |
| 模态框打开 | 点击触发动作 | 淡入动画 + 背景遮罩 | ESC 键或点击遮罩关闭(可配置) |
// 成功响应 { "code": 200, "message": "success", "data": { ... }, "timestamp": 1710316800000, "traceId": "0a1b2c3d4e5f" } // 失败响应 { "code": 40001, "message": "参数验证失败:email 格式不正确", "data": null, "errors": [ {"field": "email", "message": "无效的邮箱格式"} ], "timestamp": 1710316800000, "traceId": "0a1b2c3d4e5f" }
描述:获取用户列表(分页)
请求参数:
{
"query": {
"page": 1,
"size": 20,
"username": "可选 - 用户名模糊搜索",
"role": "可选 - 角色过滤",
"status": "可选 - 状态过滤"
}
}
响应示例:
{
"code": 200,
"data": {
"list": [
{"id": 1, "username": "admin", "email": "admin@example.com", "role": "admin"}
],
"pagination": {
"total": 100,
"page": 1,
"size": 20,
"totalPages": 5
}
}
}
描述:创建新用户
请求体:
{
"username": "newuser",
"email": "newuser@example.com",
"password": "SecurePass123!",
"role": "user"
}
响应示例:
{
"code": 201,
"message": "创建成功",
"data": {"id": 101, "username": "newuser"}
}
描述:更新用户信息(全量更新)
路径参数:id (用户 ID)
请求体:
{
"username": "updateduser",
"email": "updated@example.com",
"role": "admin",
"status": "active"
}
描述:删除用户
路径参数:id (用户 ID)
响应示例:
{
"code": 200,
"message": "删除成功"
}
# OpenAPI 3.0 规范示例 openapi: 3.0.3 info: title: 用户管理系统 API version: 1.0.0 description: 端到端研发自动化系统的用户管理模块 servers: - url: https://api.example.com/api/v1 description: 生产环境 - url: https://test-api.example.com/api/v1 description: 测试环境 paths: /users: get: summary: 获取用户列表 tags: [Users] parameters: - name: page in: query schema: type: integer default: 1 - name: size in: query schema: type: integer default: 20 maximum: 100 responses: '200': description: 成功 content: application/json: schema: $ref: '#/components/schemas/UserListResponse' post: summary: 创建用户 tags: [Users] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateUserRequest' responses: '201': description: 创建成功 components: schemas: User: type: object properties: id: type: integer username: type: string email: type: string format: email role: type: string enum: [admin, user, guest] status: type: string enum: [active, inactive]
| 技术分层 | 技术选型 | 说明 |
|---|---|---|
| 编程语言 | Java 17 / Python 3.11 / Node.js 20 | 根据团队技术栈选择 |
| Web 框架 | Spring Boot 3.x / FastAPI / NestJS | 提供 RESTful API 服务 |
| ORM 框架 | MyBatis-Plus / SQLAlchemy / Prisma | 数据库对象关系映射 |
| 数据库 | MySQL 8.0 / PostgreSQL 15 | 关系型数据存储 |
| 缓存 | Redis 7.x | 会话管理、热点数据缓存 |
| 消息队列 | RabbitMQ / Kafka | 异步任务处理、事件驱动 |
| 认证授权 | Spring Security + JWT / Auth0 | 用户认证和权限控制 |
| API 文档 | Swagger/OpenAPI 3.0 | 自动生成 API 文档 |
| 日志 | Logback + ELK Stack | 集中式日志管理 |
| 监控 | Prometheus + Grafana | 系统指标监控和告警 |
src/
├── controller/ # 控制器层(HTTP 接口)
│ ├── UserController.java
│ └── AuthController.java
├── service/ # 服务层(业务逻辑)
│ ├── UserService.java
│ └── impl/
│ └── UserServiceImpl.java
├── repository/ # 数据访问层
│ ├── UserRepository.java
│ └── mapper/
│ └── UserMapper.xml
├── entity/ # 实体类
│ ├── User.java
│ └── Role.java
├── dto/ # 数据传输对象
│ ├── request/
│ │ └── CreateUserRequest.java
│ └── response/
│ └── UserResponse.java
├── config/ # 配置类
│ ├── SecurityConfig.java
│ └── SwaggerConfig.java
├── exception/ # 异常处理
│ ├── GlobalExceptionHandler.java
│ └── BusinessException.java
├── common/ # 公共组件
│ ├── constants/
│ ├── utils/
│ └── enums/
└── resources/
├── application.yml
└── db/migration/ # Flyway/Liquibase 迁移脚本
| 技术分层 | 技术选型 | 说明 |
|---|---|---|
| 前端框架 | React 18 / Vue 3 / Angular 17 | 组件化开发框架 |
| 开发语言 | TypeScript 5.x | 类型安全的 JavaScript 超集 |
| 构建工具 | Vite 5.x / Webpack 5 | 快速开发和打包 |
| 状态管理 | Zustand / Redux Toolkit / Pinia | 全局状态管理 |
| UI 组件库 | Ant Design 5 / Element Plus / MUI | 企业级 UI 组件库 |
| 路由管理 | React Router 6 / Vue Router 4 | 前端路由和权限控制 |
| HTTP 客户端 | Axios / TanStack Query | API 请求和数据缓存 |
| 表单处理 | React Hook Form / VeeValidate | 表单验证和管理 |
| CSS 方案 | Tailwind CSS / Styled Components | 样式管理和原子化 CSS |
| 测试框架 | Vitest + Testing Library | 单元测试和组件测试 |
| E2E 测试 | Playwright / Cypress | 端到端自动化测试 |
src/ ├── components/ # 通用组件 │ ├── common/ │ │ ├── Button.tsx │ │ ├── Modal.tsx │ │ └── Table.tsx │ └── business/ │ ├── UserForm.tsx │ └── UserTable.tsx ├── pages/ # 页面组件 │ ├── users/ │ │ ├── UserList.tsx │ │ └── UserDetail.tsx │ └── login/ │ └── LoginPage.tsx ├── hooks/ # 自定义 Hooks │ ├── useAuth.ts │ └── useUsers.ts ├── store/ # 状态管理 │ ├── authStore.ts │ └── userStore.ts ├── services/ # API 服务 │ ├── api.ts │ ├── userService.ts │ └── auth.service.ts ├── types/ # TypeScript 类型定义 │ ├── user.ts │ └── api.d.ts ├── utils/ # 工具函数 │ ├── request.ts │ └── validators.ts ├── styles/ # 全局样式 │ ├── variables.css │ └── global.css ├── assets/ # 静态资源 │ ├── images/ │ └── icons/ ├── router/ # 路由配置 │ └── index.tsx ├── App.tsx └── main.tsx
| 规范项 | 要求 | 示例 |
|---|---|---|
| 命名规范 | 小写字母 + 下划线,复数形式 | users, user_profiles |
| 主键 | 使用 BIGINT 自增或 UUID | id BIGINT PRIMARY KEY AUTO_INCREMENT |
| 时间字段 | 统一使用 created_at, updated_at | created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP |
| 软删除 | 使用 deleted_at 字段标记 | deleted_at TIMESTAMP NULL |
| 索引 | 外键、查询字段、排序字段建索引 | INDEX idx_username (username) |
| 字符集 | 统一使用 utf8mb4 | CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci |
| 项目 | 规范要求 |
|---|---|
| 测试框架 | JUnit 5 (Java) / pytest (Python) / Jest (JS) |
| Mock 工具 | Mockito / unittest.mock / Jest Mock |
| 覆盖率要求 | 行覆盖率≥80%, 分支覆盖率≥70% |
| 命名规范 | should_预期行为_当条件下 (should_returnUser_whenIdValid) |
| AAA 模式 | Arrange(准备) → Act(执行) → Assert(断言) |
| 测试隔离 | 每个测试独立,不依赖其他测试状态 |
// Java + JUnit 5 + Mockito 示例 class UserServiceTest { @Mock private UserRepository userRepository; @InjectMocks private UserService userService; @Test void should_returnUser_when_validIdProvided() { // Arrange Long userId = 1L; User mockUser = new User(userId, "admin", "admin@example.com"); when(userRepository.findById(userId)).thenReturn(Optional.of(mockUser)); // Act User result = userService.getUserById(userId); // Assert assertNotNull(result); assertEquals("admin", result.getUsername()); verify(userRepository, times(1)).findById(userId); } @Test void should_throwException_when_userNotFound() { // Arrange Long userId = 999L; when(userRepository.findById(userId)).thenReturn(Optional.empty()); // Act & Assert assertThrows(UserNotFoundException.class, () -> { userService.getUserById(userId); }); } }
| 测试类型 | 测试工具 | 测试范围 |
|---|---|---|
| API 集成测试 | Postman + Newman / RestAssured | 验证 API 接口功能和数据一致性 |
| 数据库集成测试 | Testcontainers / H2 Database | 验证数据库操作和事务管理 |
| 服务间集成 | WireMock / Mountebank | 模拟外部服务依赖 |
| 消息队列测试 | Embedded RabbitMQ / Kafka | 验证消息生产和消费 |
| 项目 | 规范要求 |
|---|---|
| 测试框架 | Playwright / Cypress / Selenium |
| 元素定位 | 优先使用 data-testid 属性 |
| 等待策略 | 使用智能等待(auto-wait),避免硬编码 sleep |
| 测试数据 | 使用 Factory 模式生成测试数据 |
| 截图对比 | 关键页面进行视觉回归测试 |
| 跨浏览器 | Chrome, Firefox, Safari, Edge |
| 响应式测试 | Desktop (1920x1080), Tablet (768x1024), Mobile (375x667) |
// Playwright + TypeScript 示例 import { test, expect } from '@playwright/test'; test.describe('User Management', () => { test.beforeEach(async ({ page }) => { // 登录 await page.goto('/login'); await page.fill('[data-testid="username"]', 'admin'); await page.fill('[data-testid="password"]', 'password123'); await page.click('[data-testid="login-btn"]'); await expect(page).toHaveURL('/dashboard'); }); test('should display user list', async ({ page }) => { await page.goto('/admin/users'); // 验证表格存在 await expect(page.locator('[data-testid="user-table"]')).toBeVisible(); // 验证至少有一行数据 const rows = page.locator('[data-testid="user-row"]'); await expect(rows.count()).toBeGreaterThan(0); }); test('should create new user', async ({ page }) => { await page.goto('/admin/users'); // 点击新增按钮 await page.click('[data-testid="add-user-btn"]'); // 填写表单 await page.fill('[data-testid="username-input"]', 'testuser'); await page.fill('[data-testid="email-input"]', 'test@example.com'); await page.selectOption('[data-testid="role-select"]', 'user'); // 提交表单 await page.click('[data-testid="submit-btn"]'); // 验证成功提示 await expect(page.locator('.toast-success')).toContainText('创建成功'); // 验证新用户在列表中 await expect(page.locator('text=testuser')).toBeVisible(); }); test('should delete user', async ({ page }) => { await page.goto('/admin/users'); // 点击删除按钮 await page.click('[data-testid="delete-user-1"]'); // 确认删除 await page.click('[data-testid="confirm-delete"]'); // 验证删除成功 await expect(page.locator('.toast-success')).toContainText('删除成功'); await expect(page.locator('text=testuser')).not.toBeVisible(); }); });
// Jenkins Declarative Pipeline pipeline { agent any environment { DOCKER_REGISTRY = 'registry.example.com' IMAGE_NAME = 'myapp-backend' KUBE_CONFIG = credentials('kubeconfig') } stages { stage('Checkout') { steps { git branch: 'main', url: 'https://github.com/org/repo.git' } } stage('Code Review') { steps { sh 'sonar-scanner -Dsonar.projectKey=myapp' script { def qualityGate = waitForQualityGate() if (qualityGate.status != 'OK') { error "Pipeline aborted due to quality gate failure: ${qualityGate.status}" } } } } stage('Unit Test') { steps { sh 'mvn test -DskipITs' junit 'target/surefire-reports/*.xml' publishCoverage adapters: [jacocoAdapter('target/jacoco.exec')] } } stage('Build Docker Image') { steps { script { docker.build("${DOCKER_REGISTRY}/${IMAGE_NAME}:${BUILD_NUMBER}") } } } stage('Push Image') { steps { script { docker.withRegistry("https://${DOCKER_REGISTRY}", 'docker-credentials') { docker.image("${DOCKER_REGISTRY}/${IMAGE_NAME}:${BUILD_NUMBER}").push() } } } } stage('Deploy to Test') { steps { sh """ kubectl --namespace=test set image deployment/myapp \ myapp=${DOCKER_REGISTRY}/${IMAGE_NAME}:${BUILD_NUMBER} kubectl --namespace=test rollout status deployment/myapp """ } } stage('Integration Test') { steps { sh 'newman run tests/postman_collection.json -e tests/test_environment.json' } } stage('UI Automation Test') { steps { sh 'npx playwright test --reporter=html' publishHTML([ allowMissing: false, alwaysLinkToLastBuild: true, keepAllHistory: true, reportDir: 'playwright-report', reportFiles: 'index.html', reportName: 'Playwright Report' ]) } } stage('Deploy to Production') { when { branch 'main' expression { currentBuild.result == null || currentBuild.result == 'SUCCESS' } } steps { input message: 'Deploy to production?', ok: 'Deploy' sh """ kubectl --namespace=production set image deployment/myapp \ myapp=${DOCKER_REGISTRY}/${IMAGE_NAME}:${BUILD_NUMBER} kubectl --namespace=production rollout status deployment/myapp """ } } } post { always { cleanWs() } success { slackSend channel: '#deployments', color: 'good', message: "Build ${BUILD_NUMBER} succeeded!" } failure { slackSend channel: '#deployments', color: 'danger', message: "Build ${BUILD_NUMBER} failed!" } } }
# 多阶段构建 - Java Spring Boot 示例 # Stage 1: Build FROM maven:3.9-eclipse-temurin-17 AS builder WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean package -DskipTests # Stage 2: Runtime FROM eclipse-temurin:17-jre-alpine WORKDIR /app # 创建非 root 用户 RUN addgroup -S appgroup && adduser -S appuser -G appgroup # 复制构建产物 COPY --from=builder /app/target/*.jar app.jar # 设置时区 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 健康检查 HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \ CMD wget -qO- http://localhost:8080/actuator/health || exit 1 # 切换用户 USER appuser EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
# Kubernetes Deployment apiVersion: apps/v1 kind: Deployment metadata: name: myapp namespace: production labels: app: myapp version: v1.0.0 spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: registry.example.com/myapp-backend:latest ports: - containerPort: 8080 env: - name: SPRING_PROFILES_ACTIVE value: "production" - name: DB_HOST valueFrom: secretKeyRef: name: db-secret key: host resources: requests: memory: "512Mi" cpu: "250m" limits: memory: "1Gi" cpu: "500m" livenessProbe: httpGet: path: /actuator/health/liveness port: 8080 initialDelaySeconds: 60 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health/readiness port: 8080 initialDelaySeconds: 30 periodSeconds: 5 --- # Kubernetes Service apiVersion: v1 kind: Service metadata: name: myapp-service namespace: production spec: selector: app: myapp ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIP --- # Kubernetes Ingress apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myapp-ingress namespace: production annotations: nginx.ingress.kubernetes.io/rewrite-target: / cert-manager.io/cluster-issuer: "letsencrypt-prod" spec: 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
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 创建项目(Namespace) | 在 KubeSphere 控制台创建 dev/test/prod 项目空间 |
| 2 | 配置镜像仓库凭证 | 添加 Docker Registry 密钥用于拉取私有镜像 |
| 3 | 创建工作负载 | 导入 Deployment YAML 或可视化创建 |
| 4 | 配置服务发现 | 创建 Service 和 Ingress 暴露应用 |
| 5 | 配置 ConfigMap/Secret | 管理应用配置和敏感信息 |
| 6 | 设置 HP A | 配置水平 Pod 自动伸缩(CPU/Memory 阈值) |
| 7 | 启用监控告警 | 集成 Prometheus + Grafana 监控面板 |
| 8 | 配置日志收集 | 集成 Fluent Bit + Elasticsearch 日志系统 |
| 研发阶段 | AI 自动化程度 | 人工介入点 | 介入方式 |
|---|---|---|---|
| 需求分析 | 70% 自动解析 | 需求优先级确认、模糊需求澄清 | 在线评审会议 + 批注 |
| PRD 设计 | 80% 自动生成 | PRD 终稿审批、验收标准确认 | 电子签名审批流 |
| 技术方案 | 60% 自动设计 | 架构选型评审、技术风险评估 | 架构委员会投票 |
| API 设计 | 90% 自动生成 | 接口变更评审、Breaking Change 确认 | API 评审会议 |
| 代码开发 | 85% 自动生成 | Code Review、复杂逻辑审核 | GitHub PR Review |
| 测试执行 | 95% 自动执行 | 测试用例评审、缺陷定级 | 测试管理平台 |
| 部署发布 | 80% 自动部署 | 生产环境发布审批、紧急回滚决策 | 一键审批 + 电话确认 |
| 界面类型 | 功能描述 | 技术实现 |
|---|---|---|
| 任务看板 | 展示 AI Agent 当前任务状态和进度 | React + WebSocket 实时更新 |
| 审批中心 | 待审批事项列表和详情查看 | Vue + Element Plus 表单 |
| 对话界面 | 与 AI Agent 自然语言交互 | Chat UI + OpenClaw IM 集成 |
| 差异对比 | AI 生成内容与人工修改对比 | Monaco Editor Diff View |
| 追溯视图 | 需求 - 设计 - 代码 - 测试双向追溯 | D3.js 知识图谱可视化 |
| 质量仪表盘 | 实时展示代码质量、测试覆盖率等指标 | Grafana 嵌入式面板 |
| 异常级别 | 定义 | 处理方式 | 响应时限 |
|---|---|---|---|
| L1 - 提示 | AI 可自动处理的轻微问题 | 记录日志,继续执行 | 无需人工介入 |
| L2 - 警告 | 需要人工确认的非阻塞问题 | 发送通知,等待确认 | 4 小时内响应 |
| L3 - 错误 | 阻塞流程的关键问题 | 暂停流程,立即通知负责人 | 30 分钟内响应 |
| L4 - 严重 | 影响生产环境的重大问题 | 触发应急预案,升级至管理层 | 15 分钟内响应 |
| 术语 | 英文 | 定义 |
|---|---|---|
| PRD | Product Requirement Document | 产品需求文档,描述产品功能、业务逻辑、用户体验等 |
| OpenClaw | - | 开源任务编排引擎,用于协调多个 AI Agent 协同工作 |
| Claude Code | - | Anthropic 公司开发的 AI 编程助手 |
| CI/CD | Continuous Integration/Continuous Deployment | 持续集成/持续部署,自动化软件交付流程 |
| K8S | Kubernetes | 容器编排平台,用于自动化容器应用的部署、扩展和管理 |
| Agent | Intelligent Agent | 智能代理,能够感知环境并采取行动的自主实体 |