From 969def7fc3a797c9af0e9cd4e44fd3e6eafb880d Mon Sep 17 00:00:00 2001 From: even <827656971@qq.com> Date: Fri, 16 May 2025 15:29:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=BC=95=E6=93=8E=E9=83=A8?= =?UTF-8?q?=E5=88=86=E4=BB=A3=E7=A0=81=EF=BC=88=E5=BC=80=E4=BA=86=E4=B8=AA?= =?UTF-8?q?=E5=A4=B4=EF=BC=89=EF=BC=8Cstage=EF=BC=8Ctask=E4=B8=BB=E9=94=AE?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=94=B9=E4=B8=BAid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/GlobalErrorCodeConstants.java | 2 + .../common/pipeline/req/stage/StageReq.java | 55 ----------- .../pipeline/req/stage/StageUpdateReq.java | 2 +- .../ci/common/pipeline/req/task/TasksReq.java | 2 +- .../engine/dispatcher/BaseDispatcher.java | 10 ++ .../dispatcher/impl/ParallelDispatcher.java | 26 +++++ .../dispatcher/impl/SerialDispatcher.java | 17 ++++ .../engine/enums/ContextStateEnum.java | 70 +++++++++++++ .../engine/executor/PipelineExecutor.java | 7 ++ .../impl/DefaultPipelineExecutor.java | 45 +++++++++ .../engine/manager/RunContextManager.java | 31 ++++++ .../process/engine/manager/WorkerManager.java | 4 + .../impl/DefaultRunContextManager.java | 4 + .../engine/runContext/BaseRunContext.java | 97 +++++++++++++++++++ .../engine/runContext/MainStageContext.java | 22 +++++ .../engine/runContext/PipelineRunContext.java | 59 +++++++++++ .../engine/runContext/StageRunContext.java | 36 +++++++ .../engine/runContext/TaskRunContext.java | 29 ++++++ .../dataObject/base/PipBaseElement.java | 21 ++++ .../dataObject/pipeline/PipPipeline.java | 25 +---- .../process/dataObject/stage/PipStage.java | 12 +-- .../process/dataObject/task/PipTask.java | 12 +-- .../process/service/stage/StageService.java | 4 +- .../service/stage/impl/StageServiceImpl.java | 21 +++- .../server/controller/StageController.java | 5 - 25 files changed, 518 insertions(+), 100 deletions(-) delete mode 100644 modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/req/stage/StageReq.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/dispatcher/BaseDispatcher.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/dispatcher/impl/ParallelDispatcher.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/dispatcher/impl/SerialDispatcher.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/enums/ContextStateEnum.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/executor/PipelineExecutor.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/executor/impl/DefaultPipelineExecutor.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/RunContextManager.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/WorkerManager.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/impl/DefaultRunContextManager.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/BaseRunContext.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/MainStageContext.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/PipelineRunContext.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/StageRunContext.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/TaskRunContext.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/base/PipBaseElement.java diff --git a/framework/commons/src/main/java/cd/casic/framework/commons/exception/enums/GlobalErrorCodeConstants.java b/framework/commons/src/main/java/cd/casic/framework/commons/exception/enums/GlobalErrorCodeConstants.java index b375093f..5333f9a8 100644 --- a/framework/commons/src/main/java/cd/casic/framework/commons/exception/enums/GlobalErrorCodeConstants.java +++ b/framework/commons/src/main/java/cd/casic/framework/commons/exception/enums/GlobalErrorCodeConstants.java @@ -41,4 +41,6 @@ public interface GlobalErrorCodeConstants { ErrorCode ID_DUPLICATION = new ErrorCode(1000, "ID重复"); + ErrorCode PIPELINE_ERROR = new ErrorCode(1001,"流水线执行错误"); + } diff --git a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/req/stage/StageReq.java b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/req/stage/StageReq.java deleted file mode 100644 index 73b2c66a..00000000 --- a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/req/stage/StageReq.java +++ /dev/null @@ -1,55 +0,0 @@ -package cd.casic.ci.common.pipeline.req.stage; - -import cd.casic.ci.common.pipeline.req.task.TasksReq; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Data -public class StageReq { - //@ApiProperty(name = "stageId",desc="id") - private String stageId; - - //@ApiProperty(name = "stageName",desc="名称") - private String stageName; - - //@ApiProperty(name = "createTime",desc="创建时间") - private LocalDateTime createTime; - - //@ApiProperty(name="pipelineId",desc="流水线id") - private String pipelineId; - - //@ApiProperty(name="stageSort",desc="阶段顺序") - private int stageSort; - - //@ApiProperty(name = "parentId",desc="主阶段") - private String parentId; - - //@ApiProperty(name = "code",desc="是否是源码") - private boolean code = false; - - //@ApiProperty(name = "taskValues",desc="阶段任务") - private List taskValues; - - //@ApiProperty(name = "stageList",desc="阶段") - private List stageList; - - //@ApiProperty(name = "taskType",desc="任务类型") - private String taskType; - - //@ApiProperty(name = "taskId",desc="任务id") - private String taskId; - - //@ApiProperty(name = "values",desc="更新内容") - private Object values; - - //@ApiProperty(name = "taskSort",desc="任务顺序") - private int taskSort; - - //@ApiProperty(name = "parallelName",desc="并行阶段名称") - private String parallelName; - - // 执行实例id - private String instanceId; -} diff --git a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/req/stage/StageUpdateReq.java b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/req/stage/StageUpdateReq.java index 50fd50ec..0f5cea5a 100644 --- a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/req/stage/StageUpdateReq.java +++ b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/req/stage/StageUpdateReq.java @@ -8,6 +8,6 @@ public class StageUpdateReq { private String stageName; // 更新sort private Integer stageSort; - private String stageId; + private String id; private String pipelineId; } diff --git a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/req/task/TasksReq.java b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/req/task/TasksReq.java index f4d789fc..e9bbba2b 100644 --- a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/req/task/TasksReq.java +++ b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/req/task/TasksReq.java @@ -8,7 +8,7 @@ import java.time.LocalDateTime; @Data public class TasksReq { //@ApiProperty(name="taskId",desc="配置id") - private String taskId; + private String id; //@ApiProperty(name="createTime",desc="创建时间") private LocalDateTime createTime; diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/dispatcher/BaseDispatcher.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/dispatcher/BaseDispatcher.java new file mode 100644 index 00000000..b032b823 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/dispatcher/BaseDispatcher.java @@ -0,0 +1,10 @@ +package cd.casic.ci.process.engine.dispatcher; + +import cd.casic.ci.process.engine.runContext.BaseRunContext; +import cd.casic.ci.process.process.dataObject.base.PipBaseElement; + +import java.util.List; + +public interface BaseDispatcher { + void dispatch(); +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/dispatcher/impl/ParallelDispatcher.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/dispatcher/impl/ParallelDispatcher.java new file mode 100644 index 00000000..316f14ee --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/dispatcher/impl/ParallelDispatcher.java @@ -0,0 +1,26 @@ +package cd.casic.ci.process.engine.dispatcher.impl; + +import cd.casic.ci.process.engine.dispatcher.BaseDispatcher; +import cd.casic.ci.process.engine.runContext.PipelineRunContext; +import cd.casic.ci.process.process.dataObject.base.PipBaseElement; +import cd.casic.ci.process.process.dataObject.stage.PipStage; + +import java.util.List; + +public class ParallelDispatcher implements BaseDispatcher { + + private List firstStageList; + private Integer stageIndex; + private PipelineRunContext context; + + public ParallelDispatcher(List firstStageList, PipelineRunContext context) { + this.firstStageList = firstStageList; + this.context = context; + this.stageIndex = 0; + } + + @Override + public void dispatch() { + + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/dispatcher/impl/SerialDispatcher.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/dispatcher/impl/SerialDispatcher.java new file mode 100644 index 00000000..49f2a2d1 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/dispatcher/impl/SerialDispatcher.java @@ -0,0 +1,17 @@ +package cd.casic.ci.process.engine.dispatcher.impl; + +import cd.casic.ci.process.engine.dispatcher.BaseDispatcher; +import cd.casic.ci.process.engine.runContext.StageRunContext; +import cd.casic.ci.process.process.dataObject.base.PipBaseElement; +import cd.casic.ci.process.process.dataObject.task.PipTask; + +import java.util.List; + +public class SerialDispatcher implements BaseDispatcher { + private StageRunContext stageRunContext; + private List itemList; + @Override + public void dispatch() { + + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/enums/ContextStateEnum.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/enums/ContextStateEnum.java new file mode 100644 index 00000000..8263f105 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/enums/ContextStateEnum.java @@ -0,0 +1,70 @@ +package cd.casic.ci.process.engine.enums; + +import lombok.Getter; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; +@Getter +public enum ContextStateEnum { + INIT(0,"初始化", new HashSet<>(){ + { + add(READY); + add(SUSPEND); + add(STOP); + } + }), + READY(1,"就绪", new HashSet<>(){ + { + add(RUNNING); + add(SUSPEND); + add(STOP); + } + }), + RUNNING(2,"运行", new HashSet<>(){ + { + add(SUSPEND); + add(STOP); + add(HAPPY_ENDING); + add(BAD_ENDING); + } + }), + SUSPEND(3,"挂起", new HashSet<>(){ + { + add(INIT); + add(READY); + add(RUNNING); + } + }), + STOP(-1,"停止", new HashSet<>()), + HAPPY_ENDING(4,"执行成功", new HashSet<>()), + BAD_ENDING(5,"执行失败", new HashSet<>()) + ; + + private Integer code; + private String msg; + /** + * 包含当前所有合法的下一个状态 + * */ + private Set nextStep; + + ContextStateEnum(Integer code, String msg, Set nextStep) { + this.code = code; + this.msg = msg; + this.nextStep = nextStep; + } + public static Boolean canGoto(ContextStateEnum from,ContextStateEnum to){ + if (Objects.isNull(from) || Objects.isNull(to)) { + return false; + } + return from.nextStep.contains(to); + } + public static ContextStateEnum getByCode(Integer code){ + for (ContextStateEnum value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/executor/PipelineExecutor.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/executor/PipelineExecutor.java new file mode 100644 index 00000000..2ca6e10a --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/executor/PipelineExecutor.java @@ -0,0 +1,7 @@ +package cd.casic.ci.process.engine.executor; + +import cd.casic.ci.process.engine.runContext.PipelineRunContext; + +public interface PipelineExecutor { + PipelineRunContext execute(String pipelineId); +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/executor/impl/DefaultPipelineExecutor.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/executor/impl/DefaultPipelineExecutor.java new file mode 100644 index 00000000..cc0e9196 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/executor/impl/DefaultPipelineExecutor.java @@ -0,0 +1,45 @@ +package cd.casic.ci.process.engine.executor.impl; + +import cd.casic.ci.common.pipeline.resp.stage.StageResp; +import cd.casic.ci.process.engine.dispatcher.impl.ParallelDispatcher; +import cd.casic.ci.process.engine.enums.ContextStateEnum; +import cd.casic.ci.process.engine.executor.PipelineExecutor; +import cd.casic.ci.process.engine.manager.RunContextManager; +import cd.casic.ci.process.engine.runContext.PipelineRunContext; +import cd.casic.ci.process.process.dataObject.pipeline.PipPipeline; +import cd.casic.ci.process.process.dataObject.stage.PipStage; +import cd.casic.ci.process.process.service.pipeline.PipelineService; +import cd.casic.ci.process.process.service.stage.StageService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +@Component +public class DefaultPipelineExecutor implements PipelineExecutor { + @Resource + private PipelineService pipelineService; + @Resource + private StageService stageService; + @Resource + private RunContextManager runContextManager; + @Override + public PipelineRunContext execute(String pipelineId) { + PipPipeline pipeline = pipelineService.getById(pipelineId); + // TODO 判断状态不能重复运行 + Integer state = pipeline.getState(); + // TODO 判断资源是否申请成功是否处于可运行状态 + String resourceId = pipeline.getResourceId(); + String executeStatus = pipeline.getExecuteStatus(); + // TODO 如果判断成功则查询所有的阶段信息 + List mainStage = stageService.findAllFirstStagesAndChild(pipelineId); + PipelineRunContext pipelineRunContext = new PipelineRunContext(null,pipeline,new ConcurrentHashMap<>(),new ConcurrentHashMap<>()); + runContextManager.contextRegister(pipelineRunContext); +// ParallelDispatcher parallelDispatcher = new ParallelDispatcher(); + + return null; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/RunContextManager.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/RunContextManager.java new file mode 100644 index 00000000..f3347c27 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/RunContextManager.java @@ -0,0 +1,31 @@ +package cd.casic.ci.process.engine.manager; + +import cd.casic.ci.process.engine.runContext.BaseRunContext; + +public interface RunContextManager { + /** + * 停止流水线运行-预留 + * */ + Boolean stopPipeline(String pipelineId); + /** + * 恢复流水线运行-预留 + * */ + Boolean notifyPipeline(String pipelineId); + /** + * 挂起流水线-预留 + * */ + Boolean suspendPipeline(String pipelineId); + /** + * 恢复子阶段运行-预留 + * */ + Boolean notifyStage(String pipelineId,String stageId); + /** + * 挂起子阶段-预留 + * */ + Boolean suspendStage(String pipelineId,String stageId); + /** + * 判断相应的context类型,放入注册Map中 + * */ + void contextRegister(BaseRunContext context); + BaseRunContext getContext(String key); +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/WorkerManager.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/WorkerManager.java new file mode 100644 index 00000000..8b3e3b77 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/WorkerManager.java @@ -0,0 +1,4 @@ +package cd.casic.ci.process.engine.manager; + +public interface WorkerManager { +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/impl/DefaultRunContextManager.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/impl/DefaultRunContextManager.java new file mode 100644 index 00000000..7de3b2f5 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/impl/DefaultRunContextManager.java @@ -0,0 +1,4 @@ +package cd.casic.ci.process.engine.manager.impl; + +public class DefaultRunContextManager { +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/BaseRunContext.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/BaseRunContext.java new file mode 100644 index 00000000..65fd83e7 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/BaseRunContext.java @@ -0,0 +1,97 @@ +package cd.casic.ci.process.engine.runContext; + +import cd.casic.ci.process.engine.enums.ContextStateEnum; +import cd.casic.ci.process.process.dataObject.base.PipBaseElement; +import cd.casic.framework.commons.exception.ServiceException; +import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; +@Data +public abstract class BaseRunContext { + /** + * 当前上下文的定义 + * */ + private PipBaseElement contextDef; + private BaseRunContext parentContext; + /** + * 运行状态 + * */ + private AtomicInteger state; + /** + * 启动时间 + * */ + private LocalDateTime startTime; + /** + * 结束时间 + * */ + private LocalDateTime endTime; + private String resourceId; + private String targetId; + private String targetType; + /** + * 整个流水线全局的变量 + * */ + private Map globalVariables; + /** + * 当前上下文局部变量 + * */ + private Map localVariables; + private Map childContext; + + public BaseRunContext(PipBaseElement contextDef,BaseRunContext parentContext, LocalDateTime startTime, String resourceId, String targetId, String targetType, Map globalVariables, Map localVariables, Map childContext) { + this.contextDef = contextDef; + this.parentContext = parentContext; + this.state = new AtomicInteger(ContextStateEnum.INIT.getCode()); + this.startTime = startTime; + this.resourceId = resourceId; + this.targetId = targetId; + this.targetType = targetType; + this.globalVariables = globalVariables; + this.localVariables = localVariables; + this.childContext = childContext; + } + + /** + * 获取当前或者子上下文 + * */ + public abstract BaseRunContext getChildRunContext(String key); + public abstract void putChildRunContext(String key,BaseRunContext context); + public void callParentChange(ContextStateEnum state){ + if (ContextStateEnum.HAPPY_ENDING.equals(state)||ContextStateEnum.BAD_ENDING.equals(state)) { + checkChildEnd(); + } + } + /** + * 查找子类是否全部完成,如果子类全部完成则父类也全部完成 + * */ + public void checkChildEnd() throws ServiceException{ + int result = ContextStateEnum.HAPPY_ENDING.getCode(); + for (Map.Entry entry : childContext.entrySet()) { + BaseRunContext child = entry.getValue(); + int state = child.getState().get(); + if (!ContextStateEnum.HAPPY_ENDING.getCode().equals(state)&&!ContextStateEnum.BAD_ENDING.getCode().equals(state)) { + return; + } + result&=state; + } + boolean end = false; + if (ContextStateEnum.HAPPY_ENDING.getCode()==result) { + if (ContextStateEnum.canGoto(ContextStateEnum.getByCode(state.get()),ContextStateEnum.HAPPY_ENDING)) { + this.state.compareAndExchange(state.get(),ContextStateEnum.HAPPY_ENDING.getCode()); + end = true; + } + } else { + if (ContextStateEnum.canGoto(ContextStateEnum.getByCode(state.get()),ContextStateEnum.BAD_ENDING)) { + this.state.compareAndExchange(state.get(),ContextStateEnum.BAD_ENDING.getCode()); + end = true; + } + } + if (!end) { + throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),"状态有误"); + } + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/MainStageContext.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/MainStageContext.java new file mode 100644 index 00000000..1486cabd --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/MainStageContext.java @@ -0,0 +1,22 @@ +package cd.casic.ci.process.engine.runContext; + +import cd.casic.ci.process.process.dataObject.base.PipBaseElement; + +import java.time.LocalDateTime; +import java.util.Map; + +public class MainStageContext extends BaseRunContext{ + public MainStageContext(PipBaseElement contextDef, BaseRunContext parentContext, LocalDateTime startTime, String resourceId, String targetId, String targetType, Map globalVariables, Map localVariables, Map childContext) { + super(contextDef, parentContext, startTime, resourceId, targetId, targetType, globalVariables, localVariables, childContext); + } + + @Override + public BaseRunContext getChildRunContext(String key) { + return null; + } + + @Override + public void putChildRunContext(String key, BaseRunContext context) { + + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/PipelineRunContext.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/PipelineRunContext.java new file mode 100644 index 00000000..8a4b6727 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/PipelineRunContext.java @@ -0,0 +1,59 @@ +package cd.casic.ci.process.engine.runContext; + +import cd.casic.ci.process.api.process.pojo.Pipeline; +import cd.casic.ci.process.engine.enums.ContextStateEnum; +import cd.casic.ci.process.process.dataObject.base.PipBaseElement; +import cd.casic.ci.process.process.dataObject.pipeline.PipPipeline; +import cd.casic.framework.commons.exception.ServiceException; +import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +public class PipelineRunContext extends BaseRunContext{ + + public PipelineRunContext(BaseRunContext parentContext,PipPipeline pipeline,Map globalVariables,Map localVariables) { + this(pipeline,parentContext,LocalDateTime.now(),pipeline.getResourceId(),pipeline.getTargetId(),pipeline.getTargetType(),globalVariables,localVariables,new ConcurrentHashMap<>()); + + } + + private PipelineRunContext(PipBaseElement contextDef, BaseRunContext parentContext, LocalDateTime startTime, String resourceId, String targetId, String targetType, Map globalVariables, Map localVariables, Map childContext) { + super( contextDef + ,parentContext + ,startTime + , resourceId + , targetId + , targetType + , globalVariables + , localVariables + , childContext); + } + + /** + * pipeline 底下有多个阶段,多个阶段包含多个task 不保存第二级context + * */ + @Override + public BaseRunContext getChildRunContext(String stageId) { + Map childContext = getChildContext(); + for (Map.Entry entry : childContext.entrySet()) { + BaseRunContext childRunContext = entry.getValue().getChildRunContext(stageId); + if (childRunContext!=null) { + return childRunContext; + } + } + return null; + } + + @Override + public void putChildRunContext(String key, BaseRunContext context) { + Map childContext = getChildContext(); + if (context instanceof StageRunContext) { + childContext.put(key,context); + } else { + throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),"不支持类型"); + } + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/StageRunContext.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/StageRunContext.java new file mode 100644 index 00000000..f61223e0 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/StageRunContext.java @@ -0,0 +1,36 @@ +package cd.casic.ci.process.engine.runContext; + +import cd.casic.ci.process.process.dataObject.base.PipBaseElement; +import cd.casic.framework.commons.exception.ServiceException; +import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants; + +import java.time.LocalDateTime; +import java.util.Map; + +public class StageRunContext extends BaseRunContext{ + public StageRunContext(PipBaseElement contextDef, BaseRunContext parentContext, LocalDateTime startTime, String resourceId, String targetId, String targetType, Map globalVariables, Map localVariables, Map childContext) { + super(contextDef, parentContext, startTime, resourceId, targetId, targetType, globalVariables, localVariables, childContext); + } + + @Override + public BaseRunContext getChildRunContext(String taskId) { + Map childContext = getChildContext(); + for (Map.Entry entry : childContext.entrySet()) { + BaseRunContext childRunContext = entry.getValue().getChildRunContext(taskId); + if (childRunContext!=null) { + return childRunContext; + } + } + return null; + } + + @Override + public void putChildRunContext(String key, BaseRunContext context) { + Map childContext = getChildContext(); + if (context instanceof TaskRunContext) { + childContext.put(key,context); + } else { + throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),"不支持类型"); + } + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/TaskRunContext.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/TaskRunContext.java new file mode 100644 index 00000000..df519e5c --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/runContext/TaskRunContext.java @@ -0,0 +1,29 @@ +package cd.casic.ci.process.engine.runContext; + +import cd.casic.framework.commons.exception.ServiceException; +import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.StringUtils; + +@EqualsAndHashCode(callSuper = true) +@Data +public class TaskRunContext extends BaseRunContext{ + private String taskId; + private String taskType; + /** + * task是最后一层没有下一级所以如果id相同直接返回它自己 + * */ + @Override + public BaseRunContext getChildRunContext(String id) { + if (!StringUtils.isEmpty(id)||!id.equals(taskId)) { + return null; + } + return this; + } + + @Override + public void putChildRunContext(String key, BaseRunContext context) { + throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),"task没有子阶段"); + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/base/PipBaseElement.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/base/PipBaseElement.java new file mode 100644 index 00000000..f995bb8a --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/base/PipBaseElement.java @@ -0,0 +1,21 @@ +package cd.casic.ci.process.process.dataObject.base; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class PipBaseElement { + /** + * 主键id + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + //@ApiProperty(name = "createTime",desc="创建时间") + private LocalDateTime createTime; + private LocalDateTime updateTime; + private Long createUserId; + private Long updateUserId; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/pipeline/PipPipeline.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/pipeline/PipPipeline.java index f595d539..5fd0c4e5 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/pipeline/PipPipeline.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/pipeline/PipPipeline.java @@ -1,38 +1,23 @@ package cd.casic.ci.process.process.dataObject.pipeline; +import cd.casic.ci.process.process.dataObject.base.PipBaseElement; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; +import lombok.EqualsAndHashCode; import java.time.LocalDateTime; +@EqualsAndHashCode(callSuper = true) @Data -public class PipPipeline { - /** - * 主键id - */ - @TableId(type = IdType.ASSIGN_ID) - private String id; +public class PipPipeline extends PipBaseElement { + /** * 流水线名称 */ private String name; - /** - * 创建人用户id - */ - private String createUserId; - - private String updateUserId; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - private LocalDateTime updateTime; - /** * 流水线类型 1.多任务 2.多阶段 */ diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/stage/PipStage.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/stage/PipStage.java index 2f8b0ead..74db8e65 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/stage/PipStage.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/stage/PipStage.java @@ -1,15 +1,18 @@ package cd.casic.ci.process.process.dataObject.stage; +import cd.casic.ci.process.process.dataObject.base.PipBaseElement; import cd.casic.ci.process.process.dataObject.task.PipTask; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; +import lombok.EqualsAndHashCode; import java.time.LocalDateTime; import java.util.List; +@EqualsAndHashCode(callSuper = true) @Data -public class PipStage { +public class PipStage extends PipBaseElement { //@ApiProperty(name = "stageId",desc="id") @TableId(type = IdType.ASSIGN_ID) private String stageId; @@ -17,8 +20,7 @@ public class PipStage { //@ApiProperty(name = "stageName",desc="名称") private String stageName; - //@ApiProperty(name = "createTime",desc="创建时间") - private LocalDateTime createTime; + //@ApiProperty(name="pipelineId",desc="流水线id") private String pipelineId; @@ -42,7 +44,5 @@ public class PipStage { // 执行实例id @TableField(exist = false) private String instanceId; - private LocalDateTime updateTime; - private Long createUserId; - private Long updateUserId; + } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/task/PipTask.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/task/PipTask.java index 24edcf75..c107e5bb 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/task/PipTask.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/task/PipTask.java @@ -1,22 +1,22 @@ package cd.casic.ci.process.process.dataObject.task; +import cd.casic.ci.process.process.dataObject.base.PipBaseElement; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; +import lombok.EqualsAndHashCode; import org.json.JSONObject; import java.time.LocalDateTime; +@EqualsAndHashCode(callSuper = true) @Data -public class PipTask { +public class PipTask extends PipBaseElement { //@ApiProperty(name="taskId",desc="配置id") @TableId(type = IdType.ASSIGN_ID) private String taskId; - //@ApiProperty(name="createTime",desc="创建时间") - private LocalDateTime createTime; - //@ApiProperty(name="taskType",desc= "类型1-10:源码,10-20:测试,20-30:构建,30-40:部署,40-50:代码扫描,50-60:推送制品") private String taskType; @@ -40,7 +40,5 @@ public class PipTask { // 执行实例id @TableField(exist = false) private String instanceId; - private LocalDateTime updateTime; - private Long updateUserId; - private Long createUserId; + } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/StageService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/StageService.java index 6997c922..50dc38bc 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/StageService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/StageService.java @@ -1,14 +1,11 @@ package cd.casic.ci.process.process.service.stage; import cd.casic.ci.common.pipeline.req.stage.StageCreateReq; -import cd.casic.ci.common.pipeline.req.stage.StageReq; import cd.casic.ci.common.pipeline.req.stage.StageUpdateReq; import cd.casic.ci.common.pipeline.resp.stage.StageResp; import cd.casic.ci.process.process.dataObject.stage.PipStage; import com.baomidou.mybatisplus.extension.service.IService; -import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; import java.util.List; @@ -27,6 +24,7 @@ public interface StageService extends IService { * @return 任务 */ List findAllStagesTask(String pipelineId); + List findAllFirstStagesAndChild(String pipelineId); /** * 删除阶段及任务 diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/impl/StageServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/impl/StageServiceImpl.java index e3449755..0067be75 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/impl/StageServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/impl/StageServiceImpl.java @@ -142,7 +142,7 @@ public class StageServiceImpl extends ServiceImpl impleme for (PipStage stage : stageMainStage) { String stagesId = stage.getStageId(); //获取从节点 - List allStageStage = findOtherStageNoTask(stagesId); + List allStageStage = findSecondStageAndTask(stagesId); List stageRespList = allStageStage.stream().map(it -> { StageResp stageResp = new StageResp(); BeanUtils.copyProperties(it, stageResp); @@ -157,6 +157,23 @@ public class StageServiceImpl extends ServiceImpl impleme return list; } + @Override + public List findAllFirstStagesAndChild(String pipelineId) { + //获取流水线主节点 + List stageMainStage = findAllMainStage(pipelineId); + if (stageMainStage.isEmpty()){ + return Collections.emptyList(); + } + for (PipStage stage : stageMainStage) { + String stagesId = stage.getStageId(); + //获取从节点 + List allStageStage = findSecondStageAndTask(stagesId); + stage.setStageList(allStageStage); + } + stageMainStage.sort(Comparator.comparing(PipStage::getStageSort)); + return stageMainStage; + } + @Override public void deleteStagesOrTask(String taskId) { PipTask taskQuery = new PipTask(); @@ -345,7 +362,7 @@ public class StageServiceImpl extends ServiceImpl impleme } - public List findOtherStageNoTask(String stagesId){ + public List findSecondStageAndTask(String stagesId){ List otherStage = findSecondStage(stagesId); List list = new ArrayList<>(); List stageIdList = otherStage.stream().map(PipStage::getStageId).toList(); diff --git a/ops-server/src/main/java/cd/casic/server/controller/StageController.java b/ops-server/src/main/java/cd/casic/server/controller/StageController.java index c25a6490..7f8f90ab 100644 --- a/ops-server/src/main/java/cd/casic/server/controller/StageController.java +++ b/ops-server/src/main/java/cd/casic/server/controller/StageController.java @@ -1,13 +1,10 @@ package cd.casic.server.controller; import cd.casic.ci.common.pipeline.req.stage.StageCreateReq; -import cd.casic.ci.common.pipeline.req.stage.StageReq; import cd.casic.ci.common.pipeline.req.stage.StageUpdateReq; import cd.casic.ci.common.pipeline.resp.stage.StageResp; import cd.casic.ci.process.process.service.stage.StageService; import cd.casic.framework.commons.pojo.CommonResult; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import jakarta.annotation.Resource; import jakarta.annotation.security.PermitAll; @@ -18,8 +15,6 @@ import jakarta.validation.constraints.NotNull; import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; /**