diff --git a/modules/module-ci-process-biz/pom.xml b/modules/module-ci-process-biz/pom.xml index ed81253..327b96d 100644 --- a/modules/module-ci-process-biz/pom.xml +++ b/modules/module-ci-process-biz/pom.xml @@ -42,6 +42,11 @@ ognl ognl + + org.springframework + spring-websocket + 6.1.13 + \ No newline at end of file diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/pipeline/definition/impl/PipelineYamlServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/pipeline/definition/impl/PipelineYamlServiceImpl.java index 0cb1fc2..b4ef221 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/pipeline/definition/impl/PipelineYamlServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/pipeline/definition/impl/PipelineYamlServiceImpl.java @@ -1,641 +1,650 @@ -//package cd.casic.module.process.pipeline.definition.impl; -// -// -//import cd.casic.ci.commons.bean.engine.job.Tasks; -//import cd.casic.ci.commons.bean.process.stage.Stage; -//import cd.casic.module.process.engine.task.TasksService; -//import cd.casic.module.process.pipeline.definition.PipelineYamlService; -//import cd.casic.module.process.pipeline.definition.entity.PipelineEntity; -//import cd.casic.module.process.process.definition.dao.PipelineDao; -//import cd.casic.module.process.setting.service.AuthHostService; -//import cd.casic.module.process.setting.service.AuthService; -//import cd.casic.module.process.setting.service.AuthThirdService; -//import cd.casic.module.process.stages.service.StageService; -//import cd.casic.module.process.support.util.util.PipelineFinal; -//import com.alibaba.fastjson.JSONObject; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.stereotype.Service; -//import org.yaml.snakeyaml.DumperOptions; -//import org.yaml.snakeyaml.Yaml; -// -//import java.util.*; -// -//@Service -//public class PipelineYamlServiceImpl implements PipelineYamlService { -// -// @Autowired -// PipelineDao pipelineDao; -// -// @Autowired -// AuthHostService authHostService; -// -// @Autowired -// AuthThirdService authThirdService; -// -// @Autowired -// TaskTestOnService taskTestOnService; -// -// @Autowired -// TaskCodeGittokService taskCodeGittokService; -// -// @Autowired -// TaskArtifactXpackService taskArtifactXpackService; -// -// @Autowired -// AuthService authService; -// -// @Autowired -// PipelineYamlService pipelineYamlService; -// -// @Autowired -// TasksService tasksService; -// -// @Autowired -// StageService stageService; -// -// private static final Logger logger = LoggerFactory.getLogger(PipelineYamlService.class); -// -// -// @Override -// public String importPipelineYaml(String pipelineId){ -// -// PipelineEntity pipeline = pipelineDao.findPipelineById(pipelineId); -// -// Map properties = new HashMap<>(); -// properties.put("pipeline", Map.of("name", pipeline.getName())); -// -// DumperOptions options = new DumperOptions(); -// options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); -// -// Yaml yaml = new Yaml(options); -// -// // 将Java对象转换为YAML字符串 -// String yamlString = yaml.dump(properties); -// -// return importStageYaml(yamlString,pipelineId); -// -// // int type = pipeline.getType(); -// // -// // if (type == 1){ -// // return importTaskYaml(yamlString,pipelineId); -// // }else { -// // return importStageYaml(yamlString,pipelineId); -// // } -// } -// -// // /** -// // * 导出多任务配置为Yaml格式 -// // * @param yamlString yaml -// // * @param pipelineId 流水线 -// // * @return Yaml格式支付串 -// // */ -// // private String importTaskYaml(String yamlString,String pipelineId){ -// // -// // DumperOptions options = new DumperOptions(); -// // options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); -// // -// // Yaml yaml = new Yaml(options); -// // Map data = yaml.load(yamlString); -// // -// // List> taskList = new ArrayList<>(); -// // -// // List tasksList = tasksService.finAllPipelineTaskOrTask(pipelineId); -// // for (Tasks tasks : tasksList) { -// // LinkedHashMap tasksMap = new LinkedHashMap<>(); -// // -// // LinkedHashMap taskDetails = new LinkedHashMap<>(); -// // -// // taskDetails.put("taskId",tasks.getTaskId()); -// // taskDetails.put("taskName",tasks.getTaskName()); -// // findTaskDetails(tasks.getTaskType(), tasks.getTask(), taskDetails); -// // -// // tasksMap.put("task",taskDetails); -// // taskList.add(tasksMap); -// // } -// // -// // Map pipelineMap = (Map) data.get("pipeline"); -// // pipelineMap.put("tasks",taskList); -// // return yaml.dump(data); -// // } -// -// /** -// * 导出多阶段配置为Yaml格式 -// * @param yamlString yaml -// * @param pipelineId 流水线 -// * @return Yaml格式支付串 -// */ -// private String importStageYaml(String yamlString,String pipelineId){ -// -// DumperOptions options = new DumperOptions(); -// options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); -// -// Yaml yaml = new Yaml(options); -// Map data = yaml.load(yamlString); -// -// List> stageMapList = new ArrayList<>(); -// -// List stageList = stageService.findAllStagesOrTask(pipelineId); -// -// for (Stage stage : stageList) { -// LinkedHashMap stageMap = new LinkedHashMap<>(); -// -// List parallelStageList = stage.getStageList(); -// -// List> parallelMapList = new ArrayList<>(); -// LinkedHashMap parallelsMap = new LinkedHashMap<>(); -// for (Stage parallelStage : parallelStageList) { -// -// LinkedHashMap parallelMap = new LinkedHashMap<>(); -// -// List> taskMapList = new ArrayList<>(); -// List taskList = parallelStage.getTaskValues(); -// LinkedHashMap tasksMap = new LinkedHashMap<>(); -// for (Tasks tasks : taskList) { -// -// LinkedHashMap taskMap = new LinkedHashMap<>(); -// LinkedHashMap taskDetails = new LinkedHashMap<>(); -// -// taskDetails.put("taskId",tasks.getTaskId()); -// taskDetails.put("taskName",tasks.getTaskName()); -// findTaskDetails(tasks.getTaskType(), tasks.getTask(), taskDetails); -// -// taskMap.put("task",taskDetails); -// taskMapList.add(taskMap); -// -// tasksMap.put("parallelId",parallelStage.getStageId()); -// tasksMap.put("parallelName",parallelStage.getStageName()); -// tasksMap.put("tasks",taskMapList); -// } -// -// parallelMap.put("parallel",tasksMap); -// parallelMapList.add(parallelMap); -// } -// parallelsMap.put("stageId",stage.getStageId()); -// parallelsMap.put("stageName",stage.getStageName()); -// parallelsMap.put("parallels",parallelMapList); -// -// stageMap.put("stage",parallelsMap); -// stageMapList.add(stageMap); -// } -// Map pipelineMap = (Map) data.get("pipeline"); -// pipelineMap.put("stages",stageMapList); -// -// return yaml.dump(data); -// } -// -// -// private LinkedHashMap findTaskDetails(String taskType,Object object,LinkedHashMap taskDetails){ -// if (Objects.isNull(object)){ -// return null; -// } -// switch (taskType){ -// case PipelineFinal.TASK_CODE_GIT , PipelineFinal.TASK_CODE_GITEE , PipelineFinal.TASK_CODE_GITHUB , -// PipelineFinal.TASK_CODE_GITLAB, PipelineFinal.TASK_CODE_XCODE, PipelineFinal.TASK_CODE_SVN ->{ -// return taskCodeDetails(taskType,object,taskDetails); -// } -// case PipelineFinal.TASK_BUILD_MAVEN, PipelineFinal.TASK_BUILD_NODEJS ->{ -// return taskBuildDetails(taskType,object,taskDetails); -// } -// case PipelineFinal.TASK_TEST_MAVENTEST, PipelineFinal.TASK_TEST_TESTON ->{ -// return taskTestDetails(taskType,object,taskDetails); -// } -// case PipelineFinal.TASK_DEPLOY_LINUX , PipelineFinal.TASK_DEPLOY_DOCKER ->{ -// return taskDeployDetails(taskType,object,taskDetails); -// } -// case PipelineFinal.TASK_ARTIFACT_NEXUS , PipelineFinal.TASK_ARTIFACT_SSH , PipelineFinal.TASK_ARTIFACT_XPACK ->{ -// return taskArtifactDetails(taskType,object,taskDetails); -// } -// case PipelineFinal.TASK_CODESCAN_SONAR ->{ -// return taskCodeScanDetails(taskType,object,taskDetails); -// } -// } -// return null; -// } -// -// -// private LinkedHashMap taskCodeDetails(String taskType,Object object,LinkedHashMap taskDetailsMap){ -// String string = JSONObject.toJSONString(object); -// -// TaskCode taskCode = JSONObject.parseObject(string, TaskCode.class); -// if (!Objects.isNull(taskCode.getAuthId())){ -// taskDetailsMap.put("authId",taskCode.getAuthId()); -// } -// if (!taskType.equals(PipelineFinal.TASK_CODE_SVN)){ -// if (!Objects.isNull(taskCode.getCodeName())){ -// taskDetailsMap.put("url",taskCode.getCodeName()); -// } -// if (!Objects.isNull(taskCode.getCodeBranch())){ -// taskDetailsMap.put("branch",taskCode.getCodeBranch()); -// }else { -// taskDetailsMap.put("branch", PipelineFinal.TASK_CODE_DEFAULT_BRANCH); -// } -// }else { -// if (!Objects.isNull(taskCode.getCodeName())){ -// taskDetailsMap.put("detection_url",taskCode.getCodeName()); -// } -// -// if (!Objects.isNull(taskCode.getSvnFile())){ -// taskDetailsMap.put("detection_file",taskCode.getSvnFile()); -// } -// } -// -// // switch (taskType){ -// // case PipelineFinal.TASK_CODE_GIT, PipelineFinal.TASK_CODE_GITLAB ->{ -// // if (!Objects.isNull(taskCode.getAuthId())){ -// // taskDetailsMap.put("authId",taskCode.getAuthId()); -// // } -// // if (!Objects.isNull(taskCode.getCodeName())){ -// // taskDetailsMap.put("url",taskCode.getCodeName()); -// // } -// // -// // if (!Objects.isNull(taskCode.getCodeBranch())){ -// // taskDetailsMap.put("branch",taskCode.getCodeBranch()); -// // }else { -// // taskDetailsMap.put("branch", PipelineFinal.TASK_CODE_DEFAULT_BRANCH); -// // } -// // } -// // case PipelineFinal.TASK_CODE_GITEE, PipelineFinal.TASK_CODE_GITHUB ->{ -// // if (!Objects.isNull(taskCode.getAuthId())){ -// // taskDetailsMap.put("authId",taskCode.getAuthId()); -// // } -// // if (!Objects.isNull(taskCode.getCodeName())){ -// // taskDetailsMap.put("repository_name",taskCode.getCodeName()); -// // } -// // if (!Objects.isNull(taskCode.getCodeAddress())){ -// // taskDetailsMap.put("repository_url",taskCode.getCodeAddress()); -// // } -// // -// // if (!Objects.isNull(taskDetailsMap.get("authId"))){ -// // String authId = (String) taskDetailsMap.get("authId"); -// // String repositoryName = (String) taskDetailsMap.get("repository_name"); -// // String houseUrl = codeThirdService.getHouseUrl(authId, repositoryName, taskType); -// // taskCode.setCodeAddress(houseUrl); -// // taskDetailsMap.put("repository_url",houseUrl); -// // } -// // -// // if (!Objects.isNull(taskCode.getCodeBranch())){ -// // taskDetailsMap.put("branch",taskCode.getCodeBranch()); -// // }else { -// // taskDetailsMap.put("branch", PipelineFinal.TASK_CODE_DEFAULT_BRANCH); -// // } -// // } -// // case PipelineFinal.TASK_CODE_XCODE ->{ -// // String authId = taskCode.getAuthId(); -// // if (!Objects.isNull(authId)){ -// // taskDetailsMap.put("authId",taskCode.getAuthId()); -// // } -// // if (!Objects.isNull(taskCode.getRepository())){ -// // String rpyId = taskCode.getRepository().getRpyId(); -// // taskDetailsMap.put("repository_id",rpyId); -// // ThirdHouse thirdHouse = taskCodeGittokService. -// // findStoreHouse((String) taskDetailsMap.get("authId"), rpyId); -// // if (!Objects.isNull(thirdHouse)) { -// // // taskCode.setRepository(thirdHouse); -// // taskDetailsMap.put("repository_url",thirdHouse.getHouseWebUrl()); -// // taskDetailsMap.put("repository_name",thirdHouse.getName()); -// // } -// // } -// // taskDetailsMap.put("branch", PipelineFinal.TASK_CODE_DEFAULT_BRANCH); -// // if (!Objects.isNull(taskCode.getBranch())){ -// // String branchId = taskCode.getBranch().getBranchId(); -// // String authId1 = (String) taskDetailsMap.get("authId"); -// // String rpyId1 = (String) taskDetailsMap.get("repository_id"); -// // XcodeBranch xcodeBranch = taskCodeGittokService.findOneBranch(authId1, rpyId1,branchId); -// // if (!Objects.isNull(xcodeBranch)){ -// // taskCode.setBranch(xcodeBranch); -// // taskDetailsMap.put("branch_name",xcodeBranch.getBranchName()); -// // } -// // }else { -// // taskDetailsMap.put("branch", PipelineFinal.TASK_CODE_DEFAULT_BRANCH); -// // } -// // } -// // case PipelineFinal.TASK_CODE_SVN ->{ -// // if (!Objects.isNull(taskCode.getAuthId())){ -// // taskDetailsMap.put("authId",taskCode.getAuthId()); -// // } -// // if (!Objects.isNull(taskCode.getCodeName())){ -// // taskDetailsMap.put("detection_url",taskCode.getCodeName()); -// // } -// // -// // if (!Objects.isNull(taskCode.getSvnFile())){ -// // taskDetailsMap.put("detection_file",taskCode.getSvnFile()); -// // } -// // } -// // } -// return taskDetailsMap; -// } -// -// -// private LinkedHashMap taskCodeScanDetails(String taskType,Object object,LinkedHashMap taskDetailsMap){ -// String string = JSONObject.toJSONString(object); -// -// TaskCodeScan taskCodeScan = JSONObject.parseObject(string, TaskCodeScan.class); -// -// switch (taskType){ -// case PipelineFinal.TASK_CODESCAN_SONAR ->{ -// if (!Objects.isNull(taskCodeScan.getAuthId())){ -// taskDetailsMap.put("authId",taskCodeScan.getAuthId()); -// } -// if (!Objects.isNull(taskCodeScan.getProjectName())){ -// taskDetailsMap.put("project_name",taskCodeScan.getProjectName()); -// } -// } -// } -// return taskDetailsMap; -// } -// -// -// private LinkedHashMap taskTestDetails(String taskType,Object object,LinkedHashMap taskDetailsMap){ -// String string = JSONObject.toJSONString(object); -// -// TaskTest taskTest = JSONObject.parseObject(string, TaskTest.class); -// -// switch (taskType){ -// case PipelineFinal.TASK_TEST_MAVENTEST ->{ -// if (!Objects.isNull(taskTest.getTestOrder())){ -// taskDetailsMap.put("test_order",taskTest.getTestOrder()); -// } -// if (!Objects.isNull(taskTest.getAddress())){ -// taskDetailsMap.put("pom_address",taskTest.getAddress()); -// } -// } -// case PipelineFinal.TASK_TEST_TESTON ->{ -// -// if (!Objects.isNull(taskTest.getAuthId())){ -// taskDetailsMap.put("authId",taskTest.getAuthId()); -// } -// -// if (!Objects.isNull(taskTest.getWebEnv())){ -// taskDetailsMap.put("webEnv",taskTest.getWebEnv().getId()); -// } -// -// if (!Objects.isNull(taskTest.getApiEnv())){ -// taskDetailsMap.put("apiEnv",taskTest.getApiEnv().getId()); -// } -// if (!Objects.isNull(taskTest.getAppEnv())){ -// taskDetailsMap.put("appEnv",taskTest.getAppEnv().getId()); -// } -// if (!Objects.isNull(taskTest.getTestPlan())){ -// taskDetailsMap.put("testPlan",taskTest.getTestPlan().getId()); -// } -// if (!Objects.isNull(taskTest.getTestSpace())){ -// taskDetailsMap.put("testSpace",taskTest.getTestSpace().getId()); -// } -// } -// } -// return taskDetailsMap; -// } -// -// -// private LinkedHashMap taskBuildDetails(String taskType,Object object,LinkedHashMap taskDetailsMap){ -// String string = JSONObject.toJSONString(object); -// -// TaskBuild taskBuilder = JSONObject.parseObject(string, TaskBuild.class); -// -// switch (taskType){ -// case PipelineFinal.TASK_BUILD_MAVEN ->{ -// if (!Objects.isNull(taskBuilder.getBuildOrder())){ -// taskDetailsMap.put("mvn_order",taskBuilder.getBuildOrder()); -// } -// if (!Objects.isNull(taskBuilder.getBuildAddress())){ -// taskDetailsMap.put("pom_address",taskBuilder.getBuildAddress()); -// } -// if (!Objects.isNull(taskBuilder.getProductRule())){ -// taskDetailsMap.put("artifact_role",taskBuilder.getProductRule()); -// } -// } -// case PipelineFinal.TASK_BUILD_NODEJS ->{ -// if (!Objects.isNull(taskBuilder.getBuildOrder())){ -// taskDetailsMap.put("npm_order",taskBuilder.getBuildOrder()); -// } -// if (!Objects.isNull(taskBuilder.getBuildAddress())){ -// taskDetailsMap.put("model_address",taskBuilder.getBuildAddress()); -// } -// if (!Objects.isNull(taskBuilder.getProductRule())){ -// taskDetailsMap.put("artifact_role",taskBuilder.getProductRule()); -// } -// } -// } -// return taskDetailsMap; -// } -// -// -// private LinkedHashMap taskDeployDetails(String taskType,Object object,LinkedHashMap taskDetailsMap){ -// String string = JSONObject.toJSONString(object); -// -// TaskDeploy taskDeploy = JSONObject.parseObject(string, TaskDeploy.class); -// -// switch (taskType){ -// case PipelineFinal.TASK_DEPLOY_LINUX ->{ -// if (taskDeploy.getAuthType() != 0){ -// taskDetailsMap.put("deploy_type",taskDeploy.getAuthType()); -// } -// -// if (taskDeploy.getAuthType() == 1){ -// if (!Objects.isNull(taskDeploy.getAuthId())){ -// taskDetailsMap.put("authId",taskDeploy.getAuthId()); -// } -// if (!Objects.isNull(taskDeploy.getDeployAddress())){ -// taskDetailsMap.put("deploy_address",taskDeploy.getDeployAddress()); -// } -// } -// if (!Objects.isNull(taskDeploy.getDeployOrder())){ -// taskDetailsMap.put("deploy_order",taskDeploy.getDeployOrder()); -// } -// } -// case PipelineFinal.TASK_DEPLOY_DOCKER->{ -// if (!Objects.isNull(taskDeploy.getAuthId())){ -// taskDetailsMap.put("authId",taskDeploy.getAuthId()); -// } -// if (!Objects.isNull(taskDeploy.getDockerImage())){ -// taskDetailsMap.put("image",taskDeploy.getDockerImage()); -// } -// if (!Objects.isNull(taskDeploy.getDeployAddress())){ -// taskDetailsMap.put("deploy_address",taskDeploy.getDeployAddress()); -// } -// if (!Objects.isNull(taskDeploy.getDeployOrder())){ -// taskDetailsMap.put("deploy_order",taskDeploy.getDeployOrder()); -// } -// } -// } -// return taskDetailsMap; -// } -// -// -// private LinkedHashMap taskArtifactDetails(String taskType,Object object,LinkedHashMap taskDetailsMap){ -// String string = JSONObject.toJSONString(object); -// -// TaskArtifact taskArtifact = JSONObject.parseObject(string, TaskArtifact.class); -// -// String artifactType = taskArtifact.getArtifactType(); -// taskDetailsMap.put("artifact_type",artifactType); -// switch (taskType){ -// case PipelineFinal.TASK_ARTIFACT_MAVEN ->{ -// switch (artifactType){ -// case PipelineFinal.TASK_ARTIFACT_NEXUS ->{ -// if (!Objects.isNull(taskArtifact.getArtifactId())){ -// taskDetailsMap.put("artifact_id",taskArtifact.getArtifactId()); -// } -// if (!Objects.isNull(taskArtifact.getAuthId())){ -// taskDetailsMap.put("auth_id",taskArtifact.getAuthId()); -// } -// if (!Objects.isNull(taskArtifact.getGroupId())){ -// taskDetailsMap.put("group_id",taskArtifact.getGroupId()); -// } -// if (!Objects.isNull(taskArtifact.getVersion())){ -// taskDetailsMap.put("version",taskArtifact.getVersion()); -// } -// if (!Objects.isNull(taskArtifact.getFileAddress())){ -// taskDetailsMap.put("file_address",taskArtifact.getFileAddress()); -// } -// if (!Objects.isNull(taskArtifact.getRule())){ -// taskDetailsMap.put("rule",taskArtifact.getRule()); -// } -// } -// case PipelineFinal.TASK_ARTIFACT_SSH ->{ -// if (!Objects.isNull(taskArtifact.getAuthId())){ -// taskDetailsMap.put("auth_id",taskArtifact.getAuthId()); -// } -// if (!Objects.isNull(taskArtifact.getPutAddress())){ -// taskDetailsMap.put("remote_address",taskArtifact.getPutAddress()); -// } -// if (!Objects.isNull(taskArtifact.getFileAddress())){ -// taskDetailsMap.put("fileAddress",taskArtifact.getFileAddress()); -// } -// if (!Objects.isNull(taskArtifact.getFileAddress())){ -// taskDetailsMap.put("put_address",taskArtifact.getPutAddress()); -// } -// if (!Objects.isNull(taskArtifact.getRule())){ -// taskDetailsMap.put("rule",taskArtifact.getRule()); -// } -// } -// case PipelineFinal.TASK_ARTIFACT_XPACK ->{ -// if (!Objects.isNull(taskArtifact.getArtifactId())){ -// taskDetailsMap.put("artifactId",taskArtifact.getArtifactId()); -// } -// if (!Objects.isNull(taskArtifact.getAuthId())){ -// taskDetailsMap.put("authId",taskArtifact.getAuthId()); -// } -// if (!Objects.isNull(taskArtifact.getGroupId())){ -// taskDetailsMap.put("groupId",taskArtifact.getGroupId()); -// } -// if (!Objects.isNull(taskArtifact.getVersion())){ -// taskDetailsMap.put("version",taskArtifact.getVersion()); -// } -// if (!Objects.isNull(taskArtifact.getRepository())){ -// taskDetailsMap.put("repository_id",taskArtifact.getRepository().getId()); -// } -// } -// } -// } -// case PipelineFinal.TASK_ARTIFACT_NODEJS ->{ -// -// } -// case PipelineFinal.TASK_ARTIFACT_DOCKER ->{ -// switch (artifactType){ -// case PipelineFinal.TASK_ARTIFACT_NEXUS ->{ -// if (!Objects.isNull(taskArtifact.getDockerImage())){ -// taskDetailsMap.put("image",taskArtifact.getDockerImage()); -// } -// if (!Objects.isNull(taskArtifact.getAuthId())){ -// taskDetailsMap.put("authId",taskArtifact.getAuthId()); -// } -// } -// } -// } -// } -// return taskDetailsMap; -// } -// -// private LinkedHashMap taskPullArtifactDetails(String taskType,Object object,LinkedHashMap taskDetailsMap){ -// String string = JSONObject.toJSONString(object); -// -// TaskArtifact taskArtifact = JSONObject.parseObject(string, TaskArtifact.class); -// -// String artifactType = taskArtifact.getArtifactType(); -// taskDetailsMap.put("artifact_type",artifactType); -// switch (taskType){ -// case PipelineFinal.TASK_PULL_MAVEN ->{ -// switch (artifactType){ -// case PipelineFinal.TASK_ARTIFACT_NEXUS ->{ -// if (!Objects.isNull(taskArtifact.getArtifactId())){ -// taskDetailsMap.put("artifact_id",taskArtifact.getArtifactId()); -// } -// if (!Objects.isNull(taskArtifact.getAuthId())){ -// taskDetailsMap.put("auth_id",taskArtifact.getAuthId()); -// } -// if (!Objects.isNull(taskArtifact.getGroupId())){ -// taskDetailsMap.put("group_id",taskArtifact.getGroupId()); -// } -// if (!Objects.isNull(taskArtifact.getVersion())){ -// taskDetailsMap.put("version",taskArtifact.getVersion()); -// } -// if (!Objects.isNull(taskArtifact.getFileAddress())){ -// taskDetailsMap.put("file_address",taskArtifact.getFileAddress()); -// } -// if (!Objects.isNull(taskArtifact.getRule())){ -// taskDetailsMap.put("rule",taskArtifact.getRule()); -// } -// } -// case PipelineFinal.TASK_ARTIFACT_SSH ->{ -// if (!Objects.isNull(taskArtifact.getAuthId())){ -// taskDetailsMap.put("auth_id",taskArtifact.getAuthId()); -// } -// if (!Objects.isNull(taskArtifact.getPutAddress())){ -// taskDetailsMap.put("remote_address",taskArtifact.getPutAddress()); -// } -// if (!Objects.isNull(taskArtifact.getFileAddress())){ -// taskDetailsMap.put("fileAddress",taskArtifact.getFileAddress()); -// } -// if (!Objects.isNull(taskArtifact.getFileAddress())){ -// taskDetailsMap.put("put_address",taskArtifact.getPutAddress()); -// } -// if (!Objects.isNull(taskArtifact.getRule())){ -// taskDetailsMap.put("rule",taskArtifact.getRule()); -// } -// } -// case PipelineFinal.TASK_ARTIFACT_XPACK ->{ -// if (!Objects.isNull(taskArtifact.getArtifactId())){ -// taskDetailsMap.put("artifactId",taskArtifact.getArtifactId()); -// } -// if (!Objects.isNull(taskArtifact.getAuthId())){ -// taskDetailsMap.put("authId",taskArtifact.getAuthId()); -// } -// if (!Objects.isNull(taskArtifact.getGroupId())){ -// taskDetailsMap.put("groupId",taskArtifact.getGroupId()); -// } -// if (!Objects.isNull(taskArtifact.getVersion())){ -// taskDetailsMap.put("version",taskArtifact.getVersion()); -// } -// if (!Objects.isNull(taskArtifact.getRepository())){ -// taskDetailsMap.put("repository_id",taskArtifact.getRepository().getId()); -// } -// } -// } -// } -// case PipelineFinal.TASK_PULL_NODEJS ->{ -// -// } -// case PipelineFinal.TASK_PULL_DOCKER ->{ -// switch (artifactType){ -// case PipelineFinal.TASK_ARTIFACT_NEXUS ->{ -// if (!Objects.isNull(taskArtifact.getDockerImage())){ -// taskDetailsMap.put("image",taskArtifact.getDockerImage()); -// } -// if (!Objects.isNull(taskArtifact.getAuthId())){ -// taskDetailsMap.put("authId",taskArtifact.getAuthId()); -// } -// } -// } -// } -// } -// return taskDetailsMap; -// } -// -// -// -// -// -//} +package cd.casic.module.process.pipeline.definition.impl; + + +import cd.casic.ci.commons.bean.engine.job.Tasks; +import cd.casic.ci.commons.bean.process.stage.Stage; +import cd.casic.ci.commons.bean.support.deploy.TaskDeploy; +import cd.casic.module.process.engine.task.TasksService; +import cd.casic.module.process.pipeline.definition.PipelineYamlService; +import cd.casic.module.process.pipeline.definition.entity.PipelineEntity; +import cd.casic.module.process.process.definition.dao.PipelineDao; +import cd.casic.module.process.setting.service.AuthHostService; +import cd.casic.module.process.setting.service.AuthService; +import cd.casic.module.process.setting.service.AuthThirdService; +import cd.casic.module.process.stages.service.StageService; +import cd.casic.module.process.support.util.util.PipelineFinal; +import cd.casic.module.process.task.artifact.model.TaskArtifact; +import cd.casic.module.process.task.artifact.service.TaskArtifactXpackService; +import cd.casic.module.process.task.build.model.TaskBuild; +import cd.casic.module.process.task.code.model.TaskCode; +import cd.casic.module.process.task.code.service.TaskCodeGittokService; +import cd.casic.module.process.task.codescan.model.TaskCodeScan; +import cd.casic.module.process.task.test.model.TaskTest; +import cd.casic.module.process.task.test.service.TaskTestOnService; +import com.alibaba.fastjson.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; + +import java.util.*; + +@Service +public class PipelineYamlServiceImpl implements PipelineYamlService { + + @Autowired + PipelineDao pipelineDao; + + @Autowired + AuthHostService authHostService; + + @Autowired + AuthThirdService authThirdService; + + @Autowired + TaskTestOnService taskTestOnService; + + @Autowired + TaskCodeGittokService taskCodeGittokService; + + @Autowired + TaskArtifactXpackService taskArtifactXpackService; + + @Autowired + AuthService authService; + + @Autowired + PipelineYamlService pipelineYamlService; + + @Autowired + TasksService tasksService; + + @Autowired + StageService stageService; + + private static final Logger logger = LoggerFactory.getLogger(PipelineYamlService.class); + + + @Override + public String importPipelineYaml(String pipelineId){ + + PipelineEntity pipeline = pipelineDao.findPipelineById(pipelineId); + + Map properties = new HashMap<>(); + properties.put("pipeline", Map.of("name", pipeline.getName())); + + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + + Yaml yaml = new Yaml(options); + + // 将Java对象转换为YAML字符串 + String yamlString = yaml.dump(properties); + + return importStageYaml(yamlString,pipelineId); + + // int type = pipeline.getType(); + // + // if (type == 1){ + // return importTaskYaml(yamlString,pipelineId); + // }else { + // return importStageYaml(yamlString,pipelineId); + // } + } + + // /** + // * 导出多任务配置为Yaml格式 + // * @param yamlString yaml + // * @param pipelineId 流水线 + // * @return Yaml格式支付串 + // */ + // private String importTaskYaml(String yamlString,String pipelineId){ + // + // DumperOptions options = new DumperOptions(); + // options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + // + // Yaml yaml = new Yaml(options); + // Map data = yaml.load(yamlString); + // + // List> taskList = new ArrayList<>(); + // + // List tasksList = tasksService.finAllPipelineTaskOrTask(pipelineId); + // for (Tasks tasks : tasksList) { + // LinkedHashMap tasksMap = new LinkedHashMap<>(); + // + // LinkedHashMap taskDetails = new LinkedHashMap<>(); + // + // taskDetails.put("taskId",tasks.getTaskId()); + // taskDetails.put("taskName",tasks.getTaskName()); + // findTaskDetails(tasks.getTaskType(), tasks.getTask(), taskDetails); + // + // tasksMap.put("task",taskDetails); + // taskList.add(tasksMap); + // } + // + // Map pipelineMap = (Map) data.get("pipeline"); + // pipelineMap.put("tasks",taskList); + // return yaml.dump(data); + // } + + /** + * 导出多阶段配置为Yaml格式 + * @param yamlString yaml + * @param pipelineId 流水线 + * @return Yaml格式支付串 + */ + private String importStageYaml(String yamlString,String pipelineId){ + + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + + Yaml yaml = new Yaml(options); + Map data = yaml.load(yamlString); + + List> stageMapList = new ArrayList<>(); + + List stageList = stageService.findAllStagesOrTask(pipelineId); + + for (Stage stage : stageList) { + LinkedHashMap stageMap = new LinkedHashMap<>(); + + List parallelStageList = stage.getStageList(); + + List> parallelMapList = new ArrayList<>(); + LinkedHashMap parallelsMap = new LinkedHashMap<>(); + for (Stage parallelStage : parallelStageList) { + + LinkedHashMap parallelMap = new LinkedHashMap<>(); + + List> taskMapList = new ArrayList<>(); + List taskList = parallelStage.getTaskValues(); + LinkedHashMap tasksMap = new LinkedHashMap<>(); + for (Tasks tasks : taskList) { + + LinkedHashMap taskMap = new LinkedHashMap<>(); + LinkedHashMap taskDetails = new LinkedHashMap<>(); + + taskDetails.put("taskId",tasks.getTaskId()); + taskDetails.put("taskName",tasks.getTaskName()); + findTaskDetails(tasks.getTaskType(), tasks.getTask(), taskDetails); + + taskMap.put("task",taskDetails); + taskMapList.add(taskMap); + + tasksMap.put("parallelId",parallelStage.getStageId()); + tasksMap.put("parallelName",parallelStage.getStageName()); + tasksMap.put("tasks",taskMapList); + } + + parallelMap.put("parallel",tasksMap); + parallelMapList.add(parallelMap); + } + parallelsMap.put("stageId",stage.getStageId()); + parallelsMap.put("stageName",stage.getStageName()); + parallelsMap.put("parallels",parallelMapList); + + stageMap.put("stage",parallelsMap); + stageMapList.add(stageMap); + } + Map pipelineMap = (Map) data.get("pipeline"); + pipelineMap.put("stages",stageMapList); + + return yaml.dump(data); + } + + + private LinkedHashMap findTaskDetails(String taskType,Object object,LinkedHashMap taskDetails){ + if (Objects.isNull(object)){ + return null; + } + switch (taskType){ + case PipelineFinal.TASK_CODE_GIT , PipelineFinal.TASK_CODE_GITEE , PipelineFinal.TASK_CODE_GITHUB , + PipelineFinal.TASK_CODE_GITLAB, PipelineFinal.TASK_CODE_XCODE, PipelineFinal.TASK_CODE_SVN ->{ + return taskCodeDetails(taskType,object,taskDetails); + } + case PipelineFinal.TASK_BUILD_MAVEN, PipelineFinal.TASK_BUILD_NODEJS ->{ + return taskBuildDetails(taskType,object,taskDetails); + } + case PipelineFinal.TASK_TEST_MAVENTEST, PipelineFinal.TASK_TEST_TESTON ->{ + return taskTestDetails(taskType,object,taskDetails); + } + case PipelineFinal.TASK_DEPLOY_LINUX , PipelineFinal.TASK_DEPLOY_DOCKER ->{ + return taskDeployDetails(taskType,object,taskDetails); + } + case PipelineFinal.TASK_ARTIFACT_NEXUS , PipelineFinal.TASK_ARTIFACT_SSH , PipelineFinal.TASK_ARTIFACT_XPACK ->{ + return taskArtifactDetails(taskType,object,taskDetails); + } + case PipelineFinal.TASK_CODESCAN_SONAR ->{ + return taskCodeScanDetails(taskType,object,taskDetails); + } + } + return null; + } + + + private LinkedHashMap taskCodeDetails(String taskType,Object object,LinkedHashMap taskDetailsMap){ + String string = JSONObject.toJSONString(object); + + TaskCode taskCode = JSONObject.parseObject(string, TaskCode.class); + if (!Objects.isNull(taskCode.getAuthId())){ + taskDetailsMap.put("authId",taskCode.getAuthId()); + } + if (!taskType.equals(PipelineFinal.TASK_CODE_SVN)){ + if (!Objects.isNull(taskCode.getCodeName())){ + taskDetailsMap.put("url",taskCode.getCodeName()); + } + if (!Objects.isNull(taskCode.getCodeBranch())){ + taskDetailsMap.put("branch",taskCode.getCodeBranch()); + }else { + taskDetailsMap.put("branch", PipelineFinal.TASK_CODE_DEFAULT_BRANCH); + } + }else { + if (!Objects.isNull(taskCode.getCodeName())){ + taskDetailsMap.put("detection_url",taskCode.getCodeName()); + } + + if (!Objects.isNull(taskCode.getSvnFile())){ + taskDetailsMap.put("detection_file",taskCode.getSvnFile()); + } + } + + // switch (taskType){ + // case PipelineFinal.TASK_CODE_GIT, PipelineFinal.TASK_CODE_GITLAB ->{ + // if (!Objects.isNull(taskCode.getAuthId())){ + // taskDetailsMap.put("authId",taskCode.getAuthId()); + // } + // if (!Objects.isNull(taskCode.getCodeName())){ + // taskDetailsMap.put("url",taskCode.getCodeName()); + // } + // + // if (!Objects.isNull(taskCode.getCodeBranch())){ + // taskDetailsMap.put("branch",taskCode.getCodeBranch()); + // }else { + // taskDetailsMap.put("branch", PipelineFinal.TASK_CODE_DEFAULT_BRANCH); + // } + // } + // case PipelineFinal.TASK_CODE_GITEE, PipelineFinal.TASK_CODE_GITHUB ->{ + // if (!Objects.isNull(taskCode.getAuthId())){ + // taskDetailsMap.put("authId",taskCode.getAuthId()); + // } + // if (!Objects.isNull(taskCode.getCodeName())){ + // taskDetailsMap.put("repository_name",taskCode.getCodeName()); + // } + // if (!Objects.isNull(taskCode.getCodeAddress())){ + // taskDetailsMap.put("repository_url",taskCode.getCodeAddress()); + // } + // + // if (!Objects.isNull(taskDetailsMap.get("authId"))){ + // String authId = (String) taskDetailsMap.get("authId"); + // String repositoryName = (String) taskDetailsMap.get("repository_name"); + // String houseUrl = codeThirdService.getHouseUrl(authId, repositoryName, taskType); + // taskCode.setCodeAddress(houseUrl); + // taskDetailsMap.put("repository_url",houseUrl); + // } + // + // if (!Objects.isNull(taskCode.getCodeBranch())){ + // taskDetailsMap.put("branch",taskCode.getCodeBranch()); + // }else { + // taskDetailsMap.put("branch", PipelineFinal.TASK_CODE_DEFAULT_BRANCH); + // } + // } + // case PipelineFinal.TASK_CODE_XCODE ->{ + // String authId = taskCode.getAuthId(); + // if (!Objects.isNull(authId)){ + // taskDetailsMap.put("authId",taskCode.getAuthId()); + // } + // if (!Objects.isNull(taskCode.getRepository())){ + // String rpyId = taskCode.getRepository().getRpyId(); + // taskDetailsMap.put("repository_id",rpyId); + // ThirdHouse thirdHouse = taskCodeGittokService. + // findStoreHouse((String) taskDetailsMap.get("authId"), rpyId); + // if (!Objects.isNull(thirdHouse)) { + // // taskCode.setRepository(thirdHouse); + // taskDetailsMap.put("repository_url",thirdHouse.getHouseWebUrl()); + // taskDetailsMap.put("repository_name",thirdHouse.getName()); + // } + // } + // taskDetailsMap.put("branch", PipelineFinal.TASK_CODE_DEFAULT_BRANCH); + // if (!Objects.isNull(taskCode.getBranch())){ + // String branchId = taskCode.getBranch().getBranchId(); + // String authId1 = (String) taskDetailsMap.get("authId"); + // String rpyId1 = (String) taskDetailsMap.get("repository_id"); + // XcodeBranch xcodeBranch = taskCodeGittokService.findOneBranch(authId1, rpyId1,branchId); + // if (!Objects.isNull(xcodeBranch)){ + // taskCode.setBranch(xcodeBranch); + // taskDetailsMap.put("branch_name",xcodeBranch.getBranchName()); + // } + // }else { + // taskDetailsMap.put("branch", PipelineFinal.TASK_CODE_DEFAULT_BRANCH); + // } + // } + // case PipelineFinal.TASK_CODE_SVN ->{ + // if (!Objects.isNull(taskCode.getAuthId())){ + // taskDetailsMap.put("authId",taskCode.getAuthId()); + // } + // if (!Objects.isNull(taskCode.getCodeName())){ + // taskDetailsMap.put("detection_url",taskCode.getCodeName()); + // } + // + // if (!Objects.isNull(taskCode.getSvnFile())){ + // taskDetailsMap.put("detection_file",taskCode.getSvnFile()); + // } + // } + // } + return taskDetailsMap; + } + + + private LinkedHashMap taskCodeScanDetails(String taskType,Object object,LinkedHashMap taskDetailsMap){ + String string = JSONObject.toJSONString(object); + + TaskCodeScan taskCodeScan = JSONObject.parseObject(string, TaskCodeScan.class); + + switch (taskType){ + case PipelineFinal.TASK_CODESCAN_SONAR ->{ + if (!Objects.isNull(taskCodeScan.getAuthId())){ + taskDetailsMap.put("authId",taskCodeScan.getAuthId()); + } + if (!Objects.isNull(taskCodeScan.getProjectName())){ + taskDetailsMap.put("project_name",taskCodeScan.getProjectName()); + } + } + } + return taskDetailsMap; + } + + + private LinkedHashMap taskTestDetails(String taskType,Object object,LinkedHashMap taskDetailsMap){ + String string = JSONObject.toJSONString(object); + + TaskTest taskTest = JSONObject.parseObject(string, TaskTest.class); + + switch (taskType){ + case PipelineFinal.TASK_TEST_MAVENTEST ->{ + if (!Objects.isNull(taskTest.getTestOrder())){ + taskDetailsMap.put("test_order",taskTest.getTestOrder()); + } + if (!Objects.isNull(taskTest.getAddress())){ + taskDetailsMap.put("pom_address",taskTest.getAddress()); + } + } + case PipelineFinal.TASK_TEST_TESTON ->{ + + if (!Objects.isNull(taskTest.getAuthId())){ + taskDetailsMap.put("authId",taskTest.getAuthId()); + } + + if (!Objects.isNull(taskTest.getWebEnv())){ + taskDetailsMap.put("webEnv",taskTest.getWebEnv().getId()); + } + + if (!Objects.isNull(taskTest.getApiEnv())){ + taskDetailsMap.put("apiEnv",taskTest.getApiEnv().getId()); + } + if (!Objects.isNull(taskTest.getAppEnv())){ + taskDetailsMap.put("appEnv",taskTest.getAppEnv().getId()); + } + if (!Objects.isNull(taskTest.getTestPlan())){ + taskDetailsMap.put("testPlan",taskTest.getTestPlan().getId()); + } + if (!Objects.isNull(taskTest.getTestSpace())){ + taskDetailsMap.put("testSpace",taskTest.getTestSpace().getId()); + } + } + } + return taskDetailsMap; + } + + + private LinkedHashMap taskBuildDetails(String taskType,Object object,LinkedHashMap taskDetailsMap){ + String string = JSONObject.toJSONString(object); + + TaskBuild taskBuilder = JSONObject.parseObject(string, TaskBuild.class); + + switch (taskType){ + case PipelineFinal.TASK_BUILD_MAVEN ->{ + if (!Objects.isNull(taskBuilder.getBuildOrder())){ + taskDetailsMap.put("mvn_order",taskBuilder.getBuildOrder()); + } + if (!Objects.isNull(taskBuilder.getBuildAddress())){ + taskDetailsMap.put("pom_address",taskBuilder.getBuildAddress()); + } + if (!Objects.isNull(taskBuilder.getProductRule())){ + taskDetailsMap.put("artifact_role",taskBuilder.getProductRule()); + } + } + case PipelineFinal.TASK_BUILD_NODEJS ->{ + if (!Objects.isNull(taskBuilder.getBuildOrder())){ + taskDetailsMap.put("npm_order",taskBuilder.getBuildOrder()); + } + if (!Objects.isNull(taskBuilder.getBuildAddress())){ + taskDetailsMap.put("model_address",taskBuilder.getBuildAddress()); + } + if (!Objects.isNull(taskBuilder.getProductRule())){ + taskDetailsMap.put("artifact_role",taskBuilder.getProductRule()); + } + } + } + return taskDetailsMap; + } + + + private LinkedHashMap taskDeployDetails(String taskType,Object object,LinkedHashMap taskDetailsMap){ + String string = JSONObject.toJSONString(object); + + TaskDeploy taskDeploy = JSONObject.parseObject(string, TaskDeploy.class); + + switch (taskType){ + case PipelineFinal.TASK_DEPLOY_LINUX ->{ + if (taskDeploy.getAuthType() != 0){ + taskDetailsMap.put("deploy_type",taskDeploy.getAuthType()); + } + + if (taskDeploy.getAuthType() == 1){ + if (!Objects.isNull(taskDeploy.getAuthId())){ + taskDetailsMap.put("authId",taskDeploy.getAuthId()); + } + if (!Objects.isNull(taskDeploy.getDeployAddress())){ + taskDetailsMap.put("deploy_address",taskDeploy.getDeployAddress()); + } + } + if (!Objects.isNull(taskDeploy.getDeployOrder())){ + taskDetailsMap.put("deploy_order",taskDeploy.getDeployOrder()); + } + } + case PipelineFinal.TASK_DEPLOY_DOCKER->{ + if (!Objects.isNull(taskDeploy.getAuthId())){ + taskDetailsMap.put("authId",taskDeploy.getAuthId()); + } + if (!Objects.isNull(taskDeploy.getDockerImage())){ + taskDetailsMap.put("image",taskDeploy.getDockerImage()); + } + if (!Objects.isNull(taskDeploy.getDeployAddress())){ + taskDetailsMap.put("deploy_address",taskDeploy.getDeployAddress()); + } + if (!Objects.isNull(taskDeploy.getDeployOrder())){ + taskDetailsMap.put("deploy_order",taskDeploy.getDeployOrder()); + } + } + } + return taskDetailsMap; + } + + + private LinkedHashMap taskArtifactDetails(String taskType,Object object,LinkedHashMap taskDetailsMap){ + String string = JSONObject.toJSONString(object); + + TaskArtifact taskArtifact = JSONObject.parseObject(string, TaskArtifact.class); + + String artifactType = taskArtifact.getArtifactType(); + taskDetailsMap.put("artifact_type",artifactType); + switch (taskType){ + case PipelineFinal.TASK_ARTIFACT_MAVEN ->{ + switch (artifactType){ + case PipelineFinal.TASK_ARTIFACT_NEXUS ->{ + if (!Objects.isNull(taskArtifact.getArtifactId())){ + taskDetailsMap.put("artifact_id",taskArtifact.getArtifactId()); + } + if (!Objects.isNull(taskArtifact.getAuthId())){ + taskDetailsMap.put("auth_id",taskArtifact.getAuthId()); + } + if (!Objects.isNull(taskArtifact.getGroupId())){ + taskDetailsMap.put("group_id",taskArtifact.getGroupId()); + } + if (!Objects.isNull(taskArtifact.getVersion())){ + taskDetailsMap.put("version",taskArtifact.getVersion()); + } + if (!Objects.isNull(taskArtifact.getFileAddress())){ + taskDetailsMap.put("file_address",taskArtifact.getFileAddress()); + } + if (!Objects.isNull(taskArtifact.getRule())){ + taskDetailsMap.put("rule",taskArtifact.getRule()); + } + } + case PipelineFinal.TASK_ARTIFACT_SSH ->{ + if (!Objects.isNull(taskArtifact.getAuthId())){ + taskDetailsMap.put("auth_id",taskArtifact.getAuthId()); + } + if (!Objects.isNull(taskArtifact.getPutAddress())){ + taskDetailsMap.put("remote_address",taskArtifact.getPutAddress()); + } + if (!Objects.isNull(taskArtifact.getFileAddress())){ + taskDetailsMap.put("fileAddress",taskArtifact.getFileAddress()); + } + if (!Objects.isNull(taskArtifact.getFileAddress())){ + taskDetailsMap.put("put_address",taskArtifact.getPutAddress()); + } + if (!Objects.isNull(taskArtifact.getRule())){ + taskDetailsMap.put("rule",taskArtifact.getRule()); + } + } + case PipelineFinal.TASK_ARTIFACT_XPACK ->{ + if (!Objects.isNull(taskArtifact.getArtifactId())){ + taskDetailsMap.put("artifactId",taskArtifact.getArtifactId()); + } + if (!Objects.isNull(taskArtifact.getAuthId())){ + taskDetailsMap.put("authId",taskArtifact.getAuthId()); + } + if (!Objects.isNull(taskArtifact.getGroupId())){ + taskDetailsMap.put("groupId",taskArtifact.getGroupId()); + } + if (!Objects.isNull(taskArtifact.getVersion())){ + taskDetailsMap.put("version",taskArtifact.getVersion()); + } + if (!Objects.isNull(taskArtifact.getRepository())){ + taskDetailsMap.put("repository_id",taskArtifact.getRepository().getId()); + } + } + } + } + case PipelineFinal.TASK_ARTIFACT_NODEJS ->{ + + } + case PipelineFinal.TASK_ARTIFACT_DOCKER ->{ + switch (artifactType){ + case PipelineFinal.TASK_ARTIFACT_NEXUS ->{ + if (!Objects.isNull(taskArtifact.getDockerImage())){ + taskDetailsMap.put("image",taskArtifact.getDockerImage()); + } + if (!Objects.isNull(taskArtifact.getAuthId())){ + taskDetailsMap.put("authId",taskArtifact.getAuthId()); + } + } + } + } + } + return taskDetailsMap; + } + + private LinkedHashMap taskPullArtifactDetails(String taskType,Object object,LinkedHashMap taskDetailsMap){ + String string = JSONObject.toJSONString(object); + + TaskArtifact taskArtifact = JSONObject.parseObject(string, TaskArtifact.class); + + String artifactType = taskArtifact.getArtifactType(); + taskDetailsMap.put("artifact_type",artifactType); + switch (taskType){ + case PipelineFinal.TASK_PULL_MAVEN ->{ + switch (artifactType){ + case PipelineFinal.TASK_ARTIFACT_NEXUS ->{ + if (!Objects.isNull(taskArtifact.getArtifactId())){ + taskDetailsMap.put("artifact_id",taskArtifact.getArtifactId()); + } + if (!Objects.isNull(taskArtifact.getAuthId())){ + taskDetailsMap.put("auth_id",taskArtifact.getAuthId()); + } + if (!Objects.isNull(taskArtifact.getGroupId())){ + taskDetailsMap.put("group_id",taskArtifact.getGroupId()); + } + if (!Objects.isNull(taskArtifact.getVersion())){ + taskDetailsMap.put("version",taskArtifact.getVersion()); + } + if (!Objects.isNull(taskArtifact.getFileAddress())){ + taskDetailsMap.put("file_address",taskArtifact.getFileAddress()); + } + if (!Objects.isNull(taskArtifact.getRule())){ + taskDetailsMap.put("rule",taskArtifact.getRule()); + } + } + case PipelineFinal.TASK_ARTIFACT_SSH ->{ + if (!Objects.isNull(taskArtifact.getAuthId())){ + taskDetailsMap.put("auth_id",taskArtifact.getAuthId()); + } + if (!Objects.isNull(taskArtifact.getPutAddress())){ + taskDetailsMap.put("remote_address",taskArtifact.getPutAddress()); + } + if (!Objects.isNull(taskArtifact.getFileAddress())){ + taskDetailsMap.put("fileAddress",taskArtifact.getFileAddress()); + } + if (!Objects.isNull(taskArtifact.getFileAddress())){ + taskDetailsMap.put("put_address",taskArtifact.getPutAddress()); + } + if (!Objects.isNull(taskArtifact.getRule())){ + taskDetailsMap.put("rule",taskArtifact.getRule()); + } + } + case PipelineFinal.TASK_ARTIFACT_XPACK ->{ + if (!Objects.isNull(taskArtifact.getArtifactId())){ + taskDetailsMap.put("artifactId",taskArtifact.getArtifactId()); + } + if (!Objects.isNull(taskArtifact.getAuthId())){ + taskDetailsMap.put("authId",taskArtifact.getAuthId()); + } + if (!Objects.isNull(taskArtifact.getGroupId())){ + taskDetailsMap.put("groupId",taskArtifact.getGroupId()); + } + if (!Objects.isNull(taskArtifact.getVersion())){ + taskDetailsMap.put("version",taskArtifact.getVersion()); + } + if (!Objects.isNull(taskArtifact.getRepository())){ + taskDetailsMap.put("repository_id",taskArtifact.getRepository().getId()); + } + } + } + } + case PipelineFinal.TASK_PULL_NODEJS ->{ + + } + case PipelineFinal.TASK_PULL_DOCKER ->{ + switch (artifactType){ + case PipelineFinal.TASK_ARTIFACT_NEXUS ->{ + if (!Objects.isNull(taskArtifact.getDockerImage())){ + taskDetailsMap.put("image",taskArtifact.getDockerImage()); + } + if (!Objects.isNull(taskArtifact.getAuthId())){ + taskDetailsMap.put("authId",taskArtifact.getAuthId()); + } + } + } + } + } + return taskDetailsMap; + } + + + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/pipeline/execute/service/impl/PipelineExecServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/pipeline/execute/service/impl/PipelineExecServiceImpl.java index 3de8879..dc08720 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/pipeline/execute/service/impl/PipelineExecServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/pipeline/execute/service/impl/PipelineExecServiceImpl.java @@ -1,356 +1,369 @@ -//package cd.casic.module.process.pipeline.execute.service.impl; -// -// -//import cd.casic.ci.commons.bean.engine.execute.PipelineRunMsg; -//import cd.casic.ci.commons.bean.process.instance.PipelineInstance; -//import cd.casic.ci.commons.bean.work.agent.model.Agent; -//import cd.casic.framework.commons.exception.ServiceException; -//import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants; -//import cd.casic.module.process.engine.task.TasksExecService; -//import cd.casic.module.process.pipeline.definition.PipelineService; -//import cd.casic.module.process.pipeline.execute.service.PipelineExecService; -//import cd.casic.module.process.process.definition.VariableService; -//import cd.casic.module.process.process.instance.PipelineInstanceService; -//import cd.casic.module.process.setting.service.ResourcesService; -//import cd.casic.module.process.setting.service.ScmService; -//import cd.casic.module.process.stages.service.StageExecService; -//import cd.casic.module.process.stages.service.StageService; -//import cd.casic.module.process.support.agent.service.AgentService; -//import cd.casic.module.process.support.disk.service.DiskService; -//import cd.casic.module.process.support.home.PipelineVersionService; -//import cd.casic.module.process.support.postprocess.service.PostprocessExecService; -//import cd.casic.module.process.support.util.PipelineUtilService; -//import cd.casic.module.process.toolkit.join.JoinTemplate; -//import org.apache.commons.lang3.StringUtils; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.stereotype.Service; -////import org.springframework.web.socket.WebSocketSession; -// -//import java.util.HashMap; -//import java.util.List; -//import java.util.Map; -//import java.util.Objects; -// -///** -// * 流水线运行服务 -// */ -//@Service -////@Exporter -//public class PipelineExecServiceImpl implements PipelineExecService { -// -// @Autowired -// PipelineService pipelineService; -// -// @Autowired -// PostprocessExecService postExecService; -// -// @Autowired -// PipelineInstanceService pipelineInstanceService; -// -// @Autowired -// TasksExecService tasksExecService; -// -// @Autowired -// StageExecService stageExecService; -// -// @Autowired -// ResourcesService resourcesService; -// -// @Autowired -// PipelineVersionService versionService; -// -// @Autowired -// PipelineUtilService utilService; -// -// @Autowired -// DiskService diskService; -// -// @Autowired -// StageService stageService; -// -// @Autowired -// JoinTemplate joinTemplate; -// -// @Autowired -// ScmService scmService; -// -// @Autowired -// VariableService variableService; -// -// @Autowired -// AgentService agentService; -// -// public final Logger logger = LoggerFactory.getLogger(PipelineExecServiceImpl.class); -// -// //流水线id:流水线实例id -// public static final Map pipelineIdOrInstanceId = new HashMap<>(); -// -// //流水线id:agent -// public static final Map pipelineIdOrAgentId = new HashMap<>(); -// -// -// /** -// * 流水线开始运行 -// * @param runMsg 流水线id -// * @return 是否正在运行 -// */ -// @Override -// public PipelineInstance start(PipelineRunMsg runMsg) { -// Agent agent; -// if (StringUtils.isEmpty(runMsg.getAgentId())){ -// agent = agentService.findDefaultAgent(); -// }else { -// agent = agentService.findAgent(runMsg.getAgentId()); -// } -// if (Objects.isNull(agent)){ -// throw new ServiceException(GlobalErrorCodeConstants.LOCKED.getCode(),"无法获取到流水线执行Agent!"); -// } -// -// WebSocketSession session = SocketServerHandler.sessionMap.get(agent.getAddress()); -// if (Objects.isNull(session)){ -// throw new ApplicationException("流水线Agent断开连接,无法执行。"); -// } -// -// // 判断同一任务是否在运行 -// Pipeline pipeline = validExecPipeline(runMsg); -// String pipelineId = pipeline.getId(); -// pipelineIdOrAgentId.put(pipelineId, agent); -// -// // 判断磁盘空间是否足够 -// diskService.validationStorageSpace(); -// -// // 资源限制 -// resourcesService.judgeResources(); -// -// // 进入执行 -// runMsg.setPipeline(pipeline); -// runMsg.setAgent(agent); -// return beginExecPipeline(runMsg); -// } -// -// /** -// * 放入正在执行的流水线缓存中 -// * @param runMsg 流水线id -// * @return 流水线信息 -// */ -// public Pipeline validExecPipeline(PipelineRunMsg runMsg){ -// String pipelineId = runMsg.getPipelineId(); -// -// List allMainStage = stageService.findAllMainStage(pipelineId); -// if (allMainStage.isEmpty()){ -// throw new ApplicationException(2000,"当前流水线不存在可构建任务!"); -// } -// -// Boolean isVip = versionService.isVip(); -// -// Pipeline pipeline = pipelineService.findPipelineById(pipelineId); -// -// int size = pipelineIdOrInstanceId.size(); -// -// // 资源限制放入缓存中等待执行 -// if ((!isVip && size >= 2) || (isVip && size >= 4) ){ -// throw new ApplicationException(2000,"并行任务已满,等待执行!"); -// } -// return pipeline; -// } -// -// /** -// * 执行流水线 -// * @param runMsg 流水线信息 -// * @return 流水线实例 -// */ -// public PipelineInstance beginExecPipeline(PipelineRunMsg runMsg){ -// String pipelineId = runMsg.getPipelineId(); -// Pipeline pipeline = pipelineService.findPipelineById(pipelineId); -// pipeline.setState(2); -// pipelineService.updatePipeline(pipeline); -// runMsg.setPipeline(pipeline); -// -// logger.info("流水线{}开始运行",pipeline.getName()); -// PipelineInstance pipelineInstance = pipelineInstanceService.initializeInstance(runMsg); -// // 添加到缓存 -// String instanceId = pipelineInstance.getInstanceId(); -// pipelineInstanceService.instanceRuntime(pipelineInstance.getInstanceId()); -// joinTemplate.joinQuery(pipelineInstance); -// -// // 运行实例放入内存中 -// pipelineIdOrInstanceId.put(pipelineId, instanceId); -// -// try { -// // 创建多阶段运行实例 -// List stageList = stageExecService.createStageExecInstance(pipelineId, instanceId); -// -// List postprocessList = postExecService.createPipelinePostInstance(pipelineId, instanceId); -// -// PipelineDetails pipelineDetails = new PipelineDetails(); -// -// // 流水线基本运行信息 -// pipelineDetails.setPipelineId(pipelineId); -// pipelineDetails.setInstanceId(instanceId); -// pipelineDetails.setRunWay(runMsg.getRunWay()); -// pipelineDetails.setAgent(runMsg.getAgent()); -// -// // 流水线运行任务 -// pipelineDetails.setStageList(stageList); -// -// // 流水线后置处理 -// pipelineDetails.setPostprocessList(postprocessList); -// -// // 数据路径,源码,日志保存 -// String sourceDir = utilService.findPipelineDefaultAddress(pipelineId,1); -// String logDir = utilService.findPipelineDefaultAddress(pipelineId,2); -// pipelineDetails.setSourceDir(sourceDir); -// pipelineDetails.setLogDir(logDir); -// -// // 环境 -// List scmList = scmService.findAllPipelineScm(); -// pipelineDetails.setScmList(scmList); -// -// // 变量 -// List variableList = variableService.findAllVariable(pipelineId); -// pipelineDetails.setVariableList(variableList); -// -// AgentMessage agentMessage = new AgentMessage(); -// agentMessage.setType("exec"); -// agentMessage.setMessage(pipelineDetails); -// agentMessage.setPipelineId(pipelineId); -// -// Agent agent = pipelineDetails.getAgent(); -// -// String id = agent.getAddress(); -// -// WebSocketSession session = SocketServerHandler.sessionMap.get(id); -// if (Objects.isNull(session)) { -// throw new SystemException("客户端推送消息失败,无法获取客户端连接,客户端信息:"+id); -// } -// -// try { -// SocketServerHandler.instance().sendHandleMessage(id,agentMessage); -// } catch (Exception e) { -// throw new SystemException("客户端推送消息失败,错误信息:" + e.getMessage()); -// } -// }catch (Exception e){ -// logger.error("流水线执行出错了:{}",e.getMessage() ); -// stop(pipelineId); -// } -// return pipelineInstance; -// } -// -// @Override -// public void stop(String pipelineId){ -// Pipeline pipeline = pipelineService.findPipelineById(pipelineId); -// -// Agent agent = pipelineIdOrAgentId.get(pipelineId); -// if (Objects.isNull(agent)){ -// pipeline.setState(1); -// pipelineService.updatePipeline(pipeline); -// -// PipelineInstanceQuery pipelineInstanceQuery = new PipelineInstanceQuery(); -// pipelineInstanceQuery.setState(PipelineFinal.RUN_RUN); -// pipelineInstanceQuery.setPipelineId(pipelineId); -// List pipelineInstanceList = pipelineInstanceService.findPipelineInstanceList(pipelineInstanceQuery); -// for (PipelineInstance pipelineInstance : pipelineInstanceList) { -// String instanceId = pipelineInstance.getInstanceId(); -// pipelineInstance.setRunStatus(PipelineFinal.RUN_HALT); -// int runtime = pipelineInstanceService.findInstanceRuntime(instanceId); -// pipelineInstance.setRunTime(runtime); -// pipelineInstanceService.updateInstance(pipelineInstance); -// } -// removeExecCache(pipelineId); -// return; -// } -// -// try { -// AgentMessage agentMessage = new AgentMessage(); -// agentMessage.setType("stop"); -// agentMessage.setMessage(pipelineId); -// agentMessage.setPipelineId(pipelineId); -// SocketServerHandler.instance().sendHandleMessage(agent.getAddress(),agentMessage); -// }catch (Exception e){ -// logger.error(e.getMessage()); -// } -// -// // 添加资源配置 -// // resourcesService.instanceResources(integer); -// -// // 更新流水线状态 -// pipeline.setState(1); -// pipelineService.updatePipeline(pipeline); -// -// PipelineInstanceQuery pipelineInstanceQuery = new PipelineInstanceQuery(); -// pipelineInstanceQuery.setState(PipelineFinal.RUN_RUN); -// pipelineInstanceQuery.setPipelineId(pipelineId); -// List pipelineInstanceList = pipelineInstanceService.findPipelineInstanceList(pipelineInstanceQuery); -// for (PipelineInstance pipelineInstance : pipelineInstanceList) { -// pipelineInstance.setRunStatus(PipelineFinal.RUN_HALT); -// int runtime = pipelineInstanceService.findInstanceRuntime(pipelineInstance.getInstanceId()); -// pipelineInstance.setRunTime(runtime); -// pipelineInstanceService.updateInstance(pipelineInstance); -// } -// removeExecCache(pipelineId); -// } -// -// public void removeExecCache(String pipelineId){ -// String instanceId = pipelineIdOrInstanceId.get(pipelineId); -// PipelineInstanceServiceImpl.runTimeMap.remove(instanceId); -// pipelineInstanceService.stopThread(instanceId); -// pipelineIdOrInstanceId.remove(pipelineId); -// } -// -// @Override -// public void keepOn(String pipelineId){ -// Agent agent = pipelineIdOrAgentId.get(pipelineId); -// String id = agent.getAddress(); -// AgentMessage agentMessage = new AgentMessage(); -// agentMessage.setType("keepOn"); -// agentMessage.setMessage(pipelineId); -// agentMessage.setPipelineId(pipelineId); -// WebSocketSession session = SocketServerHandler.sessionMap.get(id); -// if (Objects.isNull(session)) { -// throw new SystemException("客户端推送消息失败,无法获取客户端连接,客户端信息:"+id); -// } -// -// try { -// SocketServerHandler.instance().sendHandleMessage(id,agentMessage); -// } catch (Exception e) { -// throw new SystemException("客户端推送消息失败,错误信息:" + e.getMessage()); -// } -// } -// -//} -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// +package cd.casic.module.process.pipeline.execute.service.impl; + + +import cd.casic.ci.commons.bean.engine.execute.PipelineDetails; +import cd.casic.ci.commons.bean.engine.execute.PipelineRunMsg; +import cd.casic.ci.commons.bean.engine.postprocess.Postprocess; +import cd.casic.ci.commons.bean.exception.SystemException; +import cd.casic.ci.commons.bean.process.definition.Pipeline; +import cd.casic.ci.commons.bean.process.definition.Variable; +import cd.casic.ci.commons.bean.process.instance.PipelineInstance; +import cd.casic.ci.commons.bean.process.instance.PipelineInstanceQuery; +import cd.casic.ci.commons.bean.process.setting.Scm; +import cd.casic.ci.commons.bean.process.stage.Stage; +import cd.casic.ci.commons.bean.work.agent.AgentMessage; +import cd.casic.ci.commons.bean.work.agent.model.Agent; +import cd.casic.framework.commons.exception.ServiceException; +import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants; +import cd.casic.module.process.engine.task.TasksExecService; +import cd.casic.module.process.pipeline.definition.PipelineService; +import cd.casic.module.process.pipeline.execute.service.PipelineExecService; +import cd.casic.module.process.pipeline.instance.service.PipelineInstanceServiceImpl; +import cd.casic.module.process.process.definition.VariableService; +import cd.casic.module.process.process.instance.PipelineInstanceService; +import cd.casic.module.process.setting.service.ResourcesService; +import cd.casic.module.process.setting.service.ScmService; +import cd.casic.module.process.stages.service.StageExecService; +import cd.casic.module.process.stages.service.StageService; +import cd.casic.module.process.support.agent.service.AgentService; +import cd.casic.module.process.support.disk.service.DiskService; +import cd.casic.module.process.support.home.PipelineVersionService; +import cd.casic.module.process.support.postprocess.service.PostprocessExecService; +import cd.casic.module.process.support.util.PipelineUtilService; +import cd.casic.module.process.support.util.util.PipelineFinal; +import cd.casic.module.process.toolkit.join.JoinTemplate; +import cd.casic.module.process.ws.server.SocketServerHandler; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.socket.WebSocketSession; +//import org.springframework.web.socket.WebSocketSession; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 流水线运行服务 + */ +@Service +//@Exporter +public class PipelineExecServiceImpl implements PipelineExecService { + + @Autowired + PipelineService pipelineService; + + @Autowired + PostprocessExecService postExecService; + + @Autowired + PipelineInstanceService pipelineInstanceService; + + @Autowired + TasksExecService tasksExecService; + + @Autowired + StageExecService stageExecService; + + @Autowired + ResourcesService resourcesService; + + @Autowired + PipelineVersionService versionService; + + @Autowired + PipelineUtilService utilService; + + @Autowired + DiskService diskService; + + @Autowired + StageService stageService; + + @Autowired + JoinTemplate joinTemplate; + + @Autowired + ScmService scmService; + + @Autowired + VariableService variableService; + + @Autowired + AgentService agentService; + + public final Logger logger = LoggerFactory.getLogger(PipelineExecServiceImpl.class); + + //流水线id:流水线实例id + public static final Map pipelineIdOrInstanceId = new HashMap<>(); + + //流水线id:agent + public static final Map pipelineIdOrAgentId = new HashMap<>(); + + + /** + * 流水线开始运行 + * @param runMsg 流水线id + * @return 是否正在运行 + */ + @Override + public PipelineInstance start(PipelineRunMsg runMsg) { + Agent agent; + if (StringUtils.isEmpty(runMsg.getAgentId())){ + agent = agentService.findDefaultAgent(); + }else { + agent = agentService.findAgent(runMsg.getAgentId()); + } + if (Objects.isNull(agent)){ + throw new ServiceException(GlobalErrorCodeConstants.LOCKED.getCode(),"无法获取到流水线执行Agent!"); + } + + WebSocketSession session = SocketServerHandler.sessionMap.get(agent.getAddress()); + if (Objects.isNull(session)){ + throw new ServiceException(GlobalErrorCodeConstants.LOCKED.getCode(),"流水线Agent断开连接,无法执行。"); + } + + // 判断同一任务是否在运行 + Pipeline pipeline = validExecPipeline(runMsg); + String pipelineId = pipeline.getId(); + pipelineIdOrAgentId.put(pipelineId, agent); + + // 判断磁盘空间是否足够 + diskService.validationStorageSpace(); + + // 资源限制 + resourcesService.judgeResources(); + + // 进入执行 + runMsg.setPipeline(pipeline); + runMsg.setAgent(agent); + return beginExecPipeline(runMsg); + } + + /** + * 放入正在执行的流水线缓存中 + * @param runMsg 流水线id + * @return 流水线信息 + */ + public Pipeline validExecPipeline(PipelineRunMsg runMsg){ + String pipelineId = runMsg.getPipelineId(); + + List allMainStage = stageService.findAllMainStage(pipelineId); + if (allMainStage.isEmpty()){ + throw new ServiceException(2000,"当前流水线不存在可构建任务!"); + } + + Boolean isVip = versionService.isVip(); + + Pipeline pipeline = pipelineService.findPipelineById(pipelineId); + + int size = pipelineIdOrInstanceId.size(); + + // 资源限制放入缓存中等待执行 + if ((!isVip && size >= 2) || (isVip && size >= 4) ){ + throw new ServiceException(2000,"并行任务已满,等待执行!"); + } + return pipeline; + } + + /** + * 执行流水线 + * @param runMsg 流水线信息 + * @return 流水线实例 + */ + public PipelineInstance beginExecPipeline(PipelineRunMsg runMsg){ + String pipelineId = runMsg.getPipelineId(); + Pipeline pipeline = pipelineService.findPipelineById(pipelineId); + pipeline.setState(2); + pipelineService.updatePipeline(pipeline); + runMsg.setPipeline(pipeline); + + logger.info("流水线{}开始运行",pipeline.getName()); + PipelineInstance pipelineInstance = pipelineInstanceService.initializeInstance(runMsg); + // 添加到缓存 + String instanceId = pipelineInstance.getInstanceId(); + pipelineInstanceService.instanceRuntime(pipelineInstance.getInstanceId()); + joinTemplate.joinQuery(pipelineInstance); + + // 运行实例放入内存中 + pipelineIdOrInstanceId.put(pipelineId, instanceId); + + try { + // 创建多阶段运行实例 + List stageList = stageExecService.createStageExecInstance(pipelineId, instanceId); + + List postprocessList = postExecService.createPipelinePostInstance(pipelineId, instanceId); + + PipelineDetails pipelineDetails = new PipelineDetails(); + + // 流水线基本运行信息 + pipelineDetails.setPipelineId(pipelineId); + pipelineDetails.setInstanceId(instanceId); + pipelineDetails.setRunWay(runMsg.getRunWay()); + pipelineDetails.setAgent(runMsg.getAgent()); + + // 流水线运行任务 + pipelineDetails.setStageList(stageList); + + // 流水线后置处理 + pipelineDetails.setPostprocessList(postprocessList); + + // 数据路径,源码,日志保存 + String sourceDir = utilService.findPipelineDefaultAddress(pipelineId,1); + String logDir = utilService.findPipelineDefaultAddress(pipelineId,2); + pipelineDetails.setSourceDir(sourceDir); + pipelineDetails.setLogDir(logDir); + + // 环境 + List scmList = scmService.findAllPipelineScm(); + pipelineDetails.setScmList(scmList); + + // 变量 + List variableList = variableService.findAllVariable(pipelineId); + pipelineDetails.setVariableList(variableList); + + AgentMessage agentMessage = new AgentMessage(); + agentMessage.setType("exec"); + agentMessage.setMessage(pipelineDetails); + agentMessage.setPipelineId(pipelineId); + + Agent agent = pipelineDetails.getAgent(); + + String id = agent.getAddress(); + + WebSocketSession session = SocketServerHandler.sessionMap.get(id); + if (Objects.isNull(session)) { + throw new SystemException("客户端推送消息失败,无法获取客户端连接,客户端信息:"+id); + } + + try { + SocketServerHandler.instance().sendHandleMessage(id,agentMessage); + } catch (Exception e) { + throw new SystemException("客户端推送消息失败,错误信息:" + e.getMessage()); + } + }catch (Exception e){ + logger.error("流水线执行出错了:{}",e.getMessage() ); + stop(pipelineId); + } + return pipelineInstance; + } + + @Override + public void stop(String pipelineId){ + Pipeline pipeline = pipelineService.findPipelineById(pipelineId); + + Agent agent = pipelineIdOrAgentId.get(pipelineId); + if (Objects.isNull(agent)){ + pipeline.setState(1); + pipelineService.updatePipeline(pipeline); + + PipelineInstanceQuery pipelineInstanceQuery = new PipelineInstanceQuery(); + pipelineInstanceQuery.setState(PipelineFinal.RUN_RUN); + pipelineInstanceQuery.setPipelineId(pipelineId); + List pipelineInstanceList = pipelineInstanceService.findPipelineInstanceList(pipelineInstanceQuery); + for (PipelineInstance pipelineInstance : pipelineInstanceList) { + String instanceId = pipelineInstance.getInstanceId(); + pipelineInstance.setRunStatus(PipelineFinal.RUN_HALT); + int runtime = pipelineInstanceService.findInstanceRuntime(instanceId); + pipelineInstance.setRunTime(runtime); + pipelineInstanceService.updateInstance(pipelineInstance); + } + removeExecCache(pipelineId); + return; + } + + try { + AgentMessage agentMessage = new AgentMessage(); + agentMessage.setType("stop"); + agentMessage.setMessage(pipelineId); + agentMessage.setPipelineId(pipelineId); + SocketServerHandler.instance().sendHandleMessage(agent.getAddress(),agentMessage); + }catch (Exception e){ + logger.error(e.getMessage()); + } + + // 添加资源配置 + // resourcesService.instanceResources(integer); + + // 更新流水线状态 + pipeline.setState(1); + pipelineService.updatePipeline(pipeline); + + PipelineInstanceQuery pipelineInstanceQuery = new PipelineInstanceQuery(); + pipelineInstanceQuery.setState(PipelineFinal.RUN_RUN); + pipelineInstanceQuery.setPipelineId(pipelineId); + List pipelineInstanceList = pipelineInstanceService.findPipelineInstanceList(pipelineInstanceQuery); + for (PipelineInstance pipelineInstance : pipelineInstanceList) { + pipelineInstance.setRunStatus(PipelineFinal.RUN_HALT); + int runtime = pipelineInstanceService.findInstanceRuntime(pipelineInstance.getInstanceId()); + pipelineInstance.setRunTime(runtime); + pipelineInstanceService.updateInstance(pipelineInstance); + } + removeExecCache(pipelineId); + } + + public void removeExecCache(String pipelineId){ + String instanceId = pipelineIdOrInstanceId.get(pipelineId); + PipelineInstanceServiceImpl.runTimeMap.remove(instanceId); + pipelineInstanceService.stopThread(instanceId); + pipelineIdOrInstanceId.remove(pipelineId); + } + + @Override + public void keepOn(String pipelineId){ + Agent agent = pipelineIdOrAgentId.get(pipelineId); + String id = agent.getAddress(); + AgentMessage agentMessage = new AgentMessage(); + agentMessage.setType("keepOn"); + agentMessage.setMessage(pipelineId); + agentMessage.setPipelineId(pipelineId); + WebSocketSession session = SocketServerHandler.sessionMap.get(id); + if (Objects.isNull(session)) { + throw new SystemException("客户端推送消息失败,无法获取客户端连接,客户端信息:"+id); + } + + try { + SocketServerHandler.instance().sendHandleMessage(id,agentMessage); + } catch (Exception e) { + throw new SystemException("客户端推送消息失败,错误信息:" + e.getMessage()); + } + } + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/model/TaskArtifact.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/model/TaskArtifact.java new file mode 100644 index 0000000..f9a71f4 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/model/TaskArtifact.java @@ -0,0 +1,64 @@ +package cd.casic.module.process.task.artifact.model; + + +import lombok.Data; + + +/** + * 任务推送制品模型 + */ +//@ApiModel +//@Join +//@Mapper +@Data +public class TaskArtifact { + + //@ApiProperty(name = "taskId",desc = "id") + private String taskId; + + //@ApiProperty(name = "groupId",desc = "groupId") + private String groupId; + + //@ApiProperty(name = "artifactId",desc = "artifactId") + private String artifactId; + + //@ApiProperty(name = "artifactType",desc = "推送类型") + private String artifactType; + + //@ApiProperty(name = "version",desc = "version") + private String version; + + //@ApiProperty(name = "fileType",desc = "文件类型") + private String fileType; + + //@ApiProperty(name = "fileAddress",desc = "文件地址") + private String fileAddress; + + //@ApiProperty(name = "putAddress",desc = "发送地址") + private String putAddress; + + //@ApiProperty(name = "dockerImage",desc = "docker镜像") + private String dockerImage; + + //授权id + //@ApiProperty(name="authId",desc="授权id") + private String authId; + + //@ApiProperty(name="authId",desc="rule") + private String rule; + +// @Mappings({ +// @Mapping(source = "repository.id",target = "xpackId") +// }) +// @JoinQuery(key = "xpackId") + private XpackRepository repository; + + //授权信息 + private Object auth; + + private String type; + + private int sort; + + private String instanceId; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/model/XpackRepository.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/model/XpackRepository.java new file mode 100644 index 0000000..b9a6637 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/model/XpackRepository.java @@ -0,0 +1,16 @@ +package cd.casic.module.process.task.artifact.model; + +import lombok.Data; + +@Data +public class XpackRepository { + + private String id; + + + private String name; + + + private String repositoryUrl; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/model/XpackRepositoryQuery.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/model/XpackRepositoryQuery.java new file mode 100644 index 0000000..75f9ed8 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/model/XpackRepositoryQuery.java @@ -0,0 +1,27 @@ +package cd.casic.module.process.task.artifact.model; + +import cd.casic.ci.commons.bean.order.Order; +import cd.casic.ci.commons.bean.order.OrderBuilders; +import cd.casic.framework.commons.pojo.PageParam; +import lombok.Data; + +import java.util.List; +@Data +public class XpackRepositoryQuery { + + // @ApiProperty(name = "orderParams", desc = "排序参数") + private List orderParams = OrderBuilders.instance().asc("id").get(); + + // @ApiProperty(name = "pageParam", desc = "分页参数") + private PageParam pageParam = new PageParam(); + + // @ApiProperty(name = "name", desc = "制品库名字") + private String name; + + // @ApiProperty(name = "repositoryType", desc = "制品库类型 maven、npm") + private String repositoryType; + + // @ApiProperty(name = "type", desc = "类型 local、remote、group") + private String type; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/service/TaskArtifactXpackService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/service/TaskArtifactXpackService.java new file mode 100644 index 0000000..129bebc --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/service/TaskArtifactXpackService.java @@ -0,0 +1,28 @@ +package cd.casic.module.process.task.artifact.service; + +import cd.casic.module.process.task.artifact.model.XpackRepository; + + +import java.util.List; + +public interface TaskArtifactXpackService { + + /** + * 获取xpack仓库 + * @param authId 认证id + * @return 仓库 + */ + List findAllRepository(String authId); + + + /** + * + * @param authId 认证id + * @param rpyId 仓库id + * @return 仓库地址 + */ + XpackRepository findRepository(String authId,String rpyId); + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/model/TaskBuild.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/model/TaskBuild.java new file mode 100644 index 0000000..738cc12 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/model/TaskBuild.java @@ -0,0 +1,52 @@ +package cd.casic.module.process.task.build.model; + + +import io.tiklab.toolkit.beans.annotation.Mapper; +import io.tiklab.toolkit.join.annotation.Join; +import lombok.Data; + + +/** + * 任务构建模型 + */ +//@ApiModel +//@Join +//@Mapper +@Data +public class TaskBuild { + + //@ApiProperty(name = "taskId",desc = "id") + private String taskId; + + //构建文件地址 + //@ApiProperty(name="buildAddress",desc="构建文件地址") + private String buildAddress; + + //构建命令 + //@ApiProperty(name="buildOrder",desc="构建命令") + private String buildOrder; + + //@ApiProperty(name="productRule",desc="制品规则") + private String productRule; + + + //@ApiProperty(name = "dockerName",desc="镜像名称") + private String dockerName; + + //@ApiProperty(name = "dockerVersion",desc="镜像版本") + private String dockerVersion; + + //@ApiProperty(name = "dockerFile",desc="DockerFile文件地址") + private String dockerFile; + + //@ApiProperty(name = "dockerOrder",desc="Docker部署命令") + private String dockerOrder; + + //顺序 + private int sort; + + //构建类型 + private String type; + + private String instanceId; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/TaskCode.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/TaskCode.java new file mode 100644 index 0000000..f5607cc --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/TaskCode.java @@ -0,0 +1,52 @@ +package cd.casic.module.process.task.code.model; + + +import lombok.Data; + +/** + * 任务源码模型 + */ +//@ApiModel +//@Join +//@Mapper +@Data +public class TaskCode { + + //@ApiProperty(name = "taskId",desc = "id") + private String taskId; + + //地址名 + //@ApiProperty(name="codeName",desc="地址名") + private String codeName; + + //代码源地址 + //@ApiProperty(name="codeAddress",desc="代码地址") + private String codeAddress; + + //分支 + //@ApiProperty(name="codeBranch",desc="分支") + private String codeBranch; + + //授权id + //@ApiProperty(name="authId",desc="授权id") + private String authId; + + //@ApiProperty(name="svnFile",desc="svn检出文件夹") + private String svnFile; + + // 第三方仓库ID + private String houseId; + + + //授权信息 + private Object auth; + + //顺序 + private int sort; + + //代码类型 + private String type; + + private String instanceId; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/ThirdBranch.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/ThirdBranch.java new file mode 100644 index 0000000..ffbc65e --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/ThirdBranch.java @@ -0,0 +1,17 @@ +package cd.casic.module.process.task.code.model; + +import lombok.Data; + +//import io.tiklab.core.BaseModel; +@Data +public class ThirdBranch { + + private String id; + + private String name; + + private Boolean isProtected = false ; + + private Boolean isDefault; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/ThirdHouse.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/ThirdHouse.java new file mode 100644 index 0000000..3a2af82 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/ThirdHouse.java @@ -0,0 +1,25 @@ +package cd.casic.module.process.task.code.model; + +import lombok.Data; + +//import io.tiklab.core.BaseModel; +@Data +public class ThirdHouse { + + private String id; + + private String path; + + private String name; + + private String pathWithSpace; + + private String nameWithSpace; + + private String houseWebUrl; + + private String houseSshUrl; + + private String defaultBranch; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/ThirdQuery.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/ThirdQuery.java new file mode 100644 index 0000000..a8122ee --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/ThirdQuery.java @@ -0,0 +1,23 @@ +package cd.casic.module.process.task.code.model; + +import lombok.Data; + +//import io.tiklab.core.BaseModel; +@Data +public class ThirdQuery { + + private String authId; + + private String houseId; + + // 查询条件 + private String query; + + // 页数 + private Integer page = 1; + + // 每页数量 + private Integer pageNumber = 50; + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/ThirdUser.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/ThirdUser.java new file mode 100644 index 0000000..7f3051b --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/model/ThirdUser.java @@ -0,0 +1,17 @@ +package cd.casic.module.process.task.code.model; + +//import io.tiklab.core.BaseModel; +import lombok.Data; + +@Data +public class ThirdUser { + + private String id; + + private String path; + + private String name; + + private String head; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/SpotbugsScanService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/SpotbugsScanService.java new file mode 100644 index 0000000..c6de997 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/SpotbugsScanService.java @@ -0,0 +1,44 @@ +package cd.casic.module.process.task.code.service; + + +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.module.process.task.codescan.model.SpotbugsBugQuery; +import cd.casic.module.process.task.codescan.model.SpotbugsBugSummary; + +import java.util.List; + +/** + * @author zcamy + */ +public interface SpotbugsScanService { + + + String creatSpotbugs(SpotbugsBugSummary bugSummary); + + + void updateSpotbugs(SpotbugsBugSummary bugSummary); + + + void deleteSpotbugs(String bugId); + + SpotbugsBugSummary findOneSpotbugs(String bugId); + + + List findAllSpotbugs(); + + + List findSpotbugsList(SpotbugsBugQuery bugQuery); + + + PageResult findSpotbugsPage(SpotbugsBugQuery bugQuery); + + + + + + + + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeGittokService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeGittokService.java new file mode 100644 index 0000000..45ae3ef --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeGittokService.java @@ -0,0 +1,47 @@ +package cd.casic.module.process.task.code.service; + + + + +import cd.casic.module.process.task.code.model.ThirdBranch; +import cd.casic.module.process.task.code.model.ThirdHouse; +import cd.casic.module.process.task.code.model.ThirdQuery; + +import java.util.List; + +public interface TaskCodeGittokService { + + /** + * 获取凭证认证的仓库列表 + * @param thirdQuery 凭证 + * @return 仓库列表 + */ + List findStoreHouseList(ThirdQuery thirdQuery); + + /** + * 获取凭证认证的仓库分支列表 + * @param thirdQuery 凭证 + * @return 分支列表 + */ + List findHouseBranchList(ThirdQuery thirdQuery); + + + /** + * 获取分支 + * @param authId 认证id + * @param rpyId 仓库id + * @param branchId 分支id + * @return 分支 + */ + ThirdBranch findOneBranch(String authId,String rpyId,String branchId); + + /** + * 获取凭证认证的指定的仓库 + * @param thirdQuery 凭证 + * @return 指定的仓库 + */ + ThirdHouse findStoreHouse(ThirdQuery thirdQuery); + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugCategory.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugCategory.java new file mode 100644 index 0000000..a173036 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugCategory.java @@ -0,0 +1,32 @@ +package cd.casic.module.process.task.codescan.model; + +/** + * @author Spotbugs代码扫描 + */ +public class SpotbugsBugCategory { + + + // bug描述 + private String category; + + private String description; + + + public String getCategory() { + return category; + } + + public SpotbugsBugCategory setCategory(String category) { + this.category = category; + return this; + } + + public String getDescription() { + return description; + } + + public SpotbugsBugCategory setDescription(String description) { + this.description = description; + return this; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugClass.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugClass.java new file mode 100644 index 0000000..3308701 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugClass.java @@ -0,0 +1,53 @@ +package cd.casic.module.process.task.codescan.model; + +/** + * @author zcamy + */ +public class SpotbugsBugClass { + + + private String classname; + + private int startLine; + + private int endLine; + + private String message; + + + public String getClassname() { + return classname; + } + + public SpotbugsBugClass setClassname(String classname) { + this.classname = classname; + return this; + } + + public int getStartLine() { + return startLine; + } + + public SpotbugsBugClass setStartLine(int startLine) { + this.startLine = startLine; + return this; + } + + public int getEndLine() { + return endLine; + } + + public SpotbugsBugClass setEndLine(int endLine) { + this.endLine = endLine; + return this; + } + + public String getMessage() { + return message; + } + + public SpotbugsBugClass setMessage(String message) { + this.message = message; + return this; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugClassStats.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugClassStats.java new file mode 100644 index 0000000..07ad914 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugClassStats.java @@ -0,0 +1,64 @@ +package cd.casic.module.process.task.codescan.model; + +import java.util.List; + +/** + * @author zcamy + */ +public class SpotbugsBugClassStats { + + private String className; + + private String classPath; + + private int bugNumber; + + private Boolean isInterface; + + private List bugInstanceList; + + public List getBugInstanceList() { + return bugInstanceList; + } + + public SpotbugsBugClassStats setBugInstanceList(List bugInstanceList) { + this.bugInstanceList = bugInstanceList; + return this; + } + + public String getClassName() { + return className; + } + + public SpotbugsBugClassStats setClassName(String className) { + this.className = className; + return this; + } + + public String getClassPath() { + return classPath; + } + + public SpotbugsBugClassStats setClassPath(String classPath) { + this.classPath = classPath; + return this; + } + + public int getBugNumber() { + return bugNumber; + } + + public SpotbugsBugClassStats setBugNumber(int bugNumber) { + this.bugNumber = bugNumber; + return this; + } + + public Boolean getInterface() { + return isInterface; + } + + public SpotbugsBugClassStats setInterface(Boolean anInterface) { + isInterface = anInterface; + return this; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugCode.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugCode.java new file mode 100644 index 0000000..5b3cde1 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugCode.java @@ -0,0 +1,41 @@ +package cd.casic.module.process.task.codescan.model; + +/** + * @author zcamy + */ +public class SpotbugsBugCode { + + private String abbrev; + + + private String cweid; + + private String description; + + public String getAbbrev() { + return abbrev; + } + + public SpotbugsBugCode setAbbrev(String abbrev) { + this.abbrev = abbrev; + return this; + } + + public String getCweid() { + return cweid; + } + + public SpotbugsBugCode setCweid(String cweid) { + this.cweid = cweid; + return this; + } + + public String getDescription() { + return description; + } + + public SpotbugsBugCode setDescription(String description) { + this.description = description; + return this; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugField.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugField.java new file mode 100644 index 0000000..acbc6f7 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugField.java @@ -0,0 +1,41 @@ +package cd.casic.module.process.task.codescan.model; + +/** + * @author zcamy + */ +public class SpotbugsBugField { + + + private String fieldName; + + private String signature; + + private String message; + + public String getFieldName() { + return fieldName; + } + + public SpotbugsBugField setFieldName(String fieldName) { + this.fieldName = fieldName; + return this; + } + + public String getSignature() { + return signature; + } + + public SpotbugsBugField setSignature(String signature) { + this.signature = signature; + return this; + } + + public String getMessage() { + return message; + } + + public SpotbugsBugField setMessage(String message) { + this.message = message; + return this; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugFileStats.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugFileStats.java new file mode 100644 index 0000000..52d9e44 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugFileStats.java @@ -0,0 +1,42 @@ +package cd.casic.module.process.task.codescan.model; + +import java.util.List; + +/** + * @author 文件代码bug信息 + */ +public class SpotbugsBugFileStats { + + private String path; + + private String bugNumber; + + private List bugInstanceList; + + public List getBugInstanceList() { + return bugInstanceList; + } + + public SpotbugsBugFileStats setBugInstanceList(List bugInstanceList) { + this.bugInstanceList = bugInstanceList; + return this; + } + + public String getPath() { + return path; + } + + public SpotbugsBugFileStats setPath(String path) { + this.path = path; + return this; + } + + public String getBugNumber() { + return bugNumber; + } + + public SpotbugsBugFileStats setBugNumber(String bugNumber) { + this.bugNumber = bugNumber; + return this; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugInstance.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugInstance.java new file mode 100644 index 0000000..e4474e0 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugInstance.java @@ -0,0 +1,140 @@ +package cd.casic.module.process.task.codescan.model; + +/** + * @author Spotbugs代码扫描,Bug实例 + */ +public class SpotbugsBugInstance { + + // bug类型 + private String bugType; + + // bug级别 + private String bugPriority; + + // 简略描述 + private String shortMessage; + + // 详细描述 + private String longMessage; + + // bug类描述 + private SpotbugsBugClass bugClass; + + // bug字段描述 + private SpotbugsBugField bugField; + + // bug方法描述 + private SpotbugsBugMethod bugMethod; + + // bug源码描述 + private SpotbugsBugSourceLine bugSourceLine; + + // 表示一个Bug的类别 + private SpotbugsBugCategory category; + + // 代码缺陷模式(BugPattern)的信息 + private SpotbugsBugPattern bugPattern; + + // 表示一个Bug的类型 + private SpotbugsBugCode bugCode; + + + public String getBugType() { + return bugType; + } + + public SpotbugsBugInstance setBugType(String bugType) { + this.bugType = bugType; + return this; + } + + public String getBugPriority() { + return bugPriority; + } + + public SpotbugsBugInstance setBugPriority(String bugPriority) { + this.bugPriority = bugPriority; + return this; + } + + public String getShortMessage() { + return shortMessage; + } + + public SpotbugsBugInstance setShortMessage(String shortMessage) { + this.shortMessage = shortMessage; + return this; + } + + public String getLongMessage() { + return longMessage; + } + + public SpotbugsBugInstance setLongMessage(String longMessage) { + this.longMessage = longMessage; + return this; + } + + public SpotbugsBugClass getBugClass() { + return bugClass; + } + + public SpotbugsBugInstance setBugClass(SpotbugsBugClass bugClass) { + this.bugClass = bugClass; + return this; + } + + public SpotbugsBugField getBugField() { + return bugField; + } + + public SpotbugsBugInstance setBugField(SpotbugsBugField bugField) { + this.bugField = bugField; + return this; + } + + public SpotbugsBugMethod getBugMethod() { + return bugMethod; + } + + public SpotbugsBugInstance setBugMethod(SpotbugsBugMethod bugMethod) { + this.bugMethod = bugMethod; + return this; + } + + public SpotbugsBugSourceLine getBugSourceLine() { + return bugSourceLine; + } + + public SpotbugsBugInstance setBugSourceLine(SpotbugsBugSourceLine bugSourceLine) { + this.bugSourceLine = bugSourceLine; + return this; + } + + public SpotbugsBugCategory getCategory() { + return category; + } + + public SpotbugsBugInstance setCategory(SpotbugsBugCategory category) { + this.category = category; + return this; + } + + public SpotbugsBugPattern getBugPattern() { + return bugPattern; + } + + public SpotbugsBugInstance setBugPattern(SpotbugsBugPattern bugPattern) { + this.bugPattern = bugPattern; + return this; + } + + public SpotbugsBugCode getBugCode() { + return bugCode; + } + + public SpotbugsBugInstance setBugCode(SpotbugsBugCode bugCode) { + this.bugCode = bugCode; + return this; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugMethod.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugMethod.java new file mode 100644 index 0000000..ebd49e1 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugMethod.java @@ -0,0 +1,62 @@ +package cd.casic.module.process.task.codescan.model; + +/** + * @author zcamy + */ +public class SpotbugsBugMethod { + + private String methodName; + + private String signature; + + private int startLine; + + private int endLine; + + private String message; + + public String getMethodName() { + return methodName; + } + + public SpotbugsBugMethod setMethodName(String methodName) { + this.methodName = methodName; + return this; + } + + public String getSignature() { + return signature; + } + + public SpotbugsBugMethod setSignature(String signature) { + this.signature = signature; + return this; + } + + public int getStartLine() { + return startLine; + } + + public SpotbugsBugMethod setStartLine(int startLine) { + this.startLine = startLine; + return this; + } + + public int getEndLine() { + return endLine; + } + + public SpotbugsBugMethod setEndLine(int endLine) { + this.endLine = endLine; + return this; + } + + public String getMessage() { + return message; + } + + public SpotbugsBugMethod setMessage(String message) { + this.message = message; + return this; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugPackageStats.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugPackageStats.java new file mode 100644 index 0000000..3f44ddb --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugPackageStats.java @@ -0,0 +1,55 @@ +package cd.casic.module.process.task.codescan.model; + +import java.util.List; + +/** + * @author zcamy + */ +public class SpotbugsBugPackageStats { + + private String packagePath; + + private int totalBugs; + + + private int totalTypes; + + private List classStatsList; + + + public String getPackagePath() { + return packagePath; + } + + public SpotbugsBugPackageStats setPackagePath(String packagePath) { + this.packagePath = packagePath; + return this; + } + + public int getTotalBugs() { + return totalBugs; + } + + public SpotbugsBugPackageStats setTotalBugs(int totalBugs) { + this.totalBugs = totalBugs; + return this; + } + + public int getTotalTypes() { + return totalTypes; + } + + public SpotbugsBugPackageStats setTotalTypes(int totalTypes) { + this.totalTypes = totalTypes; + return this; + } + + public List getClassStatsList() { + return classStatsList; + } + + public SpotbugsBugPackageStats setClassStatsList(List classStatsList) { + this.classStatsList = classStatsList; + return this; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugPattern.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugPattern.java new file mode 100644 index 0000000..7c20f96 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugPattern.java @@ -0,0 +1,63 @@ +package cd.casic.module.process.task.codescan.model; + +/** + * @author zcamy + */ +public class SpotbugsBugPattern { + + private String type; + + private String abbrev; + + private String category; + + + private String shortDescription; + + private String details; + + public String getType() { + return type; + } + + public SpotbugsBugPattern setType(String type) { + this.type = type; + return this; + } + + public String getAbbrev() { + return abbrev; + } + + public SpotbugsBugPattern setAbbrev(String abbrev) { + this.abbrev = abbrev; + return this; + } + + public String getCategory() { + return category; + } + + public SpotbugsBugPattern setCategory(String category) { + this.category = category; + return this; + } + + public String getShortDescription() { + return shortDescription; + } + + public SpotbugsBugPattern setShortDescription(String shortDescription) { + this.shortDescription = shortDescription; + return this; + } + + public String getDetails() { + return details; + } + + public SpotbugsBugPattern setDetails(String details) { + this.details = details; + return this; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugQuery.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugQuery.java new file mode 100644 index 0000000..dbde0c0 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugQuery.java @@ -0,0 +1,47 @@ +package cd.casic.module.process.task.codescan.model; + +import io.tiklab.core.order.Order; +import io.tiklab.core.order.OrderBuilders; +import io.tiklab.core.page.Page; + +import java.util.List; + +/** + * 代码扫描查询 + * @author zcamy + */ +public class SpotbugsBugQuery { + + private String pipelineId; + + private Page pageParam= new Page(); + + private List orderParams = OrderBuilders.instance().desc("scanTime").get(); + + public List getOrderParams() { + return orderParams; + } + + public SpotbugsBugQuery setOrderParams(List orderParams) { + this.orderParams = orderParams; + return this; + } + + public Page getPageParam() { + return pageParam; + } + + public SpotbugsBugQuery setPageParam(Page pageParam) { + this.pageParam = pageParam; + return this; + } + + public String getPipelineId() { + return pipelineId; + } + + public SpotbugsBugQuery setPipelineId(String pipelineId) { + this.pipelineId = pipelineId; + return this; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugSourceLine.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugSourceLine.java new file mode 100644 index 0000000..c3eec19 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugSourceLine.java @@ -0,0 +1,65 @@ +package cd.casic.module.process.task.codescan.model; + +/** + * @author zcamy + */ +public class SpotbugsBugSourceLine { + + + private String sourcePath; + + + private String sourceFile; + + private int startLine; + + private int endLine; + + private String message; + + + public String getSourcePath() { + return sourcePath; + } + + public SpotbugsBugSourceLine setSourcePath(String sourcePath) { + this.sourcePath = sourcePath; + return this; + } + + public String getSourceFile() { + return sourceFile; + } + + public SpotbugsBugSourceLine setSourceFile(String sourceFile) { + this.sourceFile = sourceFile; + return this; + } + + public int getStartLine() { + return startLine; + } + + public SpotbugsBugSourceLine setStartLine(int startLine) { + this.startLine = startLine; + return this; + } + + public int getEndLine() { + return endLine; + } + + public SpotbugsBugSourceLine setEndLine(int endLine) { + this.endLine = endLine; + return this; + } + + public String getMessage() { + return message; + } + + public SpotbugsBugSourceLine setMessage(String message) { + this.message = message; + return this; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugSummary.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugSummary.java new file mode 100644 index 0000000..7ab5fe5 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/SpotbugsBugSummary.java @@ -0,0 +1,184 @@ +package cd.casic.module.process.task.codescan.model; + +import io.tiklab.toolkit.beans.annotation.Mapper; +import io.tiklab.toolkit.join.annotation.Join; + +/** + * @author Spotbugs代码扫描信息 + */ +@Join +@Mapper(targetName = "io.tiklab.arbess.task.codescan.entity.SpotbugsScanEntity") +// @Mapper +public class SpotbugsBugSummary { + + // id + private String id; + + // 流水线id + private String pipelineId; + + // 扫描时间 + private String scanTime; + + // 总共扫描的类的数量。 + private String totalClasses; + + // 引用的类的数量 + private String referencedClasses; + + // 检测到的问题(Bugs)的数量 + private String totalBugs; + + // 项目中的包(package)数量 + private String numPackages; + + // Java 版本信息 + private String vmVersion; + + // 优先级为 1 的问题数 + private String priorityOne; + + // 优先级为 2 的问题数 + private String priorityTwo; + + // 优先级为 3 的问题数 + private String priorityThree; + + // xml文件报错地址 + private String xmlPath; + + // xml文件内容 + private String xmlFileContent; + + public String getXmlFileContent() { + return xmlFileContent; + } + + public void setXmlFileContent(String xmlFileContent) { + this.xmlFileContent = xmlFileContent; + } + + public String getXmlPath() { + return xmlPath; + } + + public SpotbugsBugSummary setXmlPath(String xmlPath) { + this.xmlPath = xmlPath; + return this; + } + + public String getVmVersion() { + return vmVersion; + } + + public SpotbugsBugSummary setVmVersion(String vmVersion) { + this.vmVersion = vmVersion; + return this; + } + + public String getId() { + return id; + } + + public SpotbugsBugSummary setId(String id) { + this.id = id; + return this; + } + + public String getPipelineId() { + return pipelineId; + } + + public SpotbugsBugSummary setPipelineId(String pipelineId) { + this.pipelineId = pipelineId; + return this; + } + + public String getScanTime() { + return scanTime; + } + + public SpotbugsBugSummary setScanTime(String scanTime) { + this.scanTime = scanTime; + return this; + } + + public String getTotalClasses() { + return totalClasses; + } + + public SpotbugsBugSummary setTotalClasses(String totalClasses) { + this.totalClasses = totalClasses; + return this; + } + + public String getReferencedClasses() { + return referencedClasses; + } + + public SpotbugsBugSummary setReferencedClasses(String referencedClasses) { + this.referencedClasses = referencedClasses; + return this; + } + + public String getTotalBugs() { + return totalBugs; + } + + public SpotbugsBugSummary setTotalBugs(String totalBugs) { + this.totalBugs = totalBugs; + return this; + } + + public String getNumPackages() { + return numPackages; + } + + public SpotbugsBugSummary setNumPackages(String numPackages) { + this.numPackages = numPackages; + return this; + } + + public String getPriorityOne() { + return priorityOne; + } + + public SpotbugsBugSummary setPriorityOne(String priorityOne) { + this.priorityOne = priorityOne; + return this; + } + + public String getPriorityTwo() { + return priorityTwo; + } + + public SpotbugsBugSummary setPriorityTwo(String priorityTwo) { + this.priorityTwo = priorityTwo; + return this; + } + + public String getPriorityThree() { + return priorityThree; + } + + public SpotbugsBugSummary setPriorityThree(String priorityThree) { + this.priorityThree = priorityThree; + return this; + } + + + + + + + + + + + + + + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/TaskCodeScan.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/TaskCodeScan.java new file mode 100644 index 0000000..fb3b00c --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/model/TaskCodeScan.java @@ -0,0 +1,150 @@ +package cd.casic.module.process.task.codescan.model; + +import io.tiklab.toolkit.beans.annotation.Mapper; +import io.tiklab.toolkit.join.annotation.Join; + + +/** + * 任务代码扫描模型 + */ +//@ApiModel +@Join +@Mapper +public class TaskCodeScan { + + //@ApiProperty(name = "taskId",desc = "id") + private String taskId; + + //@ApiProperty(name="projectName",desc="项目名称") + private String projectName; + + //授权id + //@ApiProperty(name="authName",desc="授权id") + private String authId; + + + // 是否开启断言 + private Boolean openAssert; + + // 是否启用调试模式 + private Boolean openDebug; + + // 扫描路径 + private String scanPath; + + // 扫描等级 min--最小,default--默认,max--最大 + private String scanGrade; + + // 扫描错误级别 default--默认 max--最大 + private String errGrade; + + //授权信息 + private Object auth; + + private int sort; + + private String type; + + private String instanceId; + + public String getInstanceId() { + return instanceId; + } + + public void setInstanceId(String instanceId) { + this.instanceId = instanceId; + } + + public String getScanGrade() { + return scanGrade; + } + + public TaskCodeScan setScanGrade(String scanGrade) { + this.scanGrade = scanGrade; + return this; + } + + public String getErrGrade() { + return errGrade; + } + + public TaskCodeScan setErrGrade(String errGrade) { + this.errGrade = errGrade; + return this; + } + + public String getScanPath() { + return scanPath; + } + + public TaskCodeScan setScanPath(String scanPath) { + this.scanPath = scanPath; + return this; + } + + public Boolean getOpenAssert() { + return openAssert; + } + + public TaskCodeScan setOpenAssert(Boolean openAssert) { + this.openAssert = openAssert; + return this; + } + + public Boolean getOpenDebug() { + return openDebug; + } + + public TaskCodeScan setOpenDebug(Boolean openDebug) { + this.openDebug = openDebug; + return this; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public int getSort() { + return sort; + } + + public void setSort(int sort) { + this.sort = sort; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getAuthId() { + return authId; + } + + public void setAuthId(String authId) { + this.authId = authId; + } + + public Object getAuth() { + return auth; + } + + public void setAuth(Object auth) { + this.auth = auth; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/service/TaskCodeScanService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/service/TaskCodeScanService.java new file mode 100644 index 0000000..5c3d133 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/service/TaskCodeScanService.java @@ -0,0 +1,62 @@ +package cd.casic.module.process.task.codescan.service; + + +import cd.casic.module.process.task.codescan.model.TaskCodeScan; + +import java.util.List; +/** + * 代码扫描服务接口 + */ +//@JoinProvider(model = TaskCodeScan.class) +public interface TaskCodeScanService { + + /** + * 创建流水线代码扫描 + * @param taskCodeScan 流水线代码扫描 + * @return 流水线代码扫描id + */ + String createCodeScan(TaskCodeScan taskCodeScan); + + /** + * 删除流水线代码扫描 + * @param codeScanId 流水线代码扫描id + */ + void deleteCodeScan(String codeScanId); + + /** + * 更新代码扫描信息 + * @param taskCodeScan 信息 + */ + void updateCodeScan(TaskCodeScan taskCodeScan); + + + Boolean codeScanValid(String taskType,TaskCodeScan taskCodeScan); + + + /** + * 根据配置id查询任务 + * @param taskId 配置id + * @return 任务 + */ + TaskCodeScan findCodeScanByAuth(String taskId); + + /** + * 查询代码扫描信息 + * @param codeScanId id + * @return 信息 + */ +// @FindOne + TaskCodeScan findOneCodeScan(String codeScanId); + + /** + * 查询所有流水线代码扫描 + * @return 流水线代码扫描列表 + */ +// @FindAll + List findAllCodeScan(); + + +// @FindList + List findAllCodeScanList(List idList); + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/MavenTest.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/MavenTest.java new file mode 100644 index 0000000..b70b310 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/MavenTest.java @@ -0,0 +1,49 @@ +package cd.casic.module.process.task.test.model; + +import lombok.Data; + +//@Join +//@Mapper +@Data +public class MavenTest { + + // id + private String id; + + // 流水线ID + private String pipelineId; + + // 创建时间 + private String createTime; + + // 名称 + private String name; + + // 包路径 + private String packagePath; + + // 执行人 + private String userId; + + // 全部测试用例 + private String allNumber; + + // 失败的用例数 + private String failNumber; + + // 错误的用例数 + private String errorNumber; + + // 跳过的用例数 + private String skipNumber; + + // 信息 + private String message; + + // 总测试实例ID + private String testId; + + // 测试状态 + private String testState; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/MavenTestQuery.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/MavenTestQuery.java new file mode 100644 index 0000000..c963c73 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/MavenTestQuery.java @@ -0,0 +1,30 @@ +package cd.casic.module.process.task.test.model; + + +import cd.casic.ci.commons.bean.order.Order; +import cd.casic.ci.commons.bean.order.OrderBuilders; +import cd.casic.framework.commons.pojo.PageParam; +import lombok.Data; + +import java.util.List; +// +//@Join +//@Mapper +@Data +public class MavenTestQuery { + + // 流水线ID + private String pipelineId; + + private String createTime; + + private String testId; + + //@ApiProperty(name ="pageParam",desc = "分页参数") + private PageParam pageParam= new PageParam(); + + //@ApiProperty(name ="orderParams",desc = "排序参数") + private List orderParams = OrderBuilders.instance().desc("createTime").get(); + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/RelevanceTestOn.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/RelevanceTestOn.java new file mode 100644 index 0000000..5503d65 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/RelevanceTestOn.java @@ -0,0 +1,36 @@ +package cd.casic.module.process.task.test.model; + +import cd.casic.ci.commons.bean.process.definition.Pipeline; +import lombok.Data; + + +//@ApiModel +//@Join +//@Mapper +@Data +public class RelevanceTestOn { + + + private String relevanceId; + +// @Mappings({ +// @Mapping(source = "pipeline.id",target = "pipelineId") +// }) +// @JoinQuery(key = "id") + private Pipeline pipeline; + + private String time; + + private String authId; + + private String createTime; + + private String testonId; + + private Integer status; + + private Object object; + + private String url; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/RelevanceTestOnQuery.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/RelevanceTestOnQuery.java new file mode 100644 index 0000000..b743444 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/RelevanceTestOnQuery.java @@ -0,0 +1,22 @@ +package cd.casic.module.process.task.test.model; + + + +import cd.casic.ci.commons.bean.order.Order; +import cd.casic.ci.commons.bean.order.OrderBuilders; +import cd.casic.framework.commons.pojo.PageParam; +import lombok.Data; + +import java.util.List; +@Data +public class RelevanceTestOnQuery { + + private String pipelineId; + + //@ApiProperty(name ="pageParam",desc = "分页参数") + private PageParam pageParam= new PageParam(); + + //@ApiProperty(name ="orderParams",desc = "排序参数") + private List orderParams = OrderBuilders.instance().desc("createTime").get(); + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TaskTest.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TaskTest.java new file mode 100644 index 0000000..5bb2558 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TaskTest.java @@ -0,0 +1,67 @@ +package cd.casic.module.process.task.test.model; + + +import lombok.Data; + +/** + * 任务测试模型 + */ +//@ApiModel +//@Join +//@Mapper +@Data +public class TaskTest { + + //@ApiProperty(name = "taskId",desc = "id") + private String taskId; + + //测试内容 + //@ApiProperty(name="testOrder",desc="测试内容",required = true) + private String testOrder; + + //@ApiProperty(name="address",desc="测试地址",required = true) + private String address; + +// @Mappings({ +// @Mapping(source = "testSpace.id",target = "testSpace") +// }) +// @JoinQuery(key = "testSpace") + private TestOnRepository testSpace; + +// @Mappings({ +// @Mapping(source = "testPlan.id",target = "testPlan") +// }) +// @JoinQuery(key = "testPlan") + private TestOnTestPlan testPlan; + +// @Mappings({ +// @Mapping(source = "apiEnv.id",target = "apiEnv") +// }) +// @JoinQuery(key = "apiEnv") + private TestOnApiEnv apiEnv; + +// @Mappings({ +// @Mapping(source = "appEnv.id",target = "appEnv") +// }) +// @JoinQuery(key = "appEnv") + private TestOnAppEnv appEnv; + +// @Mappings({ +// @Mapping(source = "webEnv.id",target = "webEnv") +// }) +// @JoinQuery(key = "webEnv") + private TestOnWebEnv webEnv; + + //@ApiProperty(name = "authId",desc="认证id") + private String authId; + + private Object auth; + + //测试类型 + private String type; + + //顺序 + private int sort; + + private String instanceId; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnApiEnv.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnApiEnv.java new file mode 100644 index 0000000..f05d9f5 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnApiEnv.java @@ -0,0 +1,14 @@ +package cd.casic.module.process.task.test.model; + +import lombok.Data; + +@Data +public class TestOnApiEnv { + + private String id; + + private String name; + + private String url; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnApiEnvQuery.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnApiEnvQuery.java new file mode 100644 index 0000000..f1ccf51 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnApiEnvQuery.java @@ -0,0 +1,20 @@ +package cd.casic.module.process.task.test.model; + +import cd.casic.ci.commons.bean.order.Order; +import cd.casic.ci.commons.bean.order.OrderBuilders; +import cd.casic.framework.commons.pojo.PageParam; +import lombok.Data; + +import java.util.List; +@Data +public class TestOnApiEnvQuery { + + private String repositoryId; + + // @ApiProperty(name = "orderParams", desc = "排序参数") + private List orderParams = OrderBuilders.instance().asc("id").get(); + + // @ApiProperty(name = "pageParam", desc = "分页参数") + private PageParam pageParam = new PageParam(); + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnAppEnv.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnAppEnv.java new file mode 100644 index 0000000..1997699 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnAppEnv.java @@ -0,0 +1,16 @@ +package cd.casic.module.process.task.test.model; + +import lombok.Data; + +@Data +public class TestOnAppEnv { + + + + private String id; + + private String name; + + private String url; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnAppEnvQuery.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnAppEnvQuery.java new file mode 100644 index 0000000..d8e6c82 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnAppEnvQuery.java @@ -0,0 +1,22 @@ +package cd.casic.module.process.task.test.model; + + + +import cd.casic.ci.commons.bean.order.Order; +import cd.casic.ci.commons.bean.order.OrderBuilders; +import cd.casic.framework.commons.pojo.PageParam; +import lombok.Data; + +import java.util.List; +@Data +public class TestOnAppEnvQuery { + + private String repositoryId; + + // @ApiProperty(name = "orderParams", desc = "排序参数") + private List orderParams = OrderBuilders.instance().asc("id").get(); + + // @ApiProperty(name = "pageParam", desc = "分页参数") + private PageParam pageParam = new PageParam(); + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanCaseInstance.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanCaseInstance.java new file mode 100644 index 0000000..9119af3 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanCaseInstance.java @@ -0,0 +1,28 @@ +package cd.casic.module.process.task.test.model; + + + +public class TestOnPlanCaseInstance { + + //@ApiProperty(name = "id", desc = "id") + private String id; + + //@ApiProperty(name = "testPlanInstanceId", desc = "所属测试计划实例") + private String testPlanInstanceId; + + //@ApiProperty(name = "caseInstanceId", desc = "用例实例id") + private String caseInstanceId; + + //@ApiProperty(name = "name", desc = "名称") + private String name; + + //@ApiProperty(name = "testType", desc = "测试类型") + private String testType; + + //@ApiProperty(name = "caseType", desc = "用例类型") + private String caseType; + + //@ApiProperty(name = "result", desc = "结果") + private Integer result; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanCaseInstanceBindQuery.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanCaseInstanceBindQuery.java new file mode 100644 index 0000000..3bd365a --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanCaseInstanceBindQuery.java @@ -0,0 +1,27 @@ +package cd.casic.module.process.task.test.model; + + +import cd.casic.ci.commons.bean.order.Order; +import cd.casic.ci.commons.bean.order.OrderBuilders; +import cd.casic.framework.commons.pojo.PageParam; +import lombok.Data; + +import java.util.List; +@Data +public class TestOnPlanCaseInstanceBindQuery { + + + // @ApiProperty(name = "caseInstanceId", desc = "历史id") + private String caseInstanceId; + + // @ApiProperty(name = "testPlanInstanceId", desc = "testPlanInstanceId") + private String testPlanInstanceId; + + + // @ApiProperty(name = "orderParams", desc = "排序参数") + private List orderParams = OrderBuilders.instance().asc("id").get(); + + // @ApiProperty(name = "pageParam", desc = "分页参数") + private PageParam pageParam = new PageParam(); + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanInstance.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanInstance.java new file mode 100644 index 0000000..7351caf --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanInstance.java @@ -0,0 +1,55 @@ +package cd.casic.module.process.task.test.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.sql.Timestamp; +@Data +@NoArgsConstructor +public class TestOnPlanInstance { + + //@ApiProperty(name = "id", desc = "id") + private String id; + + //@ApiProperty(name = "testPlanId", desc = "所属计划") + private String testPlanId; + + private TestOnTestPlan testPlan; + + //@ApiProperty(name = "repositoryId", desc = "所属仓库") + private String repositoryId; + + //@ApiProperty(name = "executeNumber", desc = "执行次数") + private Integer executeNumber; + + //@ApiProperty(name = "result", desc = "结果") + private Integer result; + + //@ApiProperty(name = "total", desc = "测试总次数") + private Integer total; + + //@ApiProperty(name = "passNum", desc = "通过数") + private Integer passNum; + + //@ApiProperty(name = "failNum", desc = "错误数") + private Integer failNum; + + //@ApiProperty(name = "passRate", desc = "通过率") + private String passRate; + + //@ApiProperty(name = "errorRate", desc = "错误率") + private String errorRate; + + //@ApiProperty(name = "createTime", desc = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Timestamp createTime; + + //@ApiProperty(name = "createUser", desc = "执行人") + private String createUser; + + private String testPlanName; + + private String url; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanQuery.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanQuery.java new file mode 100644 index 0000000..065bb0a --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanQuery.java @@ -0,0 +1,30 @@ +package cd.casic.module.process.task.test.model; + + +import cd.casic.ci.commons.bean.order.Order; +import cd.casic.ci.commons.bean.order.OrderBuilders; +import cd.casic.framework.commons.pojo.PageParam; +import lombok.Data; + +import java.util.List; +@Data +public class TestOnPlanQuery { + + // @ApiProperty(name = "orderParams", desc = "排序参数") + private List orderParams = OrderBuilders.instance().asc("id").get(); + + // @ApiProperty(name = "pageParam", desc = "分页参数") + private PageParam pageParam = new PageParam(); + + // @ApiProperty(name = "repositoryId", desc = "空间id") + private String repositoryId; + + // @ApiProperty(name = "name", desc = "测试计划名字,模糊匹配") + private String name; + + // @ApiProperty(name = "state", desc = "测试计划名字,模糊匹配") + private Integer state; + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanTestData.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanTestData.java new file mode 100644 index 0000000..f3f2c59 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnPlanTestData.java @@ -0,0 +1,19 @@ +package cd.casic.module.process.task.test.model; + +import lombok.Data; + +@Data +public class TestOnPlanTestData { + + + private String testPlanId; + + private String repositoryId; + + private String apiEnvId; + + private String webEnv; + + private String appEnv; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnRelevance.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnRelevance.java new file mode 100644 index 0000000..e8a8341 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnRelevance.java @@ -0,0 +1,17 @@ +package cd.casic.module.process.task.test.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TestOnRelevance { + + private String pipelineId; + + private String instanceId; + + private String authId; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnRepository.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnRepository.java new file mode 100644 index 0000000..81ca869 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnRepository.java @@ -0,0 +1,12 @@ +package cd.casic.module.process.task.test.model; + +import lombok.Data; + +@Data +public class TestOnRepository { + + private String id; + + private String name; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnTestPlan.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnTestPlan.java new file mode 100644 index 0000000..e374f49 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnTestPlan.java @@ -0,0 +1,12 @@ +package cd.casic.module.process.task.test.model; + +import lombok.Data; + +@Data +public class TestOnTestPlan { + + private String id; + + private String name; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnWebEnv.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnWebEnv.java new file mode 100644 index 0000000..03823c8 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnWebEnv.java @@ -0,0 +1,14 @@ +package cd.casic.module.process.task.test.model; + +import lombok.Data; + +@Data +public class TestOnWebEnv { + + private String id; + + private String name; + + private String preUrl; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnWebEnvQuery.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnWebEnvQuery.java new file mode 100644 index 0000000..62ea4dd --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestOnWebEnvQuery.java @@ -0,0 +1,24 @@ +package cd.casic.module.process.task.test.model; + + +import cd.casic.ci.commons.bean.order.Order; +import cd.casic.ci.commons.bean.order.OrderBuilders; +import cd.casic.framework.commons.pojo.PageParam; +import lombok.Data; + +import java.util.List; +@Data +public class TestOnWebEnvQuery { + + private String repositoryId; + + // @ApiProperty(name = "orderParams", desc = "排序参数") + private List orderParams = OrderBuilders.instance().asc("id").get(); + + // @ApiProperty(name = "pageParam", desc = "分页参数") + private PageParam pageParam = new PageParam(); + + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestPlanExecResult.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestPlanExecResult.java new file mode 100644 index 0000000..8befc63 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/model/TestPlanExecResult.java @@ -0,0 +1,23 @@ +package cd.casic.module.process.task.test.model; + + +import lombok.Data; + +@Data +public class TestPlanExecResult { + + //@ApiProperty(name = "status", desc = "状态类型:0:未开始,1:正在执行,2:结束") + private Integer status; + + //@ApiProperty(name = "testPlanInstance", desc = "测试实例") + + private TestOnPlanInstance testPlanInstance; + + // @ApiProperty( + // name = "testPlanCaseInstanceList", + // desc = "测试计划用例历史" + // ) + // private List testPlanCaseInstanceList; + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/service/MavenTestService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/service/MavenTestService.java new file mode 100644 index 0000000..beda551 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/service/MavenTestService.java @@ -0,0 +1,33 @@ +package cd.casic.module.process.task.test.service; + + + +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.module.process.task.test.model.MavenTest; +import cd.casic.module.process.task.test.model.MavenTestQuery; + +import java.util.List; + +public interface MavenTestService { + + String creatMavenTest(MavenTest mavenTest) ; + + void updateMavenTest(MavenTest mavenTest) ; + + + void deleteMavenTest(String testId) ; + + + MavenTest findOneMavenTest(String testId) ; + + List findAllMavenTest() ; + + + List findMavenTestList(MavenTestQuery testQuery); + + + PageResult findMavenTestPage(MavenTestQuery testQuery); + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/service/RelevanceTestOnService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/service/RelevanceTestOnService.java new file mode 100644 index 0000000..2e48466 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/service/RelevanceTestOnService.java @@ -0,0 +1,78 @@ +package cd.casic.module.process.task.test.service; + + +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.module.process.task.test.model.RelevanceTestOn; +import cd.casic.module.process.task.test.model.RelevanceTestOnQuery; +import cd.casic.module.process.task.test.model.TestOnRelevance; + +import java.util.List; + +//@JoinProvider(model = RelevanceTestOn.class) +public interface RelevanceTestOnService { + + + void createRelevance(TestOnRelevance testOnRelevance); + + + /** + * 创建 + * @param relevanceTestOn 关联关系 + * @return 关联关系id + */ + String createRelevance(RelevanceTestOn relevanceTestOn); + + /** + * 删除 + * @param relevanceId 关联id + */ + void deleteRelevance(String relevanceId); + + + /** + * 根据配置id删除任务 + * @param pipelineId 流水线id + */ + void deleteAllRelevance(String pipelineId); + + /** + * 获取流水线关联的testOn关系 + * @param pipelineId 流水线id + * @return 关联关系 + */ + List findAllRelevance(String pipelineId); + + + /** + * 获取流水线关联的testOn关系 + * @param relevanceTestOnQuery 条件 + * @return 关联关系 + */ + PageResult findAllRelevancePage(RelevanceTestOnQuery relevanceTestOnQuery); + + + /** + * 查询单个信息 + * @param relevanceId 关联id + * @return 关联关系 + */ +// @FindOne + RelevanceTestOn findOneRelevance(String relevanceId); + + /** + * 查询所有信息 + * @return test信息集合 + */ +// @FindAll + List findAllRelevance(); + +// @FindList + List findAllRelevanceList(List idList); + + + + + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/service/TaskTestOnService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/service/TaskTestOnService.java new file mode 100644 index 0000000..afd27c3 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/test/service/TaskTestOnService.java @@ -0,0 +1,121 @@ +package cd.casic.module.process.task.test.service; + + + +import cd.casic.module.process.task.test.model.*; + +import java.util.List; + +public interface TaskTestOnService { + + /** + * 根据名称查询仓库 + * @param authId 认证id + * @param rpyId 仓库id + * @return 仓库 + */ + TestOnRepository findOneRepository(String authId, String rpyId); + + + /** + * 获取测试计划 + * @param authId 认证id + * @param planId 测试计划id + * @return 测试计划 + */ + TestOnTestPlan findOneTestPlan(String authId, String planId); + + + /** + * 获取test仓库 + * @param authId 认证id + * @return 仓库 + */ + List findAllRepository(String authId); + + + /** + * 获取teston测试计划 + * @param authId 认证id + * @param rpyId 仓库id + * @return 测试计划 + */ + List findAllTestPlan(String authId, String rpyId); + + /** + * 获取测试计划环境 + * @param authId 认证id + * @param rpyId 仓库id + * @param env 环境 + * @return 环境信息 + */ + List findAllEnv(String authId,String rpyId,String env); + + /** + * 获取测试集合执行需要的环境 + * @param authId teston环境地址 + * @param testPlanId 测试计划ID + * @return 需要的环境 + */ + List findTestPlanEnv(String authId,String testPlanId); + + /** + * 获取api环境地址 + * @param authId teston环境地址 + * @param id id + * @return api环境 + */ + TestOnApiEnv findOneTestOnApiEnv(String authId, String id); + + /** + * 获取app环境地址 + * @param authId teston环境地址 + * @param id id + * @return app环境 + */ + TestOnAppEnv findOneTestOnAppEnv(String authId, String id); + + /** + * 获取web环境地址 + * @param authId teston环境地址 + * @param id id + * @return web环境 + */ + TestOnWebEnv findOneTestOnWebEnv(String authId, String id); + + + /** + * 执行测试计划 + * @param authId 认证id + * @param testPlanTestData 执行信息 + */ + String execTestPlan(String authId, TestOnPlanTestData testPlanTestData); + + + /** + * 获取测试结果详情 + * @param authId 认证id + * @return 测试结果 + */ + List findTestPlanExecResult(String authId, String instanceId); + + + /** + * 获取测试结果 + * @param authId 认证id + * @return 测试结果 + */ + TestPlanExecResult findPlanExecResult(String authId,String testPlanId); + + /** + * 查询测试计划的详情 + * @param authId 认证id + * @param instanceId 实例id + * @return 测试计划详情 + */ + TestOnPlanInstance findAllTestPlanInstance(String authId, String instanceId); + + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/ws/config/MatflowWebSocketConfig.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/ws/config/MatflowWebSocketConfig.java new file mode 100644 index 0000000..4fb9c3b --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/ws/config/MatflowWebSocketConfig.java @@ -0,0 +1,39 @@ +package cd.casic.module.process.ws.config; + + +import cd.casic.module.process.ws.server.SocketServerHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.config.annotation.EnableWebSocket; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; +import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean; + + +@Configuration +@EnableWebSocket +public class MatflowWebSocketConfig implements WebSocketConfigurer { + + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + registry.addHandler(socketHandler(), "/arbess/handler") + .addInterceptors() + .setAllowedOrigins("*"); + } + + @Bean + public SocketServerHandler socketHandler() { + return new SocketServerHandler(); + } + + @Bean + public ServletServerContainerFactoryBean createWebSocketContainer() { + ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean(); + container.setMaxTextMessageBufferSize(5120 * 5120); // 设置文本消息缓冲区大小 + container.setMaxBinaryMessageBufferSize(5120 * 5120); // 设置二进制消息缓冲区大小 + return container; + } + + +} + diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/ws/server/SocketServerHandler.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/ws/server/SocketServerHandler.java new file mode 100644 index 0000000..f761e3c --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/ws/server/SocketServerHandler.java @@ -0,0 +1,152 @@ +package cd.casic.module.process.ws.server; + +import cd.casic.ci.commons.bean.exception.SystemException; +import cd.casic.ci.commons.bean.utils.PipelineUtil; +import cd.casic.ci.commons.bean.work.agent.AgentMessage; +import cd.casic.ci.commons.bean.work.agent.model.Agent; +import cd.casic.module.process.support.agent.service.AgentService; +import com.alibaba.fastjson.JSONObject; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.web.socket.*; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.CopyOnWriteArrayList; + +@Service +public class SocketServerHandler implements WebSocketHandler { + @Resource + WebSocketMessageService webSocketMessageService; + + @Resource + AgentService agentService; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + private final List dataList = new CopyOnWriteArrayList<>(); + + // 线程安全的集合,用于存储客户端会话 + public static final Map sessionMap = new HashMap<>(); + + public static SocketServerHandler instance(){ + return new SocketServerHandler(); + } + + @Override + public void afterConnectionEstablished(WebSocketSession session) throws Exception { + // 连接建立时的处理逻辑 + Agent agent = connentAgent(String.valueOf(session.getUri())); + sessionMap.put(agent.getAddress(),session); + agentService.initAgent(agent); + logger.info("客户端建立连接,{}", agent.getAddress()); + } + + @Override + public void handleMessage(WebSocketSession session, WebSocketMessage message) throws Exception { + // 接收到消息时的处理逻辑 + BinaryMessage binaryMessage = (BinaryMessage) message; + ByteBuffer payload = binaryMessage.getPayload(); + String receivedString = new String(payload.array(), StandardCharsets.UTF_8); + AgentMessage agentMessage = JSONObject.parseObject(receivedString, AgentMessage.class); + logger.warn("接受客户端消息,消息类型:{}", agentMessage.getType()); + + dataList.add(agentMessage); + } + + + @Scheduled(fixedRate = 800) + protected void syncMessage(){ + if (dataList.isEmpty()){ + return; + } + + int processedCount = 0; // 计数器 + for (AgentMessage message : dataList) { + if (processedCount >= 4) { // 限制每次处理的数量为6 + break; + } + + // 执行处理逻辑 + webSocketMessageService.distributeMessage(message); + processedCount++; + + // 处理完成后删除内存中的数据 + dataList.remove(message); + } + } + + /** + * 发送消息 + * @param id 消息ID + * @param agentMessage 消息内容 + */ + public void sendHandleMessage(String id, AgentMessage agentMessage){ + WebSocketSession session = sessionMap.get(id); + if (Objects.isNull(session) || !session.isOpen()) { + throw new SystemException("客户端推送消息失败,无法获取客户端连接,客户端信息:"+id); + } + // 接收到消息时的处理逻辑 + String jsonString = JSONObject.toJSONString(agentMessage); + logger.warn("向客户端推送消息:{}",agentMessage.getType()); + try { + session.sendMessage(new TextMessage(jsonString)); + } catch (IOException e) { + throw new SystemException("客户端推送消息失败,错误信息:" + e.getMessage()); + } + } + + @Override + public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { + // 发生传输错误时的处理逻辑 + logger.error("连接过程异常,异常信息:{}", exception.getMessage()); + Agent agent = connentAgent(Objects.requireNonNull(session.getUri()).toString()); + // connetMap.remove(agent.getAddress()); + sessionMap.remove(agent.getAddress(),session); + } + + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { + // 连接关闭时的处理逻辑 + Agent agent = connentAgent(Objects.requireNonNull(session.getUri()).toString()); + String address = agent.getAddress(); + logger.warn("客户端关闭连接,id:{},原因:{}", address,closeStatus.getReason()); + sessionMap.remove(address,session); + // agentService.deleteAgent(address); + } + + @Override + public boolean supportsPartialMessages() { + return false; + } + + /** + * 解析连接信息 + * @param uri 连接地址 + * @return 连接信息 + */ + public Agent connentAgent(String uri){ + String[] split = Objects.requireNonNull(uri).split("\\?"); + String[] split1 = split[1].split("&"); + Agent agent = new Agent(); + agent.setName(split1[0]); + agent.setTenantId(split1[1]); + agent.setIp(split1[2]); + agent.setCreateTime(PipelineUtil.date(1)); + agent.setAddress(split1[0]+"-"+split1[1]); + return agent; + } + + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/ws/server/WebSocketMessageService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/ws/server/WebSocketMessageService.java new file mode 100644 index 0000000..c04a043 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/ws/server/WebSocketMessageService.java @@ -0,0 +1,16 @@ +package cd.casic.module.process.ws.server; + +import cd.casic.ci.commons.bean.work.agent.AgentMessage; + + +public interface WebSocketMessageService { + + + /** + * 分发处理消息 + * @param agentMessage 消息内容 + */ + String distributeMessage(AgentMessage agentMessage); + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/ws/server/impl/WebSocketMessageServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/ws/server/impl/WebSocketMessageServiceImpl.java new file mode 100644 index 0000000..2edf2ad --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/ws/server/impl/WebSocketMessageServiceImpl.java @@ -0,0 +1,364 @@ +package cd.casic.module.process.ws.server.impl; + +import cd.casic.ci.commons.bean.engine.job.TaskInstance; +import cd.casic.ci.commons.bean.engine.postprocess.PostprocessInstance; +import cd.casic.ci.commons.bean.process.definition.Pipeline; +import cd.casic.ci.commons.bean.process.instance.PipelineInstance; +import cd.casic.ci.commons.bean.process.stage.StageInstance; +import cd.casic.ci.commons.bean.support.deploy.TaskDeployInstance; +import cd.casic.ci.commons.bean.utils.PipelineFileUtil; +import cd.casic.ci.commons.bean.utils.PipelineUtil; +import cd.casic.ci.commons.bean.work.agent.AgentMessage; +import cd.casic.module.process.engine.task.TasksInstanceService; +import cd.casic.module.process.home.service.PipelineHomeService; +import cd.casic.module.process.pipeline.definition.PipelineService; +import cd.casic.module.process.pipeline.execute.service.impl.PipelineExecServiceImpl; +import cd.casic.module.process.process.instance.PipelineInstanceService; +import cd.casic.module.process.stages.service.StageInstanceServer; +import cd.casic.module.process.support.postprocess.service.PostprocessInstanceService; +import cd.casic.module.process.support.util.PipelineUtilService; +import cd.casic.module.process.support.util.util.PipelineFinal; +import cd.casic.module.process.task.code.service.SpotbugsScanService; +import cd.casic.module.process.task.test.model.MavenTest; +import cd.casic.module.process.task.test.model.TestOnRelevance; +import cd.casic.module.process.task.test.service.MavenTestService; +import cd.casic.module.process.task.test.service.RelevanceTestOnService; +import cd.casic.module.process.ws.server.WebSocketMessageService; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@Service +public class WebSocketMessageServiceImpl implements WebSocketMessageService { + + @Autowired + PipelineService pipelineService; + + @Autowired + PipelineInstanceService pipelineInstanceService; + + @Autowired + StageInstanceServer stageInstanceServer; + + @Autowired + TasksInstanceService tasksInstanceService; + + @Autowired + MavenTestService mavenTestService; + + @Autowired + SpotbugsScanService spotbugsScanService; + + @Autowired + RelevanceTestOnService relevanceTestOnService; + + @Autowired + PipelineUtilService utilService; + + @Autowired + PipelineHomeService homeService; + + @Autowired + PostprocessInstanceService postprocessInstanceService; + + @Autowired + TaskDeployInstanceServiceImpl deployInstanceService; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public String distributeMessage(AgentMessage agentMessage){ + String type = agentMessage.getType(); + Object message = agentMessage.getMessage(); + if (type.contains("deploy_instance_log")){ + messageTaskDeployInstanceLogHandle( message); + }else if (type.contains("deploy_end_instance_log")){ + messageTaskDeployInstanceLogHandle(message); + }else if (type.contains("log")){ + logMessageHandle(message); + }else if (type.contains("pipeline_run")){ + pipelineMessageHandle( message); + }else if (type.contains("stage_run")){ + stageMessageHandle(message); + } else if (type.contains("post_run")){ + postMessageHandle(message); + } else if (type.contains("task_run")){ + taskMessageHandle(message); + }else if (type.contains("maven_unittest")){ + mavenTestTaskMessageHandle(message); + }else if (type.contains("task_codescan")){ + codeScanTaskMessageHandle(message); + } else if (type.contains("test_teston_exec")){ + testOnTaskMessageHandle(message); + }else if (type.contains("send_message")){ + messageTaskMessageHandle(message); + } + return null; + } + + /** + * 流水线消息处理 + * @param message 消息内容 + */ + private void pipelineMessageHandle(Object message){ + String jsonString = JSONObject.toJSONString(message); + PipelineInstance sourceInstance = JSONObject.parseObject(jsonString,PipelineInstance.class); + // 更新实例状态 + String instanceId = sourceInstance.getInstanceId(); + String runStatus = sourceInstance.getRunStatus(); + PipelineInstance instance = pipelineInstanceService.findOneInstance(instanceId); + int runtime = pipelineInstanceService.findInstanceRuntime(instanceId); + instance.setRunTime(runtime+1); + instance.setRunStatus(runStatus); + pipelineInstanceService.updateInstance(instance); + + // 设置流水线为未运行 + String pipelineId = instance.getPipeline().getId(); + Pipeline pipeline = pipelineService.findPipelineById(pipelineId); + pipeline.setState(1); + pipelineService.updatePipeline(pipeline); + PipelineExecServiceImpl.pipelineIdOrInstanceId.remove(pipelineId); + + sendPipelineRunMessage(pipeline,instanceId,runStatus); + + } + + // 发送消息 + public void sendPipelineRunMessage(Pipeline pipeline,String instanceId,String state){ + Map map = homeService.initMap(pipeline); + map.put("instanceId",instanceId); + map.put("link", PipelineFinal.RUN_LINK); + PipelineInstance instance = pipelineInstanceService.findOneInstance(instanceId); + + switch (state){ + case PipelineFinal.RUN_SUCCESS ->{ + map.put("message","运行成功"); + map.put("execStatus","运行成功"); + map.put("colour","info"); + } + case PipelineFinal.RUN_ERROR ->{ + map.put("colour","warning"); + map.put("message","运行失败"); + map.put("execStatus","运行失败"); + } + case PipelineFinal.RUN_HALT ->{ + map.put("colour","warning"); + map.put("message","停止运程"); + map.put("execStatus","停止运程"); + } + default -> { + map.put("colour","info"); + map.put("message","运行成功"); + map.put("execStatus","运行成功"); + } + } + + String time = PipelineUtil.formatDateTime(instance.getRunTime()); + map.put("execTime",time); + homeService.log(PipelineFinal.LOG_TYPE_RUN, map); + map.put("dmMessage",true); + homeService.settingMessage(PipelineFinal.MES_RUN, map); + } + + /** + * 阶段消息处理 + * @param message 消息内容 + */ + private void stageMessageHandle(Object message){ + String jsonString = JSONObject.toJSONString(message); + StageInstance sourceStageInstance = JSONObject.parseObject(jsonString,StageInstance.class); + StageInstance stageInstance = stageInstanceServer.findOneStageInstance(sourceStageInstance.getId()); + stageInstance.setStageTime(sourceStageInstance.getStageTime()); + stageInstance.setStageState(sourceStageInstance.getStageState()); + stageInstanceServer.updateStageInstance(stageInstance); + } + + /** + * 任务消息处理 + * @param message 消息内容 + */ + private void taskMessageHandle(Object message){ + String jsonString = JSONObject.toJSONString(message); + + TaskInstance sourceTaskInstance = JSONObject.parseObject(jsonString,TaskInstance.class); + String id = sourceTaskInstance.getId(); + TaskInstance taskInstance = tasksInstanceService.findOneTaskInstance(id); + + TaskInstance mapTaskInstance = TasksInstanceServiceImpl.taskInstanceMap.get(id); + if (!Objects.isNull(mapTaskInstance)){ + String runLog = mapTaskInstance.getRunLog(); + taskInstance.setRunTime(sourceTaskInstance.getRunTime()); + taskInstance.setRunLog(runLog); + taskInstance.setRunState(sourceTaskInstance.getRunState()); + String logAddress = taskInstance.getLogAddress(); + PipelineFileUtil.logWriteFile(runLog,logAddress); + } + tasksInstanceService.updateTaskInstance(taskInstance); + TasksInstanceServiceImpl.taskInstanceMap.remove(taskInstance.getId()); + } + + /** + * 日志消息处理 + * @param message 消息内容 + */ + private void logMessageHandle(Object message){ + String jsonString = JSONObject.toJSONString(message); + TaskInstance sourceTaskInstance = JSONObject.parseObject(jsonString,TaskInstance.class); + String id = sourceTaskInstance.getId(); + TaskInstance taskInstance = TasksInstanceServiceImpl.taskInstanceMap.get(id); + if (!Objects.isNull(taskInstance)){ + if (!StringUtils.isEmpty(sourceTaskInstance.getRunLog())){ + sourceTaskInstance.setRunLog(taskInstance.getRunLog()+"\n"+sourceTaskInstance.getRunLog()); + }else { + sourceTaskInstance.setRunLog(taskInstance.getRunLog()); + } + } + updateTaskInstance(sourceTaskInstance); + TasksInstanceServiceImpl.taskInstanceMap.put(sourceTaskInstance.getId(), sourceTaskInstance); + } + + /** + * 日志过长更新 + * @param taskInstance 日志信息 + */ + private void updateTaskInstance(TaskInstance taskInstance){ + if (Objects.isNull(taskInstance)){ + return; + } + + String id = taskInstance.getId(); + TaskInstance oneTaskInstance = tasksInstanceService.findOneTaskInstance(id); + if (Objects.isNull(oneTaskInstance)){ + return; + } + + String runLog = taskInstance.getRunLog(); + if (StringUtils.isEmpty(runLog)){ + return; + } + + String[] split = runLog.split("\n"); + if (taskInstance.getTaskSort() < 2){ + if (split.length < 3){ + return; + } + }else { + if (split.length < 30){ + return; + } + } + String logAddress = oneTaskInstance.getLogAddress(); + logger.info("日志过长,写入文件:{}",logAddress); + + PipelineFileUtil.logWriteFile(runLog,logAddress); + + taskInstance.setRunLog(""); + } + + /** + * 单元测试结果 + * @param message 消息内容 + */ + private void mavenTestTaskMessageHandle(Object message){ + String jsonString = JSONObject.toJSONString(message); + MavenTest mavenTest = JSONObject.parseObject(jsonString, MavenTest.class); + String id = mavenTest.getId(); + MavenTest oneMavenTest = mavenTestService.findOneMavenTest(id); + if (Objects.isNull(oneMavenTest)){ + mavenTestService.creatMavenTest(mavenTest); + }else { + mavenTestService.updateMavenTest(mavenTest); + } + } + + /** + * 发送消息结果 + * @param message 消息内容 + */ + private void messageTaskMessageHandle(Object message){ + String jsonString = JSONObject.toJSONString(message); + TaskMessage taskMessage = JSONObject.parseObject(jsonString, TaskMessage.class); + Pipeline pipeline = pipelineService.findOnePipeline(taskMessage.getPipelineId()); + Map stringObjectMap = homeService.initMap(pipeline); + stringObjectMap.putAll(taskMessage.getMap()); + homeService.message(stringObjectMap,taskMessage.getList()); + } + + /** + * 发送消息结果 + * @param message 消息内容 + */ + private void messageTaskDeployInstanceLogHandle(Object message){ + String jsonString = JSONObject.toJSONString(message); + TaskDeployInstance deployInstance = JSONObject.parseObject(jsonString, TaskDeployInstance.class); + TaskDeployInstance sourceDeployInstance = deployInstanceService.findDeployInstance(deployInstance.getId()); + sourceDeployInstance.setRunStatus(deployInstance.getRunStatus()); + sourceDeployInstance.setRunTime(deployInstance.getRunTime()); + deployInstanceService.updateDeployInstance(sourceDeployInstance); + } + + private void messageTaskDeployInstanceLogEndHandle(Object message){ + String jsonString = JSONObject.toJSONString(message); + TaskDeployInstance deployInstance = JSONObject.parseObject(jsonString, TaskDeployInstance.class); + TaskDeployInstance sourceDeployInstance = deployInstanceService.findDeployInstance(deployInstance.getId()); + sourceDeployInstance.setRunStatus(deployInstance.getRunStatus()); + deployInstanceService.updateDeployInstance(sourceDeployInstance); + } + + /** + * 代码扫描结果 + * @param message 消息内容 + */ + private void codeScanTaskMessageHandle(Object message){ + String jsonString = JSONObject.toJSONString(message); + SpotbugsBugSummary spotbugsBugSummary = JSONObject.parseObject(jsonString, SpotbugsBugSummary.class); + String xmlFileContent = spotbugsBugSummary.getXmlFileContent(); + String pipelineId = spotbugsBugSummary.getPipelineId(); + + String logAddress = utilService.findPipelineDefaultAddress(pipelineId, 2)+"/spotbugs/spotbugs-"+new Date().getTime()+".xml"; + + PipelineFileUtil.createFile(logAddress); + PipelineFileUtil.logWriteFile(xmlFileContent,logAddress); + logger.info("服务端报保存代码扫描文件:{}", logAddress); + spotbugsBugSummary.setXmlPath(logAddress); + spotbugsScanService.creatSpotbugs(spotbugsBugSummary); + } + + /** + * testOn自动化测试 + * @param message 消息内容 + */ + private void testOnTaskMessageHandle(Object message){ + String jsonString = JSONObject.toJSONString(message); + TestOnRelevance testOnRelevance = JSONObject.parseObject(jsonString, TestOnRelevance.class); + relevanceTestOnService.createRelevance(testOnRelevance); + } + + /** + * testOn自动化测试 + * @param message 消息内容 + */ + private void postMessageHandle(Object message){ + String jsonString = JSONObject.toJSONString(message); + PostprocessInstance postprocessInstance = JSONObject.parseObject(jsonString, PostprocessInstance.class); + String instanceId = postprocessInstance.getInstanceId(); + + List postInstanceList = postprocessInstanceService.findPipelinePostInstance(instanceId); + if (postInstanceList.isEmpty()){ + return; + } + PostprocessInstance postInstance = postInstanceList.get(0); + postInstance.setPostState(postprocessInstance.getPostState()); + postprocessInstanceService.updatePostInstance(postInstance); + } + + +}