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 4a5f07c3..0322b06b 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
@@ -20,4 +20,5 @@ public interface PipelineConst {
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";
}
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
index 98827a4f..51f9e4d7 100644
--- 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
@@ -26,6 +26,11 @@ public interface PipelineNodeBizCodeConst {
*/
String DEPLOY_APPROVE = PipelineConst.EXECUTOR_PREFIX + "node_deploy_approve";
+ /**
+ * 合并确认
+ */
+ String MERGE_CONFIRM = PipelineConst.EXECUTOR_PREFIX + "node_merge_confirm";
+
/**
* 合并到Master
*/
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/constant/pipeline/PipelineTypeEnum.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/constant/pipeline/PipelineTypeEnum.java
new file mode 100644
index 00000000..af152334
--- /dev/null
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/constant/pipeline/PipelineTypeEnum.java
@@ -0,0 +1,34 @@
+package cn.odboy.devops.constant.pipeline;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 流水线类型
+ */
+@Getter
+@AllArgsConstructor
+public enum PipelineTypeEnum {
+ BACKEND("backend", "后端"),
+ FRONT("front", "前端"),
+ MOBILE("mobile", "移动端"),
+ ANDROID("pc", "PC端"),
+ UN_SUPPORT("un_support", "不支持的类型");
+ /**
+ * 类型编码
+ */
+ private final String code;
+ /**
+ * 描述
+ */
+ private final String desc;
+
+ public static PipelineTypeEnum getByCode(String code) {
+ for (PipelineTypeEnum value : PipelineTypeEnum.values()) {
+ if (value.getCode().equals(code)) {
+ return value;
+ }
+ }
+ return UN_SUPPORT;
+ }
+}
\ No newline at end of file
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
index ca66bba1..0b6cd1d7 100644
--- 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
@@ -1,7 +1,9 @@
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;
@@ -23,7 +25,13 @@ import java.util.Date;
@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
*/
@@ -38,45 +46,36 @@ public class PipelineInstanceNodeDetailTb extends CsObject {
@TableField("start_time")
private Date startTime;
- /**
- * 结束时间
- */
- @ApiModelProperty("结束时间")
- @TableField("finish_time")
- private Date finishTime;
-
- /**
- * 节点状态
- */
- @TableField("`status`")
- @ApiModelProperty("节点状态")
- private String status;
-
/**
* 节点索引
*/
@ApiModelProperty("节点索引")
@TableField("node_index")
private Integer nodeIndex;
-
/**
* 节点编码
*/
- @TableField("node_code")
@ApiModelProperty("节点编码")
+ @TableField("node_code")
private String nodeCode;
+ /**
+ * 步骤描述
+ */
+ @TableField("step_name")
+ @ApiModelProperty("步骤描述")
+ private String stepName;
/**
- * 节点描述
+ * 步骤状态
*/
- @ApiModelProperty("节点描述")
- @TableField("node_description")
- private String nodeDescription;
+ @ApiModelProperty("步骤状态")
+ @TableField("step_status")
+ private String stepStatus;
/**
- * 输入参数
+ * 异常明细
*/
- @TableField("`context`")
- @ApiModelProperty("输入参数")
- private String context;
+ @ApiModelProperty("异常明细")
+ @TableField("step_msg")
+ private String stepMsg;
}
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/pipeline/PipelineInstanceTb.java
index 4aac671f..a2160c89 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/pipeline/PipelineInstanceTb.java
@@ -22,7 +22,7 @@ import java.util.Date;
@Setter
@TableName("pipeline_instance")
@ApiModel(value = "PipelineInstance对象", description = "流水线实例")
-public class PipelineInstanceTb extends CsObject{
+public class PipelineInstanceTb extends CsObject {
/**
* 流水线模板id
@@ -43,7 +43,7 @@ public class PipelineInstanceTb extends CsObject{
*/
@ApiModelProperty("流水线实例id")
@TableField("pipeline_instance_id")
- private String pipelineInstanceId;
+ private Long pipelineInstanceId;
/**
* 创建时间
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
index 941803a3..90df7fa8 100644
--- 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
@@ -3,6 +3,7 @@ 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;
/**
*
@@ -14,5 +15,7 @@ import org.apache.ibatis.annotations.Mapper;
*/
@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/framework/pipeline/PipelineJobBean.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/PipelineJobBean.java
deleted file mode 100644
index 98febce7..00000000
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/PipelineJobBean.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package cn.odboy.devops.framework.pipeline;
-
-import cn.odboy.devops.constant.pipeline.PipelineConst;
-import cn.odboy.framework.context.SpringBeanHolder;
-import cn.odboy.devops.framework.pipeline.model.PipelineNodeJobExecuteResult;
-import cn.odboy.devops.framework.pipeline.model.PipelineNodeTemplateVo;
-import cn.odboy.devops.dal.dataobject.pipeline.PipelineInstanceTb;
-import cn.odboy.devops.service.pipeline.PipelineInstanceNodeDetailService;
-import cn.odboy.devops.service.pipeline.PipelineInstanceService;
-import cn.odboy.util.CsJsonUtil;
-import com.alibaba.fastjson2.JSON;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.JobDataMap;
-import org.quartz.JobExecutionContext;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
-import org.springframework.scheduling.quartz.QuartzJobBean;
-
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Future;
-
-@Slf4j
-public class PipelineJobBean extends QuartzJobBean {
- private final ThreadPoolTaskExecutor executor = SpringBeanHolder.getBean("pipelineAsync");
-
- @Override
- public void executeInternal(JobExecutionContext context) {
- JobDataMap mergedJobDataMap = context.getMergedJobDataMap();
- // 实例、节点明细
- PipelineInstanceService pipelineInstanceService = SpringBeanHolder.getBean(PipelineInstanceService.class);
- PipelineInstanceNodeDetailService pipelineInstanceNodeDetailService = SpringBeanHolder.getBean(PipelineInstanceNodeDetailService.class);
- // 获取流水线实例
- String pipelineInstanceId = mergedJobDataMap.getString(PipelineConst.INSTANCE_ID_KEY);
- PipelineInstanceTb pipelineInstance = pipelineInstanceService.getPipelineInstance(pipelineInstanceId);
- if (pipelineInstance == null) {
- log.info("流水线实例不存在, instanceId={}", pipelineInstanceId);
- return;
- }
- String pipelineTemplate = pipelineInstance.getPipelineTemplate();
- // 流水线节点模板
- List pipelineNodeTemplateVos = JSON.parseArray(pipelineTemplate, PipelineNodeTemplateVo.class);
- // 流水线上下文参数
- Map contextArgs = CsJsonUtil.toMap(pipelineInstance.getContext(), String.class, Object.class);
- // 放置额外的参数
- contextArgs.put(PipelineConst.INSTANCE_KEY, pipelineInstance);
- // 执行节点任务
- for (int i = 0; i < pipelineNodeTemplateVos.size(); i++) {
- PipelineNodeTemplateVo pipelineNodeTemplateVo = pipelineNodeTemplateVos.get(i);
- String code = pipelineNodeTemplateVo.getCode();
- contextArgs.put(PipelineConst.INSTANCE_NODE_INDEX_KEY, i);
- contextArgs.put(PipelineConst.INSTANCE_NODE_CODE_KEY, code);
- contextArgs.put(PipelineConst.INSTANCE_NODE_NAME_KEY, pipelineNodeTemplateVo.getName());
- contextArgs.put(PipelineConst.INSTANCE_NODE_TEMPLATE_ARGS_KEY, pipelineNodeTemplateVo.getParameters());
- try {
- List allServiceBeanName = SpringBeanHolder.getAllServiceBeanName();
- System.err.println(allServiceBeanName);
- PipelineNodeJobRunnable pipelineNodeJobRunnable = new PipelineNodeJobRunnable(
- PipelineConst.EXECUTOR_PREFIX + code,
- contextArgs,
- pipelineInstanceNodeDetailService
- );
- Future> future = executor.submit(pipelineNodeJobRunnable);
- PipelineNodeJobExecuteResult executeResult = (PipelineNodeJobExecuteResult) future.get();
- System.err.println(executeResult);
- } catch (Exception e) {
- log.error("流水线节点任务执行失败", e);
- }
- }
- }
-}
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
new file mode 100644
index 00000000..091ed9ae
--- /dev/null
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineJobBean.java
@@ -0,0 +1,19 @@
+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/PipelineJobManage.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineJobManage.java
similarity index 82%
rename from cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/PipelineJobManage.java
rename to cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineJobManage.java
index 34e0b9cd..0e7cffc6 100644
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/PipelineJobManage.java
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineJobManage.java
@@ -1,8 +1,8 @@
-package cn.odboy.devops.framework.pipeline;
+package cn.odboy.devops.framework.pipeline.core;
import cn.odboy.devops.constant.pipeline.PipelineConst;
-import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.devops.dal.dataobject.pipeline.PipelineInstanceTb;
+import cn.odboy.framework.exception.BadRequestException;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.stereotype.Component;
@@ -12,6 +12,7 @@ import javax.annotation.Resource;
@Slf4j
@Component
public class PipelineJobManage {
+ private static final String JOB_KEY = "PIPELINE_JOB_";
@Resource
private Scheduler scheduler;
@@ -23,11 +24,11 @@ public class PipelineJobManage {
// 构建 JobDetail
JobDetail jobDetail = JobBuilder
.newJob(PipelineJobBean.class)
- .withIdentity(pipelineInstance.getPipelineInstanceId())
+ .withIdentity(JOB_KEY + pipelineInstance.getPipelineInstanceId())
.build();
// 构建Trigger
Trigger cronTrigger = TriggerBuilder.newTrigger()
- .withIdentity(pipelineInstance.getPipelineInstanceId())
+ .withIdentity(JOB_KEY + pipelineInstance.getPipelineInstanceId())
.startNow()
.build();
// 添加流水线实例
@@ -48,7 +49,7 @@ public class PipelineJobManage {
*/
public void deleteJob(PipelineInstanceTb pipelineInstance) {
try {
- JobKey jobKey = JobKey.jobKey(pipelineInstance.getPipelineInstanceId());
+ JobKey jobKey = JobKey.jobKey(JOB_KEY + pipelineInstance.getPipelineInstanceId());
scheduler.pauseJob(jobKey);
scheduler.deleteJob(jobKey);
} catch (Exception e) {
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/PipelineNodeJobExecutor.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobExecutor.java
similarity index 54%
rename from cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/PipelineNodeJobExecutor.java
rename to cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobExecutor.java
index f1a37274..ea965a7f 100644
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/PipelineNodeJobExecutor.java
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobExecutor.java
@@ -1,11 +1,10 @@
-package cn.odboy.devops.framework.pipeline;
+package cn.odboy.devops.framework.pipeline.core;
-import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.devops.framework.pipeline.model.PipelineNodeJobExecuteResult;
-import cn.odboy.devops.service.pipeline.PipelineInstanceNodeDetailService;
+import cn.odboy.framework.exception.BadRequestException;
import java.util.Map;
public interface PipelineNodeJobExecutor {
- PipelineNodeJobExecuteResult execute(Map contextArgs, PipelineInstanceNodeDetailService pipelineInstanceNodeDetailService) throws BadRequestException;
+ PipelineNodeJobExecuteResult execute(Map contextArgs) throws BadRequestException;
}
diff --git a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/PipelineNodeJobRunnable.java b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobRunnable.java
similarity index 52%
rename from cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/PipelineNodeJobRunnable.java
rename to cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobRunnable.java
index 7247ac83..df02138e 100644
--- a/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/PipelineNodeJobRunnable.java
+++ b/cutejava/cutejava-module-devops/src/main/java/cn/odboy/devops/framework/pipeline/core/PipelineNodeJobRunnable.java
@@ -1,7 +1,6 @@
-package cn.odboy.devops.framework.pipeline;
+package cn.odboy.devops.framework.pipeline.core;
import cn.odboy.framework.context.SpringBeanHolder;
-import cn.odboy.devops.service.pipeline.PipelineInstanceNodeDetailService;
import java.util.HashMap;
import java.util.Map;
@@ -10,20 +9,18 @@ import java.util.concurrent.Callable;
public class PipelineNodeJobRunnable implements Callable