diff --git a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/context/SingletonRunContextResp.java b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/context/SingletonRunContextResp.java index 5d020a33..d3733606 100644 --- a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/context/SingletonRunContextResp.java +++ b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/context/SingletonRunContextResp.java @@ -1,6 +1,9 @@ package cd.casic.ci.common.pipeline.resp.context; import lombok.Data; + +import java.time.LocalDateTime; + /** * 单节点上下文状态返回对象 * */ @@ -14,4 +17,6 @@ public class SingletonRunContextResp { * 状态 详见 ContextStateEnum * */ private Integer state; + private LocalDateTime startTime; + private LocalDateTime endTime; } diff --git a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/context/TreeRunContextResp.java b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/context/TreeRunContextResp.java index c33a41af..e9720e39 100644 --- a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/context/TreeRunContextResp.java +++ b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/context/TreeRunContextResp.java @@ -3,10 +3,12 @@ package cd.casic.ci.common.pipeline.resp.context; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.List; import java.util.Map; @EqualsAndHashCode(callSuper = true) @Data public class TreeRunContextResp extends SingletonRunContextResp{ private Map child; + private List taskList; } diff --git a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/pipeline/PipelineFindResp.java b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/pipeline/PipelineFindResp.java index 87f6b5b9..210c67f9 100644 --- a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/pipeline/PipelineFindResp.java +++ b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/pipeline/PipelineFindResp.java @@ -105,5 +105,15 @@ public class PipelineFindResp { private List stageList; + /** + * 目标id + */ + private String targetVersionId; + + /** + * 目标类型 + */ + private String targetType; + } diff --git a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/taskTemplate/TaskTemplateResp.java b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/taskTemplate/TaskTemplateResp.java index abd3dce7..c9bace8e 100644 --- a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/taskTemplate/TaskTemplateResp.java +++ b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/resp/taskTemplate/TaskTemplateResp.java @@ -19,12 +19,12 @@ public class TaskTemplateResp { /** * name */ - private String name; + private String taskType; /** * 标签 */ - private String label; + private String taskName; /** * 描述 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 index 4ba6f78f..233736cb 100644 --- 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 @@ -42,6 +42,9 @@ public class DefaultPipelineExecutor implements PipelineExecutor { @Override public PipelineRunContext execute(String pipelineId) { PipPipeline pipeline = pipelineService.getById(pipelineId); + if (pipeline==null) { + return null; + } // TODO 判断状态不能重复运行 Integer state = pipeline.getState(); // TODO 判断资源是否申请成功是否处于可运行状态 diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/impl/DefaultWorkerManager.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/impl/DefaultWorkerManager.java index 987147b9..b9deae3f 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/impl/DefaultWorkerManager.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/impl/DefaultWorkerManager.java @@ -89,6 +89,9 @@ public class DefaultWorkerManager extends WorkerManager { } String taskType = task.getTaskType(); BaseWorker baseWorker = taskTypeWorkerMap.get(taskType); + if (baseWorker==null) { + throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),"找不到worker"); + } baseWorker.setContextKey(task.getId()); workerExecutor.execute(baseWorker); }catch (Exception e){ 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 index 0123d2e7..d93d762d 100644 --- 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 @@ -82,6 +82,7 @@ public abstract class BaseRunContext { return; } if (ContextStateEnum.HAPPY_ENDING.equals(state)||ContextStateEnum.BAD_ENDING.equals(state)) { + this.endTime=LocalDateTime.now(); parentContext.checkChildEnd(); } else if(ContextStateEnum.READY.equals(state)){ parentContext.checkChildReady(); diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ApplicationWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ApplicationWorker.java index 79b81ecf..dee49cfc 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ApplicationWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ApplicationWorker.java @@ -3,6 +3,8 @@ package cd.casic.ci.process.engine.worker; import cd.casic.ci.common.pipeline.annotation.Plugin; import cd.casic.ci.process.engine.constant.EngineRuntimeConstant; import cd.casic.ci.process.engine.context.ConstantContextHolder; +import cd.casic.ci.process.engine.runContext.BaseRunContext; +import cd.casic.ci.process.engine.runContext.PipelineRunContext; import cd.casic.ci.process.engine.runContext.TaskRunContext; import cd.casic.ci.process.process.dataObject.base.PipBaseElement; import cd.casic.ci.process.process.dataObject.log.PipTaskLog; @@ -58,15 +60,15 @@ public class ApplicationWorker extends HttpWorker{ PipTaskLog pipTaskLog = (PipTaskLog) localVariables.get(EngineRuntimeConstant.LOG_KEY); PipBaseElement contextDef = context.getContextDef(); - pipTaskLog.append("SCA-应用包审查分析节点开始执行"); - pipTaskLog.append("SCA-应用包审查分析节点配置:" + contextDef); + append(context,"SCA-应用包审查分析节点开始执行"); + append(context,"SCA-应用包审查分析节点配置:" + contextDef); if (ObjectUtil.isEmpty(contextDef)) { log.error("未查询到节点[application]配置"); localVariables.put("statusCode", "-1"); } if (ObjectUtil.isEmpty(contextDef)) { log.error("未查询到节点[application]配置"); - pipTaskLog.append("未查询到节点[application]配置"); + append(context,"未查询到节点[application]配置"); localVariables.put("statusCode", "-1"); } @@ -89,14 +91,14 @@ public class ApplicationWorker extends HttpWorker{ if (!file.exists() || !file.canRead()) { log.error("目标文件不存在或不可读"); localVariables.put("statusCode", "-1"); - pipTaskLog.append("目标文件不存在或不可读"); + append(context,"目标文件不存在或不可读"); } - handleUpload(pipTask.getTaskProperties(), file,pipTaskLog); + handleUpload(pipTask.getTaskProperties(), file,context); }catch (Exception e){ - pipTaskLog.append("==================SCA-应用包审查分析节点执行失败================="); - pipTaskLog.append("SCA-应用包审查分析节点执行失败失败,请检查当前节点配置!"); - pipTaskLog.append(e.getMessage()); + append(context,"==================SCA-应用包审查分析节点执行失败================="); + append(context,"SCA-应用包审查分析节点执行失败失败,请检查当前节点配置!"); + append(context,e.getMessage()); log.error("==================SCA-应用包审查分析节点执行失败=================",e); throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"SCA-应用包审查分析节点执行失败"); } @@ -105,7 +107,7 @@ public class ApplicationWorker extends HttpWorker{ localVariables.put(EngineRuntimeConstant.LOG_KEY, pipTaskLog); } - private void handleUpload(Map applicationConfigInfo, File file, PipTaskLog pipTaskLog) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { + private void handleUpload(Map applicationConfigInfo, File file, BaseRunContext context) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { RestTemplate restTemplate = getRestTemplateWithoutSANCheck(); String scaUploadUrl = ConstantContextHolder.getScaIp() + "/openapi/v1/app-package/detect-file"; MultiValueMap body = buildRequestBody(applicationConfigInfo, file); @@ -119,7 +121,7 @@ public class ApplicationWorker extends HttpWorker{ String message = response.getString("message"); if (message.equals("success")) { - pipTaskLog.append("===============SCA上传成功================="); + append(context,"===============SCA上传成功================="); JSONObject data = response.getJSONObject("data"); Integer scaTaskId = data.getInteger("scaTaskId"); @@ -133,7 +135,7 @@ public class ApplicationWorker extends HttpWorker{ } pollTaskStatus(restTemplate, oldScaTaskId); } else { - pipTaskLog.append("==================SCA接口异常,调用失败================="); + append(context,"==================SCA接口异常,调用失败================="); throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"SCA-应用包审查分析节点执行失败"); } Thread.currentThread().interrupt(); diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/BaseWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/BaseWorker.java index 707ae17f..7baa4dfa 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/BaseWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/BaseWorker.java @@ -4,6 +4,7 @@ package cd.casic.ci.process.engine.worker; import cd.casic.ci.process.constant.CommandConstant; import cd.casic.ci.process.engine.constant.EngineRuntimeConstant; import cd.casic.ci.process.engine.enums.ContextStateEnum; +import cd.casic.ci.process.engine.manager.LoggerManager; import cd.casic.ci.process.engine.manager.RunContextManager; import cd.casic.ci.process.engine.runContext.BaseRunContext; @@ -25,6 +26,7 @@ import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import javax.swing.text.StringContent; import java.util.Arrays; import java.util.List; @@ -37,7 +39,10 @@ public abstract class BaseWorker implements Runnable{ private RunContextManager contextManager; private String contextKey; @Resource - public MachineInfoService machineInfoService; + private MachineInfoService machineInfoService; + @Resource + private LoggerManager loggerManager; + @Override public void run() { @@ -69,6 +74,11 @@ public abstract class BaseWorker implements Runnable{ taskRunContext.changeContextState(ContextStateEnum.HAPPY_ENDING); } } + public void append(BaseRunContext context, String content){ + if (context instanceof TaskRunContext taskRunContext) { + loggerManager.append(taskRunContext.getContextDef().getId(),content); + } + } public abstract void execute(TaskRunContext context); public void toBadEnding(){ throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),""); diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/CodingWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/CodingWorker.java index d1b6c546..93284780 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/CodingWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/CodingWorker.java @@ -50,15 +50,15 @@ public class CodingWorker extends HttpWorker{ PipTaskLog pipTaskLog = (PipTaskLog) localVariables.get(EngineRuntimeConstant.LOG_KEY); PipBaseElement contextDef = context.getContextDef(); - pipTaskLog.append("SCA-代码仓库管理节点开始执行"); - pipTaskLog.append("SCA-代码仓库管理节点配置:" + contextDef); + append(context,"SCA-代码仓库管理节点开始执行"); + append(context,"SCA-代码仓库管理节点配置:" + contextDef); if (ObjectUtil.isEmpty(contextDef)) { log.error("未查询到节点[coding]配置"); localVariables.put("statusCode", "-1"); } if (ObjectUtil.isEmpty(contextDef)) { log.error("未查询到节点[coding]配置"); - pipTaskLog.append("未查询到节点[coding]配置"); + append(context,"未查询到节点[coding]配置"); localVariables.put("statusCode", "-1"); } @@ -100,7 +100,7 @@ public class CodingWorker extends HttpWorker{ JSONObject response = restTemplate.postForObject(scaUploadUrl, requestEntity, JSONObject.class); if (response.getString("message").equals("success")) { - pipTaskLog.append("===============SCA上传成功================="); + append(context,"===============SCA上传成功================="); JSONObject data = response.getJSONObject("data"); Integer scaTaskId = data.getInteger("scaTaskId"); //轮询请求状态 @@ -116,14 +116,14 @@ public class CodingWorker extends HttpWorker{ pollTaskStatus(restTemplate, oldScaTaskId); } else { //基于第三方文档表明500状态基本属于无镜像配置,对比失败,于是打印日志为无法对比镜像 - pipTaskLog.append("==================SCA校验失败================="); - pipTaskLog.append("接口异常调用失败"); + append(context,"==================SCA校验失败================="); + append(context,"接口异常调用失败"); localVariables.put("statusCode", "-1"); } }catch (Exception e){ - pipTaskLog.append("==================SCA-CODING节点执行失败================="); - pipTaskLog.append("SCA-CODING节点执行失败失败,请检查当前节点配置!"); - pipTaskLog.append(e.getMessage()); + append(context,"==================SCA-CODING节点执行失败================="); + append(context,"SCA-CODING节点执行失败失败,请检查当前节点配置!"); + append(context,e.getMessage()); log.error("==================SCA-CODING节点执行失败=================",e); throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"SCA-SBOM节点执行失败"); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/DIYImageExecuteCommandWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/DIYImageExecuteCommandWorker.java index 4d85222b..4eaac601 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/DIYImageExecuteCommandWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/DIYImageExecuteCommandWorker.java @@ -60,14 +60,14 @@ public class DIYImageExecuteCommandWorker extends SshWorker { //获取机器 MachineInfo machineInfoDO = this.getMachineInfoService().getById(machineId); - statusCode = shell(machineInfoDO,"Hnidc@0626cn!@#zyx",taskLog, + statusCode = shell(machineInfoDO,"Hnidc@0626cn!@#zyx",context, "echo \"自定义镜像执行命令\"", commandScript ); } catch (Exception e) { String errorMessage = "该节点配置信息为空,请先配置该节点信息" + "\r\n"; log.error("执行ssh失败:",e); - taskLog.append(errorMessage); + append(context,errorMessage); toBadEnding(); } if (statusCode == 0) { diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ScaBinaryWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ScaBinaryWorker.java index 38154495..fcf0fa8b 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ScaBinaryWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ScaBinaryWorker.java @@ -3,6 +3,7 @@ package cd.casic.ci.process.engine.worker; import cd.casic.ci.common.pipeline.annotation.Plugin; import cd.casic.ci.process.engine.constant.EngineRuntimeConstant; import cd.casic.ci.process.engine.context.ConstantContextHolder; +import cd.casic.ci.process.engine.runContext.BaseRunContext; import cd.casic.ci.process.engine.runContext.TaskRunContext; import cd.casic.ci.process.process.dataObject.base.PipBaseElement; import cd.casic.ci.process.process.dataObject.log.PipTaskLog; @@ -55,18 +56,18 @@ public class ScaBinaryWorker extends HttpWorker{ public void execute(TaskRunContext context) { int statusCode = 0; Map localVariables = context.getLocalVariables(); - PipTaskLog pipTaskLog = (PipTaskLog) localVariables.get(EngineRuntimeConstant.LOG_KEY); +// PipTaskLog pipTaskLog = (PipTaskLog) localVariables.get(EngineRuntimeConstant.LOG_KEY); PipBaseElement contextDef = context.getContextDef(); - pipTaskLog.append("SCA-BINARY节点开始执行"); - pipTaskLog.append("SCA-BINARY节点配置:" + contextDef); + append(context,"SCA-BINARY节点开始执行"); + append(context,"SCA-BINARY节点配置:" + contextDef); if (ObjectUtil.isEmpty(contextDef)) { log.error("未查询到节点[ScaBinary]配置"); localVariables.put("statusCode", "-1"); } if (ObjectUtil.isEmpty(contextDef)) { log.error("未查询到节点[ScaBinary]配置"); - pipTaskLog.append("未查询到节点[ScaBinary]配置"); + append(context,"未查询到节点[ScaBinary]配置"); localVariables.put("statusCode", "-1"); } @@ -90,24 +91,24 @@ public class ScaBinaryWorker extends HttpWorker{ if (!file.exists() || !file.canRead()) { log.error("目标文件不存在或不可读"); localVariables.put("statusCode", "-1"); - pipTaskLog.append("目标文件不存在或不可读"); + append(context,"目标文件不存在或不可读"); } - handleUpload(pipTask.getTaskProperties(), file,pipTaskLog); + handleUpload(pipTask.getTaskProperties(), file,context); }catch (Exception e){ - pipTaskLog.append("==================SCA-BINARY节点执行失败================="); - pipTaskLog.append("SCA-BINARY节点执行失败失败,请检查当前节点配置!"); - pipTaskLog.append(e.getMessage()); + append(context,"==================SCA-BINARY节点执行失败================="); + append(context,"SCA-BINARY节点执行失败失败,请检查当前节点配置!"); + append(context,e.getMessage()); log.error("==================SCA-BINARY节点执行失败=================",e); throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"SCA-SBOM节点执行失败"); } } localVariables.put("statusCode", statusCode + ""); - localVariables.put(EngineRuntimeConstant.LOG_KEY, pipTaskLog); +// localVariables.put(EngineRuntimeConstant.LOG_KEY, pipTaskLog); } - private void handleUpload(Map scaBinaryConfigInfo, File file, PipTaskLog pipTaskLog) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { + private void handleUpload(Map scaBinaryConfigInfo, File file, BaseRunContext context) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { RestTemplate restTemplate = getRestTemplateWithoutSANCheck(); String scaUploadUrl = ConstantContextHolder.getScaIp() + "/openapi/v1/binary/detect-file"; MultiValueMap body = buildRequestBody(scaBinaryConfigInfo, file); @@ -121,7 +122,7 @@ public class ScaBinaryWorker extends HttpWorker{ String message = response.getString("message"); if (message.equals("success")) { - pipTaskLog.append("===============SCA上传成功================="); + append(context,"===============SCA上传成功================="); JSONObject data = response.getJSONObject("data"); Integer scaTaskId = data.getInteger("scaTaskId"); @@ -135,7 +136,7 @@ public class ScaBinaryWorker extends HttpWorker{ } pollTaskStatus(restTemplate, oldScaTaskId); } else { - pipTaskLog.append("==================SCA接口异常,调用失败================="); + append(context,"==================SCA接口异常,调用失败================="); throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"SCA-SBOM节点执行失败"); } Thread.currentThread().interrupt(); diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ScaMirrorWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ScaMirrorWorker.java index 1c2926ca..9cb14eea 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ScaMirrorWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ScaMirrorWorker.java @@ -3,6 +3,7 @@ package cd.casic.ci.process.engine.worker; import cd.casic.ci.common.pipeline.annotation.Plugin; import cd.casic.ci.process.engine.constant.EngineRuntimeConstant; import cd.casic.ci.process.engine.context.ConstantContextHolder; +import cd.casic.ci.process.engine.runContext.BaseRunContext; import cd.casic.ci.process.engine.runContext.TaskRunContext; import cd.casic.ci.process.process.dataObject.base.PipBaseElement; import cd.casic.ci.process.process.dataObject.log.PipTaskLog; @@ -56,18 +57,18 @@ public class ScaMirrorWorker extends HttpWorker{ public void execute(TaskRunContext context) { int statusCode = 0; Map localVariables = context.getLocalVariables(); - PipTaskLog pipTaskLog = (PipTaskLog) localVariables.get(EngineRuntimeConstant.LOG_KEY); +// PipTaskLog pipTaskLog = (PipTaskLog) localVariables.get(EngineRuntimeConstant.LOG_KEY); PipBaseElement contextDef = context.getContextDef(); - pipTaskLog.append("SCA-MIRROR节点开始执行"); - pipTaskLog.append("SCA-MIRROR节点配置:" + contextDef); + append(context,"SCA-MIRROR节点开始执行"); + append(context,"SCA-MIRROR节点配置:" + contextDef); if (ObjectUtil.isEmpty(contextDef)) { log.error("未查询到节点[ScaMirror]配置"); localVariables.put("statusCode", "-1"); } if (ObjectUtil.isEmpty(contextDef)) { log.error("未查询到节点[ScaMirror]配置"); - pipTaskLog.append("未查询到节点[ScaMirror]配置"); + append(context,"未查询到节点[ScaMirror]配置"); localVariables.put("statusCode", "-1"); } @@ -91,24 +92,24 @@ public class ScaMirrorWorker extends HttpWorker{ if (!file.exists() || !file.canRead()) { log.error("目标文件不存在或不可读"); localVariables.put("statusCode", "-1"); - pipTaskLog.append("目标文件不存在或不可读"); + append(context,"目标文件不存在或不可读"); } - handleUpload(pipTask.getTaskProperties(), file,pipTaskLog); + handleUpload(pipTask.getTaskProperties(), file,context); }catch (Exception e){ - pipTaskLog.append("==================SCA-MIRROR节点执行失败================="); - pipTaskLog.append("SCA-MIRROR节点执行失败失败,请检查当前节点配置!"); - pipTaskLog.append(e.getMessage()); + append(context,"==================SCA-MIRROR节点执行失败================="); + append(context,"SCA-MIRROR节点执行失败失败,请检查当前节点配置!"); + append(context,e.getMessage()); log.error("==================SCA-MIRROR节点执行失败=================",e); throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"SCA-SBOM节点执行失败"); } } localVariables.put("statusCode", statusCode + ""); - localVariables.put(EngineRuntimeConstant.LOG_KEY, pipTaskLog); +// localVariables.put(EngineRuntimeConstant.LOG_KEY, pipTaskLog); } - private void handleUpload(Map scaMirrorConfigInfo, File file, PipTaskLog pipTaskLog) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { + private void handleUpload(Map scaMirrorConfigInfo, File file, BaseRunContext context) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { RestTemplate restTemplate = getRestTemplateWithoutSANCheck(); String scaUploadUrl = ConstantContextHolder.getScaIp() + "/openapi/v1/image/detect-file"; MultiValueMap body = buildRequestBody(scaMirrorConfigInfo, file); @@ -122,7 +123,7 @@ public class ScaMirrorWorker extends HttpWorker{ String message = response.getString("message"); if (message.equals("success")) { - pipTaskLog.append("===============SCA上传成功================="); + append(context,"===============SCA上传成功================="); JSONObject data = response.getJSONObject("data"); Integer scaTaskId = data.getInteger("scaTaskId"); @@ -136,7 +137,7 @@ public class ScaMirrorWorker extends HttpWorker{ } pollTaskStatus(restTemplate, oldScaTaskId); } else { - pipTaskLog.append("==================SCA接口异常,调用失败================="); + append(context,"==================SCA接口异常,调用失败================="); throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"SCA-SBOM节点执行失败"); } Thread.currentThread().interrupt(); diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ScaSbomWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ScaSbomWorker.java index bf0959b7..994a104d 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ScaSbomWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/ScaSbomWorker.java @@ -3,6 +3,7 @@ package cd.casic.ci.process.engine.worker; import cd.casic.ci.common.pipeline.annotation.Plugin; import cd.casic.ci.process.engine.constant.EngineRuntimeConstant; import cd.casic.ci.process.engine.context.ConstantContextHolder; +import cd.casic.ci.process.engine.runContext.BaseRunContext; import cd.casic.ci.process.engine.runContext.TaskRunContext; import cd.casic.ci.process.process.dataObject.base.PipBaseElement; import cd.casic.ci.process.process.dataObject.log.PipTaskLog; @@ -58,15 +59,15 @@ public class ScaSbomWorker extends HttpWorker{ PipTaskLog pipTaskLog = (PipTaskLog) localVariables.get(EngineRuntimeConstant.LOG_KEY); PipBaseElement contextDef = context.getContextDef(); - pipTaskLog.append("SCA-SBOM节点开始执行"); - pipTaskLog.append("SCA-SBOM节点配置:" + contextDef); + append(context,"SCA-SBOM节点开始执行"); + append(context,"SCA-SBOM节点配置:" + contextDef); if (ObjectUtil.isEmpty(contextDef)) { log.error("未查询到节点[ScaSbom]配置"); localVariables.put("statusCode", "-1"); } if (ObjectUtil.isEmpty(contextDef)) { log.error("未查询到节点[ScaSbom]配置"); - pipTaskLog.append("未查询到节点[ScaSbom]配置"); + append(context,"未查询到节点[ScaSbom]配置"); localVariables.put("statusCode", "-1"); } @@ -90,14 +91,14 @@ public class ScaSbomWorker extends HttpWorker{ if (!file.exists() || !file.canRead()) { log.error("目标文件不存在或不可读"); localVariables.put("statusCode", "-1"); - pipTaskLog.append("目标文件不存在或不可读"); + append(context,"目标文件不存在或不可读"); } - handleUpload(pipTask.getTaskProperties(), file,pipTaskLog); + handleUpload(pipTask.getTaskProperties(), file,context); }catch (Exception e){ - pipTaskLog.append("==================SCA-SBOM节点执行失败================="); - pipTaskLog.append("SCA-SBOM节点执行失败失败,请检查当前节点配置!"); - pipTaskLog.append(e.getMessage()); + append(context,"==================SCA-SBOM节点执行失败================="); + append(context,"SCA-SBOM节点执行失败失败,请检查当前节点配置!"); + append(context,e.getMessage()); log.error("==================SCA-SBOM节点执行失败=================",e); throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"SCA-SBOM节点执行失败"); } @@ -107,7 +108,7 @@ public class ScaSbomWorker extends HttpWorker{ localVariables.put(EngineRuntimeConstant.LOG_KEY, pipTaskLog); } - private void handleUpload(Map scaSbomConfigInfo, File file, PipTaskLog pipTaskLog) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { + private void handleUpload(Map scaSbomConfigInfo, File file, BaseRunContext context) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { RestTemplate restTemplate = getRestTemplateWithoutSANCheck(); String scaUploadUrl = ConstantContextHolder.getScaIp() + "/openapi/v1/sbom/detect-file"; MultiValueMap body = buildRequestBody(scaSbomConfigInfo, file); @@ -121,7 +122,7 @@ public class ScaSbomWorker extends HttpWorker{ String message = response.getString("message"); if (message.equals("success")) { - pipTaskLog.append("===============SCA上传成功================="); + append(context,"===============SCA上传成功================="); JSONObject data = response.getJSONObject("data"); Integer scaTaskId = data.getInteger("scaTaskId"); @@ -135,7 +136,7 @@ public class ScaSbomWorker extends HttpWorker{ } pollTaskStatus(restTemplate, oldScaTaskId); } else { - pipTaskLog.append("==================SCA接口异常,调用失败================="); + append(context,"==================SCA接口异常,调用失败================="); throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"SCA-SBOM节点执行失败"); } Thread.currentThread().interrupt(); diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/SshWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/SshWorker.java index ad2637f4..01786f8f 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/SshWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/SshWorker.java @@ -1,6 +1,7 @@ package cd.casic.ci.process.engine.worker; import cd.casic.ci.process.constant.CommandConstant; +import cd.casic.ci.process.engine.runContext.BaseRunContext; import cd.casic.ci.process.enums.MachineSystemEnum; import cd.casic.ci.process.process.dataObject.log.PipTaskLog; import cd.casic.ci.process.process.dataObject.machine.MachineInfo; @@ -22,7 +23,7 @@ public abstract class SshWorker extends BaseWorker{ * @param commands 命令 * @return 0 成功;其他值 失败 */ - public int shell(MachineInfo machineInfo,String sudoPassword, PipTaskLog taskLog, String... commands) { + public int shell(MachineInfo machineInfo, String sudoPassword, BaseRunContext context, String... commands) { List commandList = Arrays.asList(commands); if(MachineSystemEnum.WINDOWS.getSystem().equals(machineInfo.getOsSystem())){ return powerShell(machineInfo, commandList); @@ -38,14 +39,14 @@ public abstract class SshWorker extends BaseWorker{ //执行命令,并且把命令的执行回传到前端 // TODO 记录日志 // loggerService.sendMessage(key, var); - statusCode = ssh.execNew(commandList,sudoPassword, taskLog::append); + statusCode = ssh.execNew(commandList,sudoPassword, (content)->append(context,content)); log.info("exit-status: " + statusCode); //主动释放当前socket连接 // loggerService.close(key); } catch (Exception e) { String errorMessage = "与机器建立SSH连接出错" + CommandConstant.ENTER; // errorHandle(e, errorMessage); - taskLog.append(errorMessage); + append(context,errorMessage); } finally { if(ssh!=null) { ssh.disconnect(); diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/node/PipTaskTemplate.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/node/PipTaskTemplate.java index 2048b9b6..d9130ac9 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/node/PipTaskTemplate.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/node/PipTaskTemplate.java @@ -32,12 +32,12 @@ public class PipTaskTemplate extends BaseDO { /** * name */ - private String name; + private String taskType; /** * 标签 */ - private String label; + private String taskName; /** * 描述 diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/pipeline/impl/PipelineServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/pipeline/impl/PipelineServiceImpl.java index 137287d9..c3d4dae1 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/pipeline/impl/PipelineServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/pipeline/impl/PipelineServiceImpl.java @@ -532,9 +532,13 @@ public class PipelineServiceImpl extends ServiceImpl i TreeRunContextResp pipeline = new TreeRunContextResp(); pipeline.setId(pipelineRunContext.getContextDef().getId()); pipeline.setState(pipelineRunContext.getState().get()); + pipeline.setStartTime(pipelineRunContext.getStartTime()); + pipeline.setEndTime(pipelineRunContext.getEndTime()); Map secondStageStateMap = new HashMap<>(pipelineRunContext.getChildContext().size()); Map childContext = pipelineRunContext.getChildContext(); pipeline.setChild(secondStageStateMap); + LinkedList taskList = new LinkedList<>(); + pipeline.setTaskList(taskList); for (Map.Entry secondEntry : childContext.entrySet()) { BaseRunContext value = secondEntry.getValue(); String key = secondEntry.getKey(); @@ -551,7 +555,10 @@ public class PipelineServiceImpl extends ServiceImpl i TreeRunContextResp taskState = new TreeRunContextResp(); taskState.setId(taskId); taskState.setState(taskContext.getState().get()); + taskState.setStartTime(taskContext.getStartTime()); + taskState.setEndTime(taskContext.getEndTime()); taskStateMap.put(taskId,taskState); + taskList.add(taskState); } } return pipeline; diff --git a/ops-server/src/main/java/cd/casic/server/controller/TasksController.java b/ops-server/src/main/java/cd/casic/server/controller/TasksController.java index c206abc6..9dd00ce4 100644 --- a/ops-server/src/main/java/cd/casic/server/controller/TasksController.java +++ b/ops-server/src/main/java/cd/casic/server/controller/TasksController.java @@ -5,10 +5,17 @@ import cd.casic.ci.common.pipeline.resp.task.TasksResp; import cd.casic.ci.process.process.dataObject.log.PipTaskLog; import cd.casic.ci.process.process.service.task.TaskService; import cd.casic.framework.commons.pojo.CommonResult; +import cd.casic.framework.commons.util.network.IpUtil; +import cd.casic.framework.commons.util.redis.core.utils.IPUtils; +import cd.casic.framework.commons.util.util.WebFrameworkUtils; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.io.IOException; @RestController @RequestMapping("/task") @@ -43,4 +50,5 @@ public class TasksController { public CommonResult getLogContentByTaskId(@PathVariable String taskId){ return taskService.getLogContentByTaskId(taskId); } + } diff --git a/ops-server/src/main/resources/application.yaml b/ops-server/src/main/resources/application.yaml index 8c60b6aa..6eb957c3 100644 --- a/ops-server/src/main/resources/application.yaml +++ b/ops-server/src/main/resources/application.yaml @@ -121,6 +121,7 @@ ops: security: permit-all_urls: - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,不需要登录 + - /sse/** websocket: enable: true # websocket的开关 path: /infra/ws # 路径