从需求分析 → PRD 设计 → 技术方案 → API 开发 → AI Coding → 测试 → CI/CD → K8S 部署 → UI 自动化验收全流程自动化研发系统
本系统基于 OpenClaw AI Agent 框架 和 Claude Code 构建,实现从需求到部署的全流程自动化研发。
| 层级 | 技术组件 | 版本要求 | 用途说明 |
|---|---|---|---|
| AI Agent 层 | OpenClaw | v2026.1+ | 智能体编排与任务执行 |
| AI Coding 层 | Claude Code | Claude Sonnet 4.5+ | 代码生成与重构 |
| 大模型层 | Claude/GPT/Qwen | 最新 API | LLM 推理引擎 |
| CI/CD 层 | Jenkins | v2.440+ | 持续集成流水线 |
| 容器化层 | Docker | v24.0+ | 应用容器封装 |
| 编排层 | Kubernetes | v1.29+ | 容器编排管理 |
| 管理平台 | KubeSphere | v3.4+ | K8S可视化管理 |
| 测试框架 | Pytest/Jest/Playwright | 最新版 | 自动化测试执行 |
系统定义了以下核心 Agent 角色,每个角色都有明确的职责边界和协作机制:
主要职责:
使用技能:自然语言理解、需求模板库、优先级评估模型
输出产物:需求清单、用户故事地图、需求优先级列表
主要职责:
使用技能:PRD 模板引擎、流程图生成、原型设计工具
输出产物:PRD 文档、业务流程图、原型设计稿
主要职责:
使用技能:架构模式库、技术选型决策树、C4 建模工具
输出产物:技术方案文档、系统架构图、数据库 ER 图
主要职责:
使用技能:OpenAPI Generator、API 设计最佳实践、Mock 服务
输出产物:API 文档、Swagger YAML、Postman Collection
主要职责:
使用技能:Claude Code CLI、AST 解析、代码静态分析
输出产物:源代码、单元测试、代码审查报告
主要职责:
使用技能:测试框架、Mock 服务、覆盖率工具
输出产物:测试用例、测试报告、覆盖率报告
主要职责:
使用技能:Docker/K8S/Helm、Jenkins Pipeline、密钥管理
输出产物:容器镜像、K8S 配置、部署脚本
主要职责:
使用技能:Playwright、Percy、Lighthouse
输出产物:E2E 测试脚本、测试报告、截图证据
| 阶段 | 主导 Agent | 协作 Agent | 人机协同点 | 交付物 |
|---|---|---|---|---|
| 需求阶段 | 需求分析 Agent | PRD 设计 Agent | 需求确认评审 | 需求清单 |
| 设计阶段 | 架构设计 Agent | API 设计 Agent | 技术方案评审 | 技术方案文档 |
| 开发阶段 | AI Coding Agent | 测试 Agent | 代码审查 | 源代码 |
| 测试阶段 | 测试 Agent | UI 自动化 Agent | 缺陷确认 | 测试报告 |
| 部署阶段 | 部署 Agent | 所有 Agent | 上线审批 | 生产环境 |
| 组件 | 最低配置 | 推荐配置 | 必选/可选 |
|---|---|---|---|
| CPU | 4 核 | 8 核+ | 必选 |
| 内存 | 8GB | 16GB+ | 必选 |
| 存储 | 50GB SSD | 100GB+ NVMe | 必选 |
| 操作系统 | Ubuntu 20.04 | Ubuntu 22.04 LTS | 必选 |
| 网络 | 10Mbps | 100Mbps+ | 必选 |
# 更新软件包列表
sudo apt update && sudo apt upgrade -y
# 安装基础工具
sudo apt install -y \
git \
curl \
wget \
vim \
net-tools \
jq \
unzip \
software-properties-common \
apt-transport-https \
ca-certificates \
gnupg \
lsb-release
# 使用 NodeSource 安装 Node.js 22
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
# 验证安装
node --version # 应显示 v22.x.x
npm --version # 应显示 10.x.x
# 配置 npm 国内镜像(可选,加速下载)
npm config set registry https://registry.npmmirror.com
# 添加 Docker GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker 仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 将当前用户加入 docker 组(避免每次使用 sudo)
sudo usermod -aG docker $USER
# 验证安装
docker --version
docker run hello-world
# 下载 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
OpenClaw 具有强大的系统操作权限,请务必注意以下安全事项:
# 执行官方安装脚本
curl -fsSL https://openclaw.ai/install.sh | bash
# 安装完成后运行新手引导
openclaw onboard --install-daemon
# PowerShell 执行
iwr -useb https://openclaw.ai/install.ps1 | iex
# 使用 npm 全局安装
npm install -g openclaw
# 或使用 pnpm(推荐)
pnpm add -g openclaw
# 国内用户可使用淘宝镜像
npm install -g openclaw --registry=https://registry.npmmirror.com
运行 openclaw onboard 后,按提示完成以下配置:
~/.openclaw/agents/<agentId>/auth-profiles.json 中存储# 主配置文件位置
~/.openclaw/openclaw.json
# 工作区目录
~/.openclaw/workspace/
├── AGENTS.md # 指令说明
├── USER.md # 偏好设置
├── MEMORY.md # 长期记忆
├── HEARTBEAT.md # 检查清单
├── SOUL.md # 人格/语气
└── IDENTITY.md # 名称/主题
# 认证配置文件
~/.openclaw/agents/<agentId>/auth-profiles.json
# 向量索引存储
~/.openclaw/memory/<cid>.sqlite
# 全局共享技能
~/.openclaw/skills/
# 日志文件
/tmp/openclaw/*.log
| 命令 | 功能描述 |
|---|---|
openclaw status |
查看 Gateway 运行状态 |
openclaw health |
健康检查 |
openclaw doctor |
综合诊断与修复 |
openclaw gateway restart |
重启网关服务 |
openclaw dashboard |
打开 Web 控制面板 |
clawhub install <skill> |
从 ClawHub 安装技能 |
openclaw logs --follow |
实时查看日志 |
# 创建 docker-compose.yml
version: '3.8'
services:
openclaw:
image: openclaw/openclaw:latest
container_name: openclaw
ports:
- "18789:18789"
volumes:
- ./workspace:/app/workspace
- ./config:/app/config
environment:
- OPENCLAW_MODEL=claude-sonnet-4.5
- OPENCLAW_API_KEY=${ANTHROPIC_API_KEY}
restart: unless-stopped
# 启动服务
docker-compose up -d
# 访问 Web UI
# http://localhost:18789
Claude Code 是 Anthropic 官方推出的终端原生 AI 编程助手,基于 Claude Sonnet 4.5/Opus 4.6 大模型,支持本地执行、可视化管理、多智能体协作。
# 安装 Claude Code CLI
npm install -g @anthropic-ai/claude-code
# 或使用 Homebrew (macOS)
brew install claude-code
# 配置 API Key
export ANTHROPIC_API_KEY="your-api-key-here"
# 验证安装
claude --version
在 OpenClaw 配置文件中添加 Claude Code 作为执行工具:
# ~/.openclaw/openclaw.json
{
"agents": {
"coding_agent": {
"model": "claude-sonnet-4.5",
"tools": [
{
"name": "claude_code",
"enabled": true,
"config": {
"api_key": "${ANTHROPIC_API_KEY}",
"max_tokens": 8192,
"temperature": 0.7
}
}
]
}
}
}
# 场景 1: 根据 PRD 生成代码
claude "基于以下 PRD 需求,生成 Python FastAPI 后端代码:
[粘贴 PRD 内容]"
# 场景 2: 代码重构
claude "重构这个函数,提高可读性和性能"
# 场景 3: 生成单元测试
claude "为这个模块编写 pytest 单元测试,覆盖率达到 90%"
# 场景 4: Bug 修复
claude "分析这个错误日志并提供修复方案:
[粘贴错误日志]"
# 创建 Jenkins 数据目录
mkdir -p ~/jenkins_data
# 运行 Jenkins 容器
docker run -d \
--name jenkins \
-p 8080:8080 \
-p 50000:50000 \
-v ~/jenkins_data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/usr/bin/docker \
jenkins/jenkins:lts-jdk17
# 获取初始管理员密码
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
# 访问 Jenkins Web UI
# http://localhost:8080
登录 Jenkins 后,安装以下插件:
pipeline {
agent any
tools {
nodejs 'NodeJS-22'
python 'Python-3.12'
}
environment {
DOCKER_REGISTRY = 'registry.example.com'
IMAGE_NAME = 'myapp'
KUBE_CONFIG = credentials('kubeconfig')
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Install Dependencies') {
steps {
sh 'npm ci'
sh 'pip install -r requirements.txt'
}
}
stage('Code Quality') {
steps {
sh 'npm run lint'
sh 'python -m pylint src/'
}
}
stage('Unit Test') {
steps {
sh 'npm test'
sh 'pytest tests/unit --cov=src --cov-report=xml'
}
post {
always {
junit 'reports/*.xml'
publishCoverage adapters: [coberturaAdapter('coverage.xml')]
}
}
}
stage('Build Docker Image') {
steps {
script {
docker.build("${DOCKER_REGISTRY}/${IMAGE_NAME}:${BUILD_NUMBER}")
}
}
}
stage('Integration Test') {
steps {
sh 'pytest tests/integration'
sh 'npm run test:e2e'
}
}
stage('Push to Registry') {
steps {
script {
docker.withRegistry("https://${DOCKER_REGISTRY}", 'docker-credentials') {
docker.image("${DOCKER_REGISTRY}/${IMAGE_NAME}:${BUILD_NUMBER}").push()
docker.image("${DOCKER_REGISTRY}/${IMAGE_NAME}:${BUILD_NUMBER}").push('latest')
}
}
}
}
stage('Deploy to K8S') {
steps {
sh '''
kubectl apply -f k8s/deployment.yaml
kubectl set image deployment/myapp myapp=${DOCKER_REGISTRY}/${IMAGE_NAME}:${BUILD_NUMBER}
kubectl rollout status deployment/myapp
'''
}
}
stage('UI Automation Test') {
steps {
sh 'playwright test --reporter=html'
}
post {
always {
archiveArtifacts artifacts: 'playwright-report/**/*'
}
}
}
}
post {
success {
echo 'Pipeline completed successfully!'
// 发送通知(飞书/钉钉/邮件)
}
failure {
echo 'Pipeline failed!'
// 发送失败通知
}
}
}
在 Jenkins 中配置以下凭证:
# 后端服务 Dockerfile (Python)
FROM python:3.12-slim as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt
FROM python:3.12-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
# 前端服务 Dockerfile (Node.js)
FROM node:22-alpine as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-backend
labels:
app: myapp
component: backend
spec:
replicas: 3
selector:
matchLabels:
app: myapp
component: backend
template:
metadata:
labels:
app: myapp
component: backend
spec:
containers:
- name: backend
image: registry.example.com/myapp-backend:latest
ports:
- containerPort: 8000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8000
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: myapp-backend-service
spec:
selector:
app: myapp
component: backend
ports:
- port: 80
targetPort: 8000
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: myapp-backend-service
port:
number: 80
myapp-chart/
├── Chart.yaml
├── values.yaml
├── values-production.yaml
└── templates/
├── _helpers.tpl
├── deployment.yaml
├── service.yaml
├── ingress.yaml
├── configmap.yaml
└── secrets.yaml
# 打包 Helm Chart
helm package myapp-chart
# 安装应用
helm install myapp ./myapp-chart -f values-production.yaml
# 升级应用
helm upgrade myapp ./myapp-chart -f values-production.yaml
# 使用 KubeKey 安装 KubeSphere + Kubernetes
curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.13 sh -
chmod +x kk
# 创建集群配置
./kk create config --with-kubernetes v1.28.5 --with-kubesphere v3.4.0
# 编辑 config-sample.yaml 配置节点信息
# 开始安装
./kk create cluster -f config-sample.yaml -y
# 访问 KubeSphere Dashboard
# https://<master-node-ip>:30880
在 KubeSphere 中创建 DevOps 项目:
KubeSphere 内置监控组件:
# tests/unit/test_api.py
import pytest
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def test_read_main():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello World"}
@pytest.mark.asyncio
async def test_create_user():
response = client.post("/users", json={
"username": "testuser",
"email": "test@example.com"
})
assert response.status_code == 201
assert response.json()["username"] == "testuser"
# 运行测试
# pytest tests/unit --cov=src --cov-report=html
# tests/integration/test_workflow.py
import pytest
import requests
BASE_URL = "http://localhost:8000"
def test_full_workflow():
# 1. 创建用户
user_response = requests.post(f"{BASE_URL}/users", json={
"username": "integration_test",
"email": "test@example.com"
})
assert user_response.status_code == 201
user_id = user_response.json()["id"]
# 2. 创建订单
order_response = requests.post(f"{BASE_URL}/orders", json={
"user_id": user_id,
"product": "test_product"
})
assert order_response.status_code == 201
# 3. 查询订单
get_order = requests.get(f"{BASE_URL}/orders/{order_response.json()['id']}")
assert get_order.status_code == 200
// tests/e2e/example.spec.ts
import { test, expect } from '@playwright/test';
test.describe('Login Flow', () => {
test('should login successfully', async ({ page }) => {
await page.goto('http://localhost:3000/login');
await page.fill('[data-testid="username"]', 'admin');
await page.fill('[data-testid="password"]', 'password123');
await page.click('[data-testid="submit"]');
await expect(page).toHaveURL('http://localhost:3000/dashboard');
await expect(page.locator('text=Welcome')).toBeVisible();
});
test('should show validation errors', async ({ page }) => {
await page.goto('http://localhost:3000/login');
await page.click('[data-testid="submit"]');
await expect(page.locator('text=Username is required')).toBeVisible();
});
});
// playwright.config.ts
import type { PlaywrightTestConfig } from '@playwright/test';
const config: PlaywrightTestConfig = {
projects: [
{ name: 'chromium', use: { browserName: 'chromium' } },
{ name: 'firefox', use: { browserName: 'firefox' } },
{ name: 'webkit', use: { browserName: 'webkit' } },
],
reporter: [['html'], ['junit', { outputFile: 'results.xml' }]],
use: {
screenshot: 'only-on-failure',
video: 'retain-on-failure',
},
};
export default config;
| 测试类型 | 最低覆盖率 | 目标覆盖率 |
|---|---|---|
| 单元测试 | 80% | 90%+ |
| 集成测试 | 70% | 85%+ |
| E2E 测试 | 关键路径 100% | 核心功能 100% |
# 使用 OpenClaw 创建新项目
openclaw "创建一个全栈项目,包含:
- 后端:Python FastAPI
- 前端:React + TypeScript
- 数据库:PostgreSQL
- 包含完整的 CI/CD 配置"
# 或手动创建项目结构
mkdir myproject && cd myproject
mkdir -p backend frontend tests docs k8s
# 初始化 Git
git init
git commit --allow-empty -m "Initial commit"
cd backend
# 创建虚拟环境
python -m venv venv
source venv/bin/activate
# 安装依赖
pip install fastapi uvicorn sqlalchemy alembic \
pytest pytest-cov python-jose passlib
# 生成 requirements.txt
pip freeze > requirements.txt
# 初始化 Alembic 迁移
alembic init alembic
# 创建 FastAPI 主应用
cat > main.py << 'EOF'
from fastapi import FastAPI
app = FastAPI(title="MyApp API")
@app.get("/")
async def root():
return {"message": "Hello World"}
@app.get("/health")
async def health():
return {"status": "healthy"}
EOF
cd frontend
# 使用 Vite 创建 React + TypeScript 项目
npm create vite@latest . -- --template react-ts
# 安装依赖
npm install react-router-dom axios @tanstack/react-query
# 安装开发依赖
npm install -D @playwright/test @testing-library/react
# 初始化 Playwright
npx playwright install
npx playwright install-deps
# .env.example (后端)
DATABASE_URL=postgresql://user:pass@localhost:5432/mydb
SECRET_KEY=your-secret-key-here
API_PREFIX=/api/v1
# .env.example (前端)
VITE_API_URL=http://localhost:8000/api/v1
VITE_APP_TITLE=My Application
# docker-compose.dev.yml
version: '3.8'
services:
db:
image: postgres:15
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
ports:
- "5432:5432"
backend:
build: ./backend
ports:
- "8000:8000"
depends_on:
- db
frontend:
build: ./frontend
ports:
- "3000:3000"
在以下关键节点设置人工审核:
# OpenClaw 飞书机器人配置
# ~/.openclaw/channels/feishu.json
{
"channel": "feishu",
"app_id": "cli_xxxxxxxxxxxxx",
"app_secret": "xxxxxxxxxxxxx",
"webhook_url": "https://open.feishu.cn/open-apis/bot/v2/hook/xxx",
"approval_enabled": true,
"approval_nodes": [
"prd_review",
"tech_design_review",
"code_review",
"deployment_approval"
]
}
# 审批通知消息格式
{
"msg_type": "interactive",
"card": {
"elements": [{
"tag": "div",
"text": {
"content": "**待审批**: PRD 文档已生成\n项目:XXX 系统\n请点击查看并审批"
}
}],
"actions": [{
"tag": "button",
"text": { "content": "查看详情" },
"url": "http://jenkins/job/prd-review"
}]
}
}
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| OpenClaw 无法启动 | Node.js 版本过低 | 升级到 Node.js 22+ |
| API Key 认证失败 | 密钥过期或配置错误 | 重新生成 API Key 并更新配置 |
| Docker 容器无法启动 | 端口冲突 | 修改端口映射或停止占用端口的服务 |
| K8S Pod 一直处于 Pending | 资源不足 | 检查节点资源,扩容或调整资源请求 |
| Jenkins Pipeline 失败 | 凭证配置错误 | 检查 Jenkins 凭证配置 |
| 测试覆盖率不达标 | 缺少测试用例 | 补充单元测试和集成测试 |
# OpenClaw 日志
openclaw logs --follow
# Docker 容器日志
docker logs -f <container-id>
# Kubernetes Pod 日志
kubectl logs -f <pod-name> -n <namespace>
# Jenkins 构建日志
# 通过 Web UI 查看或 API 获取
# 系统日志
journalctl -u docker -f
journalctl -u kubelet -f