diff --git a/cutejava-front/src/views/components/dev/CutePipelineNode.vue b/cutejava-front/src/views/components/dev/CutePipelineNode.vue
index 2fc37066..55fcc1de 100644
--- a/cutejava-front/src/views/components/dev/CutePipelineNode.vue
+++ b/cutejava-front/src/views/components/dev/CutePipelineNode.vue
@@ -55,7 +55,7 @@
diff --git a/cutejava-front/src/views/componentsDemo/CutePipelineNodeDemo.vue b/cutejava-front/src/views/componentsDemo/CutePipelineNodeDemo.vue
index 3862010d..fedafb7a 100644
--- a/cutejava-front/src/views/componentsDemo/CutePipelineNodeDemo.vue
+++ b/cutejava-front/src/views/componentsDemo/CutePipelineNodeDemo.vue
@@ -163,7 +163,7 @@ export default {
createTime: '2025-07-17 21:12:01',
updateTime: '2025-07-17 21:13:01',
startTime: '2025-07-17 21:13:01',
- currentNode: '执行成功',
+ currentNodeMsg: '执行成功',
currentNodeStatus: 'success',
status: 'success'
},
@@ -176,7 +176,7 @@ export default {
createTime: '2025-07-17 21:13:01',
updateTime: '2025-07-17 21:18:01',
startTime: '2025-07-17 21:13:01',
- currentNode: '执行成功',
+ currentNodeMsg: '执行成功',
currentNodeStatus: 'success',
status: 'success'
},
@@ -193,7 +193,7 @@ export default {
createTime: '2025-07-17 21:18:01',
updateTime: '2025-07-17 21:28:01',
startTime: '2025-07-17 21:18:01',
- currentNode: '执行成功',
+ currentNodeMsg: '执行成功',
currentNodeStatus: 'success',
status: 'success'
},
@@ -210,7 +210,7 @@ export default {
createTime: '2025-07-17 21:28:01',
updateTime: '2025-07-17 21:28:21',
startTime: '2025-07-17 21:28:01',
- currentNode: '执行成功',
+ currentNodeMsg: '执行成功',
currentNodeStatus: 'success',
status: 'success'
},
@@ -237,7 +237,7 @@ export default {
createTime: '2025-07-17 21:28:21',
updateTime: '2025-07-17 21:28:21',
startTime: '2025-07-17 21:28:21',
- currentNode: '等待人工审批',
+ currentNodeMsg: '等待人工审批',
currentNodeStatus: 'running',
status: 'running'
},
@@ -258,7 +258,7 @@ export default {
createTime: '2025-07-17 21:28:21',
updateTime: '2025-07-17 21:28:21',
startTime: null,
- currentNode: '待执行',
+ currentNodeMsg: '待执行',
currentNodeStatus: 'pending',
status: 'pending'
},
@@ -277,7 +277,7 @@ export default {
createTime: '2025-07-17 21:28:21',
updateTime: '2025-07-17 21:28:21',
startTime: null,
- currentNode: '待执行',
+ currentNodeMsg: '待执行',
currentNodeStatus: 'pending',
status: 'pending'
},
@@ -290,7 +290,7 @@ export default {
createTime: '2025-07-17 21:28:21',
updateTime: '2025-07-17 21:28:21',
startTime: null,
- currentNode: '待执行',
+ currentNodeMsg: '待执行',
currentNodeStatus: 'pending',
status: 'pending'
}
@@ -304,7 +304,7 @@ export default {
createTime: '2025-07-17 21:12:01',
updateTime: '2025-07-17 21:13:01',
startTime: '2025-07-17 21:13:01',
- currentNode: '执行成功',
+ currentNodeMsg: '执行成功',
currentNodeStatus: 'success',
status: 'success'
},
@@ -317,7 +317,7 @@ export default {
createTime: '2025-07-17 21:13:01',
updateTime: '2025-07-17 21:18:01',
startTime: '2025-07-17 21:13:01',
- currentNode: '执行成功',
+ currentNodeMsg: '执行成功',
currentNodeStatus: 'success',
status: 'success'
},
@@ -334,7 +334,7 @@ export default {
createTime: '2025-07-17 21:18:01',
updateTime: '2025-07-17 21:28:01',
startTime: '2025-07-17 21:18:01',
- currentNode: '执行成功',
+ currentNodeMsg: '执行成功',
currentNodeStatus: 'success',
status: 'success'
},
@@ -351,7 +351,7 @@ export default {
createTime: '2025-07-17 21:28:01',
updateTime: '2025-07-17 21:28:21',
startTime: '2025-07-17 21:28:01',
- currentNode: '执行成功',
+ currentNodeMsg: '执行成功',
currentNodeStatus: 'success',
status: 'success'
},
@@ -378,7 +378,7 @@ export default {
createTime: '2025-07-17 21:28:21',
updateTime: '2025-07-17 21:30:21',
startTime: '2025-07-17 21:28:21',
- currentNode: '执行成功',
+ currentNodeMsg: '执行成功',
currentNodeStatus: 'success',
status: 'success'
},
@@ -399,7 +399,7 @@ export default {
createTime: '2025-07-17 21:28:21',
updateTime: '2025-07-17 21:58:21',
startTime: '2025-07-17 21:30:21',
- currentNode: '执行成功',
+ currentNodeMsg: '执行成功',
currentNodeStatus: 'success',
status: 'success'
},
@@ -418,7 +418,7 @@ export default {
createTime: '2025-07-17 21:28:21',
updateTime: '2025-07-17 22:10:21',
startTime: '2025-07-17 21:58:21',
- currentNode: '执行成功',
+ currentNodeMsg: '执行成功',
currentNodeStatus: 'success',
status: 'success'
},
@@ -431,7 +431,7 @@ export default {
createTime: '2025-07-17 21:28:21',
updateTime: '2025-07-17 22:10:58',
startTime: '2025-07-17 22:10:21',
- currentNode: '执行成功',
+ currentNodeMsg: '执行成功',
currentNodeStatus: 'success',
status: 'success'
}
@@ -445,7 +445,7 @@ export default {
createTime: '2025-07-17 21:12:01',
updateTime: '2025-07-17 21:13:01',
startTime: '2025-07-17 21:13:01',
- currentNode: '执行成功',
+ currentNodeMsg: '执行成功',
currentNodeStatus: 'success',
status: 'success'
},
@@ -458,7 +458,7 @@ export default {
createTime: '2025-07-17 21:13:01',
updateTime: '2025-07-17 21:18:01',
startTime: '2025-07-17 21:13:01',
- currentNode: '执行成功',
+ currentNodeMsg: '执行成功',
currentNodeStatus: 'success',
status: 'success'
},
@@ -475,7 +475,7 @@ export default {
createTime: '2025-07-17 21:18:01',
updateTime: '2025-07-17 21:28:01',
startTime: '2025-07-17 21:18:01',
- currentNode: '执行失败',
+ currentNodeMsg: '执行失败',
currentNodeStatus: 'fail',
status: 'fail'
},
@@ -492,7 +492,7 @@ export default {
createTime: '2025-07-17 21:28:01',
updateTime: '2025-07-17 21:28:21',
startTime: null,
- currentNode: '待执行',
+ currentNodeMsg: '待执行',
currentNodeStatus: 'pending',
status: 'pending'
},
@@ -519,7 +519,7 @@ export default {
createTime: '2025-07-17 21:28:21',
updateTime: '2025-07-17 21:28:21',
startTime: null,
- currentNode: '待执行',
+ currentNodeMsg: '待执行',
currentNodeStatus: 'pending',
status: 'pending'
},
@@ -540,7 +540,7 @@ export default {
createTime: '2025-07-17 21:28:21',
updateTime: '2025-07-17 21:28:21',
startTime: null,
- currentNode: '待执行',
+ currentNodeMsg: '待执行',
currentNodeStatus: 'pending',
status: 'pending'
},
@@ -559,7 +559,7 @@ export default {
createTime: '2025-07-17 21:28:21',
updateTime: '2025-07-17 21:28:21',
startTime: null,
- currentNode: '待执行',
+ currentNodeMsg: '待执行',
currentNodeStatus: 'pending',
status: 'pending'
},
@@ -572,7 +572,7 @@ export default {
createTime: '2025-07-17 21:28:21',
updateTime: '2025-07-17 21:28:21',
startTime: null,
- currentNode: '待执行',
+ currentNodeMsg: '待执行',
currentNodeStatus: 'pending',
status: 'pending'
}
diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/config/AsyncTheadPoolConfig.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/config/AsyncTheadPoolConfig.java
index baae1446..cd136d7b 100644
--- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/config/AsyncTheadPoolConfig.java
+++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/config/AsyncTheadPoolConfig.java
@@ -33,9 +33,7 @@ public class AsyncTheadPoolConfig implements AsyncConfigurer {
// 自定义工厂
ThreadFactory factory = r -> new Thread(r, "default-async-" + new AtomicInteger(1).getAndIncrement());
// 自定义线程池
- return new ThreadPoolExecutor(asyncTaskPool.getCorePoolSize(), asyncTaskPool.getMaxPoolSize(), asyncTaskPool.getKeepAliveSeconds(),
- TimeUnit.SECONDS, new ArrayBlockingQueue<>(asyncTaskPool.getQueueCapacity()), factory,
- new ThreadPoolExecutor.CallerRunsPolicy());
+ return new ThreadPoolExecutor(asyncTaskPool.getCorePoolSize(), asyncTaskPool.getMaxPoolSize(), asyncTaskPool.getKeepAliveSeconds(), TimeUnit.SECONDS, new ArrayBlockingQueue<>(asyncTaskPool.getQueueCapacity()), factory, new ThreadPoolExecutor.CallerRunsPolicy());
}
/**
@@ -61,25 +59,4 @@ public class AsyncTheadPoolConfig implements AsyncConfigurer {
executor.initialize();
return executor;
}
-
- @Bean("pipelineAsync")
- public ThreadPoolTaskExecutor pipelineAsync() {
- ThreadPoolSettingModel asyncTaskPool = properties.getAsyncTaskPool();
- // 用法 private ThreadPoolTaskExecutor pipelineAsync
- ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
- executor.setCorePoolSize(asyncTaskPool.getCorePoolSize());
- executor.setMaxPoolSize(asyncTaskPool.getMaxPoolSize());
- executor.setQueueCapacity(asyncTaskPool.getQueueCapacity());
- executor.setThreadNamePrefix("pipeline-async-");
- executor.setKeepAliveSeconds(asyncTaskPool.getKeepAliveSeconds());
- // DiscardOldestPolicy,抛弃最早的任务,将新任务加入队列。
- // AbortPolicy,拒绝执行新任务,并抛出异常。
- // CallerRunsPolicy,交由调用者线程执行新任务,如果调用者线程已关闭,则抛弃任务。
- // DiscardPolicy,直接抛弃新任务。
- executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
- // 设置包装器
- executor.setTaskDecorator(TtlRunnable::get);
- executor.initialize();
- return executor;
- }
}
diff --git a/cutejava/cutejava-module-devops/pom.xml b/cutejava/cutejava-module-devops/pom.xml
index faa32951..a10f2964 100644
--- a/cutejava/cutejava-module-devops/pom.xml
+++ b/cutejava/cutejava-module-devops/pom.xml
@@ -9,6 +9,7 @@
4.0.0
cutejava-module-devops
devops应用模块
+
cn.odboy
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/constant/pipeline/PipelineConst.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/constant/pipeline/PipelineConst.java
index 0322b06b..9be1c164 100644
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/constant/pipeline/PipelineConst.java
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/constant/pipeline/PipelineConst.java
@@ -7,18 +7,25 @@ public interface PipelineConst {
/**
* 执行器服务前缀
*/
- String EXECUTOR_PREFIX = "pipeline:executor:";
- /**
- * 流水线实例Key
- */
- String INSTANCE_ID_KEY = "pipelineInstanceId";
- String INSTANCE_KEY = "pipelineInstance";
- /**
- * 流水线实例节点相关Key
- */
- String INSTANCE_NODE_INDEX_KEY = "pipelineInstanceNodeIndex";
- String INSTANCE_NODE_CODE_KEY = "pipelineInstanceNodeCode";
- String INSTANCE_NODE_NAME_KEY = "pipelineInstanceNodeName";
- String INSTANCE_NODE_TEMPLATE_ARGS_KEY = "pipelineInstanceNodeTemplateArgs";
- String INSTANCE_RETRY_NODE_INDEX_KEY = "pipelineInstanceRetryNodeIndex";
+ String INSTANCE_PREFIX = "pipeline_instance_";
+ String EXECUTOR_PREFIX = "pipeline_executor_";
+ // /**
+// * 流水线实例Key
+// */
+// String INSTANCE_KEY = "pipelineInstance";
+// /**
+// * 流水线实例节点相关Key
+// */
+// String INSTANCE_NODE_INDEX_KEY = "pipelineInstanceNodeIndex";
+// String INSTANCE_NODE_CODE_KEY = "pipelineInstanceNodeCode";
+// String INSTANCE_NODE_NAME_KEY = "pipelineInstanceNodeName";
+// String INSTANCE_NODE_TEMPLATE_ARGS_KEY = "pipelineInstanceNodeTemplateArgs";
+// String INSTANCE_RETRY_NODE_INDEX_KEY = "pipelineInstanceRetryNodeIndex";
+ // 以下为标准常量
+ String INSTANCE_ID = "InstanceId";
+ String TEMPLATE_ID = "TemplateId";
+ String ENV = "Env";
+ String CONTEXT_NAME = "ContextName";
+ String RETRY_NODE_CODE = "RetryNodeCode";
+ String CURRENT_NODE_TEMPLATE = "CurrentNodeTemplate";
}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/constant/pipeline/PipelineNodeBizCodeConst.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/constant/pipeline/PipelineNodeBizCodeConst.java
deleted file mode 100644
index 51f9e4d7..00000000
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/constant/pipeline/PipelineNodeBizCodeConst.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package cn.odboy.devops.constant.pipeline;
-
-/**
- * 流水线节点业务编码
- *
- * @author odboy
- */
-public interface PipelineNodeBizCodeConst {
- /**
- * 初始化
- */
- String INIT = PipelineConst.EXECUTOR_PREFIX + "node_init";
-
- /**
- * 合并代码
- */
- String MERGE_BRANCH = PipelineConst.EXECUTOR_PREFIX + "node_merge_branch";
-
- /**
- * 镜像扫描
- */
- String IMAGE_SCAN = PipelineConst.EXECUTOR_PREFIX + "node_image_scan";
-
- /**
- * 部署审批
- */
- String DEPLOY_APPROVE = PipelineConst.EXECUTOR_PREFIX + "node_deploy_approve";
-
- /**
- * 合并确认
- */
- String MERGE_CONFIRM = PipelineConst.EXECUTOR_PREFIX + "node_merge_confirm";
-
- /**
- * 合并到Master
- */
- String MERGE_MASTER = PipelineConst.EXECUTOR_PREFIX + "node_merge_master";
-
- interface AppJava {
- /**
- * 构建
- */
- String BUILD = PipelineConst.EXECUTOR_PREFIX + "node_build_java";
- /**
- * 部署
- */
- String DEPLOY = PipelineConst.EXECUTOR_PREFIX + "node_deploy_java";
- }
-
- interface AppPython {
- /**
- * 构建
- */
- String BUILD = PipelineConst.EXECUTOR_PREFIX + "node_build_python";
- /**
- * 部署
- */
- String DEPLOY = PipelineConst.EXECUTOR_PREFIX + "node_deploy_python";
- }
-
- interface AppGo {
- /**
- * 构建
- */
- String BUILD = PipelineConst.EXECUTOR_PREFIX + "node_build_go";
- /**
- * 部署
- */
- String DEPLOY = PipelineConst.EXECUTOR_PREFIX + "node_deploy_go";
- }
-
- interface AppNodeJs {
- /**
- * 构建
- */
- String BUILD = PipelineConst.EXECUTOR_PREFIX + "node_build_nodejs";
- /**
- * 部署
- */
- String DEPLOY = PipelineConst.EXECUTOR_PREFIX + "node_deploy_nodejs";
- }
-}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/controller/DevopsPipelineController.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/controller/DevopsPipelineController.java
new file mode 100644
index 00000000..18c3cede
--- /dev/null
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/controller/DevopsPipelineController.java
@@ -0,0 +1,43 @@
+package cn.odboy.devops.controller;
+
+import cn.odboy.annotation.AnonymousGetMapping;
+import cn.odboy.devops.dal.dataobject.PipelineInstanceTb;
+import cn.odboy.devops.dal.dataobject.PipelineTemplateTb;
+import cn.odboy.devops.service.PipelineInstanceService;
+import cn.odboy.devops.service.PipelineTemplateService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/devops/pipeline")
+@Api(tags = "系统:验证码管理")
+public class DevopsPipelineController {
+ @Autowired
+ private PipelineTemplateService pipelineTemplateService;
+ @Autowired
+ private PipelineInstanceService pipelineInstanceService;
+
+ @AnonymousGetMapping(value = "/start")
+ public ResponseEntity> start() {
+ // 输入参数
+ String appName = "cuteops";
+ String envCode = "daily";
+ // 获取模板
+ PipelineTemplateTb pipelineTemplateTb = pipelineTemplateService.getPipelineTemplateById(4L);
+ // 创建流水线实例
+ PipelineInstanceTb pipelineInstanceTb = new PipelineInstanceTb();
+ pipelineInstanceTb.setTemplateId(pipelineTemplateTb.getId());
+ pipelineInstanceTb.setInstanceName("流水线测试");
+ pipelineInstanceTb.setTemplateType(pipelineTemplateTb.getType());
+ pipelineInstanceTb.setContextName(appName);
+ pipelineInstanceTb.setEnv(envCode);
+ pipelineInstanceTb.setTemplateContent(pipelineTemplateTb.getTemplate());
+ pipelineInstanceService.start(pipelineInstanceTb);
+ return ResponseEntity.ok("流水线启动成功");
+ }
+}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/PipelineInstanceNodeDetailTb.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/PipelineInstanceNodeDetailTb.java
new file mode 100644
index 00000000..992d18ef
--- /dev/null
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/PipelineInstanceNodeDetailTb.java
@@ -0,0 +1,76 @@
+package cn.odboy.devops.dal.dataobject;
+
+import cn.odboy.base.CsObject;
+import com.anwen.mongo.annotation.ID;
+import com.anwen.mongo.annotation.collection.CollectionField;
+import com.anwen.mongo.annotation.collection.CollectionName;
+import com.anwen.mongo.enums.FieldFill;
+import com.anwen.mongo.enums.IdTypeEnum;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ *
+ * 流水线实例节点明细
+ *
+ *
+ * @author codegen
+ * @since 2025-06-26
+ */
+@Getter
+@Setter
+@CollectionName("pipeline_instance_node_detail")
+public class PipelineInstanceNodeDetailTb extends CsObject {
+ /**
+ * mongoid
+ */
+ @ID(type = IdTypeEnum.ASSIGN_ID)
+ private Long id;
+ /**
+ * 流水线节点Id
+ */
+ @CollectionField("node_id")
+ private String nodeId;
+
+ /**
+ * 开始时间
+ */
+ @CollectionField(value = "start_time", fill = FieldFill.INSERT)
+ private Date startTime;
+
+ /**
+ * 结束时间
+ */
+ @CollectionField("finish_time")
+ private Date finishTime;
+
+ /**
+ * 节点索引
+ */
+ @CollectionField("node_index")
+ private Integer nodeIndex;
+ /**
+ * 节点编码
+ */
+ @CollectionField("node_code")
+ private String nodeCode;
+ /**
+ * 步骤描述
+ */
+ @CollectionField("step_name")
+ private String stepName;
+
+ /**
+ * 步骤状态
+ */
+ @CollectionField("step_status")
+ private String stepStatus;
+
+ /**
+ * 异常明细
+ */
+ @CollectionField("step_msg")
+ private String stepMsg;
+}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/PipelineInstanceNodeTb.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/PipelineInstanceNodeTb.java
new file mode 100644
index 00000000..12ee18b6
--- /dev/null
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/PipelineInstanceNodeTb.java
@@ -0,0 +1,87 @@
+package cn.odboy.devops.dal.dataobject;
+
+import cn.odboy.base.CsObject;
+import cn.odboy.devops.constant.pipeline.PipelineStatusEnum;
+import cn.odboy.devops.framework.pipeline.model.PipelineNodeOperateButtonVo;
+import com.anwen.mongo.annotation.ID;
+import com.anwen.mongo.annotation.collection.CollectionField;
+import com.anwen.mongo.annotation.collection.CollectionName;
+import com.anwen.mongo.enums.FieldFill;
+import com.anwen.mongo.enums.IdTypeEnum;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 流水线实例明细
+ *
+ * @author odboy
+ * @date 2025-07-20
+ */
+@Getter
+@Setter
+@CollectionName("pipeline_instance_node")
+public class PipelineInstanceNodeTb extends CsObject {
+ /**
+ * mongoid
+ */
+ @ID(type = IdTypeEnum.ASSIGN_ID)
+ private Long id;
+ /**
+ * 流水线实例id
+ */
+ @CollectionField("instance_id")
+ private Long instanceId;
+ /**
+ * 节点名称
+ */
+ @CollectionField("name")
+ private String name;
+ /**
+ * 节点编码,也就是流水线模板中的code
+ */
+ @CollectionField("code")
+ private String code;
+ /**
+ * 节点类型:默认为service
+ */
+ @CollectionField("type")
+ private String type = "service";
+ /**
+ * 节点具体服务类型:gitlab、jenkins等
+ */
+ @CollectionField("detail_type")
+ private String detailType;
+ /**
+ * 默认附加参数
+ */
+ @CollectionField("parameters")
+ private Map parameters;
+ @CollectionField("click")
+ private Boolean click = false;
+ @CollectionField("retry")
+ private Boolean retry = false;
+ @CollectionField("buttons")
+ private List buttons;
+ @CollectionField(value = "create_time", fill = FieldFill.INSERT)
+ private Date createTime;
+ @CollectionField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+ private Date updateTime;
+ @CollectionField("start_time")
+ private Date startTime;
+ /**
+ * 节点状态
+ */
+ @CollectionField("current_node_msg")
+ private String currentNodeMsg = PipelineStatusEnum.PENDING.getDesc();
+ @CollectionField("current_node_status")
+ private String currentNodeStatus = PipelineStatusEnum.PENDING.getCode();
+ /**
+ * 节点状态
+ */
+ @CollectionField("status")
+ private String status = PipelineStatusEnum.PENDING.getCode();
+}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/pipeline/PipelineInstanceTb.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/PipelineInstanceTb.java
similarity index 50%
rename from cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/pipeline/PipelineInstanceTb.java
rename to cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/PipelineInstanceTb.java
index a2160c89..97d9fd8f 100644
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/pipeline/PipelineInstanceTb.java
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/PipelineInstanceTb.java
@@ -1,124 +1,76 @@
-package cn.odboy.devops.dal.dataobject.pipeline;
-
-import cn.odboy.base.CsObject;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Getter;
-import lombok.Setter;
-
-import java.util.Date;
-
-/**
- *
- * 流水线实例
- *
- *
- * @author codegen
- * @since 2025-06-26
- */
-@Getter
-@Setter
-@TableName("pipeline_instance")
-@ApiModel(value = "PipelineInstance对象", description = "流水线实例")
-public class PipelineInstanceTb extends CsObject {
-
- /**
- * 流水线模板id
- */
- @ApiModelProperty("流水线模板id")
- @TableField("pipeline_template_id")
- private Long pipelineTemplateId;
-
- /**
- * 流水线实例名称
- */
- @ApiModelProperty("流水线实例名称")
- @TableField("pipeline_instance_name")
- private String pipelineInstanceName;
-
- /**
- * 流水线实例id
- */
- @ApiModelProperty("流水线实例id")
- @TableField("pipeline_instance_id")
- private Long pipelineInstanceId;
-
- /**
- * 创建时间
- */
- @ApiModelProperty("创建时间")
- @TableField("create_time")
- private Date createTime;
-
- /**
- * 创建人
- */
- @ApiModelProperty("创建人")
- @TableField("create_by")
- private String createBy;
-
- /**
- * 更新时间
- */
- @ApiModelProperty("更新时间")
- @TableField("update_time")
- private Date updateTime;
-
- /**
- * 流水线模板类型
- */
- @TableField("`type`")
- @ApiModelProperty("流水线模板类型")
- private String type;
-
- /**
- * 应用名称
- */
- @TableField("app_name")
- @ApiModelProperty("应用名称")
- private String appName;
-
- /**
- * 环境编码
- */
- @TableField("env")
- @ApiModelProperty("环境编码")
- private String env;
-
- /**
- * 流水线实例状态
- */
- @TableField("`status`")
- @ApiModelProperty("流水线实例状态")
- private String status;
-
- /**
- * 流水线实例当前节点code
- */
- @TableField("current_node")
- @ApiModelProperty("流水线实例当前节点code")
- private String currentNode;
-
- /**
- * 流水线实例当前节点状态
- */
- @ApiModelProperty("流水线实例当前节点状态")
- @TableField("current_node_status")
- private String currentNodeStatus;
-
- /**
- * 输入参数
- */
- @TableField("`context`")
- @ApiModelProperty("输入参数")
- private String context;
-
- /**
- * 流水线模板
- */
- @TableField("pipeline_template")
- @ApiModelProperty("流水线模板")
- private String pipelineTemplate;
-}
+package cn.odboy.devops.dal.dataobject;
+
+import cn.odboy.base.CsObject;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ *
+ * 流水线实例
+ *
+ *
+ * @author codegen
+ * @since 2025-06-26
+ */
+@Getter
+@Setter
+@TableName("pipeline_instance")
+@ApiModel(value = "PipelineInstance对象", description = "流水线实例")
+public class PipelineInstanceTb extends CsObject {
+ @ApiModelProperty("流水线实例id")
+ @TableId(value = "instance_id")
+ private Long instanceId;
+
+ @ApiModelProperty("创建时间")
+ @TableField(value = "create_time", fill = FieldFill.INSERT)
+ private Date createTime;
+ @ApiModelProperty("创建人")
+ @TableField(value = "create_by", fill = FieldFill.INSERT)
+ private String createBy;
+ @ApiModelProperty("更新时间")
+ @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+ private Date updateTime;
+
+ @ApiModelProperty("流水线实例名称")
+ @TableField("instance_name")
+ private String instanceName;
+
+ @TableField("env")
+ @ApiModelProperty("环境编码")
+ private String env;
+
+ @TableField("context_name")
+ @ApiModelProperty("上下文名称")
+ private String contextName;
+ @TableField("context_params")
+ @ApiModelProperty("上下文参数,这里指QuartzJobDataMap")
+ private String contextParams;
+
+ @TableField("current_node")
+ @ApiModelProperty("流水线实例当前节点code")
+ private String currentNode;
+ @ApiModelProperty("流水线实例当前节点状态")
+ @TableField("current_node_status")
+ private String currentNodeStatus;
+ @TableField("`status`")
+ @ApiModelProperty("流水线实例状态")
+ private String status;
+
+ @ApiModelProperty("流水线模板id")
+ @TableField("template_id")
+ private Long templateId;
+ @TableField("template_type")
+ @ApiModelProperty("流水线模板类型")
+ private String templateType;
+ @TableField("template_content")
+ @ApiModelProperty("流水线模板")
+ private String templateContent;
+}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/pipeline/PipelineTemplateTb.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/PipelineTemplateTb.java
similarity index 92%
rename from cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/pipeline/PipelineTemplateTb.java
rename to cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/PipelineTemplateTb.java
index 685d7d81..ddb70c17 100644
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/pipeline/PipelineTemplateTb.java
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/PipelineTemplateTb.java
@@ -1,82 +1,82 @@
-package cn.odboy.devops.dal.dataobject.pipeline;
-
-import cn.odboy.base.CsBaseUserTimeLogicTb;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- *
- * 流水线模板
- *
- *
- * @author codegen
- * @since 2025-06-26
- */
-@Getter
-@Setter
-@TableName("pipeline_template")
-@ApiModel(value = "PipelineTemplate对象", description = "流水线模板")
-public class PipelineTemplateTb extends CsBaseUserTimeLogicTb {
-
- /**
- * id
- */
- @ApiModelProperty("id")
- @TableId(value = "id", type = IdType.AUTO)
- private Long id;
-
- /**
- * 流水线类型
- */
- @TableField("`type`")
- @ApiModelProperty("流水线类型")
- private String type;
-
- /**
- * 语言
- */
- @ApiModelProperty("语言")
- @TableField("`language`")
- private String language;
-
- /**
- * 环境编码
- */
- @TableField("env")
- @ApiModelProperty("环境编码")
- private String env;
-
- /**
- * 流水线编码
- */
- @TableField("`code`")
- @ApiModelProperty("流水线编码")
- private String code;
-
- /**
- * 流水线名称
- */
- @TableField("`name`")
- @ApiModelProperty("流水线名称")
- private String name;
-
- /**
- * 流水线描述
- */
- @ApiModelProperty("流水线描述")
- @TableField("`description`")
- private String description;
-
- /**
- * 流水线模板内容
- */
- @TableField("template")
- @ApiModelProperty("流水线模板内容")
- private String template;
-}
+package cn.odboy.devops.dal.dataobject;
+
+import cn.odboy.base.CsBaseUserTimeLogicTb;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ *
+ * 流水线模板
+ *
+ *
+ * @author codegen
+ * @since 2025-06-26
+ */
+@Getter
+@Setter
+@TableName("pipeline_template")
+@ApiModel(value = "PipelineTemplate对象", description = "流水线模板")
+public class PipelineTemplateTb extends CsBaseUserTimeLogicTb {
+
+ /**
+ * id
+ */
+ @ApiModelProperty("id")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 流水线类型
+ */
+ @TableField("`type`")
+ @ApiModelProperty("流水线类型")
+ private String type;
+
+ /**
+ * 语言
+ */
+ @ApiModelProperty("语言")
+ @TableField("`language`")
+ private String language;
+
+ /**
+ * 环境编码
+ */
+ @TableField("env")
+ @ApiModelProperty("环境编码")
+ private String env;
+
+ /**
+ * 流水线编码
+ */
+ @TableField("`code`")
+ @ApiModelProperty("流水线编码")
+ private String code;
+
+ /**
+ * 流水线名称
+ */
+ @TableField("`name`")
+ @ApiModelProperty("流水线名称")
+ private String name;
+
+ /**
+ * 流水线描述
+ */
+ @ApiModelProperty("流水线描述")
+ @TableField("`description`")
+ private String description;
+
+ /**
+ * 流水线模板内容
+ */
+ @TableField("template")
+ @ApiModelProperty("流水线模板内容")
+ private String template;
+}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/pipeline/PipelineInstanceNodeDetailTb.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/pipeline/PipelineInstanceNodeDetailTb.java
deleted file mode 100644
index 0b6cd1d7..00000000
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/dataobject/pipeline/PipelineInstanceNodeDetailTb.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package cn.odboy.devops.dal.dataobject.pipeline;
-
-import cn.odboy.base.CsObject;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Getter;
-import lombok.Setter;
-
-import java.util.Date;
-
-/**
- *
- * 流水线实例节点明细
- *
- *
- * @author codegen
- * @since 2025-06-26
- */
-@Getter
-@Setter
-@TableName("pipeline_instance_node_detail")
-@ApiModel(value = "PipelineInstanceNodeDetail对象", description = "流水线实例节点明细")
-public class PipelineInstanceNodeDetailTb extends CsObject {
- /**
- * id
- */
- @ApiModelProperty("id")
- @TableId(value = "id", type = IdType.AUTO)
-
- private Long id;
- /**
- * 流水线实例id
- */
- @ApiModelProperty("流水线实例id")
- @TableField("pipeline_instance_id")
- private Long pipelineInstanceId;
-
- /**
- * 开始时间
- */
- @ApiModelProperty("开始时间")
- @TableField("start_time")
- private Date startTime;
-
- /**
- * 节点索引
- */
- @ApiModelProperty("节点索引")
- @TableField("node_index")
- private Integer nodeIndex;
- /**
- * 节点编码
- */
- @ApiModelProperty("节点编码")
- @TableField("node_code")
- private String nodeCode;
- /**
- * 步骤描述
- */
- @TableField("step_name")
- @ApiModelProperty("步骤描述")
- private String stepName;
-
- /**
- * 步骤状态
- */
- @ApiModelProperty("步骤状态")
- @TableField("step_status")
- private String stepStatus;
-
- /**
- * 异常明细
- */
- @ApiModelProperty("异常明细")
- @TableField("step_msg")
- private String stepMsg;
-}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/PipelineInstanceMapper.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/PipelineInstanceMapper.java
new file mode 100644
index 00000000..e9b5c7f8
--- /dev/null
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/PipelineInstanceMapper.java
@@ -0,0 +1,17 @@
+package cn.odboy.devops.dal.mysql;
+
+import cn.odboy.devops.dal.dataobject.PipelineInstanceTb;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ * 流水线实例 Mapper 接口
+ *
+ *
+ * @author codegen
+ * @since 2025-06-26
+ */
+@Mapper
+public interface PipelineInstanceMapper extends BaseMapper {
+}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/pipeline/PipelineTemplateMapper.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/PipelineTemplateMapper.java
similarity index 69%
rename from cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/pipeline/PipelineTemplateMapper.java
rename to cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/PipelineTemplateMapper.java
index 1a96308b..afbd212e 100644
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/pipeline/PipelineTemplateMapper.java
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/PipelineTemplateMapper.java
@@ -1,18 +1,18 @@
-package cn.odboy.devops.dal.mysql.pipeline;
-
-import cn.odboy.devops.dal.dataobject.pipeline.PipelineTemplateTb;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- *
- * 流水线模板 Mapper 接口
- *
- *
- * @author codegen
- * @since 2025-06-26
- */
-@Mapper
-public interface PipelineTemplateMapper extends BaseMapper {
-
-}
+package cn.odboy.devops.dal.mysql;
+
+import cn.odboy.devops.dal.dataobject.PipelineTemplateTb;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ * 流水线模板 Mapper 接口
+ *
+ *
+ * @author codegen
+ * @since 2025-06-26
+ */
+@Mapper
+public interface PipelineTemplateMapper extends BaseMapper {
+
+}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/pipeline/PipelineInstanceMapper.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/pipeline/PipelineInstanceMapper.java
deleted file mode 100644
index 90df7fa8..00000000
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/pipeline/PipelineInstanceMapper.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package cn.odboy.devops.dal.mysql.pipeline;
-
-import cn.odboy.devops.dal.dataobject.pipeline.PipelineInstanceTb;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-/**
- *
- * 流水线实例 Mapper 接口
- *
- *
- * @author codegen
- * @since 2025-06-26
- */
-@Mapper
-public interface PipelineInstanceMapper extends BaseMapper {
- void updateStatusByInstanceId(@Param("status") String status, @Param("pipelineInstanceId") long pipelineInstanceId);
-
- void updateCurrentNodeByInstanceId(@Param("code") String code, @Param("status") String status, @Param("pipelineInstanceId") long pipelineInstanceId);
-}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/pipeline/PipelineInstanceNodeDetailMapper.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/pipeline/PipelineInstanceNodeDetailMapper.java
deleted file mode 100644
index a7280669..00000000
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/mysql/pipeline/PipelineInstanceNodeDetailMapper.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package cn.odboy.devops.dal.mysql.pipeline;
-
-import cn.odboy.devops.dal.dataobject.pipeline.PipelineInstanceNodeDetailTb;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- *
- * 流水线实例节点明细 Mapper 接口
- *
- *
- * @author codegen
- * @since 2025-06-26
- */
-@Mapper
-public interface PipelineInstanceNodeDetailMapper extends BaseMapper {
-
-}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/redis/PipelineInstanceDAO.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/redis/PipelineInstanceDAO.java
new file mode 100644
index 00000000..f79b21bd
--- /dev/null
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/dal/redis/PipelineInstanceDAO.java
@@ -0,0 +1,35 @@
+package cn.odboy.devops.dal.redis;
+
+import cn.odboy.devops.constant.pipeline.PipelineConst;
+import cn.odboy.devops.dal.dataobject.PipelineInstanceTb;
+import cn.odboy.framework.redis.RedisHelper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class PipelineInstanceDAO {
+ private final RedisHelper redisHelper;
+
+ /**
+ * 全局锁,对应上下文,只能有一次
+ */
+ public boolean lock(PipelineInstanceTb pipelineInstanceTb) {
+ String redisKey = PipelineConst.INSTANCE_PREFIX + pipelineInstanceTb.getTemplateId() + pipelineInstanceTb.getContextName();
+ Object o = redisHelper.get(redisKey);
+ if (o != null) {
+ return true;
+ }
+ // 365天
+ redisHelper.set(redisKey, true, 60 * 60 * 24 * 365);
+ return false;
+ }
+
+ public void unLock(PipelineInstanceTb pipelineInstanceTb) {
+ String redisKey = PipelineConst.INSTANCE_PREFIX + pipelineInstanceTb.getTemplateId() + pipelineInstanceTb.getContextName();
+ Object o = redisHelper.get(redisKey);
+ if (o != null) {
+ redisHelper.del(redisKey);
+ }
+ }
+}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/mongoplus/MongoPlusMetaObjectHandler.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/mongoplus/MongoPlusMetaObjectHandler.java
new file mode 100644
index 00000000..d0c07067
--- /dev/null
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/mongoplus/MongoPlusMetaObjectHandler.java
@@ -0,0 +1,40 @@
+package cn.odboy.devops.framework.mongoplus;
+
+import com.anwen.mongo.handlers.MetaObjectHandler;
+import com.anwen.mongo.model.AutoFillMetaObject;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+@Component
+public class MongoPlusMetaObjectHandler implements MetaObjectHandler {
+// @Override
+// public void insertFill(Map insertFillMap, Document document) {
+// insertFillMap.keySet().forEach(key -> {
+// if (key.equals("createTime")){
+// document.put(key, LocalDateTime.now());
+// }
+// });
+// }
+//
+// @Override
+// public void updateFill(Map insertFillMap, Document document) {
+// insertFillMap.keySet().forEach(key -> {
+// if (key.equals("createTime")){
+// document.put(key, LocalDateTime.now());
+// }
+// });
+// }
+
+ @Override
+ public void insertFill(AutoFillMetaObject insertAutoFillMetaObject) {
+ Date nowTime = new Date();
+ insertAutoFillMetaObject.fillValue("create_time", nowTime);
+ insertAutoFillMetaObject.fillValue("update_time", nowTime);
+ }
+
+ @Override
+ public void updateFill(AutoFillMetaObject updateAutoFillMetaObject) {
+ updateAutoFillMetaObject.fillValue("update_time", new Date());
+ }
+}
\ No newline at end of file
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineJobBean.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineJobBean.java
deleted file mode 100644
index 091ed9ae..00000000
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineJobBean.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package cn.odboy.devops.framework.pipeline.core;
-
-import cn.odboy.devops.service.pipeline.PipelineInstanceService;
-import cn.odboy.framework.context.SpringBeanHolder;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.JobExecutionContext;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
-import org.springframework.scheduling.quartz.QuartzJobBean;
-
-@Slf4j
-public class PipelineJobBean extends QuartzJobBean {
- private final ThreadPoolTaskExecutor executor = SpringBeanHolder.getBean("pipelineAsync");
- private final PipelineInstanceService pipelineInstanceService = SpringBeanHolder.getBean(PipelineInstanceService.class);
-
- @Override
- public void executeInternal(JobExecutionContext context) {
- pipelineInstanceService.startPipeline(executor, context);
- }
-}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineJobManage.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineJobManage.java
index 0e7cffc6..85f5ae62 100644
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineJobManage.java
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineJobManage.java
@@ -1,39 +1,58 @@
package cn.odboy.devops.framework.pipeline.core;
import cn.odboy.devops.constant.pipeline.PipelineConst;
-import cn.odboy.devops.dal.dataobject.pipeline.PipelineInstanceTb;
+import cn.odboy.devops.dal.dataobject.PipelineInstanceTb;
+import cn.odboy.devops.framework.pipeline.model.PipelineNodeTemplateVo;
import cn.odboy.framework.exception.BadRequestException;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
+import javax.validation.constraints.NotNull;
+/**
+ * 流水线任务管理器
+ *
+ * @author odboy
+ * @date 2025-07-19
+ */
@Slf4j
@Component
public class PipelineJobManage {
- private static final String JOB_KEY = "PIPELINE_JOB_";
+ private static final String JOB_KEY = "PIPELINE_JOB_%s_%s";
@Resource
private Scheduler scheduler;
/**
* 启动 job
*/
- public void startJob(PipelineInstanceTb pipelineInstance) {
+ public void startJob(PipelineInstanceTb pipelineInstance, PipelineNodeTemplateVo pipelineNodeTemplate) {
try {
+ // 流水线Id
+ Long instanceId = pipelineInstance.getInstanceId();
+ String jobId = String.format(JOB_KEY, instanceId, pipelineNodeTemplate.getCode());
// 构建 JobDetail
+ JobKey jobKey = JobKey.jobKey(jobId);
JobDetail jobDetail = JobBuilder
- .newJob(PipelineJobBean.class)
- .withIdentity(JOB_KEY + pipelineInstance.getPipelineInstanceId())
+ .newJob(PipelineNodeJobBean.class)
+ .withIdentity(jobKey)
.build();
// 构建Trigger
+ TriggerKey triggerKey = TriggerKey.triggerKey(String.format(JOB_KEY, instanceId, pipelineNodeTemplate.getCode()));
Trigger cronTrigger = TriggerBuilder.newTrigger()
- .withIdentity(JOB_KEY + pipelineInstance.getPipelineInstanceId())
+ .withIdentity(triggerKey)
.startNow()
.build();
- // 添加流水线实例
- cronTrigger.getJobDataMap().put(PipelineConst.INSTANCE_ID_KEY, pipelineInstance.getPipelineInstanceId());
+ // 任务参数
+ JobDataMap jobDataMap = cronTrigger.getJobDataMap();
+ jobDataMap.put(PipelineConst.INSTANCE_ID, pipelineInstance.getInstanceId());
+ jobDataMap.put(PipelineConst.CONTEXT_NAME, pipelineInstance.getContextName());
+ jobDataMap.put(PipelineConst.ENV, pipelineInstance.getEnv());
+ jobDataMap.put(PipelineConst.TEMPLATE_ID, pipelineInstance.getTemplateId());
+ jobDataMap.put(PipelineConst.CURRENT_NODE_TEMPLATE, pipelineNodeTemplate);
try {
+ // 在quartz的内部线程池中异步执行
scheduler.scheduleJob(jobDetail, cronTrigger);
} catch (ObjectAlreadyExistsException e) {
log.warn("定时任务已存在,跳过加载");
@@ -47,9 +66,9 @@ public class PipelineJobManage {
/**
* 删除job
*/
- public void deleteJob(PipelineInstanceTb pipelineInstance) {
+ public void deleteJob(@NotNull String instanceId, @NotNull String nodeCode) {
try {
- JobKey jobKey = JobKey.jobKey(JOB_KEY + pipelineInstance.getPipelineInstanceId());
+ JobKey jobKey = JobKey.jobKey(String.format(JOB_KEY, instanceId, nodeCode));
scheduler.pauseJob(jobKey);
scheduler.deleteJob(jobKey);
} catch (Exception e) {
@@ -57,4 +76,13 @@ public class PipelineJobManage {
throw new BadRequestException("删除定时任务失败");
}
}
+
+ /**
+ * 中断正在执行的任务
+ * 任务终止需要配合响应中断或停止信号
+ */
+ public void interruptJob(@NotNull String instanceId, @NotNull String nodeCode) throws SchedulerException {
+ JobKey jobKey = JobKey.jobKey(String.format(JOB_KEY, instanceId, nodeCode));
+ scheduler.interrupt(jobKey);
+ }
}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobBean.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobBean.java
new file mode 100644
index 00000000..0873b23c
--- /dev/null
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobBean.java
@@ -0,0 +1,30 @@
+package cn.odboy.devops.framework.pipeline.core;
+
+import cn.odboy.devops.constant.pipeline.PipelineConst;
+import cn.odboy.devops.framework.pipeline.model.PipelineNodeTemplateVo;
+import cn.odboy.framework.context.SpringBeanHolder;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.*;
+
+/**
+ * 流水线任务载体
+ *
+ * @author odboy
+ * @date 2025-07-19
+ */
+@Slf4j
+public class PipelineNodeJobBean implements InterruptableJob {
+ @Override
+ public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+ JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap();
+ PipelineNodeTemplateVo currentNodeTemplate = (PipelineNodeTemplateVo) jobDataMap.get(PipelineConst.CURRENT_NODE_TEMPLATE);
+ String serviceName = PipelineConst.EXECUTOR_PREFIX + currentNodeTemplate.getCode();
+ PipelineNodeJobExecutor pipelineNodeJobExecutor = SpringBeanHolder.getBean(serviceName);
+ pipelineNodeJobExecutor.execute(jobDataMap);
+ }
+
+ @Override
+ public void interrupt() throws UnableToInterruptJobException {
+
+ }
+}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobExecutor.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobExecutor.java
index ea965a7f..71946f2f 100644
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobExecutor.java
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobExecutor.java
@@ -1,10 +1,14 @@
package cn.odboy.devops.framework.pipeline.core;
import cn.odboy.devops.framework.pipeline.model.PipelineNodeJobExecuteResult;
-import cn.odboy.framework.exception.BadRequestException;
-
-import java.util.Map;
+import org.quartz.JobDataMap;
+/**
+ * 流水线节点任务 接口
+ *
+ * @author odboy
+ * @date 2025-07-21
+ */
public interface PipelineNodeJobExecutor {
- PipelineNodeJobExecuteResult execute(Map contextArgs) throws BadRequestException;
+ PipelineNodeJobExecuteResult execute(JobDataMap contextArgs);
}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobRunnable.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobRunnable.java
deleted file mode 100644
index df02138e..00000000
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobRunnable.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package cn.odboy.devops.framework.pipeline.core;
-
-import cn.odboy.framework.context.SpringBeanHolder;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.Callable;
-
-public class PipelineNodeJobRunnable implements Callable
+
+
+
+ com.gitee.anwena
+ mongo-plus-boot-starter
+
+ 2.1.6.1
+
+
+ org.springframework.boot
+ spring-boot-starter-data-mongodb
+