887 lines
27 KiB
Markdown
887 lines
27 KiB
Markdown
# Deploy Ease 自动化部署平台设计文档
|
||
|
||
## 一、系统概述
|
||
|
||
### 1.1 功能模块
|
||
1. 项目集管理
|
||
- 项目集配置
|
||
- 项目管理
|
||
- Git仓库集成
|
||
- Jenkins集成
|
||
|
||
2. 环境管理
|
||
- 环境配置
|
||
- 环境克隆
|
||
- 环境变量管理
|
||
- 权限控制
|
||
|
||
3. 工作流引擎
|
||
- 流程设计
|
||
- 节点执行
|
||
- 状态管理
|
||
- 日志追踪
|
||
|
||
4. 审批流程
|
||
- 审批配置
|
||
- 审批执行
|
||
- 权限管理
|
||
- 日志记录
|
||
|
||
5. 配置中心
|
||
- Nacos配置管理
|
||
- 配置同步
|
||
- 版本控制
|
||
- 变更追踪
|
||
|
||
## 二、数据库设计
|
||
|
||
### 2.1 项目管理相关表
|
||
```sql
|
||
-- 项目集表
|
||
CREATE TABLE sys_project_group (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
|
||
create_by VARCHAR(255) NULL COMMENT '创建人',
|
||
create_time DATETIME(6) NULL COMMENT '创建时间',
|
||
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||
update_by VARCHAR(255) NULL COMMENT '更新人',
|
||
update_time DATETIME(6) NULL COMMENT '更新时间',
|
||
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
||
tenant_id BIGINT NOT NULL COMMENT '租户ID',
|
||
|
||
code VARCHAR(50) NOT NULL COMMENT '项目集编码',
|
||
name VARCHAR(100) NOT NULL COMMENT '项目集名称',
|
||
description TEXT COMMENT '描述',
|
||
git_group_url VARCHAR(255) NOT NULL COMMENT 'Git组地址',
|
||
jenkins_folder VARCHAR(255) COMMENT 'Jenkins文件夹',
|
||
deploy_type VARCHAR(20) NOT NULL COMMENT '部署类型:JENKINS/SELF_BUILD',
|
||
status VARCHAR(20) NOT NULL DEFAULT 'ENABLED' COMMENT '状态:ENABLED/DISABLED',
|
||
|
||
CONSTRAINT uk_group_code UNIQUE (tenant_id, code),
|
||
CONSTRAINT uk_group_name UNIQUE (tenant_id, name)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='项目集表';
|
||
|
||
-- 项目表
|
||
CREATE TABLE sys_project (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
|
||
create_by VARCHAR(255) NULL COMMENT '创建人',
|
||
create_time DATETIME(6) NULL COMMENT '创建时间',
|
||
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||
update_by VARCHAR(255) NULL COMMENT '更新人',
|
||
update_time DATETIME(6) NULL COMMENT '更新时间',
|
||
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
||
tenant_id BIGINT NOT NULL COMMENT '租户ID',
|
||
|
||
group_id BIGINT NOT NULL COMMENT '项目集ID',
|
||
code VARCHAR(50) NOT NULL COMMENT '项目编码',
|
||
name VARCHAR(100) NOT NULL COMMENT '项目名称',
|
||
description TEXT COMMENT '描述',
|
||
git_url VARCHAR(255) NOT NULL COMMENT 'Git地址',
|
||
jenkins_job VARCHAR(255) COMMENT 'Jenkins任务名',
|
||
build_type VARCHAR(20) NOT NULL COMMENT '构建类型:MAVEN/GRADLE/NPM',
|
||
enable_build BIT NOT NULL DEFAULT 1 COMMENT '是否启用构建',
|
||
status VARCHAR(20) NOT NULL DEFAULT 'ENABLED' COMMENT '状态:ENABLED/DISABLED',
|
||
|
||
CONSTRAINT fk_project_group FOREIGN KEY (group_id) REFERENCES sys_project_group(id),
|
||
CONSTRAINT uk_project_code UNIQUE (tenant_id, code),
|
||
CONSTRAINT uk_project_name UNIQUE (tenant_id, group_id, name)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='项目表';
|
||
```
|
||
|
||
### 2.2 环境管理相关表
|
||
```sql
|
||
-- 环境表
|
||
CREATE TABLE sys_environment (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
|
||
create_by VARCHAR(255) NULL COMMENT '创建人',
|
||
create_time DATETIME(6) NULL COMMENT '创建时间',
|
||
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||
update_by VARCHAR(255) NULL COMMENT '更新人',
|
||
update_time DATETIME(6) NULL COMMENT '更新时间',
|
||
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
||
tenant_id BIGINT NOT NULL COMMENT '租户ID',
|
||
|
||
code VARCHAR(50) NOT NULL COMMENT '环境编码',
|
||
name VARCHAR(100) NOT NULL COMMENT '环境名称',
|
||
description TEXT COMMENT '描述',
|
||
type VARCHAR(20) NOT NULL COMMENT '环境类型:DEV/TEST/UAT/PROD',
|
||
need_approval BIT NOT NULL DEFAULT 0 COMMENT '是否需要审批',
|
||
status VARCHAR(20) NOT NULL DEFAULT 'ENABLED' COMMENT '状态:ENABLED/DISABLED',
|
||
|
||
CONSTRAINT uk_env_code UNIQUE (tenant_id, code),
|
||
CONSTRAINT uk_env_name UNIQUE (tenant_id, name)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='环境表';
|
||
|
||
-- 项目环境配置表
|
||
CREATE TABLE sys_project_env (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
|
||
create_by VARCHAR(255) NULL COMMENT '创建人',
|
||
create_time DATETIME(6) NULL COMMENT '创建时间',
|
||
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||
update_by VARCHAR(255) NULL COMMENT '更新人',
|
||
update_time DATETIME(6) NULL COMMENT '更新时间',
|
||
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
||
tenant_id BIGINT NOT NULL COMMENT '租户ID',
|
||
|
||
project_id BIGINT NOT NULL COMMENT '项目ID',
|
||
env_id BIGINT NOT NULL COMMENT '环境ID',
|
||
workflow_id BIGINT COMMENT '工作流定义ID',
|
||
config TEXT COMMENT '环境配置(JSON)',
|
||
status VARCHAR(20) NOT NULL DEFAULT 'ENABLED' COMMENT '状态:ENABLED/DISABLED',
|
||
|
||
CONSTRAINT fk_env_project FOREIGN KEY (project_id) REFERENCES sys_project(id),
|
||
CONSTRAINT fk_env_environment FOREIGN KEY (env_id) REFERENCES sys_environment(id),
|
||
CONSTRAINT uk_project_env UNIQUE (tenant_id, project_id, env_id)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='项目环境配置表';
|
||
```
|
||
|
||
### 2.3 工作流相关表
|
||
```sql
|
||
-- 工作流定义表
|
||
CREATE TABLE sys_workflow_definition (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
|
||
create_by VARCHAR(255) NULL COMMENT '创建人',
|
||
create_time DATETIME(6) NULL COMMENT '创建时间',
|
||
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||
update_by VARCHAR(255) NULL COMMENT '更新人',
|
||
update_time DATETIME(6) NULL COMMENT '更新时间',
|
||
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
||
tenant_id BIGINT NOT NULL COMMENT '租户ID',
|
||
|
||
code VARCHAR(50) NOT NULL COMMENT '工作流编码',
|
||
name VARCHAR(100) NOT NULL COMMENT '工作流名称',
|
||
description TEXT COMMENT '描述',
|
||
content TEXT NOT NULL COMMENT '工作流定义(JSON)',
|
||
type VARCHAR(20) NOT NULL COMMENT '类型:DEPLOY/CONFIG_SYNC',
|
||
status VARCHAR(20) NOT NULL DEFAULT 'DRAFT' COMMENT '状态:DRAFT/PUBLISHED/DISABLED',
|
||
|
||
CONSTRAINT uk_workflow_code UNIQUE (tenant_id, code)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流定义表';
|
||
|
||
-- 工作流实例表
|
||
CREATE TABLE sys_workflow_instance (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
|
||
create_by VARCHAR(255) NULL COMMENT '创建人',
|
||
create_time DATETIME(6) NULL COMMENT '创建时间',
|
||
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||
update_by VARCHAR(255) NULL COMMENT '更新人',
|
||
update_time DATETIME(6) NULL COMMENT '更新时间',
|
||
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
||
tenant_id BIGINT NOT NULL COMMENT '租户ID',
|
||
|
||
definition_id BIGINT NOT NULL COMMENT '工作流定义ID',
|
||
project_env_id BIGINT NOT NULL COMMENT '项目环境ID',
|
||
status VARCHAR(20) NOT NULL COMMENT '状态:RUNNING/COMPLETED/FAILED/CANCELED',
|
||
start_time DATETIME NOT NULL COMMENT '开始时间',
|
||
end_time DATETIME COMMENT '结束时间',
|
||
variables TEXT COMMENT '工作流变量(JSON)',
|
||
error TEXT COMMENT '错误信息',
|
||
|
||
CONSTRAINT fk_instance_definition FOREIGN KEY (definition_id) REFERENCES sys_workflow_definition(id),
|
||
CONSTRAINT fk_instance_project_env FOREIGN KEY (project_env_id) REFERENCES sys_project_env(id)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流实例表';
|
||
|
||
-- 节点实例表
|
||
CREATE TABLE sys_node_instance (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
|
||
create_by VARCHAR(255) NULL COMMENT '创建人',
|
||
create_time DATETIME(6) NULL COMMENT '创建时间',
|
||
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||
update_by VARCHAR(255) NULL COMMENT '更新人',
|
||
update_time DATETIME(6) NULL COMMENT '更新时间',
|
||
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
||
tenant_id BIGINT NOT NULL COMMENT '租户ID',
|
||
|
||
workflow_instance_id BIGINT NOT NULL COMMENT '工作流实例ID',
|
||
node_id VARCHAR(50) NOT NULL COMMENT '节点ID',
|
||
node_type VARCHAR(50) NOT NULL COMMENT '节点类型',
|
||
name VARCHAR(100) NOT NULL COMMENT '节点名称',
|
||
status VARCHAR(20) NOT NULL COMMENT '状态:PENDING/RUNNING/COMPLETED/FAILED/CANCELED',
|
||
start_time DATETIME COMMENT '开始时间',
|
||
end_time DATETIME COMMENT '结束时间',
|
||
input TEXT COMMENT '输入参数(JSON)',
|
||
output TEXT COMMENT '输出结果(JSON)',
|
||
error TEXT COMMENT '错误信息',
|
||
|
||
CONSTRAINT fk_node_workflow_instance FOREIGN KEY (workflow_instance_id) REFERENCES sys_workflow_instance(id)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='节点实例表';
|
||
```
|
||
|
||
### 2.4 审批相关表
|
||
```sql
|
||
-- 审批流程定义表
|
||
CREATE TABLE sys_approval_flow (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
|
||
create_by VARCHAR(255) NULL COMMENT '创建人',
|
||
create_time DATETIME(6) NULL COMMENT '创建时间',
|
||
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||
update_by VARCHAR(255) NULL COMMENT '更新人',
|
||
update_time DATETIME(6) NULL COMMENT '更新时间',
|
||
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
||
tenant_id BIGINT NOT NULL COMMENT '租户ID',
|
||
|
||
code VARCHAR(50) NOT NULL COMMENT '流程编码',
|
||
name VARCHAR(100) NOT NULL COMMENT '流程名称',
|
||
description TEXT COMMENT '描述',
|
||
type VARCHAR(20) NOT NULL COMMENT '流程类型:DEPLOY/LEAVE/NACOS_CONFIG',
|
||
content TEXT NOT NULL COMMENT '流程定义(JSON)',
|
||
status VARCHAR(20) NOT NULL DEFAULT 'ENABLED' COMMENT '状态:ENABLED/DISABLED',
|
||
|
||
CONSTRAINT uk_flow_code UNIQUE (tenant_id, code)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='审批流程定义表';
|
||
|
||
-- 审批任务表
|
||
CREATE TABLE sys_approval_task (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
|
||
create_by VARCHAR(255) NULL COMMENT '创建人',
|
||
create_time DATETIME(6) NULL COMMENT '创建时间',
|
||
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||
update_by VARCHAR(255) NULL COMMENT '更新人',
|
||
update_time DATETIME(6) NULL COMMENT '更新时间',
|
||
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
||
tenant_id BIGINT NOT NULL COMMENT '租户ID',
|
||
|
||
flow_id BIGINT NOT NULL COMMENT '流程定义ID',
|
||
node_id BIGINT NOT NULL COMMENT '当前节点ID',
|
||
title VARCHAR(200) NOT NULL COMMENT '审批标题',
|
||
status VARCHAR(20) NOT NULL COMMENT '状态:PENDING/APPROVED/REJECTED/CANCELED',
|
||
start_time DATETIME NOT NULL COMMENT '开始时间',
|
||
end_time DATETIME COMMENT '结束时间',
|
||
variables TEXT COMMENT '审批变量(JSON)',
|
||
|
||
CONSTRAINT fk_task_flow FOREIGN KEY (flow_id) REFERENCES sys_approval_flow(id)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='审批任务表';
|
||
|
||
-- 审批记录表
|
||
CREATE TABLE sys_approval_record (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
|
||
create_by VARCHAR(255) NULL COMMENT '创建人',
|
||
create_time DATETIME(6) NULL COMMENT '创建时间',
|
||
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||
update_by VARCHAR(255) NULL COMMENT '更新人',
|
||
update_time DATETIME(6) NULL COMMENT '更新时间',
|
||
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
||
tenant_id BIGINT NOT NULL COMMENT '租户ID',
|
||
|
||
task_id BIGINT NOT NULL COMMENT '审批任务ID',
|
||
node_id BIGINT NOT NULL COMMENT '审批节点ID',
|
||
approver VARCHAR(100) NOT NULL COMMENT '审批人',
|
||
action VARCHAR(20) NOT NULL COMMENT '操作:APPROVE/REJECT',
|
||
comment TEXT COMMENT '审批意见',
|
||
|
||
CONSTRAINT fk_record_task FOREIGN KEY (task_id) REFERENCES sys_approval_task(id)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='审批记录表';
|
||
```
|
||
|
||
## 三、API接口设计
|
||
|
||
### 3.1 项目管理接口
|
||
|
||
#### 3.1.1 项目集管理
|
||
```yaml
|
||
/api/v1/project-group:
|
||
post:
|
||
summary: 创建项目集
|
||
description: |
|
||
创建新的项目集,需要提供以下信息:
|
||
1. 项目集基本信息(编码、名称、描述)
|
||
2. Git仓库信息
|
||
3. Jenkins配置(可选)
|
||
requestBody:
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/ProjectGroupDTO'
|
||
responses:
|
||
200:
|
||
description: 成功创建项目集
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/Response'
|
||
|
||
get:
|
||
summary: 查询项目集列表
|
||
description: |
|
||
支持以下查询条件:
|
||
1. 名称模糊搜索
|
||
2. 状态过滤
|
||
3. 分页参数
|
||
parameters:
|
||
- name: name
|
||
in: query
|
||
description: 项目集名称
|
||
schema:
|
||
type: string
|
||
- name: status
|
||
in: query
|
||
description: 状态
|
||
schema:
|
||
type: string
|
||
enum: [ENABLED, DISABLED]
|
||
responses:
|
||
200:
|
||
description: 项目集列表
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/PageResponse'
|
||
```
|
||
|
||
#### 3.1.2 项目管理
|
||
```yaml
|
||
/api/v1/project:
|
||
post:
|
||
summary: 创建项目
|
||
description: |
|
||
创建新项目,需要提供:
|
||
1. 项目基本信息
|
||
2. 所属项目集
|
||
3. Git仓库信息
|
||
4. 构建配置
|
||
requestBody:
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/ProjectDTO'
|
||
responses:
|
||
200:
|
||
description: 成功创建项目
|
||
|
||
get:
|
||
summary: 查询项目列表
|
||
description: |
|
||
支持条件:
|
||
1. 项目集ID
|
||
2. 名称搜索
|
||
3. 状态过滤
|
||
parameters:
|
||
- name: groupId
|
||
in: query
|
||
required: true
|
||
schema:
|
||
type: integer
|
||
- name: name
|
||
in: query
|
||
schema:
|
||
type: string
|
||
responses:
|
||
200:
|
||
description: 项目列表
|
||
```
|
||
|
||
### 3.2 工作流管理接口
|
||
|
||
#### 3.2.1 工作流设计
|
||
```yaml
|
||
/api/v1/workflow/definition:
|
||
post:
|
||
summary: 创建工作流
|
||
description: |
|
||
创建工作流定义,支持:
|
||
1. 节点配置
|
||
2. 连线规则
|
||
3. 变量定义
|
||
requestBody:
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/WorkflowDefinitionDTO'
|
||
|
||
get:
|
||
summary: 获取工作流定义
|
||
description: |
|
||
查询工作流定义,支持:
|
||
1. 基本信息
|
||
2. 节点信息
|
||
3. 连线信息
|
||
parameters:
|
||
- name: id
|
||
in: path
|
||
required: true
|
||
schema:
|
||
type: integer
|
||
```
|
||
|
||
#### 3.2.2 工作流执行
|
||
```yaml
|
||
/api/v1/workflow/instance:
|
||
post:
|
||
summary: 启动工作流
|
||
description: |
|
||
启动工作流实例,需要:
|
||
1. 工作流定义ID
|
||
2. 项目环境ID
|
||
3. 执行参数
|
||
requestBody:
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/WorkflowStartDTO'
|
||
|
||
get:
|
||
summary: 查询执行状态
|
||
description: |
|
||
查询工作流执行状态,包括:
|
||
1. 整体状态
|
||
2. 节点状态
|
||
3. 执行日志
|
||
parameters:
|
||
- name: id
|
||
in: path
|
||
required: true
|
||
schema:
|
||
type: integer
|
||
```
|
||
|
||
## 四、前端集成指南
|
||
|
||
### 4.1 工作流设计器
|
||
|
||
#### 4.1.1 组件结构
|
||
```typescript
|
||
// 工作流设计器组件
|
||
const WorkflowDesigner: React.FC = () => {
|
||
// 1. 画布配置
|
||
const graphConfig = {
|
||
container: 'workflow-container',
|
||
grid: true,
|
||
history: true,
|
||
connecting: {
|
||
snap: true,
|
||
allowBlank: false,
|
||
allowLoop: false,
|
||
highlight: true,
|
||
},
|
||
};
|
||
|
||
// 2. 节点配置
|
||
const nodeConfig = {
|
||
// Git同步节点
|
||
gitSync: {
|
||
width: 120,
|
||
height: 60,
|
||
attrs: {
|
||
body: {
|
||
fill: '#E7F7FF',
|
||
stroke: '#1890FF',
|
||
},
|
||
label: {
|
||
text: 'Git同步',
|
||
},
|
||
},
|
||
},
|
||
// 其他节点配置...
|
||
};
|
||
|
||
return (
|
||
<div className="workflow-designer">
|
||
<Toolbar>
|
||
<NodePalette nodes={nodeConfig} />
|
||
<div className="actions">
|
||
<Button onClick={handleSave}>保存</Button>
|
||
<Button onClick={handleDeploy}>部署</Button>
|
||
</div>
|
||
</Toolbar>
|
||
|
||
<div className="designer-container">
|
||
<div id="workflow-container" className="graph-container" />
|
||
<NodeConfig node={selectedNode} onChange={handleNodeChange} />
|
||
</div>
|
||
|
||
<LogViewer instance={currentInstance} />
|
||
</div>
|
||
);
|
||
};
|
||
```
|
||
|
||
#### 4.1.2 节点配置
|
||
```typescript
|
||
// 节点配置组件
|
||
const NodeConfig: React.FC<{node: Node}> = ({ node }) => {
|
||
// 1. 动态加载配置组件
|
||
const ConfigComponent = nodeConfigComponents[node.type];
|
||
|
||
// 2. 处理配置变更
|
||
const handleConfigChange = (config: any) => {
|
||
// 更新节点配置
|
||
node.updateConfig(config);
|
||
};
|
||
|
||
return (
|
||
<div className="node-config">
|
||
<ConfigComponent
|
||
value={node.config}
|
||
onChange={handleConfigChange}
|
||
/>
|
||
</div>
|
||
);
|
||
};
|
||
|
||
// Git同步节点配置
|
||
const GitSyncConfig: React.FC<{value: any, onChange: (config: any) => void}> = ({
|
||
value,
|
||
onChange,
|
||
}) => {
|
||
return (
|
||
<Form layout="vertical">
|
||
<Form.Item label="分支" required>
|
||
<Input
|
||
value={value.branch}
|
||
onChange={e => onChange({ ...value, branch: e.target.value })}
|
||
/>
|
||
</Form.Item>
|
||
<Form.Item label="本地路径" required>
|
||
<Input
|
||
value={value.localPath}
|
||
onChange={e => onChange({ ...value, localPath: e.target.value })}
|
||
/>
|
||
</Form.Item>
|
||
</Form>
|
||
);
|
||
};
|
||
```
|
||
|
||
#### 4.1.3 日志查看
|
||
```typescript
|
||
// 日志查看器组件
|
||
const LogViewer: React.FC<{instance: WorkflowInstance}> = ({ instance }) => {
|
||
const [logs, setLogs] = useState<LogMessage[]>([]);
|
||
|
||
// 1. 建立WebSocket连接
|
||
useEffect(() => {
|
||
const ws = new WebSocket(`ws://localhost:8080/api/logs/${instance.id}`);
|
||
|
||
ws.onmessage = (event) => {
|
||
const log = JSON.parse(event.data);
|
||
setLogs(prev => [...prev, log]);
|
||
};
|
||
|
||
return () => ws.close();
|
||
}, [instance]);
|
||
|
||
// 2. 渲染日志
|
||
return (
|
||
<div className="log-viewer">
|
||
<Tabs>
|
||
<TabPane tab="流程日志" key="workflow">
|
||
<LogList logs={logs.filter(log => log.type === 'workflow')} />
|
||
</TabPane>
|
||
<TabPane tab="节点日志" key="node">
|
||
<LogList logs={logs.filter(log => log.type === 'node')} />
|
||
</TabPane>
|
||
</Tabs>
|
||
</div>
|
||
);
|
||
};
|
||
```
|
||
|
||
### 4.2 状态管理
|
||
|
||
#### 4.2.1 工作流状态
|
||
```typescript
|
||
// 工作流状态管理
|
||
const useWorkflowStore = create<WorkflowStore>((set) => ({
|
||
definitions: [],
|
||
instances: [],
|
||
|
||
// 加载工作流定义
|
||
loadDefinitions: async () => {
|
||
const response = await api.get('/api/v1/workflow/definition');
|
||
set({ definitions: response.data });
|
||
},
|
||
|
||
// 创建工作流实例
|
||
createInstance: async (params) => {
|
||
const response = await api.post('/api/v1/workflow/instance', params);
|
||
set(state => ({
|
||
instances: [...state.instances, response.data],
|
||
}));
|
||
},
|
||
|
||
// 更新实例状态
|
||
updateInstanceStatus: (id, status) => {
|
||
set(state => ({
|
||
instances: state.instances.map(instance =>
|
||
instance.id === id
|
||
? { ...instance, status }
|
||
: instance
|
||
),
|
||
}));
|
||
},
|
||
}));
|
||
```
|
||
|
||
#### 4.2.2 审批状态
|
||
```typescript
|
||
// 审批状态管理
|
||
const useApprovalStore = create<ApprovalStore>((set) => ({
|
||
tasks: [],
|
||
records: [],
|
||
|
||
// 加载待办任务
|
||
loadTasks: async () => {
|
||
const response = await api.get('/api/v1/approval/task');
|
||
set({ tasks: response.data });
|
||
},
|
||
|
||
// 审批通过
|
||
approve: async (taskId, comment) => {
|
||
await api.post(`/api/v1/approval/task/${taskId}/approve`, { comment });
|
||
set(state => ({
|
||
tasks: state.tasks.filter(task => task.id !== taskId),
|
||
}));
|
||
},
|
||
|
||
// 审批拒绝
|
||
reject: async (taskId, comment) => {
|
||
await api.post(`/api/v1/approval/task/${taskId}/reject`, { comment });
|
||
set(state => ({
|
||
tasks: state.tasks.filter(task => task.id !== taskId),
|
||
}));
|
||
},
|
||
}));
|
||
```
|
||
|
||
## 五、部署指南
|
||
|
||
### 5.1 环境要求
|
||
1. Java 21
|
||
2. MySQL 8.0
|
||
3. Redis 7.x
|
||
4. Node.js 18+
|
||
|
||
### 5.2 配置说明
|
||
```yaml
|
||
# application.yml
|
||
spring:
|
||
datasource:
|
||
url: jdbc:mysql://localhost:3306/deploy_ease
|
||
username: root
|
||
password: root
|
||
|
||
redis:
|
||
host: localhost
|
||
port: 6379
|
||
|
||
rabbitmq:
|
||
host: localhost
|
||
port: 5672
|
||
|
||
workflow:
|
||
executor:
|
||
core-pool-size: 10
|
||
max-pool-size: 20
|
||
queue-capacity: 100
|
||
|
||
node:
|
||
timeout: 3600 # 节点执行超时时间(秒)
|
||
retry:
|
||
max-attempts: 3
|
||
delay: 5000
|
||
```
|
||
|
||
### 5.3 部署步骤
|
||
1. 数据库初始化
|
||
```bash
|
||
mysql -u root -p deploy_ease < schema.sql
|
||
mysql -u root -p deploy_ease < data.sql
|
||
```
|
||
|
||
2. 后端部署
|
||
```bash
|
||
mvn clean package
|
||
java -jar deploy-ease.jar
|
||
```
|
||
|
||
3. 前端部署
|
||
```bash
|
||
npm install
|
||
npm run build
|
||
```
|
||
|
||
### 5.4 监控配置
|
||
1. Prometheus监控
|
||
```yaml
|
||
scrape_configs:
|
||
- job_name: 'deploy-ease'
|
||
metrics_path: '/actuator/prometheus'
|
||
static_configs:
|
||
- targets: ['localhost:8080']
|
||
```
|
||
|
||
2. Grafana面板
|
||
- JVM监控
|
||
- 接口监控
|
||
- 业务监控
|
||
|
||
## 六、系统优化增强
|
||
|
||
### 6.1 分布式工作流支持
|
||
```java
|
||
/**
|
||
* 分布式工作流引擎增强
|
||
*/
|
||
public interface DistributedWorkflowEngine extends WorkflowEngine {
|
||
// 分布式锁支持
|
||
void acquireWorkflowLock(String lockKey, Duration timeout);
|
||
void releaseWorkflowLock(String lockKey);
|
||
|
||
// 集群协调
|
||
void registerWorker(WorkerInfo workerInfo);
|
||
void updateWorkerStatus(String workerId, WorkerStatus status);
|
||
|
||
// 任务分发
|
||
void assignTask(String workerId, WorkflowTask task);
|
||
void reassignTask(String fromWorkerId, String toWorkerId, WorkflowTask task);
|
||
|
||
// 故障转移
|
||
void handleWorkerFailure(String workerId);
|
||
void recoverTasks(String failedWorkerId);
|
||
}
|
||
```
|
||
|
||
### 6.2 工作流版本控制
|
||
```java
|
||
/**
|
||
* 工作流版本管理
|
||
*/
|
||
public interface WorkflowVersionManager {
|
||
// 版本控制
|
||
String createVersion(WorkflowDefinition definition);
|
||
WorkflowDefinition getVersion(String versionId);
|
||
List<WorkflowVersion> getVersionHistory(String code);
|
||
|
||
// 版本迁移
|
||
void migrateInstances(String fromVersion, String toVersion);
|
||
void rollbackVersion(String versionId);
|
||
|
||
// 版本比较
|
||
WorkflowDiff compareVersions(String version1, String version2);
|
||
}
|
||
```
|
||
|
||
### 6.3 动态节点支持
|
||
```java
|
||
/**
|
||
* 动态节点管理器
|
||
*/
|
||
public interface DynamicNodeManager {
|
||
// 动态节点注册
|
||
void registerNodeType(String type, NodeExecutor executor);
|
||
void unregisterNodeType(String type);
|
||
|
||
// 动态配置
|
||
void updateNodeConfig(String type, NodeConfig config);
|
||
NodeConfig getNodeConfig(String type);
|
||
|
||
// 节点发现
|
||
List<NodeTypeInfo> discoverNodes();
|
||
boolean isNodeTypeAvailable(String type);
|
||
}
|
||
```
|
||
|
||
### 6.4 工作流监控增强
|
||
```java
|
||
/**
|
||
* 增强的工作流监控
|
||
*/
|
||
@Component
|
||
@Slf4j
|
||
public class EnhancedWorkflowMonitor extends PerformanceMonitor {
|
||
// 业务监控指标
|
||
private final Counter businessErrorCounter;
|
||
private final Counter approvalTimeoutCounter;
|
||
private final Timer approvalDurationTimer;
|
||
|
||
// 资源监控
|
||
private final Gauge databaseConnectionGauge;
|
||
private final Gauge cacheUsageGauge;
|
||
private final Gauge messageQueueDepthGauge;
|
||
|
||
// SLA监控
|
||
private final Timer workflowSLATimer;
|
||
private final Counter slaViolationCounter;
|
||
|
||
public void recordBusinessError(String errorType, String errorCode) {
|
||
businessErrorCounter.increment();
|
||
// 记录详细错误信息
|
||
}
|
||
|
||
public void checkSLA(WorkflowInstance instance) {
|
||
Duration duration = Duration.between(instance.getStartTime(), LocalDateTime.now());
|
||
workflowSLATimer.record(duration);
|
||
|
||
if (duration.compareTo(instance.getSLADuration()) > 0) {
|
||
slaViolationCounter.increment();
|
||
// 触发SLA违规告警
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 6.5 工作流数据分析
|
||
```java
|
||
/**
|
||
* 工作流分析服务
|
||
*/
|
||
@Service
|
||
@Slf4j
|
||
public class WorkflowAnalyticsService {
|
||
private final WorkflowInstanceRepository instanceRepository;
|
||
private final NodeInstanceRepository nodeRepository;
|
||
private final AnalyticsEngine analyticsEngine;
|
||
|
||
// 性能分析
|
||
public PerformanceReport analyzePerformance(String workflowType, DateRange range) {
|
||
// 分析工作流执行性能
|
||
return analyticsEngine.analyzePerformance(workflowType, range);
|
||
}
|
||
|
||
// 瓶颈分析
|
||
public List<BottleneckNode> findBottlenecks(String workflowType) {
|
||
// 识别执行瓶颈
|
||
return analyticsEngine.findBottlenecks(workflowType);
|
||
}
|
||
|
||
// 趋势分析
|
||
public TrendReport analyzeTrend(String metric, DateRange range) {
|
||
// 分析指标趋势
|
||
return analyticsEngine.analyzeTrend(metric, range);
|
||
}
|
||
}
|
||
```
|
||
|
||
### 6.6 工作流调度优化
|
||
```java
|
||
/**
|
||
* 优化的工作流调度器
|
||
*/
|
||
@Component
|
||
@Slf4j
|
||
public class OptimizedWorkflowScheduler {
|
||
private final WorkloadBalancer workloadBalancer;
|
||
private final PriorityQueue<WorkflowTask> taskQueue;
|
||
|
||
// 优先级调度
|
||
public void schedulePriorityTask(WorkflowTask task) {
|
||
task.setPriority(calculatePriority(task));
|
||
taskQueue.offer(task);
|
||
}
|
||
|
||
// 负载均衡
|
||
public void balanceWorkload() {
|
||
List<WorkerNode> workers = workloadBalancer.getActiveWorkers();
|
||
for (WorkerNode worker : workers) {
|
||
if (worker.isOverloaded()) {
|
||
redistributeTasks(worker);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 资源预留
|
||
public void reserveResources(WorkflowTask task) {
|
||
ResourceRequirements requirements = task.getResourceRequirements();
|
||
resourceManager.reserve(requirements);
|
||
}
|
||
}
|
||
``` |