diff --git a/modules/module-ci-commons/pom.xml b/modules/module-ci-commons/pom.xml index 28ea6509..94750763 100644 --- a/modules/module-ci-commons/pom.xml +++ b/modules/module-ci-commons/pom.xml @@ -23,6 +23,10 @@ cd.casic.boot module-system-api + + org.springframework.boot + spring-boot-starter-jdbc + \ No newline at end of file diff --git a/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/commons/Pagination.java b/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/commons/Pagination.java new file mode 100644 index 00000000..5edebf77 --- /dev/null +++ b/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/commons/Pagination.java @@ -0,0 +1,26 @@ +package cd.casic.ci.commons.bean.commons; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @ClassName Pagination + * @Author hopeli + * @Date 2025/5/2 21:32 + * @Version 1.0 + */ +@Data +public class Pagination implements Serializable { + @Serial + private static final long serialVersionUID = 5016662499561189494L; + private int pageSize = 10; + private int currentPage = 1; + private int totalRecord; + private int totalPage; + private int beginIndex; + private int endIndex; + private List dataList; +} diff --git a/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/jdbc/JdbcTemplate.java b/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/jdbc/JdbcTemplate.java new file mode 100644 index 00000000..c6d08f6b --- /dev/null +++ b/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/jdbc/JdbcTemplate.java @@ -0,0 +1,26 @@ +package cd.casic.ci.commons.bean.jdbc; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.sql.DataSource; + +/** + * @ClassName JdbcTemplate + * @Author hopeli + * @Date 2025/5/2 21:29 + * @Version 1.0 + */ + +public class JdbcTemplate extends org.springframework.jdbc.core.JdbcTemplate { + private static Logger logger = LoggerFactory.getLogger(JdbcTemplate.class); + + public JdbcTemplate(DataSource dataSource) { + super(dataSource); + } + + public JdbcTemplate(DataSource dataSource, boolean lazyInit) { + super(dataSource, lazyInit); + } + +} diff --git a/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/join/annototion/Join.java b/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/join/annototion/Join.java new file mode 100644 index 00000000..61d159d3 --- /dev/null +++ b/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/join/annototion/Join.java @@ -0,0 +1,18 @@ +package cd.casic.ci.commons.join.annototion; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @ClassName Join + * @Author hopeli + * @Date 2025/5/2 18:38 + * @Version 1.0 + */ +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Join { + Class model() default Object.class; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/core/context/AppHomeContext.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/core/context/AppHomeContext.java new file mode 100644 index 00000000..3dbeed68 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/core/context/AppHomeContext.java @@ -0,0 +1,22 @@ +package cd.casic.module.process.core.context; + +/** + * @ClassName AppHomeContext + * @Author hopeli + * @Date 2025/5/2 18:25 + * @Version 1.0 + */ +public class AppHomeContext { + private static String appHome; + + public AppHomeContext() { + } + + public static String getAppHome() { + return appHome; + } + + public static void setAppHome(String appHome) { + AppHomeContext.appHome = appHome; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/engine/execute/impl/PipelineExecServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/engine/execute/impl/PipelineExecServiceImpl.java index b0a794ea..85994e83 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/engine/execute/impl/PipelineExecServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/engine/execute/impl/PipelineExecServiceImpl.java @@ -4,7 +4,7 @@ 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.process.definition.Pipeline; -import cd.casic.ci.commons.bean.process.definition.Variable; +import cd.casic.module.process.support.variable.model.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; @@ -19,7 +19,7 @@ import cd.casic.module.process.support.postprocess.service.PostprocessExecServic import cd.casic.module.process.engine.task.TasksExecService; import cd.casic.module.process.pipeline.instance.service.PipelineInstanceServiceImpl; import cd.casic.module.process.process.definition.PipelineService; -import cd.casic.module.process.process.definition.VariableService; +import cd.casic.module.process.support.variable.service.VariableService; import cd.casic.module.process.process.instance.PipelineInstanceService; import cd.casic.module.process.process.setting.ResourcesService; import cd.casic.module.process.process.setting.ScmService; @@ -27,7 +27,7 @@ import cd.casic.module.process.process.stage.StageExecService; import cd.casic.module.process.process.stage.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.version.service.PipelineVersionService; 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; diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/pipeline/definition/impl/PipelineServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/pipeline/definition/impl/PipelineServiceImpl.java index bd65ebe2..5b966474 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/pipeline/definition/impl/PipelineServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/pipeline/definition/impl/PipelineServiceImpl.java @@ -5,7 +5,6 @@ import cd.casic.ci.commons.bean.process.definition.*; import cd.casic.ci.commons.bean.process.instance.PipelineInstance; import cd.casic.ci.commons.bean.utils.PipelineFileUtil; import cd.casic.ci.commons.bean.utils.PipelineUtil; -import cd.casic.framework.commons.exception.ErrorCode; import cd.casic.framework.commons.exception.ServiceException; import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants; import cd.casic.framework.commons.pojo.PageResult; @@ -19,7 +18,7 @@ import cd.casic.module.process.pipeline.definition.PipelineOpenService; import cd.casic.module.process.pipeline.definition.PipelineService; import cd.casic.module.process.pipeline.definition.entity.PipelineEntity; -import cd.casic.module.process.process.definition.VariableService; +import cd.casic.module.process.support.variable.service.VariableService; import cd.casic.module.process.process.definition.dao.PipelineDao; import cd.casic.module.process.process.instance.PipelineInstanceService; import cd.casic.module.process.process.stage.StageService; @@ -31,14 +30,10 @@ import cd.casic.module.process.support.util.PipelineUtilService; import cd.casic.module.process.support.util.util.PipelineFinal; import cd.casic.module.process.toolkit.beans.BeanMapper; import cd.casic.module.process.toolkit.join.JoinTemplate; -import cd.casic.module.process.user.user.User; import jakarta.annotation.Resource; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import javax.security.auth.login.LoginContext; import java.io.File; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; 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 dc087205..547d457d 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 @@ -6,7 +6,7 @@ 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.module.process.support.variable.model.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; @@ -19,7 +19,7 @@ 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.support.variable.service.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; @@ -27,7 +27,7 @@ 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.version.service.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; diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/process/setting/impl/CacheServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/process/setting/impl/CacheServiceImpl.java index 8c448ff6..e1f73111 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/process/setting/impl/CacheServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/process/setting/impl/CacheServiceImpl.java @@ -4,16 +4,12 @@ package cd.casic.module.process.process.setting.impl; import cd.casic.ci.commons.bean.process.setting.Cache; import cd.casic.module.process.process.setting.CacheService; import cd.casic.module.process.process.setting.dao.CacheDao; -import cd.casic.module.process.support.home.PipelineVersionService; +import cd.casic.module.process.support.version.service.PipelineVersionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Objects; - -import static cd.casic.ci.commons.bean.commons.PipelineConstants.DEFAULT_CLEAN_CACHE_DAY; @Service diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/PipelineDataService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/PipelineDataService.java new file mode 100644 index 00000000..09f710f5 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/PipelineDataService.java @@ -0,0 +1,15 @@ +package cd.casic.module.process.support.util; + +/** + * @ClassName PipelineDataService + * @Author hopeli + * @Date 2025/5/2 18:27 + * @Version 1.0 + */ +public interface PipelineDataService { + + /** + * 清理消息数据 + */ + void cleanMessageData(); +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/impl/PipelineDataServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/impl/PipelineDataServiceImpl.java new file mode 100644 index 00000000..42dabdbe --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/impl/PipelineDataServiceImpl.java @@ -0,0 +1,55 @@ +package cd.casic.module.process.support.util.impl; + +import cd.casic.ci.commons.bean.process.definition.Pipeline; +import cd.casic.module.process.message.message.MessageDmNoticeService; +import cd.casic.module.process.message.message.model.MessageDmNotice; +import cd.casic.module.process.message.message.model.MessageDmNoticeQuery; +import cd.casic.module.process.message.message.model.MessageNoticePatch; +import cd.casic.module.process.pipeline.definition.PipelineService; +import cd.casic.module.process.support.util.PipelineDataService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @ClassName PipelineDataServiceImpl + * @Author hopeli + * @Date 2025/5/2 18:27 + * @Version 1.0 + */ +@Service +public class PipelineDataServiceImpl implements PipelineDataService { + + @Resource + PipelineService pipelineService; + + @Resource + MessageDmNoticeService messageDmNoticeService; + + + @Override + public void cleanMessageData(){ + + List allPipeline = pipelineService.findAllPipelineNoQuery(); + + for (Pipeline pipeline : allPipeline) { + String domainId = pipeline.getId(); + + MessageDmNoticeQuery messageDmNoticeQuery = new MessageDmNoticeQuery(); + messageDmNoticeQuery.setDomainId(domainId); + List messageDmNoticeList = + messageDmNoticeService.findMessageDmNoticeList(messageDmNoticeQuery); + + if (!messageDmNoticeList.isEmpty()){ + continue; + } + + // 克隆消息模版 + MessageNoticePatch messageNoticePatch = new MessageNoticePatch(); + messageNoticePatch.setDomainId(domainId); + messageNoticePatch.setUserList(List.of(String.valueOf(pipeline.getAdminUserRespDTO().getId()))); + messageDmNoticeService.initMessageDmNotice(messageNoticePatch); + } + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/impl/PipelineUtilServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/impl/PipelineUtilServiceImpl.java new file mode 100644 index 00000000..080babad --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/impl/PipelineUtilServiceImpl.java @@ -0,0 +1,126 @@ +package cd.casic.module.process.support.util.impl; + +import cd.casic.ci.commons.bean.exception.ApplicationException; +import cd.casic.ci.commons.bean.utils.PipelineFileUtil; +import cd.casic.ci.commons.bean.utils.PipelineUtil; +import cd.casic.module.process.core.context.AppHomeContext; +import cd.casic.module.process.support.util.PipelineUtilService; +import cd.casic.module.process.support.util.util.PipelineFinal; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @ClassName PipelineUtilServiceImpl + * @Author hopeli + * @Date 2025/5/2 18:22 + * @Version 1.0 + */ +@Service +public class PipelineUtilServiceImpl implements PipelineUtilService{ + @Value("${DATA_HOME:null}") + String dataHome; + + @Value("${jdk.address:null}") + String jdkPath; + + @Override + public String instanceAddress(int type) { + if (Objects.isNull(dataHome) || "null".equals(dataHome)){ + dataHome = "/opt/tiklab/tiklab-arbess"; + } + + return switch (type) { + case 0 -> dataHome + PipelineFinal.MATFLOW_INSTABCE; + case 1 -> dataHome + PipelineFinal.MATFLOW_WORKSPACE; + default -> dataHome + PipelineFinal.MATFLOW_LOGS; + }; + } + + @Override + public String findPipelineDefaultAddress(String pipelineId, int type) { + String path = instanceAddress(type); + int systemType = PipelineUtil.findSystemType(); + if (systemType == 1){ + if (!PipelineUtil.isNoNull(pipelineId)){ + return path + "\\"; + }else { + return path + "\\" + pipelineId + "\\"; + } + }else { + if (!PipelineUtil.isNoNull(pipelineId)){ + return path + "/"; + }else { + return path + "/" + pipelineId + "/" ; + } + } + } + + + @Override + public String findFile(String pipelineId,String fileDir, String regex) { + List list = new ArrayList<>(); + + File file3 = new File(fileDir); + if (file3.exists() && file3.isFile()){ + return fileDir; + } + + File file2 = new File(fileDir + "/" + regex); + if (file2.exists() && file2.isFile()){ + return file2.getAbsolutePath(); + } + + List filePath = PipelineFileUtil.getFilePath(new File(fileDir),new ArrayList<>()); + for (String s : filePath) { + File file = new File(s); + + //拼装正则匹配 + boolean matches = file.getName().matches("^(.*" + regex + ".*)"); + + //正则匹配 + boolean matches1 = file.getName().matches(regex); + + File file1 = new File(s + "/" + regex); + if (file1.exists()){ + return file1.getAbsolutePath(); + } + + if (matches || matches1){ + list.add(s); + } + } + + if (list.size() > 1){ + StringBuilder s = new StringBuilder("匹配到多个文件,请重新输入文件信息。"); + for (String s1 : list) { + s.append("\n").append(s1); + } + throw new ApplicationException(s.toString()); + } + + if (list.size()== 1){ + return list.get(0); + } + throw new ApplicationException("没有匹配到文件。"); + } + + + @Override + public String findJavaPath(){ + + if (!"null".equals(jdkPath)){ + return jdkPath; + } + + String appHome = AppHomeContext.getAppHome(); + String applyRootDir = new File(appHome).getParentFile().getParent(); + + return appHome+"/embbed/jdk-16.0.2"; + + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/util/PipelineFinal.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/util/PipelineFinal.java index 9fa04dcf..4efa1d53 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/util/PipelineFinal.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/util/PipelineFinal.java @@ -19,6 +19,8 @@ public class PipelineFinal { public static final String MATFLOW_LOGS = "/artifact"; + public static final String MATFLOW_INSTABCE = "/instance"; + /** * 流水线运行状态 @@ -208,6 +210,13 @@ public class PipelineFinal { public static final Integer DEFAULT_CLEAN_CACHE_DAY = 7; + // 上传类型 + public static final String TASK_TYPE_UPLOAD = "upload"; + public static final String TASK_UPLOAD_HADESS = "upload_hadess"; + public static final String TASK_UPLOAD_SSH = "upload_ssh"; + public static final String TASK_UPLOAD_NEXUS = "upload_nexus"; + public static final String TASK_UPLOAD_DOCKER = "upload_docker"; + diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/util/PipelineRequestUtil.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/util/PipelineRequestUtil.java new file mode 100644 index 00000000..0e12c273 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/util/util/PipelineRequestUtil.java @@ -0,0 +1,222 @@ +package cd.casic.module.process.support.util.util; + +/** + * @ClassName TaskArtifactServiceImpl + * @Author hopeli + * @Date 2025/5/5 06:04 + * @Version 1.0 + */ + +import cd.casic.ci.commons.bean.exception.ApplicationException; +import cd.casic.ci.commons.bean.exception.SystemException; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.client.RestTemplate; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@Component +public class PipelineRequestUtil { + + @Autowired + RestTemplate restTemplate; + + @Autowired + PipelineRequestUtil requestUtil; + + + /** + * 发起Post请求 + * @param headers 请求头 + * @param requestUrl 请求地址 + * @param param 请求参数 + * @param tClass 返回类型 + * @return 请求结果 + * @throws ApplicationException 请求失败 + */ + public T requestPost(HttpHeaders headers, String requestUrl, Object param, Class tClass){ + + // 创建带有头部和请求体的 HttpEntity + HttpEntity requestEntity = new HttpEntity<>(param, headers); + ResponseEntity response; + try { + response = restTemplate.exchange(requestUrl, HttpMethod.POST, requestEntity, JSONObject.class); + }catch (ResourceAccessException e){ + boolean timedOut = Objects.requireNonNull(e.getMessage()).contains("Read timed out"); + boolean connectOut = Objects.requireNonNull(e.getMessage()).contains("Connect timed out"); + if (timedOut || connectOut){ + throw new ApplicationException(50001,"请求超时!"); + } + throw new SystemException(String.valueOf(e)); + } + + JSONObject jsonObject = response.getBody(); + return findBody(jsonObject,tClass); + } + + public List requestPostList(HttpHeaders headers, String requestUrl, Object param, Class tClass){ + + // 创建带有头部和请求体的 HttpEntity + HttpEntity requestEntity = new HttpEntity<>(param, headers); + + ResponseEntity response; + try { + response = restTemplate.exchange(requestUrl, HttpMethod.POST, requestEntity, JSONObject.class); + }catch (ResourceAccessException e){ + boolean timedOut = Objects.requireNonNull(e.getMessage()).contains("Read timed out"); + boolean connectOut = Objects.requireNonNull(e.getMessage()).contains("Connect timed out"); + if (timedOut || connectOut){ + throw new ApplicationException(50001,"请求超时!"); + } + throw new RuntimeException(e); + } + + JSONObject jsonObject = response.getBody(); + return findBodyList(jsonObject,tClass); + } + + + /** + * 发起Get请求 + * @param headers 请求头 + * @param requestUrl 请求地址 + * @param tClass 返回类型 + * @return 请求结果 + * @throws ApplicationException 请求失败 + */ + public T requestGet(HttpHeaders headers, String requestUrl, Object param, Class tClass){ + + // 创建带有头部和请求体的 HttpEntity + HttpEntity requestEntity = new HttpEntity<>(param, headers); + + ResponseEntity response; + try { + response = restTemplate.exchange(requestUrl, HttpMethod.GET, requestEntity, JSONObject.class); + }catch (ResourceAccessException e){ + boolean timedOut = Objects.requireNonNull(e.getMessage()).contains("Read timed out"); + boolean connectOut = Objects.requireNonNull(e.getMessage()).contains("Connect timed out"); + if (timedOut || connectOut){ + throw new ApplicationException(50001,"请求超时!"); + } + throw new RuntimeException(); + } + JSONObject jsonObject = response.getBody(); + + return findBody(jsonObject,tClass); + } + + public List requestGetList(HttpHeaders headers, String requestUrl, Object param, Class tClass){ + + // 创建带有头部和请求体的 HttpEntity + HttpEntity requestEntity = new HttpEntity<>(param, headers); + + ResponseEntity response; + try { + response = restTemplate.exchange(requestUrl, HttpMethod.GET, requestEntity, JSONObject.class); + }catch (ResourceAccessException e){ + boolean timedOut = Objects.requireNonNull(e.getMessage()).contains("Read timed out"); + boolean connectOut = Objects.requireNonNull(e.getMessage()).contains("Connect timed out"); + if (timedOut || connectOut){ + throw new ApplicationException(50001,"请求超时!"); + } + throw new SystemException(String.valueOf(e)); + } + JSONObject jsonObject = response.getBody(); + return findBodyList(jsonObject,tClass); + } + + + /** + * 转换接口请求内容 + * @param jsonObject 接口返回数据 + * @param tClass 转换模型 + * @return 转换后对象 + * @param 对象类型 + */ + public T findBody(JSONObject jsonObject,Class tClass){ + if (Objects.isNull(jsonObject)){ + throw new ApplicationException(50001,"获取接口返回数据为空!"); + } + Integer code = jsonObject.getInteger("code"); + if (code != 0){ + String msg = jsonObject.getString("msg"); + throw new SystemException("错误!,Message:" + msg); + } + + if (tClass.isAssignableFrom(String.class)){ + String data = jsonObject.getString("data"); + return (T)data; + } + + JSONObject data = jsonObject.getJSONObject("data"); + if (Objects.isNull(data)){ + return null; + } + + return JSONObject.parseObject(data.toJSONString(), tClass); + } + + /** + * 转换接口请求内容 + * @param jsonObject 接口返回数据 + * @param tClass 转换模型 + * @return 转换后对象 + * @param 对象类型 + */ + public List findBodyList(JSONObject jsonObject,Class tClass){ + + if (Objects.isNull( jsonObject)){ + throw new SystemException("获取返回值为空!"); + } + Integer code = jsonObject.getInteger("code"); + if (code != 0){ + String msg = jsonObject.getString("msg"); + throw new ApplicationException("错误!,Message:"+msg); + } + if(Objects.isNull(tClass)){ + return null; + } + + JSONArray data = jsonObject.getJSONArray("data"); + if (Objects.isNull(data)){ + return null; + } + return data.toJavaList(tClass); + } + + /** + * + * @param mediaType 请求类型 MediaType.MULTIPART_FORM_DATA --formdata MediaType.APPLICATION_JSON --json + * @param headerMap 其他请求头 + * @return 请求头 + */ + public HttpHeaders initHeaders(MediaType mediaType, Map headerMap){ + HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Collections.singletonList(mediaType)); + if (Objects.isNull(headerMap)){ + return headers; + } + for (Map.Entry header : headerMap.entrySet()) { + String key = header.getKey(); + String value = header.getValue(); + headers.set(key,value); + } + return headers; + } + + + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/dao/VariableDao.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/dao/VariableDao.java index cd769cac..1525bb15 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/dao/VariableDao.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/dao/VariableDao.java @@ -1,9 +1,13 @@ -package cd.casic.module.process.service.support.variable.dao; +package cd.casic.module.process.support.variable.dao; import cd.casic.framework.mybatis.core.mapper.BaseMapperX; -import cd.casic.module.process.service.support.variable.dataobject.VariableDo; +import cd.casic.module.process.support.variable.dataobject.VariableDo; +import cd.casic.module.process.support.variable.model.Variable; +import cd.casic.module.process.support.variable.model.VariableQuery; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * @author by mianbin * @Classname VariableDao @@ -12,4 +16,15 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface VariableDao extends BaseMapperX { + String createVariable(Variable variable); + + void deleteVariable(String varId); + + void updateVariable(Variable variable); + + Variable findOneVariable(String varId); + + List findAllVariable(); + + List findVariableList(VariableQuery query); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/dataobject/VariableDo.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/dataobject/VariableDo.java index 7bbf7dff..8017952e 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/dataobject/VariableDo.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/dataobject/VariableDo.java @@ -1,4 +1,4 @@ -package cd.casic.module.process.service.support.variable.dataobject; +package cd.casic.module.process.support.variable.dataobject; import cd.casic.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/process/definition/ExecVariable.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/model/ExecVariable.java similarity index 91% rename from modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/process/definition/ExecVariable.java rename to modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/model/ExecVariable.java index ec1bb771..c3f379c6 100644 --- a/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/process/definition/ExecVariable.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/model/ExecVariable.java @@ -1,4 +1,4 @@ -package cd.casic.ci.commons.bean.process.definition; +package cd.casic.module.process.support.variable.model; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/process/definition/Variable.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/model/Variable.java similarity index 94% rename from modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/process/definition/Variable.java rename to modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/model/Variable.java index 6896052e..26471b43 100644 --- a/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/process/definition/Variable.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/model/Variable.java @@ -1,4 +1,4 @@ -package cd.casic.ci.commons.bean.process.definition; +package cd.casic.module.process.support.variable.model; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/process/definition/VariableQuery.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/model/VariableQuery.java similarity index 91% rename from modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/process/definition/VariableQuery.java rename to modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/model/VariableQuery.java index d95de23a..c8045fab 100644 --- a/modules/module-ci-commons/src/main/java/cd/casic/ci/commons/bean/process/definition/VariableQuery.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/model/VariableQuery.java @@ -1,7 +1,6 @@ -package cd.casic.ci.commons.bean.process.definition; +package cd.casic.module.process.support.variable.model; import cd.casic.framework.commons.pojo.PageParam; -import cn.hutool.db.Page; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/process/definition/ExecVariableService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/service/ExecVariableService.java similarity index 75% rename from modules/module-ci-process-biz/src/main/java/cd/casic/module/process/process/definition/ExecVariableService.java rename to modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/service/ExecVariableService.java index c388f90d..5fe31395 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/process/definition/ExecVariableService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/service/ExecVariableService.java @@ -1,7 +1,7 @@ -package cd.casic.module.process.process.definition; +package cd.casic.module.process.support.variable.service; -import cd.casic.ci.commons.bean.process.definition.ExecVariable; +import cd.casic.module.process.support.variable.model.ExecVariable; /** * 执行变量服务接口 diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/process/definition/VariableService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/service/VariableService.java similarity index 88% rename from modules/module-ci-process-biz/src/main/java/cd/casic/module/process/process/definition/VariableService.java rename to modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/service/VariableService.java index 2265180f..10f01b3d 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/process/definition/VariableService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/service/VariableService.java @@ -1,7 +1,7 @@ -package cd.casic.module.process.process.definition; +package cd.casic.module.process.support.variable.service; -import cd.casic.ci.commons.bean.process.definition.Variable; -import cd.casic.ci.commons.bean.process.definition.VariableQuery; +import cd.casic.module.process.support.variable.model.Variable; +import cd.casic.module.process.support.variable.model.VariableQuery; import java.util.List; diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/service/impl/ExecVariableServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/service/impl/ExecVariableServiceImpl.java new file mode 100644 index 00000000..d425f693 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/service/impl/ExecVariableServiceImpl.java @@ -0,0 +1,10 @@ +package cd.casic.module.process.support.variable.service.impl; + +/** + * @ClassName ExecVariableServiceImpl + * @Author hopeli + * @Date 2025/5/2 18:47 + * @Version 1.0 + */ +public class ExecVariableServiceImpl implements ExecVariableService { +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/service/impl/VariableServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/service/impl/VariableServiceImpl.java new file mode 100644 index 00000000..5a8d5746 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/variable/service/impl/VariableServiceImpl.java @@ -0,0 +1,173 @@ +package cd.casic.module.process.support.variable.service.impl; + +import cd.casic.ci.commons.bean.utils.PipelineUtil; +import cd.casic.module.process.support.variable.dao.VariableDao; +import cd.casic.module.process.support.variable.dataobject.VariableDo; +import cd.casic.module.process.support.variable.model.Variable; +import cd.casic.module.process.support.variable.model.VariableQuery; +import cd.casic.module.process.support.variable.service.VariableService; +import cd.casic.module.process.toolkit.beans.BeanMapper; +import jakarta.annotation.Resource; +import org.apache.commons.lang3.text.StrSubstitutor; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @ClassName VariableServiceImpl + * @Author hopeli + * @Date 2025/5/2 18:49 + * @Version 1.0 + */ +public class VariableServiceImpl implements VariableService { + + @Resource + private VariableDao variableDao; + + + public String replaceVariable(String pipelineId,String taskId,String order){ + Map map = new HashMap<>(); + //替换全局变量 + List allVariable = findAllVariable(pipelineId); + if (!allVariable.isEmpty()){ + for (Variable variable : allVariable) { + String varKey = variable.getVarKey(); + String varValue = variable.getVarValue(); + map.put(varKey,varValue); + } + } + //替换局部变量 + List variableList = findAllVariable(taskId); + if (!variableList.isEmpty()){ + for (Variable variable : variableList) { + String varValue = variable.getVarValue(); + String varKey = variable.getVarKey(); + map.put(varKey,varValue); + } + } + + StrSubstitutor substitutor = new StrSubstitutor(map); + return substitutor.replace(order); + } + + @Override + public String createVariable(Variable variable) { + String taskType = variable.getVarType(); + variable.setCreateTime(PipelineUtil.date(1)); + if (taskType.equals("single")){ + String values = updateValues(variable.getValueList()); + variable.setVarValues(values); + } + return variableDao.createVariable(variable); + } + + private String updateValues(List list ){ + StringBuilder values = new StringBuilder(); + for (String s : list) { + if (!PipelineUtil.isNoNull(values.toString())){ + values = new StringBuilder(s); + }else { + values.append(",").append(s); + } + } + return values.toString(); + } + + /** + * 删除变量 + * @param varId 变量id + */ + @Override + public void deleteVariable(String varId) { + variableDao.deleteVariable(varId); + } + + /** + * 更新变量 + * @param variable 变量信息 + */ + @Override + public void updateVariable(Variable variable) { + String taskType = variable.getVarType(); + if (taskType.equals("single")){ + String values = updateValues(variable.getValueList()); + variable.setVarValues(values); + } + variableDao.updateVariable(variable); + } + + /** + * 查询单个变量 + * @param varId 变量id + * @return 变量信息 + */ + @Override + public Variable findOneVariable(String varId) { + return variableDao.findOneVariable(varId); + } + + /** + * 查询所有变量 + * @return 变量集合 + */ + public List findAllVariable() { + List allVariable = variableDao.findAllVariable(); + if (allVariable == null || allVariable.isEmpty()){ + return Collections.emptyList(); + } + return allVariable; + } + + /** + * 查询流水线所有变量 + * @param taskId 流水线id + * @return 变量 + */ + @Override + public List findAllVariable(String taskId) { + List allVariable = findAllVariable(); + if (allVariable.isEmpty()){ + return Collections.emptyList(); + } + List list = new ArrayList<>(); + for (Variable variable : allVariable) { + String id = variable.getTaskId(); + if (id == null ||!id.equals(taskId)){ + continue; + } + if (variable.getVarType().equals("single")){ + String values = variable.getVarValues(); + String[] split = values.split(","); + List stringList = new ArrayList<>(List.of(split)); + variable.setValueList(stringList); + } + list.add(variable); + } + list.sort(Comparator.comparing(Variable::getCreateTime).reversed()); + return list; + } + + @Override + public List findVariableList(VariableQuery query){ + List variableList = variableDao.findVariableList(query); + if (variableList == null || variableList.isEmpty()){ + return Collections.emptyList(); + } + return BeanMapper.mapList(variableList, Variable.class); + } + + @Override + public void cloneVariable(String id,String cloneId){ + VariableQuery variableQuery = new VariableQuery(); + variableQuery.setTaskId(id); + List variableList = findVariableList(variableQuery); + for (Variable variable : variableList) { + variable.setTaskId(cloneId); + createVariable(variable); + } + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/home/PipelineVersionService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/version/service/PipelineVersionService.java similarity index 74% rename from modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/home/PipelineVersionService.java rename to modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/version/service/PipelineVersionService.java index d2860f91..b08a68e8 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/home/PipelineVersionService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/version/service/PipelineVersionService.java @@ -1,4 +1,4 @@ -package cd.casic.module.process.support.home; +package cd.casic.module.process.support.version.service; public interface PipelineVersionService { diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/version/service/impl/PipelineVersionServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/version/service/impl/PipelineVersionServiceImpl.java new file mode 100644 index 00000000..6147e75f --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/version/service/impl/PipelineVersionServiceImpl.java @@ -0,0 +1,31 @@ +package cd.casic.module.process.support.version.service.impl; + +import cd.casic.module.process.licence.licence.model.Version; +import cd.casic.module.process.licence.licence.service.VersionService; +import cd.casic.module.process.support.version.service.PipelineVersionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @ClassName PipelineVersionServiceImpl + * @Author hopeli + * @Date 2025/5/2 18:58 + * @Version 1.0 + */ +@Service +public class PipelineVersionServiceImpl implements PipelineVersionService { + + @Autowired + VersionService versionServer; + + + @Override + public Boolean isVip() { + Version version = versionServer.getVersion(); + + Boolean expired = version.getExpired(); + // Integer release = version.getRelease(); + return !expired; + } + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/webHook/model/WebHook.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/webHook/model/WebHook.java new file mode 100644 index 00000000..d98a2b4f --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/support/webHook/model/WebHook.java @@ -0,0 +1,51 @@ +package cd.casic.module.process.support.webHook.model; + + +/** + * @ClassName PipelineVersionServiceImpl + * @Author hopeli + * @Date 2025/5/2 19:00 + * @Version 1.0 + */ + +/** + * 流水线webhook模型 + */ +public class WebHook { + + /** + * ID + */ + private String id; + + /** + * 名称 + */ + private String name; + + /** + * 类型 + */ + private String type; + + /** + * 流水线ID + */ + private String pipelineId; + + /** + * 参数 + */ + private String parameters; + + /** + * 地址 + */ + private String url; + + + + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/dao/TaskArtifactDao.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/dao/TaskArtifactDao.java new file mode 100644 index 00000000..f5019bac --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/dao/TaskArtifactDao.java @@ -0,0 +1,39 @@ +package cd.casic.module.process.task.artifact.dao; + +import cd.casic.module.process.task.artifact.dataobject.TaskArtifactDo; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @ClassName TaskArtifactDao + * @Author hopeli + * @Date 2025/5/2 19:08 + * @Version 1.0 + */ + +@Repository +public class TaskArtifactDao { + public String createProduct(TaskArtifactDo taskArtifactEntity) { + return null; + } + + public void deleteProduct(String productId) { + } + + public void updateProduct(TaskArtifactDo productEntity) { + + } + + public TaskArtifactDo findOneProduct(String artifactId) { + return null; + } + + public List findAllProduct() { + return null; + } + + public List findAllProductList(List idList) { + return null; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/dataobject/TaskArtifactDo.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/dataobject/TaskArtifactDo.java new file mode 100644 index 00000000..8887eb23 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/dataobject/TaskArtifactDo.java @@ -0,0 +1,51 @@ +package cd.casic.module.process.task.artifact.dataobject; + +import cd.casic.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.springframework.data.annotation.Id; + +import java.io.Serial; + +/** + * @ClassName TaskArtifactDo + * @Author hopeli + * @Date 2025/5/2 19:10 + * @Version 1.0 + */ + +@Data +@Builder +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName(value = "pip_task_artifact", autoResultMap = true) +public class TaskArtifactDo extends BaseDO { + + @Serial + private static final long serialVersionUID = -5333368911605592175L; + + @TableId + private String taskId; + + private String artifactType; + + private String version; + + private String fileAddress; + + private String putAddress; + + private String authId; + + private String rule; + + private String dockerImage; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/service/TaskArtifactService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/service/TaskArtifactService.java new file mode 100644 index 00000000..c0777756 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/service/TaskArtifactService.java @@ -0,0 +1,76 @@ +package cd.casic.module.process.task.artifact.service; + +/** + * @ClassName TaskArtifactService + * @Author hopeli + * @Date 2025/5/2 19:02 + * @Version 1.0 + */ + +import cd.casic.ci.commons.join.annototion.FindAll; +import cd.casic.ci.commons.join.annototion.FindList; +import cd.casic.ci.commons.join.annototion.FindOne; +import cd.casic.ci.commons.join.annototion.JoinProvider; +import cd.casic.module.process.task.artifact.model.TaskArtifact; + +import java.util.List; + +/** + * 任务推送制品服务接口 + */ +@JoinProvider(model = TaskArtifact.class) +public interface TaskArtifactService { + + /** + * 创建流水线推送制品 + * @param taskArtifact 流水线推送制品 + * @return 流水线推送制品id + */ + String createProduct(TaskArtifact taskArtifact); + + /** + * 删除流水线推送制品 + * @param productId 流水线推送制品id + */ + void deleteProduct(String productId); + + + /** + * 根据配置id查询任务 + * @param taskId 配置id + * @return 任务 + */ + TaskArtifact findOneArtifactByAuth(String taskId); + + + /** + * 更新推送制品信息 + * @param taskArtifact 信息 + */ + void updateProduct(TaskArtifact taskArtifact); + + /** + * 查询推送制品信息 + * @param artifactId id + * @return 信息 + */ + @FindOne + TaskArtifact findOneProduct(String artifactId); + + /** + * 查询所有流水线推送制品 + * @return 流水线推送制品列表 + */ + @FindAll + List findAllProduct(); + + + /** + * 根据ID列表查询流水线推送制品 + * @param idList ID列表 + * @return 流水线推送制品列表 + */ + @FindList + List findAllProductList(List idList); + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/service/impl/TaskArtifactServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/service/impl/TaskArtifactServiceImpl.java new file mode 100644 index 00000000..0898ba8f --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/service/impl/TaskArtifactServiceImpl.java @@ -0,0 +1,132 @@ +package cd.casic.module.process.task.artifact.service.impl; + +import cd.casic.ci.commons.bean.process.setting.AuthHost; +import cd.casic.ci.commons.bean.process.setting.AuthThird; +import cd.casic.ci.commons.rpc.annototion.Exporter; +import cd.casic.module.process.process.setting.AuthHostService; +import cd.casic.module.process.process.setting.AuthThirdService; +import cd.casic.module.process.support.util.util.PipelineFinal; +import cd.casic.module.process.task.artifact.dao.TaskArtifactDao; +import cd.casic.module.process.task.artifact.dataobject.TaskArtifactDo; +import cd.casic.module.process.task.artifact.model.TaskArtifact; +import cd.casic.module.process.task.artifact.service.TaskArtifactService; +import cd.casic.module.process.toolkit.beans.BeanMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +/** + * @ClassName TaskArtifactServiceImpl + * @Author hopeli + * @Date 2025/5/2 19:34 + * @Version 1.0 + */ + + +@Service +@Exporter +public class TaskArtifactServiceImpl implements TaskArtifactService { + + @Resource + private TaskArtifactDao productDao; + + @Resource + private AuthThirdService thirdServer; + + @Resource + private AuthHostService hostServer; + + /** + * 创建流水线推送制品 + * @param taskArtifact 流水线推送制品 + * @return 流水线推送制品id + */ + @Override + public String createProduct(TaskArtifact taskArtifact) { + TaskArtifactDo taskArtifactEntity = BeanMapper.map(taskArtifact, TaskArtifactDo.class); + return productDao.createProduct(taskArtifactEntity); + } + + /** + * 根据配置id查询任务 + * @return 任务 + */ + @Override + public TaskArtifact findOneArtifactByAuth(String taskId){ + + TaskArtifact artifact = findOneProduct(taskId); + if (Objects.isNull(artifact)){ + return null; + } + String authId = artifact.getAuthId(); + if (Objects.isNull(authId)){ + return artifact; + } + String artifactType = artifact.getArtifactType(); + AuthThird authServer = thirdServer.findOneAuthServer(authId); + artifact.setAuth(authServer); + + if (artifactType.equals(PipelineFinal.TASK_UPLOAD_SSH)){ + AuthHost oneAuthHost = hostServer.findOneAuthHost(authId); + artifact.setAuth(oneAuthHost); + } + return artifact; + } + + /** + * 删除流水线推送制品 + * @param ProductId 流水线推送制品id + */ + @Override + public void deleteProduct(String ProductId) { + productDao.deleteProduct(ProductId); + } + + /** + * 更新推送制品信息 + * @param taskArtifact 信息 + */ + @Override + public void updateProduct(TaskArtifact taskArtifact) { + TaskArtifactDo productEntity = BeanMapper.map(taskArtifact, TaskArtifactDo.class); + productDao.updateProduct(productEntity); + } + + /** + * 查询推送制品信息 + * @param artifactId id + * @return 信息集合 + */ + @Override + public TaskArtifact findOneProduct(String artifactId) { + TaskArtifactDo oneProduct = productDao.findOneProduct(artifactId); + return BeanMapper.map(oneProduct, TaskArtifact.class); + } + + /** + * 查询所有流水线推送制品 + * @return 流水线推送制品列表 + */ + @Override + public List findAllProduct() { + List allProduct = productDao.findAllProduct(); + return BeanMapper.mapList(allProduct, TaskArtifact.class); + } + + @Override + public List findAllProductList(List idList) { + List allProductList = productDao.findAllProductList(idList); + return BeanMapper.mapList(allProductList, TaskArtifact.class); + } + + private Object findAuth(String id){ + AuthThird oneAuthServer = thirdServer.findOneAuthServer(id); + if (oneAuthServer != null){ + return oneAuthServer; + } + return hostServer.findOneAuthHost(id); + } + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/service/impl/TaskArtifactXpackServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/service/impl/TaskArtifactXpackServiceImpl.java new file mode 100644 index 00000000..79bc54d4 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/artifact/service/impl/TaskArtifactXpackServiceImpl.java @@ -0,0 +1,97 @@ +package cd.casic.module.process.task.artifact.service.impl; + +import cd.casic.ci.commons.bean.exception.ApplicationException; +import cd.casic.ci.commons.bean.process.setting.AuthThird; +import cd.casic.module.process.process.setting.AuthThirdService; +import cd.casic.module.process.support.util.util.PipelineRequestUtil; +import cd.casic.module.process.task.artifact.model.XpackRepository; +import cd.casic.module.process.task.artifact.model.XpackRepositoryQuery; +import cd.casic.module.process.task.artifact.service.TaskArtifactXpackService; +import cd.casic.module.process.task.code.service.impl.TaskCodeGittokServiceImpl; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 19:19 + * @Version 1.0 + */ +@Service +public class TaskArtifactXpackServiceImpl implements TaskArtifactXpackService { + + private static final Logger logger = LoggerFactory.getLogger(TaskCodeGittokServiceImpl.class); + + @Resource + AuthThirdService authThirdService; + + @Resource + PipelineRequestUtil requestUtil; + + + @Override + public List findAllRepository(String authId){ + AuthThird authServer = authThirdService.findOneAuthServer(authId); + + if (Objects.isNull(authServer)){ + return null; + } + + String serverAddress = authServer.getServerAddress(); + XpackRepositoryQuery repositoryQuery = new XpackRepositoryQuery(); + repositoryQuery.setRepositoryType("local"); + try { + HttpHeaders headers = requestUtil.initHeaders(MediaType.APPLICATION_JSON, new HashMap<>()); + String requestUrl = serverAddress+"/api/xpackRepository/findRepositoryList"; + return requestUtil.requestPostList(headers, requestUrl, repositoryQuery, XpackRepository.class); + + } catch (Throwable throwable){ + String message = throwable.getMessage(); + logger.error(message); + if (message.contains("未订阅")){ + throw new ApplicationException("当前企业未订阅GitPuk!"); + } + if (throwable instanceof ApplicationException){ + throw new ApplicationException(message); + } + throw new ApplicationException("无法连接到:"+serverAddress); + } + } + + public XpackRepository findRepository(String authId,String rpyId){ + AuthThird authServer = authThirdService.findOneAuthServer(authId); + if (Objects.isNull(authServer) || Objects.isNull(rpyId)){ + return null; + } + String serverAddress = authServer.getServerAddress(); + + try { + HttpHeaders headers = requestUtil.initHeaders(MediaType.APPLICATION_JSON, new HashMap<>()); + String requestUrl = serverAddress+"/api/xpackRepository/findRepository"; + MultiValueMap multiValueMap = new LinkedMultiValueMap<>(); + multiValueMap.add("id",rpyId); + return requestUtil.requestPost(headers, requestUrl, multiValueMap, XpackRepository.class); + + } catch (Throwable throwable){ + String message = throwable.getMessage(); + logger.error(message); + if (throwable instanceof ApplicationException){ + throw new ApplicationException(message); + } + if (message.contains("未订阅")){ + throw new ApplicationException("当前企业未订阅GitPuk!"); + } + throw new ApplicationException("无法连接到:"+serverAddress); + } + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/dao/TaskBuildDao.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/dao/TaskBuildDao.java new file mode 100644 index 00000000..7b5d7cdd --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/dao/TaskBuildDao.java @@ -0,0 +1,69 @@ +package cd.casic.module.process.task.build.dao; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 19:26 + * @Version 1.0 + */ + +import cd.casic.module.process.task.code.jpa.JpaTemplate; +import cd.casic.module.process.task.build.dataobject.TaskBuildDo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class TaskBuildDao { + + @Autowired + JpaTemplate jpaTemplate; + + /** + * 创建 + * @param taskBuildDo build信息 + * @return buildId + */ + public String createBuild(TaskBuildDo taskBuildDo){ + return jpaTemplate.save(taskBuildDo,String.class); + } + + /** + * 删除 + * @param buildId buildId + */ + public void deleteBuild(String buildId){ + jpaTemplate.delete(TaskBuildDo.class,buildId); + } + + /** + * 更新build + * @param taskBuildDo 更新信息 + */ + public void updateBuild(TaskBuildDo taskBuildDo){ + jpaTemplate.update(taskBuildDo); + } + + /** + * 查询单个build信息 + * @param buildId buildId + * @return build信息 + */ + public TaskBuildDo findOneBuild(String buildId){ + return jpaTemplate.findOne(TaskBuildDo.class,buildId); + } + + /** + * 查询所有build信息 + * @return build信息集合 + */ + public List findAllBuild(){ + return jpaTemplate.findAll(TaskBuildDo.class); + } + + + public List findAllCodeList(List idList){ + return jpaTemplate.findList(TaskBuildDo.class,idList); + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/dao/TaskBuildProductDao.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/dao/TaskBuildProductDao.java new file mode 100644 index 00000000..25ce2b88 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/dao/TaskBuildProductDao.java @@ -0,0 +1,84 @@ +package cd.casic.module.process.task.build.dao; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 19:46 + * @Version 1.0 + */ + + +import cd.casic.module.process.task.build.dataobject.TaskBuildProductDo; +import cd.casic.module.process.task.build.model.TaskBuildProductQuery; +import cd.casic.module.process.task.code.jpa.JpaTemplate; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class TaskBuildProductDao { + + @Autowired + JpaTemplate jpaTemplate; + + /** + * 创建 + * @param taskBuildProductEntity build信息 + * @return buildId + */ + public String createBuildProduct(TaskBuildProductDo taskBuildProductEntity){ + return jpaTemplate.save(taskBuildProductEntity,String.class); + } + + /** + * 删除 + * @param buildId buildId + */ + public void deleteBuildProduct(String buildId){ + jpaTemplate.delete(TaskBuildProductDo.class,buildId); + } + + /** + * 更新build + * @param taskBuildProductDo 更新信息 + */ + public void updateBuildProduct(TaskBuildProductDo taskBuildProductDo){ + jpaTemplate.update(taskBuildProductDo); + } + + /** + * 查询单个build信息 + * @param buildId buildId + * @return build信息 + */ + public TaskBuildProductDo findOneBuildProduct(String buildId){ + return jpaTemplate.findOne(TaskBuildProductDo.class,buildId); + } + + /** + * 查询所有build信息 + * @return build信息集合 + */ + public List findAllBuildProduct(){ + return jpaTemplate.findAll(TaskBuildProductDo.class); + } + + public List findBuildProductList(TaskBuildProductQuery taskBuildProductQuery){ +// QueryCondition queryCondition = QueryWrapper.createQuery(TaskBuildProductDo.class) +// .eq("instanceId", taskBuildProductQuery.getInstanceId()) +// .eq("type", taskBuildProductQuery.getType()) +// .eq("key", taskBuildProductQuery.getKey()) +// .get(); + return jpaTemplate.findList(null, TaskBuildProductDo.class); + } + + public List findAllBuildProductList(List idList){ + return jpaTemplate.findList(TaskBuildProductDo.class,idList); + } + + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/dataobject/TaskBuildDo.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/dataobject/TaskBuildDo.java new file mode 100644 index 00000000..d7153351 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/dataobject/TaskBuildDo.java @@ -0,0 +1,60 @@ +package cd.casic.module.process.task.build.dataobject; + +import cd.casic.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 19:23 + * @Version 1.0 + */ + + + +@Data +@Builder +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName(value = "pip_task_build", autoResultMap = true) +public class TaskBuildDo extends BaseDO { + + @TableId + private String taskId; + + //地址 + private String buildAddress; + + //分支 + private String buildOrder; + + private String productRule; + + private String dockerName; + + private String dockerVersion; + + private String dockerFile; + + private String dockerOrder; + + // jdk版本 + private String toolJdk; + + // maven版本 + private String toolMaven; + + // npm版本 + private String toolNodejs; + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/dataobject/TaskBuildProductDo.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/dataobject/TaskBuildProductDo.java new file mode 100644 index 00000000..3b5b6ef1 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/dataobject/TaskBuildProductDo.java @@ -0,0 +1,43 @@ +package cd.casic.module.process.task.build.dataobject; + +import cd.casic.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 19:24 + * @Version 1.0 + */ + +@Data +@Builder +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName(value = "pip_task_build_product", autoResultMap = true) +public class TaskBuildProductDo extends BaseDO { + + @TableId + private String id; + + + private String instanceId; + + //地址 + private String type; + + + private String key; + + private String value; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/service/TaskBuildService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/service/TaskBuildService.java new file mode 100644 index 00000000..903bae1b --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/service/TaskBuildService.java @@ -0,0 +1,85 @@ +package cd.casic.module.process.task.build.service; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 19:30 + * @Version 1.0 + */ + + + +import cd.casic.ci.commons.join.annototion.FindAll; +import cd.casic.ci.commons.join.annototion.FindList; +import cd.casic.ci.commons.join.annototion.FindOne; +import cd.casic.ci.commons.join.annototion.JoinProvider; +import cd.casic.module.process.task.build.model.TaskBuild; + +import java.util.List; + +/** + * 任务构建服务接口 + */ +@JoinProvider(model = TaskBuild.class) +public interface TaskBuildService { + + /** + * 创建 + * @param TaskBuild build信息 + * @return buildId + */ + String createBuild(TaskBuild TaskBuild); + + /** + * 删除 + * @param buildId buildId + */ + void deleteBuild(String buildId); + + /** + * 更新 + * @param TaskBuild 更新信息 + */ + void updateBuild(TaskBuild TaskBuild); + + /** + * 验证 + * @param taskType taskType + * @param taskBuild object + * @return Boolean + */ + Boolean buildValid(String taskType,TaskBuild taskBuild); + + + /** + * 根据配置id查询任务 + * @param configId 配置id + * @return 任务 + */ + TaskBuild findBuildByAuth(String configId); + + + /** + * 查询单个信息 + * @param buildId buildId + * @return build信息 + */ + @FindOne + TaskBuild findOneBuild(String buildId); + + /** + * 查询所有信息 + * @return build信息集合 + */ + @FindAll + List findAllBuild(); + + /** + * 根据ID列表查询构建 + * @param idList ID列表 + * @return 构建列表 + */ + @FindList + List findAllBuildList(List idList); +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/service/impl/TaskBuildProductServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/service/impl/TaskBuildProductServiceImpl.java new file mode 100644 index 00000000..d1e6cf64 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/service/impl/TaskBuildProductServiceImpl.java @@ -0,0 +1,102 @@ +package cd.casic.module.process.task.build.service.impl; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 19:35 + * @Version 1.0 + */ + +import cd.casic.ci.commons.rpc.annototion.Exporter; +import cd.casic.module.process.task.build.dao.TaskBuildProductDao; +import cd.casic.module.process.task.build.dataobject.TaskBuildProductDo; +import cd.casic.module.process.task.build.model.TaskBuildProduct; +import cd.casic.module.process.task.build.model.TaskBuildProductQuery; +import cd.casic.module.process.task.build.service.TaskBuildProductService; +import cd.casic.module.process.toolkit.beans.BeanMapper; +import com.alibaba.fastjson.JSONObject; +import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@Service +@Exporter +public class TaskBuildProductServiceImpl implements TaskBuildProductService { + + @Resource + TaskBuildProductDao taskBuildProductDao; + + + @Override + public String createBuildProduct(TaskBuildProduct taskBuildProduct) { + TaskBuildProductDo taskBuildProductDo = BeanMapper.map(taskBuildProduct, TaskBuildProductDo.class); + return taskBuildProductDao.createBuildProduct(taskBuildProductDo); + } + + @Override + public void updateBuildProduct(TaskBuildProduct taskBuildProduct) { + TaskBuildProductDo taskBuildProductDo = BeanMapper.map(taskBuildProduct, TaskBuildProductDo.class); + taskBuildProductDao.updateBuildProduct(taskBuildProductDo); + } + + @Override + public void deleteBuildProduct(String id) { + taskBuildProductDao.deleteBuildProduct(id); + } + + @Override + public TaskBuildProduct findOneBuildProduct(String id) { + TaskBuildProductDo buildProductEntity = taskBuildProductDao.findOneBuildProduct(id); + return BeanMapper.map(buildProductEntity, TaskBuildProduct.class); + } + + @Override + public List findAllBuildProduct() { + List allBuildProduct = taskBuildProductDao.findAllBuildProduct(); + if (allBuildProduct == null || allBuildProduct.isEmpty()){ + return Collections.emptyList(); + } + return BeanMapper.mapList(allBuildProduct, TaskBuildProduct.class); + } + + @Override + public List findBuildProductList(TaskBuildProductQuery taskBuildProductQuery) { + List allBuildProduct = taskBuildProductDao.findBuildProductList(taskBuildProductQuery); + if (allBuildProduct == null || allBuildProduct.isEmpty()){ + return Collections.emptyList(); + } + return BeanMapper.mapList(allBuildProduct, TaskBuildProduct.class); + } + + + @Override + public String replace(String instanceId,String strings){ + TaskBuildProductQuery taskBuildProductQuery = new TaskBuildProductQuery(); + taskBuildProductQuery.setInstanceId(instanceId); + List buildProductList = findBuildProductList(taskBuildProductQuery); + + if (buildProductList.isEmpty()){ + return strings; + } + + for (TaskBuildProduct taskBuildProduct : buildProductList) { + + LinkedHashMap linkedHashMap = JSONObject.parseObject(taskBuildProduct.getValue(), LinkedHashMap.class); + for (Map.Entry entry : linkedHashMap.entrySet()) { + String value = (String)entry.getValue(); + String key = entry.getKey(); + strings = strings.replaceAll("\\$\\{" + key + "}",value); + strings = strings.replaceAll(key,value); + } + } + return strings; + } + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/service/impl/TaskBuildServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/service/impl/TaskBuildServiceImpl.java new file mode 100644 index 00000000..abfdb2d8 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/build/service/impl/TaskBuildServiceImpl.java @@ -0,0 +1,91 @@ +package cd.casic.module.process.task.build.service.impl; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 19:40 + * @Version 1.0 + */ + +import cd.casic.ci.commons.rpc.annototion.Exporter; +import cd.casic.module.process.support.util.util.PipelineFinal; +import cd.casic.module.process.task.build.dao.TaskBuildDao; +import cd.casic.module.process.task.build.dataobject.TaskBuildDo; +import cd.casic.module.process.task.build.model.TaskBuild; +import cd.casic.module.process.task.build.service.TaskBuildService; +import cd.casic.module.process.toolkit.beans.BeanMapper; +import jakarta.annotation.Resource; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + + +@Service +@Exporter +public class TaskBuildServiceImpl implements TaskBuildService { + + @Resource + TaskBuildDao taskBuildDao; + + //创建 + @Override + public String createBuild(TaskBuild taskBuild) { + return taskBuildDao.createBuild(BeanMapper.map(taskBuild, TaskBuildDo.class)); + } + + @Override + public Boolean buildValid(String taskType,TaskBuild build){ + if (taskType.equals(PipelineFinal.TASK_BUILD_DOCKER)){ + return !StringUtils.isEmpty(build.getDockerFile()); + } + return true; + } + + /** + * 根据配置id查询任务 + * @param authId 配置id + * @return 任务 + */ + @Override + public TaskBuild findBuildByAuth(String authId){ + + TaskBuild build = findOneBuild(authId); + if (Objects.isNull(build.getDockerVersion())){ + build.setDockerVersion("latest"); + } + return build; + } + + //删除 + @Override + public void deleteBuild(String buildId) { + taskBuildDao.deleteBuild(buildId); + } + + //修改 + @Override + public void updateBuild(TaskBuild taskBuild) { + taskBuildDao.updateBuild(BeanMapper.map(taskBuild, TaskBuildDo.class)); + } + + //查询单个 + @Override + public TaskBuild findOneBuild(String buildId) { + return BeanMapper.map(taskBuildDao.findOneBuild(buildId), TaskBuild.class); + } + + //查询所有 + @Override + public List findAllBuild() { + return BeanMapper.mapList(taskBuildDao.findAllBuild(), TaskBuild.class); + } + + @Override + public List findAllBuildList(List idList) { + return BeanMapper.mapList(taskBuildDao.findAllCodeList(idList), TaskBuild.class); + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodeGitHubController.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodeGitHubController.java new file mode 100644 index 00000000..d8f466cb --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodeGitHubController.java @@ -0,0 +1,70 @@ +package cd.casic.module.process.task.code.controller; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:25 + * @Version 1.0 + */ +import cd.casic.ci.commons.bean.utils.Result; +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 cd.casic.module.process.task.code.service.TaskCodeGitHubService; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @pi.protocol: http + * @pi.groupName: 流水线集成github控制器 + */ +@RestController +@RequestMapping("/code/third/github") +public class PipelineCodeGitHubController { + + @Resource + TaskCodeGitHubService gitHubService; + + /** + * @pi.name:获取xcode所有仓库 + * @pi.url:/code/third/github/findStoreHouseList + * @pi.methodType:post + * @pi.request-type: formdata + * @pi.param: name=authId;dataType=string;value=authId; + */ + @RequestMapping(path="/findStoreHouseList",method = RequestMethod.POST) + public Result< List> findAllRepository(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){ + + List allRepository = gitHubService.findStoreHouseList(thirdQuery); + + return Result.ok(allRepository); + } + + + /** + * @pi.name:获取仓库分支信息 + * @pi.url:/code/third/github/findHouseBranchList + * @pi.methodType:post + * @pi.request-type: formdata + * @pi.param: name=authId;dataType=string;value=authId; + * @pi.param: name=rpyId;dataType=string;value=rpyId; + */ + @RequestMapping(path="/findHouseBranchList",method = RequestMethod.POST) + public Result> findHouseBranchList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){ + + List allRepository = gitHubService.findStoreBranchList(thirdQuery); + + return Result.ok(allRepository); + } + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodeGitLabController.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodeGitLabController.java new file mode 100644 index 00000000..ae78675f --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodeGitLabController.java @@ -0,0 +1,71 @@ +package cd.casic.module.process.task.code.controller; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:25 + * @Version 1.0 + */ + +import cd.casic.ci.commons.bean.utils.Result; +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 cd.casic.module.process.task.code.service.TaskCodeGitLabService; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @pi.protocol: http + * @pi.groupName: 流水线集成gitlab控制器 + */ +@RestController +@RequestMapping("/code/third/gitlab") +public class PipelineCodeGitLabController { + + @Resource + TaskCodeGitLabService gitLabService; + + /** + * @pi.name:获取xcode所有仓库 + * @pi.url:/code/third/gitlab/findStoreHouseList + * @pi.methodType:post + * @pi.request-type: formdata + * @pi.param: name=authId;dataType=string;value=authId; + */ + @RequestMapping(path="/findStoreHouseList",method = RequestMethod.POST) + public Result> findStoreHouseList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){ + + List allRepository = gitLabService.findStoreHouseList(thirdQuery); + + return Result.ok(allRepository); + } + + + /** + * @pi.name:获取仓库分支信息 + * @pi.url:/code/third/gitlab/findHouseBranchList + * @pi.methodType:post + * @pi.request-type: formdata + * @pi.param: name=authId;dataType=string;value=authId; + * @pi.param: name=rpyId;dataType=string;value=rpyId; + */ + @RequestMapping(path="/findHouseBranchList",method = RequestMethod.POST) + public Result> findHouseBranchList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){ + + List allRepository = gitLabService.findStoreBranchList(thirdQuery); + + return Result.ok(allRepository); + } + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodeGiteeController.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodeGiteeController.java new file mode 100644 index 00000000..d26f0655 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodeGiteeController.java @@ -0,0 +1,71 @@ +package cd.casic.module.process.task.code.controller; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:25 + * @Version 1.0 + */ + +import cd.casic.ci.commons.bean.utils.Result; +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 cd.casic.module.process.task.code.service.TaskCodeGiteeService; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @pi.protocol: http + * @pi.groupName: 流水线集成gitee控制器 + */ +@RestController +@RequestMapping("/code/third/gitee") +public class PipelineCodeGiteeController { + + @Resource + TaskCodeGiteeService giteeService; + + /** + * @pi.name:获取xcode所有仓库 + * @pi.url:/code/third/gitee/findStoreHouseList + * @pi.methodType:post + * @pi.request-type: formdata + * @pi.param: name=authId;dataType=string;value=authId; + */ + @RequestMapping(path="/findStoreHouseList",method = RequestMethod.POST) + public Result> findAllRepository(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){ + + List allRepository = giteeService.findStoreHouseList(thirdQuery); + + return Result.ok(allRepository); + } + + + /** + * @pi.name:获取仓库分支信息 + * @pi.url:/code/third/gitee/findHouseBranchList + * @pi.methodType:post + * @pi.request-type: formdata + * @pi.param: name=authId;dataType=string;value=authId; + * @pi.param: name=rpyId;dataType=string;value=rpyId; + */ + @RequestMapping(path="/findHouseBranchList",method = RequestMethod.POST) + public Result> findHouseBranchList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){ + + List allRepository = giteeService.findStoreBranchList(thirdQuery); + + return Result.ok(allRepository); + } + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodeGittokController.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodeGittokController.java new file mode 100644 index 00000000..2de6914c --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodeGittokController.java @@ -0,0 +1,70 @@ +package cd.casic.module.process.task.code.controller; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:25 + * @Version 1.0 + */ + +import cd.casic.ci.commons.bean.utils.Result; +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 cd.casic.module.process.task.code.service.TaskCodeGittokService; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @pi.protocol: http + * @pi.groupName: 流水线集成Xcode控制器 + */ +@RestController +@RequestMapping("/code/third/gittok") +public class PipelineCodeGittokController { + + @Resource + TaskCodeGittokService gittokService; + + /** + * @pi.name:获取xcode所有仓库 + * @pi.url:/xcodeAuthorize/findAllRepository + * @pi.methodType:post + * @pi.request-type: formdata + * @pi.param: name=authId;dataType=string;value=authId; + */ + @RequestMapping(path="/findStoreHouseList",method = RequestMethod.POST) + public Result> findStoreHouseList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){ + + List allRepository = gittokService.findStoreHouseList(thirdQuery); + + return Result.ok(allRepository); + } + + + /** + * @pi.name:获取仓库分支信息 + * @pi.url:/xcodeAuthorize/findAllBranch + * @pi.methodType:post + * @pi.request-type: formdata + * @pi.param: name=authId;dataType=string;value=authId; + * @pi.param: name=rpyId;dataType=string;value=rpyId; + */ + @RequestMapping(path="/findHouseBranchList",method = RequestMethod.POST) + public Result> findHouseBranchList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){ + + List allRepository = gittokService.findHouseBranchList(thirdQuery); + + return Result.ok(allRepository); + } + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodePriGitLabController.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodePriGitLabController.java new file mode 100644 index 00000000..4ab476bb --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/controller/PipelineCodePriGitLabController.java @@ -0,0 +1,70 @@ +package cd.casic.module.process.task.code.controller; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:25 + * @Version 1.0 + */ + +import cd.casic.ci.commons.bean.utils.Result; +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 cd.casic.module.process.task.code.service.TaskCodePriGitLabService; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @pi.protocol: http + * @pi.groupName: 流水线集成gitlab控制器 + */ +@RestController +@RequestMapping("/code/third/pri/v4/gitlab") +public class PipelineCodePriGitLabController { + + @Resource + TaskCodePriGitLabService priGitLabService; + + /** + * @pi.name:获取自建GitLab所有仓库 + * @pi.url:/code/third/gitlab/findStoreHouseList + * @pi.methodType:post + * @pi.request-type: formdata + * @pi.param: name=authId;dataType=string;value=authId; + */ + @RequestMapping(path="/findStoreHouseList",method = RequestMethod.POST) + public Result> findStoreHouseList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){ + + List allRepository = priGitLabService.findStoreHouseList(thirdQuery); + + return Result.ok(allRepository); + } + + + /** + * @pi.name:获取仓库分支信息 + * @pi.url:/code/third/gitlab/findHouseBranchList + * @pi.methodType:post + * @pi.request-type: formdata + * @pi.param: name=authId;dataType=string;value=authId; + * @pi.param: name=rpyId;dataType=string;value=rpyId; + */ + @RequestMapping(path="/findHouseBranchList",method = RequestMethod.POST) + public Result> findHouseBranchList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){ + + List allRepository = priGitLabService.findStoreBranchList(thirdQuery); + + return Result.ok(allRepository); + } + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/dao/TaskCodeDao.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/dao/TaskCodeDao.java new file mode 100644 index 00000000..77a91fbb --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/dao/TaskCodeDao.java @@ -0,0 +1,70 @@ +package cd.casic.module.process.task.code.dao; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:25 + * @Version 1.0 + */ + +import cd.casic.module.process.task.code.jpa.JpaTemplate; +import cd.casic.module.process.task.code.dataobject.TaskCodeDo; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class TaskCodeDao { + + @Resource + JpaTemplate jpaTemplate; + + /** + * 创建 + * @param taskCodeDo code信息 + * @return codeId + */ + public String createCode(TaskCodeDo taskCodeDo){ + return jpaTemplate.save(taskCodeDo,String.class); + } + + /** + * 删除code + * @param codeId codeId + */ + public void deleteCode(String codeId){ + jpaTemplate.delete(TaskCodeDo.class,codeId); + } + + /** + * 更新code + * @param taskCodeDo 更新信息 + */ + public void updateCode(TaskCodeDo taskCodeDo){ + jpaTemplate.update(taskCodeDo); + } + + /** + * 查询单个code信息 + * @param codeId codeId + * @return code信息 + */ + public TaskCodeDo findOneCode(String codeId){ + return jpaTemplate.findOne(TaskCodeDo.class,codeId); + } + + /** + * 查询所有code信息 + * @return code信息集合 + */ + public List findAllCode(){ + return jpaTemplate.findAll(TaskCodeDo.class); + } + + public List findAllCodeList(List idList){ + return jpaTemplate.findList(TaskCodeDo.class,idList); + } + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/dataobject/TaskCodeDo.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/dataobject/TaskCodeDo.java new file mode 100644 index 00000000..0a51cdd6 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/dataobject/TaskCodeDo.java @@ -0,0 +1,70 @@ +package cd.casic.module.process.task.code.dataobject; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:25 + * @Version 1.0 + */ + +import cd.casic.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + + +@Data +@Builder +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName(value = "pip_task_code", autoResultMap = true) +public class TaskCodeDo extends BaseDO { + + @TableId + private String taskId; + + //地址名 + private String codeName; + + //地址 + private String codeAddress; + + //分支 + private String codeBranch; + + //凭证信息 + private String authId; + + private String svnFile; + + private String xcodeId; + + private String branchId; + + private String houseId; + + private String toolGit; + + private String toolSvn; + + // 认证类型 + private String authType; + + // 用户名 + private String username; + + // 密码 + private String password; + + // 私钥 + private String priKey; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/jpa/JpaOperation.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/jpa/JpaOperation.java new file mode 100644 index 00000000..8e258aaf --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/jpa/JpaOperation.java @@ -0,0 +1,10 @@ +package cd.casic.module.process.task.code.jpa; + +/** + * @ClassName JpaOperation + * @Author hopeli + * @Date 2025/5/2 21:28 + * @Version 1.0 + */ +public interface JpaOperation { +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/jpa/JpaTemplate.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/jpa/JpaTemplate.java new file mode 100644 index 00000000..d0d4a70e --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/jpa/JpaTemplate.java @@ -0,0 +1,73 @@ +package cd.casic.module.process.task.code.jpa; + +import cd.casic.ci.commons.bean.commons.Pagination; +import cd.casic.ci.commons.bean.jdbc.JdbcTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; + +import javax.sql.DataSource; +import java.util.List; + +/** + * @ClassName JpaTemplate + * @Author hopeli + * @Date 2025/5/2 21:27 + * @Version 1.0 + */ +public class JpaTemplate implements JpaOperation { + private static Logger logger = LoggerFactory.getLogger(JpaTemplate.class); + private DataSource dataSource; + private JdbcTemplate jdbcTemplate; + private NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + public JpaTemplate() { + } + + public JpaTemplate(DataSource dataSource) { + this.dataSource = dataSource; + this.jdbcTemplate = new JdbcTemplate(dataSource); + this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); + } + + public JdbcTemplate getJdbcTemplate() { + return this.jdbcTemplate; + } + + public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() { + return this.namedParameterJdbcTemplate; + } + + + public ID save(T entity, Class idClass) throws DataAccessException { + return null; + } + + public void update(T entity) throws DataAccessException { + } + + + public void delete(Class entityClass, ID id) throws DataAccessException { + } + + public List findAll(Class entityClass) throws DataAccessException { + return null; + } + + public T findOne(Class entityClass, ID id) throws DataAccessException { + return null; + } + + public List findList(Class entityClass, List idList) throws DataAccessException { + return null; + } + + public List findList(Object queryObject, Class resultType) throws DataAccessException { + return null; + } + + public Pagination findPage(Object queryObject, Class resultType) throws DataAccessException { + return null; + } +} 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 index f5607cc8..ddb838f3 100644 --- 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 @@ -1,6 +1,7 @@ package cd.casic.module.process.task.code.model; +import cd.casic.ci.commons.bean.process.setting.Scm; import lombok.Data; /** @@ -49,4 +50,23 @@ public class TaskCode { private String instanceId; + // Git版本 + private Scm toolGit; + + // svn版本 + private Scm toolSvn; + + + // 认证类型 + private String authType; + + // 用户名 + private String username; + + // 密码 + private String password; + + // 私钥 + private String priKey; + } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeGitHubService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeGitHubService.java new file mode 100644 index 00000000..3a1893e7 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeGitHubService.java @@ -0,0 +1,49 @@ +package cd.casic.module.process.task.code.service; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:15 + * @Version 1.0 + */ + + +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 cd.casic.module.process.task.code.model.ThirdUser; + +import java.util.List; + +public interface TaskCodeGitHubService { + + /** + * 获取AccessToken的授权用户信息 + * @param thirdQuery 凭证 + * @return 授权用户信息 + */ + ThirdUser findAuthUser(ThirdQuery thirdQuery); + + /** + * 获取凭证认证的仓库列表 + * @param thirdQuery 凭证 + * @return 仓库列表 + */ + List findStoreHouseList(ThirdQuery thirdQuery); + + /** + * 获取指定仓库信息 + * @param thirdQuery 仓库 + * @return 仓库信息 + */ + ThirdHouse findStoreHouse(ThirdQuery thirdQuery); + + /** + * 获取凭证认证的仓库分支列表 + * @param thirdQuery 凭证 + * @return 分支列表 + */ + List findStoreBranchList(ThirdQuery thirdQuery); + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeGitLabService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeGitLabService.java new file mode 100644 index 00000000..00dd2c4e --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeGitLabService.java @@ -0,0 +1,49 @@ +package cd.casic.module.process.task.code.service; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:15 + * @Version 1.0 + */ + + +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 cd.casic.module.process.task.code.model.ThirdUser; + +import java.util.List; + +public interface TaskCodeGitLabService { + + /** + * 获取AccessToken的授权用户信息 + * @param thirdQuery 凭证 + * @return 授权用户信息 + */ + ThirdUser findAuthUser(ThirdQuery thirdQuery); + + /** + * 获取凭证认证的仓库列表 + * @param thirdQuery 凭证 + * @return 仓库列表 + */ + List findStoreHouseList(ThirdQuery thirdQuery); + + /** + * 获取指定仓库信息 + * @param thirdQuery 仓库 + * @return 仓库信息 + */ + ThirdHouse findStoreHouse(ThirdQuery thirdQuery); + + /** + * 获取凭证认证的仓库分支列表 + * @param thirdQuery 凭证 + * @return 分支列表 + */ + List findStoreBranchList(ThirdQuery thirdQuery); + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeGiteeService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeGiteeService.java new file mode 100644 index 00000000..2af0f025 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeGiteeService.java @@ -0,0 +1,50 @@ +package cd.casic.module.process.task.code.service; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:15 + * @Version 1.0 + */ + + +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 cd.casic.module.process.task.code.model.ThirdUser; + +import java.util.List; + +public interface TaskCodeGiteeService { + + /** + * 获取AccessToken的授权用户信息 + * @param thirdQuery 凭证 + * @return 授权用户信息 + */ + ThirdUser findAuthUser(ThirdQuery thirdQuery); + + /** + * 获取凭证认证的仓库列表 + * @param thirdQuery 凭证 + * @return 仓库列表 + */ + List findStoreHouseList(ThirdQuery thirdQuery); + + + /** + * 获取指定仓库信息 + * @param thirdQuery 仓库 + * @return 仓库信息 + */ + ThirdHouse findStoreHouse(ThirdQuery thirdQuery); + + /** + * 获取凭证认证的仓库分支列表 + * @param thirdQuery 凭证 + * @return 分支列表 + */ + List findStoreBranchList(ThirdQuery thirdQuery); + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodePriGitLabService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodePriGitLabService.java new file mode 100644 index 00000000..40c496c4 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodePriGitLabService.java @@ -0,0 +1,48 @@ +package cd.casic.module.process.task.code.service; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:15 + * @Version 1.0 + */ + +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 cd.casic.module.process.task.code.model.ThirdUser; + +import java.util.List; + +public interface TaskCodePriGitLabService { + + /** + * 获取AccessToken的授权用户信息 + * @param thirdQuery 凭证 + * @return 授权用户信息 + */ + ThirdUser findAuthUser(ThirdQuery thirdQuery); + + /** + * 获取凭证认证的仓库列表 + * @param thirdQuery 凭证 + * @return 仓库列表 + */ + List findStoreHouseList(ThirdQuery thirdQuery); + + /** + * 获取指定仓库信息 + * @param thirdQuery 仓库 + * @return 仓库信息 + */ + ThirdHouse findStoreHouse(ThirdQuery thirdQuery); + + /** + * 获取凭证认证的仓库分支列表 + * @param thirdQuery 凭证 + * @return 分支列表 + */ + List findStoreBranchList(ThirdQuery thirdQuery); + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeService.java new file mode 100644 index 00000000..9a054a4e --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/TaskCodeService.java @@ -0,0 +1,81 @@ +package cd.casic.module.process.task.code.service; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:15 + * @Version 1.0 + */ + +import cd.casic.ci.commons.join.annototion.FindAll; +import cd.casic.ci.commons.join.annototion.FindList; +import cd.casic.ci.commons.join.annototion.FindOne; +import cd.casic.ci.commons.join.annototion.JoinProvider; +import cd.casic.module.process.task.code.model.TaskCode; + +import java.util.List; + +/** + * 源码服务接口 + */ +@JoinProvider(model = TaskCode.class) +public interface TaskCodeService { + + /** + * 创建 + * @param taskCode code信息 + * @return codeId + */ + String createCode(TaskCode taskCode); + + /** + * 根据配置id查询任务 + * @param taskId 配置id + * @return 任务 + */ + TaskCode findCodeByAuth(String taskId); + + + /** + * 验证 + * @param taskType 任务类型 + * @param code object + * @return 是否验证通过 + */ + Boolean codeValid(String taskType,TaskCode code); + + /** + * 删除 + * @param codeId codeId + */ + void deleteCode(String codeId); + + /** + * 更新 + * @param taskCode 更新信息 + */ + void updateCode(TaskCode taskCode); + + + void updateOneCode(TaskCode taskCode); + + /** + * 查询单个信息 + * @param codeId codeId + * @return code信息 + */ + @FindOne + TaskCode findOneCode(String codeId); + + /** + * 查询所有信息 + * @return code信息集合 + */ + @FindAll + List findAllCode(); + + + @FindList + List findAllCodeList(List idList); + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeGitHubServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeGitHubServiceImpl.java new file mode 100644 index 00000000..1d72d5b7 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeGitHubServiceImpl.java @@ -0,0 +1,258 @@ +package cd.casic.module.process.task.code.service.impl; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:12 + * @Version 1.0 + */ + +import cd.casic.ci.commons.bean.exception.ApplicationException; +import cd.casic.ci.commons.bean.exception.SystemException; +import cd.casic.ci.commons.bean.process.setting.AuthThird; +import cd.casic.module.process.process.setting.AuthThirdService; +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 cd.casic.module.process.task.code.model.ThirdUser; +import cd.casic.module.process.task.code.service.TaskCodeGitHubService; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Service +public class TaskCodeGitHubServiceImpl implements TaskCodeGitHubService { + + + @Resource + AuthThirdService authThirdService; + + /** + * 获取accessToken + * @param authId 认证ID + * @return 凭证 + */ + private String findAccessToken(String authId){ + AuthThird authServer = authThirdService.findOneAuthServer(authId); + if (Objects.isNull(authServer)){ + throw new ApplicationException("没有查询到当前凭证授权码!"); + } + return authServer.getAccessToken(); + } + + @Override + public List findStoreHouseList(ThirdQuery thirdQuery){ + + String accessToken = findAccessToken(thirdQuery.getAuthId()); + List houseList = new ArrayList<>(); + RestTemplate restTemplate = new RestTemplate(); + String url = String.format("https://api.github.com/user/repos?page=%s&per_page=%s", + thirdQuery.getPage(), thirdQuery.getPageNumber()); + try { + HttpHeaders headers = new HttpHeaders(); + headers.set("Accept", "application/vnd.github.v3+json"); + headers.set("Authorization", "token"+" "+ accessToken); + headers.set("X-GitHub-Api-Version", "2022-11-28"); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + ResponseEntity forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + if (Objects.isNull(body)){ + throw new SystemException("获取仓库信息失败,获取信息为空!"); + } + JSONArray projectList = JSONObject.parseArray(body); + for (Object o : projectList) { + JSONObject jsonObject = JSONObject.parseObject(String.valueOf(o)); + String id = jsonObject.getString("id"); + String name = jsonObject.getString("name"); + String nameSpace = jsonObject.getString("full_name"); + String sshUrl = jsonObject.getString("ssh_url_to_repo"); + String webUrl = jsonObject.getString("clone_url"); + String defaultBranch = jsonObject.getString("default_branch"); + ThirdHouse thirdHouse = new ThirdHouse(); + thirdHouse.setId(id); + thirdHouse.setName(name); + thirdHouse.setPath(name); + thirdHouse.setNameWithSpace(nameSpace); + thirdHouse.setPathWithSpace(nameSpace); + thirdHouse.setHouseSshUrl(sshUrl); + thirdHouse.setHouseWebUrl(webUrl); + thirdHouse.setDefaultBranch(defaultBranch); + houseList.add(thirdHouse); + } + }catch (HttpClientErrorException e) { + findGitlabErrorRequest(e.getRawStatusCode()); + throw new SystemException(String.valueOf(e)); + } + return houseList; + } + + @Override + public ThirdHouse findStoreHouse(ThirdQuery thirdQuery) { + + String accessToken = findAccessToken(thirdQuery.getAuthId()); + String[] split = thirdQuery.getHouseId().split("/"); + RestTemplate restTemplate = new RestTemplate(); + String url = String.format("https://api.github.com/repos/%s/%s", split[0],split[1]); + try { + HttpHeaders headers = new HttpHeaders(); + headers.set("Accept", "application/vnd.github.v3+json"); + headers.set("Authorization", "token"+" "+ accessToken); + headers.set("X-GitHub-Api-Version", "2022-11-28"); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + ResponseEntity forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + if (Objects.isNull(body)){ + throw new SystemException("获取仓库信息失败,获取信息为空!"); + } + JSONObject jsonObject = JSONObject.parseObject(body); + String id = jsonObject.getString("id"); + String name = jsonObject.getString("name"); + String nameSpace = jsonObject.getString("full_name"); + String sshUrl = jsonObject.getString("ssh_url_to_repo"); + String webUrl = jsonObject.getString("clone_url"); + String defaultBranch = jsonObject.getString("default_branch"); + + ThirdHouse thirdHouse = new ThirdHouse(); + thirdHouse.setId(id); + thirdHouse.setName(name); + thirdHouse.setPath(name); + thirdHouse.setNameWithSpace(nameSpace); + thirdHouse.setPathWithSpace(nameSpace); + thirdHouse.setHouseSshUrl(sshUrl); + thirdHouse.setHouseWebUrl(webUrl); + thirdHouse.setDefaultBranch(defaultBranch); + + return thirdHouse; + }catch (HttpClientErrorException e) { + findGitlabErrorRequest(e.getRawStatusCode()); + throw new SystemException(String.valueOf(e)); + } + } + + @Override + public ThirdUser findAuthUser(ThirdQuery thirdQuery){ + String accessToken = findAccessToken(thirdQuery.getAuthId()); + RestTemplate restTemplate = new RestTemplate(); + String url = "https://api.github.com/user"; + try { + HttpHeaders headers = new HttpHeaders(); + headers.set("Accept", "application/vnd.github.v3+json"); + headers.set("Authorization", "token"+" "+ accessToken); + headers.set("X-GitHub-Api-Version", "2022-11-28"); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + ResponseEntity forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + + JSONObject jsonObject = JSONObject.parseObject(body); + String id = jsonObject.getString("id"); + String login = jsonObject.getString("login"); + String name = jsonObject.getString("name"); + String avatar = jsonObject.getString("avatar_url"); + ThirdUser thirdUser = new ThirdUser(); + thirdUser.setId(id); + thirdUser.setName(name); + thirdUser.setPath(login); + thirdUser.setHead(avatar); + return thirdUser; + + }catch (HttpClientErrorException e) { + findGitlabErrorRequest(e.getRawStatusCode()); + throw new SystemException(String.valueOf(e)); + } + } + + @Override + public List findStoreBranchList(ThirdQuery thirdQuery){ + String accessToken = findAccessToken(thirdQuery.getAuthId()); + String[] split = thirdQuery.getHouseId().split("/"); + List branchList= new ArrayList<>(); + RestTemplate restTemplate = new RestTemplate(); + String url = String.format("https://api.github.com/repos/%s/%s/branches?page=%s&per_page=%s", + split[0],split[1], thirdQuery.getPage(), thirdQuery.getPageNumber()); + try { + HttpHeaders headers = new HttpHeaders(); + headers.set("Accept", "application/vnd.github.v3+json"); + headers.set("Authorization", "token"+" "+ accessToken); + headers.set("X-GitHub-Api-Version", "2022-11-28"); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + ResponseEntity forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + if (Objects.isNull(body)){ + throw new SystemException("获取分支信息失败,获取信息为空!"); + } + JSONArray projectList = JSONObject.parseArray(body); + for (Object o : projectList) { + JSONObject jsonObject = JSONObject.parseObject(String.valueOf(o)); + String name = jsonObject.getString("name"); + Boolean idProtected = jsonObject.getBoolean("protected"); + ThirdBranch thirdBranch = new ThirdBranch(); + thirdBranch.setId(name); + thirdBranch.setName(name); + thirdBranch.setIsProtected(idProtected); + thirdBranch.setIsProtected(false); + branchList.add(thirdBranch); + } + }catch (HttpClientErrorException e) { + findGitlabErrorRequest(e.getRawStatusCode()); + throw new SystemException(String.valueOf(e)); + } + return branchList; + } + + private void findGitlabErrorRequest(int code){ + switch (code){ + case 401 -> { throw new ApplicationException("令牌无效或已过期 !");} + case 403 -> { throw new ApplicationException("令牌权限不足!");} + case 404 -> { throw new ApplicationException("请求失败,接口不存在!");} + case 405 -> { throw new ApplicationException("不支持该请求!");} + case 429 -> { throw new ApplicationException("请求次数过多!");} + case 503 -> { throw new ApplicationException("服务器暂时超载,无法处理该请求!");} + } + } + + +} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeGitLabServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeGitLabServiceImpl.java new file mode 100644 index 00000000..1e08b9a0 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeGitLabServiceImpl.java @@ -0,0 +1,257 @@ +package cd.casic.module.process.task.code.service.impl; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:13 + * @Version 1.0 + */ + +import cd.casic.ci.commons.bean.exception.ApplicationException; +import cd.casic.ci.commons.bean.exception.SystemException; +import cd.casic.ci.commons.bean.process.setting.AuthThird; +import cd.casic.module.process.process.setting.AuthThirdService; +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 cd.casic.module.process.task.code.model.ThirdUser; +import cd.casic.module.process.task.code.service.TaskCodeGitLabService; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Service +public class TaskCodeGitLabServiceImpl implements TaskCodeGitLabService { + + @Resource + AuthThirdService authThirdService; + + /** + * 获取accessToken + * @param authId 认证ID + * @return 凭证 + */ + private String findAccessToken(String authId){ + AuthThird authServer = authThirdService.findOneAuthServer(authId); + if (Objects.isNull(authServer)){ + throw new ApplicationException("没有查询到当前凭证授权码!"); + } + return authServer.getAccessToken(); + } + + @Override + public List findStoreHouseList(ThirdQuery thirdQuery){ + String accessToken = findAccessToken(thirdQuery.getAuthId()); + List houseList = new ArrayList<>(); + RestTemplate restTemplate = new RestTemplate(); + String url = String.format("https://gitlab.com/api/v4/projects?min_access_level=10&simple=true&page=%s&per_page=%s", + thirdQuery.getPage(),thirdQuery.getPageNumber()); + try { + HttpHeaders headers = new HttpHeaders(); + headers.set("Authorization", "Bearer"+" "+accessToken); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + ResponseEntity forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + if (Objects.isNull(body)){ + throw new SystemException("获取分支信息失败,获取信息为空!"); + } + JSONArray projectList = JSONObject.parseArray(body); + for (Object o : projectList) { + JSONObject jsonObject = JSONObject.parseObject(String.valueOf(o)); + String id = jsonObject.getString("id"); + String name = jsonObject.getString("name"); + String path = jsonObject.getString("path"); + String nameSpace = jsonObject.getString("name_with_namespace"); + String pathSpace = jsonObject.getString("path_with_namespace"); + String sshUrl = jsonObject.getString("ssh_url_to_repo"); + String webUrl = jsonObject.getString("http_url_to_repo"); + String defaultBranch = jsonObject.getString("default_branch"); + + ThirdHouse thirdHouse = new ThirdHouse(); + thirdHouse.setId(id); + thirdHouse.setName(name); + thirdHouse.setPath(name); + thirdHouse.setNameWithSpace(nameSpace); + thirdHouse.setPathWithSpace(nameSpace); + thirdHouse.setHouseSshUrl(sshUrl); + thirdHouse.setHouseWebUrl(webUrl); + thirdHouse.setDefaultBranch(defaultBranch); + houseList.add(thirdHouse); + } + }catch (HttpClientErrorException e) { + // if (Objects.requireNonNull(e.getMessage()).contains("Token is expired")){ + // throw new SystemException("令牌已过期!"); + // } + // if (e.getMessage().contains("Unauthorized")){ + // throw new SystemException("令牌认证失败!"); + // } + findGitlabErrorRequest(e.getRawStatusCode()); + throw new SystemException(String.valueOf(e)); + } + return houseList; + } + + @Override + public ThirdHouse findStoreHouse(ThirdQuery thirdQuery) { + String accessToken = findAccessToken(thirdQuery.getAuthId()); + RestTemplate restTemplate = new RestTemplate(); + String url = String.format("https://gitlab.com/api/v4/projects/%s",thirdQuery.getHouseId()); + ResponseEntity forEntity; + try { + HttpHeaders headers = new HttpHeaders(); + headers.set("Authorization", "Bearer"+" "+accessToken); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + if (Objects.isNull(body)){ + throw new SystemException("获取仓库信息失败,获取信息为空!"); + } + JSONObject jsonObject = JSONObject.parseObject(body); + String id = jsonObject.getString("id"); + String name = jsonObject.getString("name"); + String path = jsonObject.getString("path"); + String nameSpace = jsonObject.getString("name_with_namespace"); + String pathSpace = jsonObject.getString("path_with_namespace"); + String sshUrl = jsonObject.getString("ssh_url_to_repo"); + String webUrl = jsonObject.getString("http_url_to_repo"); + String defaultBranch = jsonObject.getString("default_branch"); + ThirdHouse thirdHouse = new ThirdHouse(); + thirdHouse.setId(id); + thirdHouse.setName(name); + thirdHouse.setPath(name); + thirdHouse.setNameWithSpace(nameSpace); + thirdHouse.setPathWithSpace(nameSpace); + thirdHouse.setHouseSshUrl(sshUrl); + thirdHouse.setHouseWebUrl(webUrl); + thirdHouse.setDefaultBranch(defaultBranch); + return thirdHouse; + }catch (HttpClientErrorException e) { + findGitlabErrorRequest(e.getRawStatusCode()); + throw new SystemException(String.valueOf(e)); + } + } + + @Override + public ThirdUser findAuthUser(ThirdQuery thirdQuery){ + String accessToken = findAccessToken(thirdQuery.getAuthId()); + RestTemplate restTemplate = new RestTemplate(); + String url = "https://gitlab.com/api/v4/user"; + ResponseEntity forEntity; + try { + HttpHeaders headers = new HttpHeaders(); + headers.set("Authorization", "Bearer"+" "+accessToken); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + + JSONObject jsonObject = JSONObject.parseObject(body); + String id = jsonObject.getString("id"); + String login = jsonObject.getString("username"); + String name = jsonObject.getString("name"); + String avatar = jsonObject.getString("avatar_url"); + ThirdUser thirdUser = new ThirdUser(); + thirdUser.setId(id); + thirdUser.setName(name); + thirdUser.setPath(login); + thirdUser.setHead(avatar); + return thirdUser; + }catch (HttpClientErrorException e) { + findGitlabErrorRequest(e.getRawStatusCode()); + throw new SystemException(String.valueOf(e)); + } + } + + @Override + public List findStoreBranchList(ThirdQuery thirdQuery){ + String accessToken = findAccessToken(thirdQuery.getAuthId()); + List branchList= new ArrayList<>(); + RestTemplate restTemplate = new RestTemplate(); + String url = String.format("https://gitlab.com/api/v4/projects/%s/repository/branches",thirdQuery.getHouseId()); + ResponseEntity forEntity; + try { + HttpHeaders headers = new HttpHeaders(); + headers.set("Authorization", "Bearer"+" "+accessToken); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + if (Objects.isNull(body)){ + throw new SystemException("获取分支信息失败,获取信息为空!"); + } + JSONArray projectList = JSONObject.parseArray(body); + for (Object o : projectList) { + JSONObject jsonObject = JSONObject.parseObject(String.valueOf(o)); + String id = jsonObject.getString("commit"); + String name = jsonObject.getString("name"); + Boolean isDefault = jsonObject.getBoolean("default"); + Boolean idProtected = jsonObject.getBoolean("protected"); + ThirdBranch thirdBranch = new ThirdBranch(); + thirdBranch.setId(name); + thirdBranch.setName(name); + thirdBranch.setIsProtected(idProtected); + thirdBranch.setIsProtected(false); + branchList.add(thirdBranch); + } + }catch (HttpClientErrorException e) { + findGitlabErrorRequest(e.getRawStatusCode()); + throw new SystemException(String.valueOf(e)); + } + return branchList; + } + + private void findGitlabErrorRequest(int code){ + switch (code){ + case 401 -> { throw new ApplicationException("令牌无效或已过期 !");} + case 403 -> { throw new ApplicationException("令牌权限不足!");} + case 404 -> { throw new ApplicationException("请求失败,接口不存在!");} + case 405 -> { throw new ApplicationException("不支持该请求!");} + case 429 -> { throw new ApplicationException("请求次数过多!");} + case 503 -> { throw new ApplicationException("服务器暂时超载,无法处理该请求!");} + } + } + + +} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeGiteeServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeGiteeServiceImpl.java new file mode 100644 index 00000000..0e14bcbc --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeGiteeServiceImpl.java @@ -0,0 +1,260 @@ +package cd.casic.module.process.task.code.service.impl; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:10 + * @Version 1.0 + */ + +import cd.casic.ci.commons.bean.exception.ApplicationException; +import cd.casic.ci.commons.bean.exception.SystemException; +import cd.casic.ci.commons.bean.process.setting.AuthThird; +import cd.casic.module.process.process.setting.AuthThirdService; +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 cd.casic.module.process.task.code.model.ThirdUser; +import cd.casic.module.process.task.code.service.TaskCodeGiteeService; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import jakarta.annotation.Resource; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Service +public class TaskCodeGiteeServiceImpl implements TaskCodeGiteeService { + + @Resource + AuthThirdService authThirdService; + + /** + * 获取accessToken + * @param authId 认证ID + * @return 凭证 + */ + private String findAccessToken(String authId){ + AuthThird authServer = authThirdService.findOneAuthServer(authId); + if (Objects.isNull(authServer)){ + throw new ApplicationException("没有查询到当前凭证授权码!"); + } + return authServer.getAccessToken(); + } + + @Override + public List findStoreHouseList(ThirdQuery thirdQuery){ + List houseList = new ArrayList<>(); + RestTemplate restTemplate = new RestTemplate(); + String accessToken = findAccessToken(thirdQuery.getAuthId()); + String url; + if (StringUtils.isEmpty(thirdQuery.getQuery())){ + url = String.format("https://gitee.com/api/v5/user/repos?access_token=%s&sort=full_name&page=%s&per_page=%s", + accessToken,thirdQuery.getPage(),thirdQuery.getPageNumber()); + }else { + url = String.format("https://gitee.com/api/v5/user/repos?access_token=%s&sort=full_name&q=%s&page=%s&per_page=%s", + accessToken,thirdQuery.getQuery(),thirdQuery.getPage(),thirdQuery.getPageNumber()); + } + + try { + HttpHeaders headers = new HttpHeaders(); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + ResponseEntity forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + if (Objects.isNull(body)){ + throw new SystemException("获取分支信息失败,获取信息为空!"); + } + JSONArray projectList = JSONObject.parseArray(body); + for (Object o : projectList) { + JSONObject jsonObject = JSONObject.parseObject(String.valueOf(o)); + String id = jsonObject.getString("full_name"); + String name = jsonObject.getString("name"); + String path = jsonObject.getString("path"); + String nameSpace = jsonObject.getString("full_name"); + String pathSpace = jsonObject.getString("human_name"); + String sshUrl = jsonObject.getString("ssh_url"); + String webUrl = jsonObject.getString("html_url"); + String defaultBranch = jsonObject.getString("default_branch"); + ThirdHouse thirdHouse = new ThirdHouse(); + thirdHouse.setId(id); + thirdHouse.setName(name); + thirdHouse.setPath(path); + thirdHouse.setNameWithSpace(nameSpace); + thirdHouse.setPathWithSpace(pathSpace); + thirdHouse.setHouseSshUrl(sshUrl); + thirdHouse.setHouseWebUrl(webUrl); + thirdHouse.setDefaultBranch(defaultBranch); + houseList.add(thirdHouse); + } + }catch (Exception e) { + if (e instanceof HttpClientErrorException){ + int rawStatusCode = ((HttpClientErrorException) e).getRawStatusCode(); + if (rawStatusCode == 401){ + throw new ApplicationException("授权信息认证失败!"); + } + } + throw new SystemException(String.valueOf(e)); + } + return houseList; + } + + @Override + public ThirdHouse findStoreHouse(ThirdQuery thirdQuery){ + String accessToken = findAccessToken(thirdQuery.getAuthId()); + String[] split = thirdQuery.getHouseId().split("/"); + String url = String.format("https://gitee.com/api/v5/repos/%s/%s?access_token=%s", + split[0],split[1],accessToken); + RestTemplate restTemplate = new RestTemplate(); + + try { + HttpHeaders headers = new HttpHeaders(); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + ResponseEntity forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + if (Objects.isNull(body)){ + throw new SystemException("获取仓库信息失败,获取信息为空!"); + } + JSONObject jsonObject = JSONObject.parseObject(body); + String id = jsonObject.getString("full_name"); + String name = jsonObject.getString("name"); + String path = jsonObject.getString("path"); + String nameSpace = jsonObject.getString("full_name"); + String pathSpace = jsonObject.getString("human_name"); + String sshUrl = jsonObject.getString("ssh_url"); + String webUrl = jsonObject.getString("html_url"); + String defaultBranch = jsonObject.getString("default_branch"); + ThirdHouse thirdHouse = new ThirdHouse(); + thirdHouse.setId(id); + thirdHouse.setName(name); + thirdHouse.setPath(path); + thirdHouse.setNameWithSpace(nameSpace); + thirdHouse.setPathWithSpace(pathSpace); + thirdHouse.setHouseSshUrl(sshUrl); + thirdHouse.setHouseWebUrl(webUrl); + thirdHouse.setDefaultBranch(defaultBranch); + return thirdHouse; + } catch (Exception e) { + throw new SystemException(String.valueOf(e)); + } + } + + @Override + public ThirdUser findAuthUser(ThirdQuery thirdQuery){ + RestTemplate restTemplate = new RestTemplate(); + String accessToken = findAccessToken(thirdQuery.getAuthId()); + String url = String.format("https://gitee.com/api/v5/user?access_token=%s",accessToken); + try { + HttpHeaders headers = new HttpHeaders(); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + ResponseEntity forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + + JSONObject jsonObject = JSONObject.parseObject(body); + String id = jsonObject.getString("id"); + String login = jsonObject.getString("login"); + String name = jsonObject.getString("name"); + String avatar = jsonObject.getString("avatar_url"); + + ThirdUser thirdUser = new ThirdUser(); + thirdUser.setId(id); + thirdUser.setName(name); + thirdUser.setPath(login); + thirdUser.setHead(avatar); + return thirdUser; + }catch (Exception e) { + throw new SystemException(String.valueOf(e)); + } + } + + @Override + public List findStoreBranchList(ThirdQuery thirdQuery){ + List branchList= new ArrayList<>(); + RestTemplate restTemplate = new RestTemplate(); + String[] split = thirdQuery.getHouseId().split("/"); + String accessToken = findAccessToken(thirdQuery.getAuthId()); + String url = String.format("https://gitee.com/api/v5/repos/%s/%s/branches?access_token=%s&sort=name&direction=asc&page=%s&per_page=%s", + split[0],split[1],accessToken,thirdQuery.getPage(),thirdQuery.getPageNumber()); + ResponseEntity forEntity; + try { + HttpHeaders headers = new HttpHeaders(); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + if (Objects.isNull(body)){ + throw new SystemException("获取分支信息失败,获取信息为空!"); + } + JSONArray projectList = JSONObject.parseArray(body); + if (projectList.isEmpty()){ + throw new SystemException("获取分支信息失败,当前仓库为空仓库!"); + } + for (Object o : projectList) { + JSONObject jsonObject = JSONObject.parseObject(String.valueOf(o)); + String name = jsonObject.getString("name"); + Boolean isProtected = jsonObject.getBoolean("protected"); + ThirdBranch thirdBranch = new ThirdBranch(); + thirdBranch.setId(name); + thirdBranch.setName(name); + thirdBranch.setIsProtected(isProtected); + thirdBranch.setIsDefault(false); + branchList.add(thirdBranch); + } + }catch (HttpClientErrorException e) { + findGitlabErrorRequest(e.getRawStatusCode()); + throw new SystemException(String.valueOf(e)); + } + return branchList; + } + + private void findGitlabErrorRequest(int code){ + switch (code){ + case 401 -> { throw new ApplicationException("AccessToken无效或已过期 !");} + case 403 -> { throw new ApplicationException("AccessToken权限不足!");} + case 404 -> { throw new ApplicationException("请求失败,接口不存在!");} + case 405 -> { throw new ApplicationException("不支持该请求!");} + case 429 -> { throw new ApplicationException("请求次数过多!");} + case 503 -> { throw new ApplicationException("服务器暂时超载,无法处理该请求!");} + } + } + + +} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeGittokServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeGittokServiceImpl.java new file mode 100644 index 00000000..989837d6 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeGittokServiceImpl.java @@ -0,0 +1,282 @@ +package cd.casic.module.process.task.code.service.impl; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:13 + * @Version 1.0 + */ + +import cd.casic.ci.commons.bean.exception.ApplicationException; +import cd.casic.ci.commons.bean.exception.SystemException; +import cd.casic.ci.commons.bean.process.setting.AuthThird; +import cd.casic.module.process.process.setting.AuthThirdService; +import cd.casic.module.process.support.util.util.PipelineRequestUtil; +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 cd.casic.module.process.task.code.service.TaskCodeGittokService; +import com.alibaba.fastjson.JSONArray; +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.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +@Service +public class TaskCodeGittokServiceImpl implements TaskCodeGittokService { + + private static final Logger logger = LoggerFactory.getLogger(TaskCodeGittokServiceImpl.class); + + @Resource + AuthThirdService serverServer; + + @Resource + PipelineRequestUtil requestUtil; + + + @Override + public List findStoreHouseList(ThirdQuery thirdQuery){ + String authId = thirdQuery.getAuthId(); + AuthThird authServer = serverServer.findOneAuthServer(authId); + + if (Objects.isNull(authServer)){ + return null; + } + + String serverAddress = authServer.getServerAddress(); + try { + + String username = authServer.getUsername(); + String password = authServer.getPassword(); + + HttpHeaders headers = requestUtil.initHeaders(MediaType.APPLICATION_JSON, new HashMap<>()); + MultiValueMap valueMap = new LinkedMultiValueMap<>(); + valueMap.add("account",username); + valueMap.add("password",password); + valueMap.add("dirId","1"); + String requestUrl = serverAddress+"/api/rpy/findRepositoryByUser"; + + HttpEntity requestEntity = new HttpEntity<>(valueMap, headers); + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity response = restTemplate.exchange(requestUrl, HttpMethod.POST, requestEntity, JSONObject.class); + JSONObject jsonObject = response.getBody(); + JSONArray jsonArray = validBody(jsonObject, JSONArray.class); + + List houseList = new ArrayList<>(); + + for (Object o : jsonArray) { + JSONObject parseObject = JSONObject.parseObject(String.valueOf(o)); + ThirdHouse thirdHouse = bindHouse(parseObject); + houseList.add(thirdHouse); + } + return houseList; + }catch (Throwable throwable){ + String message = throwable.getMessage(); + logger.error(" 连接异常:{}", message); + if (message.contains("timed out") ){ + throw new ApplicationException(58001,"请求超时!"); + } + if (message.contains("未订阅")){ + throw new ApplicationException("当前企业未订阅gittok"); + } + if (throwable instanceof ApplicationException){ + throw new ApplicationException(message); + } + throw new ApplicationException("无法连接到:" + serverAddress); + } + } + + @Override + public List findHouseBranchList(ThirdQuery thirdQuery){ + String authId = thirdQuery.getAuthId(); + String houseId = thirdQuery.getHouseId(); + AuthThird authServer = serverServer.findOneAuthServer(authId); + String serverAddress = authServer.getServerAddress(); + try { + HttpHeaders headers = requestUtil.initHeaders(MediaType.APPLICATION_JSON, new HashMap<>()); + MultiValueMap valueMap = new LinkedMultiValueMap<>(); + valueMap.add("rpyId",houseId); + String requestUrl = serverAddress+"/api/branch/findAllBranch"; + + HttpEntity requestEntity = new HttpEntity<>(valueMap, headers); + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity response = restTemplate.exchange(requestUrl, HttpMethod.POST, requestEntity, JSONObject.class); + JSONObject jsonObject = response.getBody(); + List branchList = new ArrayList<>(); + JSONArray jsonArray = validBody(jsonObject, JSONArray.class); + for (Object o : jsonArray) { + JSONObject parseObject = JSONObject.parseObject(String.valueOf(o)); + ThirdBranch thirdBranch = bindBranch(parseObject); + branchList.add(thirdBranch); + } + return branchList; + + // return requestUtil.requestPostList(headers, requestUrl, valueMap, XcodeBranch.class); + }catch (Throwable throwable){ + String message = throwable.getMessage(); + logger.error(message); + if (message.contains("未订阅")){ + throw new ApplicationException("当前企业未订阅Xcode"); + } + if (throwable instanceof ApplicationException){ + throw new ApplicationException(message); + } + throw new ApplicationException("无法连接到:"+serverAddress); + } + } + + @Override + public ThirdBranch findOneBranch(String authId,String rpyId,String branchId){ + if (Objects.isNull(authId) || Objects.isNull(branchId)){ + return null; + } + + AuthThird authServer = serverServer.findOneAuthServer(authId); + String serverAddress = authServer.getServerAddress(); + + HttpHeaders headers = requestUtil.initHeaders(MediaType.APPLICATION_JSON, new HashMap<>()); + MultiValueMap valueMap = new LinkedMultiValueMap<>(); + valueMap.add("rpyId",rpyId); + valueMap.add("commitId",branchId); + String requestUrl = serverAddress+"/api/branch/findBranch"; + + HttpEntity requestEntity = new HttpEntity<>(valueMap, headers); + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity response = restTemplate.exchange(requestUrl, HttpMethod.POST, requestEntity, JSONObject.class); + JSONObject object = validBody(response.getBody(), JSONObject.class); + ThirdBranch thirdBranch = bindBranch(object); + if (Objects.isNull(thirdBranch)){ + throw new ApplicationException("找不到"+ rpyId +"仓库!"); + } + return thirdBranch; + + // return requestUtil.requestPost(headers, requestUrl, valueMap, XcodeBranch.class); + } + + @Override + public ThirdHouse findStoreHouse(ThirdQuery thirdQuery){ + String authId = thirdQuery.getAuthId(); + String houseId = thirdQuery.getHouseId(); + if (Objects.isNull(authId) || Objects.isNull(houseId)){ + return null; + } + AuthThird authServer = serverServer.findOneAuthServer(authId); + String serverAddress = authServer.getServerAddress(); + try { + HttpHeaders headers = requestUtil.initHeaders(MediaType.APPLICATION_JSON, new HashMap<>()); + MultiValueMap valueMap = new LinkedMultiValueMap<>(); + valueMap.add("id",houseId); + String requestUrl = serverAddress+"/api/rpy/findRepository"; + + HttpEntity requestEntity = new HttpEntity<>(valueMap, headers); + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity response = restTemplate.exchange(requestUrl, HttpMethod.POST, requestEntity, JSONObject.class); + JSONObject object = validBody(response.getBody(), JSONObject.class); + ThirdHouse thirdHouse = bindHouse(object); + if (Objects.isNull(thirdHouse)){ + throw new ApplicationException("找不到"+ houseId +"仓库!"); + } + return thirdHouse; + }catch (Throwable throwable){ + String message = throwable.getMessage(); + logger.error(message); + if (message.contains("未订阅")){ + throw new ApplicationException("当前企业未订阅Xcode"); + } + if (throwable instanceof ApplicationException){ + throw new ApplicationException(message); + } + throw new ApplicationException("无法连接到:"+serverAddress); + } + } + + + private T validBody(JSONObject jsonObject,Class tClass){ + if (Objects.isNull( jsonObject)){ + throw new SystemException("获取返回值为空!"); + } + Integer code = jsonObject.getInteger("code"); + if (code != 0){ + String msg = jsonObject.getString("msg"); + if (code == 5000){ + throw new ApplicationException("用户效验失败!"); + } + throw new ApplicationException("获取仓库列表失败!,Message:"+msg); + } + return jsonObject.getObject("data",tClass); + } + + + private ThirdHouse bindHouse(JSONObject jsonObject){ + if (Objects.isNull(jsonObject)){ + return null; + } + String id = jsonObject.getString("rpyId"); + String fullPath = jsonObject.getString("fullPath"); + String path = jsonObject.getString("address"); + String defaultBranch = jsonObject.getString("defaultBranch"); + String name = jsonObject.getString("name"); + ThirdHouse thirdHouse = new ThirdHouse(); + thirdHouse.setId(id); + thirdHouse.setName(name); + thirdHouse.setPath(path); + thirdHouse.setNameWithSpace(name); + thirdHouse.setPathWithSpace(path); + thirdHouse.setHouseSshUrl(fullPath); + thirdHouse.setDefaultBranch(defaultBranch); + return thirdHouse; + } + + private ThirdBranch bindBranch(JSONObject jsonObject){ + if (Objects.isNull(jsonObject)){ + return null; + } + String id = jsonObject.getString("branchId"); + Boolean defaultBranch = jsonObject.getBoolean("defaultBranch"); + String branchName = jsonObject.getString("branchName"); + + ThirdBranch thirdBranch = new ThirdBranch(); + thirdBranch.setId(branchName); + thirdBranch.setName(branchName); + thirdBranch.setIsDefault(defaultBranch); + return thirdBranch; + } + +} + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodePriGitLabServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodePriGitLabServiceImpl.java new file mode 100644 index 00000000..42632667 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodePriGitLabServiceImpl.java @@ -0,0 +1,262 @@ +package cd.casic.module.process.task.code.service.impl; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:13 + * @Version 1.0 + */ + +import cd.casic.ci.commons.bean.exception.ApplicationException; +import cd.casic.ci.commons.bean.exception.SystemException; +import cd.casic.ci.commons.bean.process.setting.AuthThird; +import cd.casic.module.process.process.setting.AuthThirdService; +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 cd.casic.module.process.task.code.model.ThirdUser; +import cd.casic.module.process.task.code.service.TaskCodePriGitLabService; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Service +public class TaskCodePriGitLabServiceImpl implements TaskCodePriGitLabService { + + @Autowired + AuthThirdService authThirdService; + + /** + * 获取accessToken + * @param authId 认证ID + * @return 凭证 + */ + private AuthThird findAccessToken(String authId){ + AuthThird authServer = authThirdService.findOneAuthServer(authId); + if (Objects.isNull(authServer)){ + throw new ApplicationException("没有查询到当前凭证授权码!"); + } + return authServer; + } + + @Override + public List findStoreHouseList(ThirdQuery thirdQuery){ + AuthThird authServer = findAccessToken(thirdQuery.getAuthId()); + String accessToken = authServer.getAccessToken(); + String serverAddress = authServer.getServerAddress(); + List houseList = new ArrayList<>(); + RestTemplate restTemplate = new RestTemplate(); + + String url = String.format("%s/api/v4/projects?min_access_level=10&simple=true&page=%s&per_page=%s", + serverAddress,thirdQuery.getPage(),thirdQuery.getPageNumber()); + try { + HttpHeaders headers = new HttpHeaders(); + headers.set("Authorization", "Bearer"+" "+accessToken); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + ResponseEntity forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + if (Objects.isNull(body)){ + throw new SystemException("获取分支信息失败,获取信息为空!"); + } + JSONArray projectList = JSONObject.parseArray(body); + for (Object o : projectList) { + JSONObject jsonObject = JSONObject.parseObject(String.valueOf(o)); + String id = jsonObject.getString("id"); + String name = jsonObject.getString("name"); + String path = jsonObject.getString("path"); + String nameSpace = jsonObject.getString("name_with_namespace"); + String pathSpace = jsonObject.getString("path_with_namespace"); + String sshUrl = jsonObject.getString("ssh_url_to_repo"); + String webUrl = jsonObject.getString("http_url_to_repo"); + String defaultBranch = jsonObject.getString("default_branch"); + + ThirdHouse thirdHouse = new ThirdHouse(); + thirdHouse.setId(id); + thirdHouse.setName(name); + thirdHouse.setPath(path); + thirdHouse.setNameWithSpace(nameSpace); + thirdHouse.setPathWithSpace(pathSpace); + thirdHouse.setHouseSshUrl(sshUrl); + thirdHouse.setHouseWebUrl(webUrl); + thirdHouse.setDefaultBranch(defaultBranch); + houseList.add(thirdHouse); + } + }catch (HttpClientErrorException e) { + findGitlabErrorRequest(e.getRawStatusCode()); + throw new SystemException(String.valueOf(e)); + } + return houseList; + } + + @Override + public ThirdHouse findStoreHouse(ThirdQuery thirdQuery) { + AuthThird authServer = findAccessToken(thirdQuery.getAuthId()); + String accessToken = authServer.getAccessToken(); + String serverAddress = authServer.getServerAddress(); + RestTemplate restTemplate = new RestTemplate(); + String url = String.format("%s/api/v4/projects/%s",serverAddress,thirdQuery.getHouseId()); + ResponseEntity forEntity; + try { + HttpHeaders headers = new HttpHeaders(); + headers.set("Authorization", "Bearer"+" "+accessToken); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + if (Objects.isNull(body)){ + throw new SystemException("获取仓库信息失败,获取信息为空!"); + } + JSONObject jsonObject = JSONObject.parseObject(body); + String id = jsonObject.getString("id"); + String name = jsonObject.getString("name"); + String path = jsonObject.getString("path"); + String nameSpace = jsonObject.getString("name_with_namespace"); + String pathSpace = jsonObject.getString("path_with_namespace"); + String sshUrl = jsonObject.getString("ssh_url_to_repo"); + String webUrl = jsonObject.getString("http_url_to_repo"); + String defaultBranch = jsonObject.getString("default_branch"); + ThirdHouse thirdHouse = new ThirdHouse(); + thirdHouse.setId(id); + thirdHouse.setName(name); + thirdHouse.setPath(path); + thirdHouse.setNameWithSpace(nameSpace); + thirdHouse.setPathWithSpace(pathSpace); + thirdHouse.setHouseSshUrl(sshUrl); + thirdHouse.setHouseWebUrl(webUrl); + thirdHouse.setDefaultBranch(defaultBranch); + + return thirdHouse; + }catch (HttpClientErrorException e) { + findGitlabErrorRequest(e.getRawStatusCode()); + throw new SystemException(String.valueOf(e)); + } + } + + @Override + public ThirdUser findAuthUser(ThirdQuery thirdQuery){ + AuthThird authServer = findAccessToken(thirdQuery.getAuthId()); + String accessToken = authServer.getAccessToken(); + String serverAddress = authServer.getServerAddress(); + RestTemplate restTemplate = new RestTemplate(); + String url = serverAddress+ "/api/v4/user"; + ResponseEntity forEntity; + try { + HttpHeaders headers = new HttpHeaders(); + headers.set("Authorization", "Bearer"+" "+accessToken); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + + JSONObject jsonObject = JSONObject.parseObject(body); + String id = jsonObject.getString("id"); + String login = jsonObject.getString("username"); + String name = jsonObject.getString("name"); + String avatar = jsonObject.getString("avatar_url"); + + ThirdUser thirdUser = new ThirdUser(); + thirdUser.setId(id); + thirdUser.setName(name); + thirdUser.setPath(login); + thirdUser.setHead(avatar); + return thirdUser; + }catch (HttpClientErrorException e) { + findGitlabErrorRequest(e.getRawStatusCode()); + throw new SystemException(String.valueOf(e)); + } + } + + @Override + public List findStoreBranchList(ThirdQuery thirdQuery){ + AuthThird authServer = findAccessToken(thirdQuery.getAuthId()); + String accessToken = authServer.getAccessToken(); + String serverAddress = authServer.getServerAddress(); + List branchList= new ArrayList<>(); + RestTemplate restTemplate = new RestTemplate(); + String url = String.format("%s/api/v4/projects/%s/repository/branches",serverAddress,thirdQuery.getHouseId()); + ResponseEntity forEntity; + try { + HttpHeaders headers = new HttpHeaders(); + headers.set("Authorization", "Bearer"+" "+accessToken); + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + HttpEntity> entity = new HttpEntity<>(paramMap, headers); + forEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + String body = forEntity.getBody(); + if (Objects.isNull(body)){ + throw new SystemException("获取分支信息失败,获取信息为空!"); + } + JSONArray projectList = JSONObject.parseArray(body); + for (Object o : projectList) { + JSONObject jsonObject = JSONObject.parseObject(String.valueOf(o)); + String id = jsonObject.getString("commit"); + String name = jsonObject.getString("name"); + Boolean isDefault = jsonObject.getBoolean("default"); + Boolean idProtected = jsonObject.getBoolean("protected"); + ThirdBranch thirdBranch = new ThirdBranch(); + thirdBranch.setId(name); + thirdBranch.setName(name); + thirdBranch.setIsProtected(idProtected); + thirdBranch.setIsProtected(false); + + branchList.add(thirdBranch); + } + }catch (HttpClientErrorException e) { + findGitlabErrorRequest(e.getRawStatusCode()); + throw new SystemException(String.valueOf(e)); + } + return branchList; + } + + private void findGitlabErrorRequest(int code){ + switch (code){ + case 401 -> { throw new ApplicationException("令牌无效或已过期 !");} + case 403 -> { throw new ApplicationException("令牌权限不足!");} + case 404 -> { throw new ApplicationException("请求失败,接口不存在!");} + case 405 -> { throw new ApplicationException("不支持该请求!");} + case 429 -> { throw new ApplicationException("请求次数过多!");} + case 503 -> { throw new ApplicationException("服务器暂时超载,无法处理该请求!");} + } + } + + +} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeServiceImpl.java new file mode 100644 index 00000000..fc5927c7 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/code/service/impl/TaskCodeServiceImpl.java @@ -0,0 +1,221 @@ +package cd.casic.module.process.task.code.service.impl; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 20:14 + * @Version 1.0 + */ + + +import cd.casic.ci.commons.bean.process.setting.AuthThird; +import cd.casic.ci.commons.rpc.annototion.Exporter; +import cd.casic.module.process.process.setting.AuthService; +import cd.casic.module.process.process.setting.AuthThirdService; +import cd.casic.module.process.task.code.dao.TaskCodeDao; +import cd.casic.module.process.task.code.dataobject.TaskCodeDo; +import cd.casic.module.process.task.code.model.TaskCode; +import cd.casic.module.process.task.code.model.ThirdHouse; +import cd.casic.module.process.task.code.model.ThirdQuery; +import cd.casic.module.process.task.code.service.TaskCodeGitHubService; +import cd.casic.module.process.task.code.service.TaskCodeGitLabService; +import cd.casic.module.process.task.code.service.TaskCodeGiteeService; +import cd.casic.module.process.task.code.service.TaskCodeGittokService; +import cd.casic.module.process.task.code.service.TaskCodePriGitLabService; +import cd.casic.module.process.task.code.service.TaskCodeService; +import cd.casic.module.process.toolkit.beans.BeanMapper; +import jakarta.annotation.Resource; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +import static cd.casic.ci.commons.bean.commons.PipelineConstants.AUTH_NONE; +import static cd.casic.ci.commons.bean.commons.PipelineConstants.AUTH_USER_PASS; +import static cd.casic.ci.commons.bean.commons.PipelineConstants.TASK_CODE_PRI_GITLAB; +import static cd.casic.module.process.support.util.util.PipelineFinal.TASK_CODE_GITEE; +import static cd.casic.module.process.support.util.util.PipelineFinal.TASK_CODE_GITHUB; +import static cd.casic.module.process.support.util.util.PipelineFinal.TASK_CODE_GITLAB; +import static cd.casic.module.process.support.util.util.PipelineFinal.TASK_CODE_SVN; +import static cd.casic.module.process.support.util.util.PipelineFinal.TASK_CODE_XCODE; + + +@Service +@Exporter +public class TaskCodeServiceImpl implements TaskCodeService { + + @Resource + TaskCodeDao taskCodeDao; + + @Resource + AuthService authServer; + + @Resource + AuthThirdService authServerServer; + + @Resource + TaskCodeGiteeService giteeService; + + @Resource + TaskCodeGitHubService gitHubService; + + @Resource + TaskCodeGitLabService gitLabService; + + @Resource + TaskCodePriGitLabService priGitLabService; + + @Resource + TaskCodeGittokService xcodeService; + + @Override + public String createCode(TaskCode taskCode) { + return taskCodeDao.createCode(BeanMapper.map(taskCode, TaskCodeDo.class)); + } + + @Override + public TaskCode findCodeByAuth(String taskId){ + TaskCodeDo oneCodeEntity = taskCodeDao.findOneCode(taskId); + TaskCode taskCode = BeanMapper.map(oneCodeEntity, TaskCode.class); + String authId = taskCode.getAuthId(); + + if (Objects.isNull(authId)){ + return taskCode; + } + taskCode.setAuth(findAuth(taskCode.getAuthId())); + return taskCode; + } + + @Override + public Boolean codeValid(String taskType,TaskCode code){ + switch (taskType) { + case TASK_CODE_GITEE, TASK_CODE_GITLAB, TASK_CODE_GITHUB,TASK_CODE_PRI_GITLAB -> { + if (StringUtils.isEmpty(code.getHouseId())) { + return false; + } + return !StringUtils.isEmpty(code.getAuthId()); + } + case TASK_CODE_XCODE -> { + if (StringUtils.isEmpty(code.getHouseId())) { + return false; + } + return !StringUtils.isEmpty(code.getAuthId()); + } + case TASK_CODE_SVN -> { + // String svnFile = code.getSvnFile(); + // return !StringUtils.isEmpty(svnFile); + return true; + } + default -> { + String codeAddress = code.getCodeAddress(); + return !StringUtils.isEmpty(codeAddress); + } + } + } + + @Override + public void deleteCode(String codeId) { + taskCodeDao.deleteCode(codeId); + } + + @Override + public void updateCode(TaskCode taskCode) { + TaskCodeDo oneCodeEntity = taskCodeDao.findOneCode(taskCode.getTaskId()); + TaskCode oneCode = BeanMapper.map(oneCodeEntity, TaskCode.class); + String authId = oneCode.getAuthId(); + String houseId = taskCode.getHouseId(); + + if (!StringUtils.isEmpty(houseId)){ + ThirdHouse storeHouse = null; + ThirdQuery thirdQuery = new ThirdQuery(); + thirdQuery.setHouseId(houseId); + thirdQuery.setAuthId(authId); + switch (taskCode.getType()) { + case TASK_CODE_GITEE -> { + storeHouse = giteeService.findStoreHouse(thirdQuery); + } + case TASK_CODE_GITHUB -> { + storeHouse = gitHubService.findStoreHouse(thirdQuery); + } + case TASK_CODE_GITLAB -> { + storeHouse = gitLabService.findStoreHouse(thirdQuery); + } + case TASK_CODE_PRI_GITLAB -> { + storeHouse = priGitLabService.findStoreHouse(thirdQuery); + } + case TASK_CODE_XCODE -> { + storeHouse = xcodeService.findStoreHouse(thirdQuery); + } + default -> { + } + } + if (!Objects.isNull(storeHouse)){ + taskCode.setCodeAddress(storeHouse.getHouseWebUrl()); + taskCode.setCodeName(storeHouse.getNameWithSpace()); + taskCode.setCodeBranch(storeHouse.getDefaultBranch()); + } + }else { + taskCode.setCodeAddress(taskCode.getCodeName()); + } + + String authType = taskCode.getAuthType(); + if (!StringUtils.isEmpty(authType)){ + if (authType.equals(AUTH_NONE)){ + taskCode.setUsername(""); + taskCode.setPassword(""); + taskCode.setPriKey(""); + }else if (authType.equals(AUTH_USER_PASS)){ + taskCode.setPriKey(""); + }else { + taskCode.setUsername(""); + taskCode.setPassword(""); + } + } + TaskCodeDo taskCodeDo = BeanMapper.map(taskCode, TaskCodeDo.class); + taskCodeDao.updateCode(taskCodeDo); + } + + @Override + public void updateOneCode(TaskCode taskCode){ + taskCodeDao.updateCode(BeanMapper.map(taskCode, TaskCodeDo.class)); + } + + @Override + public TaskCode findOneCode(String codeId) { + TaskCodeDo oneCodeEntity = taskCodeDao.findOneCode(codeId); + return BeanMapper.map(oneCodeEntity, TaskCode.class); + } + + @Override + public List findAllCode() { + List allCode = taskCodeDao.findAllCode(); + List taskCodes = BeanMapper.mapList(allCode, TaskCode.class); + if (taskCodes == null){ + return null; + } + for (TaskCode taskCode : taskCodes) { + taskCode.setAuth(findAuth(taskCode.getAuthId())); + } + return taskCodes; + } + + @Override + public List findAllCodeList(List idList) { + return BeanMapper.mapList(taskCodeDao.findAllCodeList(idList), TaskCode.class); + } + + //获认证信息 + private Object findAuth(String id){ + AuthThird oneAuthServer = authServerServer.findOneAuthServer(id); + if (oneAuthServer != null){ + return oneAuthServer; + } + return authServer.findOneAuth(id); + } + +} + + diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/controller/SpotbugsScanController.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/controller/SpotbugsScanController.java new file mode 100644 index 00000000..a96491aa --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/controller/SpotbugsScanController.java @@ -0,0 +1,111 @@ +package cd.casic.module.process.task.codescan.controller; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/3 20:15 + * @Version 1.0 + */ + +import cd.casic.ci.commons.bean.commons.Pagination; +import cd.casic.ci.commons.bean.utils.Result; +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.module.process.task.code.service.SpotbugsScanService; +import cd.casic.module.process.task.codescan.model.SpotbugsBugInstance; +import cd.casic.module.process.task.codescan.model.SpotbugsBugPackageStats; +import cd.casic.module.process.task.codescan.model.SpotbugsBugQuery; +import cd.casic.module.process.task.codescan.model.SpotbugsBugSummary; +import cd.casic.module.process.task.codescan.service.impl.SpotbugsXmlConfig; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @pi.protocol: http + * @pi.groupName: 流水线代码扫描Spotbugs控制器 + */ +@RestController +@RequestMapping("/spotbugsScan") +public class SpotbugsScanController { + + @Resource + SpotbugsScanService spotbugsScanService; + + /** + * @pi.name:条件查询代码扫描结果 + * @pi.url:/spotbugsScan/findScanBugsList + * @pi.methodType:post + * @pi.request-type:json + * @pi.param: model=spotbugsBugQuery + */ + @RequestMapping(path = "/findScanBugsList", method = RequestMethod.POST) + public Result> findSpotbugsList(@RequestBody @Valid @NotNull SpotbugsBugQuery spotbugsBugQuery) { + List spotbugsList = spotbugsScanService.findSpotbugsList(spotbugsBugQuery); + + return Result.ok(spotbugsList); + } + + /** + * @pi.name:分页查询代码扫描结果 + * @pi.url:/spotbugsScan/findSpotbugsPage + * @pi.methodType:post + * @pi.request-type:json + * @pi.param: model=spotbugsBugQuery + */ + @RequestMapping(path = "/findSpotbugsPage", method = RequestMethod.POST) + public Result> findSpotbugsPage(@RequestBody @Valid @NotNull SpotbugsBugQuery spotbugsBugQuery) { + + PageResult spotbugsList = spotbugsScanService.findSpotbugsPage(spotbugsBugQuery); + + return Result.ok(spotbugsList); + } + + /** + * @pi.name:查询代码扫描详情 + * @pi.url:/spotbugsScan/findBugs + * @pi.methodType:post + * @pi.request-type: formdata + * @pi.param: name=xmlPath;dataType=string;value=xmlPath; + */ + @RequestMapping(path = "/findBugs", method = RequestMethod.POST) + public Result> findAllRepository(@NotNull String xmlPath) { + List scanBugs = new SpotbugsXmlConfig().findScanBugs(xmlPath); + + return Result.ok(scanBugs); + } + + + /** + * @pi.name:删除代码扫描结果 + * @pi.url:/spotbugsScan/deleteSpotbugs + * @pi.methodType:post + * @pi.request-type: formdata + * @pi.param: name=bugId;dataType=string;value=bugId; + */ + @RequestMapping(path = "/deleteSpotbugs", method = RequestMethod.POST) + public Result> deleteSpotbugs(@NotNull String bugId) { + + spotbugsScanService.deleteSpotbugs(bugId); + return Result.ok(); + } + + + + + + + + + + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/dao/SpotbugsScanDao.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/dao/SpotbugsScanDao.java new file mode 100644 index 00000000..b50a1576 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/dao/SpotbugsScanDao.java @@ -0,0 +1,77 @@ +package cd.casic.module.process.task.codescan.dao; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/3 20:15 + * @Version 1.0 + */ + + +import cd.casic.ci.commons.bean.commons.Pagination; +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.module.process.task.code.jpa.JpaTemplate; +import cd.casic.module.process.task.codescan.dataobject.SpotbugsScanEntity; +import cd.casic.module.process.task.codescan.model.SpotbugsBugQuery; +import cd.casic.module.process.task.codescan.model.SpotbugsBugSummary; +import cd.casic.module.process.toolkit.beans.BeanMapper; +import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +/** + * Spotbugs代码扫描数据操作 + * @author zcamy + */ +@Repository +public class SpotbugsScanDao { + + + @Resource + JpaTemplate jpaTemplate; + + public String creatSpotbugs(SpotbugsBugSummary bugSummary) { + SpotbugsScanEntity scanEntity = BeanMapper.map(bugSummary, SpotbugsScanEntity.class); + return jpaTemplate.save(scanEntity,String.class); + } + + public void updateSpotbugs(SpotbugsBugSummary bugSummary) { + SpotbugsScanEntity scanEntity = BeanMapper.map(bugSummary, SpotbugsScanEntity.class); + jpaTemplate.update(scanEntity); + } + + + public void deleteSpotbugs(String bugId) { + jpaTemplate.delete(SpotbugsScanEntity.class,bugId); + } + + + public SpotbugsBugSummary findOneSpotbugs(String bugId) { + SpotbugsScanEntity scanEntity = jpaTemplate.findOne(SpotbugsScanEntity.class, bugId); + + return BeanMapper.map(scanEntity,SpotbugsBugSummary.class); + } + + + public List findAllSpotbugs() { + List scanEntityList = jpaTemplate.findAll(SpotbugsScanEntity.class); + if (scanEntityList == null || scanEntityList.isEmpty()){ + return Collections.emptyList(); + } + return BeanMapper.mapList(scanEntityList,SpotbugsBugSummary.class); + } + + + public List findSpotbugsList(SpotbugsBugQuery bugQuery) { + return BeanMapper.mapList(null,SpotbugsBugSummary.class); + } + + public PageResult findSpotbugsPage(SpotbugsBugQuery bugQuery) { + return null; + } + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/dao/TaskCodeScanDao.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/dao/TaskCodeScanDao.java new file mode 100644 index 00000000..8b7fd17e --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/dao/TaskCodeScanDao.java @@ -0,0 +1,73 @@ +package cd.casic.module.process.task.codescan.dao; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 19:26 + * @Version 1.0 + */ + +import cd.casic.module.process.task.code.jpa.JpaTemplate; +import cd.casic.module.process.task.codescan.dataobject.TaskCodeScanEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class TaskCodeScanDao { + + @Autowired + JpaTemplate jpaTemplate ; + + /** + * 创建动态 + * @param taskCodeScanEntity 代码扫描 + * @return 代码扫描id + */ + public String createCodeScan(TaskCodeScanEntity taskCodeScanEntity){ + + return jpaTemplate.save(taskCodeScanEntity, String.class); + } + + /** + * 删除代码扫描 + * @param CodeScanId 代码扫描id + */ + public void deleteCodeScan(String CodeScanId){ + jpaTemplate.delete(TaskCodeScanEntity.class, CodeScanId); + } + + /** + * 更新代码扫描 + * @param taskCodeScanEntity 更新信息 + */ + public void updateCodeScan(TaskCodeScanEntity taskCodeScanEntity){ + jpaTemplate.update(taskCodeScanEntity); + } + + /** + * 查询单个代码扫描信息 + * @param CodeScanId 代码扫描id + * @return 代码扫描信息 + */ + public TaskCodeScanEntity findOneCodeScan(String CodeScanId){ + return jpaTemplate.findOne(TaskCodeScanEntity.class,CodeScanId); + } + + /** + * 查询所有代码扫描 + * @return 代码扫描集合 + */ + public List findAllCodeScan(){ + return jpaTemplate.findAll(TaskCodeScanEntity.class); + } + + + public List findAllCodeScanList(List idList){ + return jpaTemplate.findList(TaskCodeScanEntity.class,idList); + } + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/dataobject/SpotbugsScanEntity.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/dataobject/SpotbugsScanEntity.java new file mode 100644 index 00000000..7489450d --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/dataobject/SpotbugsScanEntity.java @@ -0,0 +1,64 @@ +package cd.casic.module.process.task.codescan.dataobject; + + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 19:26 + * @Version 1.0 + */ + +import cd.casic.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * @author Spotbugs代码扫描 + */ +@Data +@Builder +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName(value = "pip_task_code_scan_spotbugs", autoResultMap = true) +public class SpotbugsScanEntity extends BaseDO { + + @TableId + private String id; + + // 流水线id + private String pipelineId; + + // 扫描时间 + private String scanTime; + + // 总共扫描的类的数量。 + private String totalClasses; + + // 引用的类的数量 + private String referencedClasses; + + // 检测到的问题(Bugs)的数量 + private String totalBugs; + + // 项目中的包(package)数量 + private String numPackages; + + // 优先级为 1 的问题数 + private String priorityOne; + + // 优先级为 2 的问题数 + private String priorityTwo; + + // 优先级为 3 的问题数 + private String priorityThree; + + private String xmlPath; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/dataobject/TaskCodeScanEntity.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/dataobject/TaskCodeScanEntity.java new file mode 100644 index 00000000..02376f3d --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/dataobject/TaskCodeScanEntity.java @@ -0,0 +1,62 @@ +package cd.casic.module.process.task.codescan.dataobject; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/2 19:26 + * @Version 1.0 + */ + + +import cd.casic.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.springframework.data.annotation.Id; + +/** + * 代码扫描 + * @author zcamy + */ + +@Data +@Builder +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName(value = "pip_task_code_scan", autoResultMap = true) +public class TaskCodeScanEntity extends BaseDO { + + @TableId + private String taskId; + + private String projectName; + + private String authId; + + // 是否开启断言 + private String openAssert; + + // 是否启用调试模式 + private String openDebug; + + private String scanPath; + + // 扫描等级 min--最小,default--默认,max--最大 + private String scanGrade; + + // 扫描错误级别 default--默认 max--最大 + private String errGrade; + + // jdk版本 + private String toolJdk; + + // maven版本 + private String toolMaven; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/service/impl/SpotbugsScanServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/service/impl/SpotbugsScanServiceImpl.java new file mode 100644 index 00000000..bd3e0e16 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/service/impl/SpotbugsScanServiceImpl.java @@ -0,0 +1,98 @@ +package cd.casic.module.process.task.codescan.service.impl; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/3 20:15 + * @Version 1.0 + */ + +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.module.process.task.code.service.SpotbugsScanService; +import cd.casic.module.process.task.codescan.dao.SpotbugsScanDao; +import cd.casic.module.process.task.codescan.model.SpotbugsBugQuery; +import cd.casic.module.process.task.codescan.model.SpotbugsBugSummary; +import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.util.List; +import java.util.Objects; + +/** + * @author Spotbugs代码扫描实现 + */ +@Service +public class SpotbugsScanServiceImpl implements SpotbugsScanService { + + @Resource + SpotbugsScanDao spotbugsScanDao; + + @Override + public String creatSpotbugs(SpotbugsBugSummary bugSummary) { + return spotbugsScanDao.creatSpotbugs(bugSummary); + } + + @Override + public void updateSpotbugs(SpotbugsBugSummary bugSummary) { + spotbugsScanDao.updateSpotbugs(bugSummary); + } + + @Override + public void deleteSpotbugs(String bugId) { + SpotbugsBugSummary spotbugs = findOneSpotbugs(bugId); + if (Objects.isNull(spotbugs)){ + return; + } + String xmlPath = spotbugs.getXmlPath(); + + File file = new File(xmlPath); + if (file.exists()){ + file.delete(); + } + spotbugsScanDao.deleteSpotbugs(bugId); + } + + @Override + public SpotbugsBugSummary findOneSpotbugs(String bugId) { + return spotbugsScanDao.findOneSpotbugs(bugId); + } + + @Override + public List findAllSpotbugs() { + return spotbugsScanDao.findAllSpotbugs(); + } + + @Override + public List findSpotbugsList(SpotbugsBugQuery bugQuery) { + return spotbugsScanDao.findSpotbugsList(bugQuery); + } + + @Override + public PageResult findSpotbugsPage(SpotbugsBugQuery bugQuery) { + return spotbugsScanDao.findSpotbugsPage(bugQuery); + } +} + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/service/impl/SpotbugsXmlConfig.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/service/impl/SpotbugsXmlConfig.java new file mode 100644 index 00000000..7c6d1ee8 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/service/impl/SpotbugsXmlConfig.java @@ -0,0 +1,550 @@ +package cd.casic.module.process.task.codescan.service.impl; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/3 20:15 + * @Version 1.0 + */ + +import cd.casic.ci.commons.bean.exception.ApplicationException; +import cd.casic.ci.commons.bean.exception.SystemException; +import cd.casic.ci.commons.bean.utils.PipelineFileUtil; +import cd.casic.module.process.task.codescan.model.SpotbugsBugCategory; +import cd.casic.module.process.task.codescan.model.SpotbugsBugClass; +import cd.casic.module.process.task.codescan.model.SpotbugsBugClassStats; +import cd.casic.module.process.task.codescan.model.SpotbugsBugCode; +import cd.casic.module.process.task.codescan.model.SpotbugsBugField; +import cd.casic.module.process.task.codescan.model.SpotbugsBugFileStats; +import cd.casic.module.process.task.codescan.model.SpotbugsBugInstance; +import cd.casic.module.process.task.codescan.model.SpotbugsBugMethod; +import cd.casic.module.process.task.codescan.model.SpotbugsBugPackageStats; +import cd.casic.module.process.task.codescan.model.SpotbugsBugPattern; +import cd.casic.module.process.task.codescan.model.SpotbugsBugSourceLine; +import cd.casic.module.process.task.codescan.model.SpotbugsBugSummary; +import org.apache.commons.lang3.StringUtils; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.File; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; + +/** + * SpotbugsXml文件解析 + * @author zcamy + */ +public class SpotbugsXmlConfig { + + /** + * 解析代码扫描统计信息 + * @param xmlPath 扫描结果文件 + * @return 解析结果 + */ + public SpotbugsBugSummary findScanSummary(String xmlPath){ + try { + File xmlFile = new File(xmlPath); + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(xmlFile); + + // 可选:根据需要对Document进行额外的配置 + doc.getDocumentElement().normalize(); + + // 获取根元素 + Element rootElement = doc.getDocumentElement(); + + NodeList findBugsSummaryList = rootElement.getElementsByTagName("FindBugsSummary"); + for (int i = 0; i < findBugsSummaryList.getLength(); i++) { + Node findBugsSummaryNode = findBugsSummaryList.item(i); + if (findBugsSummaryNode.getNodeType() == Node.ELEMENT_NODE) { + Element findBugsSummaryElement = (Element) findBugsSummaryNode; + String totalClasses = findBugsSummaryElement.getAttribute("total_classes"); //总共扫描的类的数量。 + String referencedClasses = findBugsSummaryElement.getAttribute("referenced_classes");//引用的类的数量。 + String totalBugs = findBugsSummaryElement.getAttribute("total_bugs");//总共检测到的问题(Bugs)的数量。 + String numPackages = findBugsSummaryElement.getAttribute("num_packages");//项目中的包(package)数量。 + String vmVersion = findBugsSummaryElement.getAttribute("vm_version");//vm_version Java 版本信息。 + String priority2 = findBugsSummaryElement.getAttribute("priority_2");//优先级为 2 的问题数量。 + String priority1 = findBugsSummaryElement.getAttribute("priority_1");//优先级为 1 的问题数量。 + String priority3 = findBugsSummaryElement.getAttribute("priority_3");//优先级为 1 的问题数量。 + + // 转换时间 + String format; + SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH); + try { + Date date = dateFormat.parse(findBugsSummaryElement.getAttribute("timestamp")); + format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + } + SpotbugsBugSummary summary = new SpotbugsBugSummary(); + summary.setScanTime(format); + summary.setTotalClasses(totalClasses); + summary.setReferencedClasses(referencedClasses); + summary.setTotalBugs(totalBugs); + summary.setNumPackages(numPackages); + summary.setVmVersion(vmVersion); + summary.setPriorityOne(priority1); + summary.setPriorityTwo(priority2); + summary.setPriorityThree(priority3); + + return summary; + } + } + }catch (Exception e){ + throw new SystemException("解析Xml文件失败,path:"+xmlPath+" ,message:"+e.getMessage()); + } + return null; + } + + /** + * 解析所有Bug + * @param xmlPath 文件地址 + * @return Bug集合 + */ + public List findBugFileStats(String xmlPath){ + try { + File xmlFile = new File(xmlPath); + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(xmlFile); + + // 可选:根据需要对Document进行额外的配置 + doc.getDocumentElement().normalize(); + + List list = new ArrayList<>(); + + // 获取根元素 + Element rootElement = doc.getDocumentElement(); + + NodeList findBugsSummaryList = rootElement.getElementsByTagName("FindBugsSummary"); + for (int i = 0; i < findBugsSummaryList.getLength(); i++) { + Node findBugsSummaryNode = findBugsSummaryList.item(i); + if (findBugsSummaryNode.getNodeType() == Node.ELEMENT_NODE) { + Element findBugsSummaryElement = (Element) findBugsSummaryNode; + + NodeList fileStatsList = findBugsSummaryElement.getElementsByTagName("FileStats"); + for (int i1 = 0; i1 < fileStatsList.getLength(); i1++) { + Node fileStatsNide = fileStatsList.item(i); + if (fileStatsNide.getNodeType() == Node.ELEMENT_NODE) { + Element fileStatsElement = (Element) fileStatsNide; + String path = fileStatsElement.getAttribute("path"); + String bugCount = fileStatsElement.getAttribute("bugCount"); + + String replace = path.replaceAll("/", ".").replace(".java",""); + + List scanBugsList = findScanBugs(xmlPath); + List bugInstanceList = scanBugsList.stream() + .filter(a -> !Objects.equals(a.getBugClass().getClassname(), replace)).toList(); + + SpotbugsBugFileStats spotbugsBugFileStats = new SpotbugsBugFileStats() + .setPath(path) + .setBugNumber(String.valueOf(scanBugsList.size())) + .setBugInstanceList(bugInstanceList); + + list.add(spotbugsBugFileStats); + + } + } + } + } + + return list; + }catch (Exception e){ + throw new SystemException("解析Xml文件失败,path:"+xmlPath+" ,message:"+e.getMessage()); + } + } + + /** + * 根据包解析Bug + * @param xmlPath xml文件地址 + * @return bug集合 + */ + public List findBugPackageStats(String xmlPath){ + try { + File xmlFile = new File(xmlPath); + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(xmlFile); + + // 可选:根据需要对Document进行额外的配置 + doc.getDocumentElement().normalize(); + + List list = new ArrayList<>(); + + // 获取根元素 + Element rootElement = doc.getDocumentElement(); + + NodeList findBugsSummaryList = rootElement.getElementsByTagName("FindBugsSummary"); + for (int i = 0; i < findBugsSummaryList.getLength(); i++) { + Node findBugsSummaryNode = findBugsSummaryList.item(i); + if (findBugsSummaryNode.getNodeType() == Node.ELEMENT_NODE) { + Element findBugsSummaryElement = (Element) findBugsSummaryNode; + + NodeList packageStatsList = findBugsSummaryElement.getElementsByTagName("PackageStats"); + for (int i1 = 0; i1 < packageStatsList.getLength(); i1++) { + Node fileStatsNide = packageStatsList.item(i); + if (fileStatsNide.getNodeType() == Node.ELEMENT_NODE) { + Element fileStatsElement = (Element) findBugsSummaryNode; + String packagePath = fileStatsElement.getAttribute("package"); + String totalBugs = fileStatsElement.getAttribute("total_bugs"); + String totalTypes = fileStatsElement.getAttribute("total_types"); + + // 文件不存在bug + if ("0".equals(totalBugs)){ + continue; + } + List classStatsArrayList = new ArrayList<>(); + + NodeList classStatsList = fileStatsElement.getElementsByTagName("ClassStats"); + for (int i2 = 0; i2 < classStatsList.getLength(); i2++) { + Element classStatsElement = (Element) classStatsList.item(i); + String aClass = classStatsElement.getAttribute("class"); + String bugs = classStatsElement.getAttribute("bugs"); + String idInterface = classStatsElement.getAttribute("interface"); + // if ("0".equals(bugs)){ + // continue; + // } + + List scanBugsList = findScanBugs(xmlPath); + List bugInstanceList = scanBugsList.stream() + .filter(a -> !Objects.equals(a.getBugClass().getClassname(), aClass)).toList(); + + SpotbugsBugClassStats spotbugsBugClassStats = new SpotbugsBugClassStats() + // .setBugNumber(scanBugsList.size()) + .setClassName(aClass) + // .setInterface(Boolean.valueOf(idInterface)) + .setBugInstanceList(bugInstanceList); + + classStatsArrayList.add(spotbugsBugClassStats); + } + SpotbugsBugPackageStats spotbugsBugPackageStats = new SpotbugsBugPackageStats() + .setTotalBugs(classStatsArrayList.size()) + .setPackagePath(packagePath) + // .setTotalTypes(Integer.parseInt(totalTypes)) + .setClassStatsList(classStatsArrayList); + list.add(spotbugsBugPackageStats); + } + } + } + } + return list; + }catch (Exception e){ + throw new SystemException("解析Xml文件失败,path:"+xmlPath+" ,message:"+e.getMessage()); + } + } + + public List findScanBugs(String xmlPath){ + try { + // 读取XML文件 + File xmlFile = new File(xmlPath); + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(xmlFile); + + // 可选:根据需要对Document进行额外的配置 + doc.getDocumentElement().normalize(); + + // 获取根元素 + Element rootElement = doc.getDocumentElement(); + + List list = new ArrayList<>(); + + Map categoryMap = analysisBugCategory(rootElement); + + Map patternMap = analysisBugPattern(rootElement); + + Map bugCodeMap = analysisBugCode(rootElement); + + + // 获取BugInstance元素的列表 + NodeList bugInstanceList = rootElement.getElementsByTagName("BugInstance"); + + // 遍历BugInstance元素列表 + for (int i = 0; i < bugInstanceList.getLength(); i++) { + Node bugInstanceNode = bugInstanceList.item(i); + + if (bugInstanceNode.getNodeType() == Node.ELEMENT_NODE) { + Element bugInstanceElement = (Element) bugInstanceNode; + + // 获取Bug 级别 + String priority = bugInstanceElement.getAttribute("priority"); + + String bugDescription = bugInstanceElement.getElementsByTagName("LongMessage") + .item(0).getTextContent(); + + String shortMessage = bugInstanceElement.getElementsByTagName("ShortMessage") + .item(0).getTextContent(); + + + String abbrev = bugInstanceElement.getAttribute("abbrev"); + SpotbugsBugCode spotbugsBugCode = bugCodeMap.get(abbrev); + + String category = bugInstanceElement.getAttribute("category"); + SpotbugsBugCategory spotbugsBugCategory = categoryMap.get(category); + + String bugType = bugInstanceElement.getAttribute("type"); + SpotbugsBugPattern spotbugsBugPattern = patternMap.get(bugType); + + // 解析Class + SpotbugsBugClass spotbugsBugClass = analysisClass(bugInstanceElement); + + // 解析Method + SpotbugsBugMethod spotbugsBugMethod = analysisMethod(bugInstanceElement); + + // 解析Field + SpotbugsBugField spotbugsBugField = analysisField(bugInstanceElement); + + // 解析SourceLine + SpotbugsBugSourceLine spotbugsBugSourceLine = analysisSourceLine(bugInstanceElement); + + SpotbugsBugInstance spotbugsBugInstance = new SpotbugsBugInstance() + .setBugClass(spotbugsBugClass) + .setBugCode(spotbugsBugCode) + .setBugField(spotbugsBugField) + .setBugMethod(spotbugsBugMethod) + .setBugField(spotbugsBugField) + .setCategory(spotbugsBugCategory) + .setBugPattern(spotbugsBugPattern) + .setBugPriority(priority) + .setBugSourceLine(spotbugsBugSourceLine) + .setBugType(bugType) + .setLongMessage(bugDescription) + .setShortMessage(shortMessage); + list.add(spotbugsBugInstance); + } + } + return list.stream().sorted(Comparator.comparing(SpotbugsBugInstance::getBugPriority)).toList(); + + } catch (Exception e) { + throw new SystemException("解析Xml文件失败,path:"+xmlPath+" ,message:"+e.getMessage()); + } + } + + // 解析Class + private SpotbugsBugClass analysisClass(Element element){ + Element classElement = (Element) element.getElementsByTagName("Class") + .item(0); + Element sourceLine = (Element) classElement.getElementsByTagName("SourceLine") + .item(0); + int beginLine = 0 ,endLine = 0; + String start = sourceLine.getAttribute("start"); + if (!StringUtils.isEmpty(start)){ + beginLine = Integer.parseInt(sourceLine.getAttribute("start")); + } + String end = sourceLine.getAttribute("end"); + if (!StringUtils.isEmpty(end)){ + endLine = Integer.parseInt(sourceLine.getAttribute("end")); + } + String classname = classElement.getAttribute("classname"); + String message = classElement.getElementsByTagName("Message") + .item(0).getTextContent(); + return new SpotbugsBugClass() + .setMessage(message) + .setStartLine(beginLine) + .setEndLine(endLine) + .setClassname(classname); + } + + // 解析Method + private SpotbugsBugMethod analysisMethod(Element element){ + Element methodElement = (Element) element.getElementsByTagName("Method") + .item(0); + if (Objects.isNull(methodElement)){ + return null; + } + String name = methodElement.getAttribute("name"); + String signature = methodElement.getAttribute("signature"); + Element sourceLine = (Element) methodElement.getElementsByTagName("SourceLine") + .item(0); + int beginLine = 0 ,endLine = 0; + String start = sourceLine.getAttribute("start"); + if (!StringUtils.isEmpty(start)){ + beginLine = Integer.parseInt(start); + } + String end = sourceLine.getAttribute("end"); + if (!StringUtils.isEmpty(end)){ + endLine = Integer.parseInt(end); + } + String message = methodElement.getElementsByTagName("Message") + .item(0).getTextContent(); + return new SpotbugsBugMethod() + .setMethodName(name) + .setSignature(signature) + .setStartLine(beginLine) + .setEndLine(endLine) + .setMessage(message); + } + + // 解析Field + private SpotbugsBugField analysisField(Element element){ + Element fieldElement = (Element) element.getElementsByTagName("Field") + .item(0); + if (Objects.isNull(fieldElement)){ + return null; + } + String name = fieldElement.getAttribute("name"); + String signature = fieldElement.getAttribute("signature"); + String message = fieldElement.getElementsByTagName("Message") + .item(0).getTextContent(); + return new SpotbugsBugField() + .setFieldName(name) + .setSignature(signature) + .setMessage(message); + } + + // 解析SourceLine + private SpotbugsBugSourceLine analysisSourceLine(Element element){ + Element sourceLineElement = (Element) element.getElementsByTagName("SourceLine").item(0); + if (Objects.isNull(sourceLineElement)){ + return null; + } + String sourcePath = sourceLineElement.getAttribute("sourcepath"); + String sourceFile = sourceLineElement.getAttribute("sourcefile"); + + int beginLine = 0 ,endLine = 0; + String start = sourceLineElement.getAttribute("start"); + if (!StringUtils.isEmpty(start)){ + beginLine = Integer.parseInt(start); + } + String end = sourceLineElement.getAttribute("end"); + if (!StringUtils.isEmpty(end)){ + endLine = Integer.parseInt(end); + } + String message = sourceLineElement.getElementsByTagName("Message").item(0).getTextContent(); + return new SpotbugsBugSourceLine() + .setStartLine(beginLine) + .setEndLine(endLine) + .setMessage(message) + .setSourceFile(sourceFile) + .setSourcePath(sourcePath); + } + + // 解析Category + private Map analysisBugCategory(Element element){ + NodeList bugInstanceList = element.getElementsByTagName("BugCategory"); + Map hashMap = new HashMap<>(); + for (int i = 0; i < bugInstanceList.getLength(); i++) { + Node bugInstanceNode = bugInstanceList.item(i); + + if (bugInstanceNode.getNodeType() == Node.ELEMENT_NODE) { + Element categoryElement = (Element) bugInstanceNode; + + String category = categoryElement.getAttribute("category"); + String description = categoryElement.getElementsByTagName("Description") + .item(0).getTextContent(); + SpotbugsBugCategory spotbugsBugCategory = new SpotbugsBugCategory() + .setCategory(category) + .setDescription(description); + + hashMap.put(category,spotbugsBugCategory); + } + } + return hashMap; + } + + private Map analysisBugPattern(Element element){ + NodeList bugInstanceList = element.getElementsByTagName("BugPattern"); + Map hashMap = new HashMap<>(); + for (int i = 0; i < bugInstanceList.getLength(); i++) { + Node bugInstanceNode = bugInstanceList.item(i); + + if (bugInstanceNode.getNodeType() == Node.ELEMENT_NODE) { + Element categoryElement = (Element) bugInstanceNode; + + String category = categoryElement.getAttribute("category"); + String type = categoryElement.getAttribute("type"); + String abbrev = categoryElement.getAttribute("abbrev"); + + String shortDescription = categoryElement.getElementsByTagName("ShortDescription") + .item(0).getTextContent(); + + String details = categoryElement.getElementsByTagName("Details") + .item(0).getTextContent(); + SpotbugsBugPattern spotbugsBugPattern = new SpotbugsBugPattern() + .setCategory(category) + .setType(type) + .setAbbrev(abbrev) + .setShortDescription(shortDescription) + .setDetails(details); + + hashMap.put(type, spotbugsBugPattern); + } + } + return hashMap; + } + + private Map analysisBugCode(Element element){ + NodeList bugInstanceList = element.getElementsByTagName("BugCode"); + Map hashMap = new HashMap<>(); + for (int i = 0; i < bugInstanceList.getLength(); i++) { + Node bugInstanceNode = bugInstanceList.item(i); + + if (bugInstanceNode.getNodeType() == Node.ELEMENT_NODE) { + Element categoryElement = (Element) bugInstanceNode; + + String cweid = categoryElement.getAttribute("cweid"); + String abbrev = categoryElement.getAttribute("abbrev"); + + String description = categoryElement.getElementsByTagName("Description") + .item(0).getTextContent(); + + SpotbugsBugCode spotbugsBugCode = new SpotbugsBugCode() + .setAbbrev(abbrev) + .setCweid(cweid) + .setDescription(description); + + hashMap.put(abbrev,spotbugsBugCode); + + } + } + return hashMap; + } + + private Map findJavaFilePath(String filePath){ + + File file = new File(filePath); + + if (!file.exists() || file.isFile()){ + throw new ApplicationException("文件夹不存在!" + filePath); + } + + Map map = new HashMap<>(); + + List javaPathList = PipelineFileUtil.getFilePath(file, new ArrayList<>()); + + for (String javaPath : javaPathList) { + if (!javaPath.endsWith(".java")){ + continue; + } + String name = new File(javaPath).getName(); + + if (StringUtils.isEmpty(map.get(name))){ + String parent = new File(javaPath).getParent(); + map.put( parent+"/"+name ,javaPath); + }else { + map.put(name,javaPath); + } + } + return map; + } + + + + + + + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/service/impl/TaskCodeScanServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/service/impl/TaskCodeScanServiceImpl.java new file mode 100644 index 00000000..5e1218f3 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/module/process/task/codescan/service/impl/TaskCodeScanServiceImpl.java @@ -0,0 +1,145 @@ +package cd.casic.module.process.task.codescan.service.impl; + +/** + * @ClassName TaskArtifactXpackServiceImpl + * @Author hopeli + * @Date 2025/5/3 20:15 + * @Version 1.0 + */ + +import cd.casic.ci.commons.bean.process.setting.AuthThird; +import cd.casic.ci.commons.bean.utils.PipelineUtil; +import cd.casic.ci.commons.rpc.annototion.Exporter; +import cd.casic.module.process.process.setting.AuthHostService; +import cd.casic.module.process.process.setting.AuthThirdService; +import cd.casic.module.process.task.codescan.dao.TaskCodeScanDao; +import cd.casic.module.process.task.codescan.dataobject.TaskCodeScanEntity; +import cd.casic.module.process.task.codescan.model.TaskCodeScan; +import cd.casic.module.process.task.codescan.service.TaskCodeScanService; +import cd.casic.module.process.toolkit.beans.BeanMapper; +import cd.casic.module.process.toolkit.join.JoinTemplate; +import jakarta.annotation.Resource; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +import static cd.casic.module.process.support.util.util.PipelineFinal.TASK_CODESCAN_SONAR; + + +@Service +@Exporter +public class TaskCodeScanServiceImpl implements TaskCodeScanService { + + + @Resource + TaskCodeScanDao codeScanDao; + + @Resource + AuthThirdService thirdServer; + + @Resource + JoinTemplate joinTemplate; + + @Resource + AuthHostService authHostService; + + /** + * 创建流水线代码扫描 + * @param taskCodeScan 流水线代码扫描 + * @return 流水线代码扫描id + */ + @Override + public String createCodeScan(TaskCodeScan taskCodeScan) { + TaskCodeScanEntity taskCodeScanEntity = BeanMapper.map(taskCodeScan, TaskCodeScanEntity.class); + return codeScanDao.createCodeScan(taskCodeScanEntity); + } + + + @Override + public Boolean codeScanValid(String taskType,TaskCodeScan taskCodeScan){ + + if (taskType.equals(TASK_CODESCAN_SONAR)) { + if (StringUtils.isEmpty(taskCodeScan.getAuthId())){ + return false; + } + String projectName = taskCodeScan.getProjectName(); + return !StringUtils.isEmpty(projectName); + } else { + return true; + } + } + + + @Override + public TaskCodeScan findCodeScanByAuth(String taskId){ + TaskCodeScan codeScan = findOneCodeScan(taskId); + String authId = codeScan.getAuthId(); + if (!Objects.isNull(authId)){ + Object auth = authHostService.findOneAuthHost(authId); + if (Objects.isNull(auth)){ + auth = thirdServer.findOneAuthServer(authId); + codeScan.setAuth(auth); + } + codeScan.setAuth(auth); + } + return codeScan; + } + + /** + * 删除流水线代码扫描 + * @param CodeScanId 流水线代码扫描id + */ + @Override + public void deleteCodeScan(String CodeScanId) { + codeScanDao.deleteCodeScan(CodeScanId); + } + + /** + * 更新代码扫描信息 + * @param taskCodeScan 信息 + */ + @Override + public void updateCodeScan(TaskCodeScan taskCodeScan) { + TaskCodeScanEntity codeScanEntity = BeanMapper.map(taskCodeScan, TaskCodeScanEntity.class); + codeScanDao.updateCodeScan(codeScanEntity); + } + + /** + * 查询代码扫描信息 + * @param codeScanId id + * @return 信息集合 + */ + @Override + public TaskCodeScan findOneCodeScan(String codeScanId) { + TaskCodeScanEntity oneCodeScan = codeScanDao.findOneCodeScan(codeScanId); + TaskCodeScan codeScan = BeanMapper.map(oneCodeScan, TaskCodeScan.class); + if (PipelineUtil.isNoNull(codeScan.getAuthId())){ + AuthThird authServer = thirdServer.findOneAuthServer(codeScan.getAuthId()); + codeScan.setAuth(authServer); + } + joinTemplate.joinQuery(codeScan); + return codeScan; + } + + /** + * 查询所有流水线代码扫描 + * @return 流水线代码扫描列表 + */ + @Override + public List findAllCodeScan() { + List allCodeScan = codeScanDao.findAllCodeScan(); + return BeanMapper.mapList(allCodeScan, TaskCodeScan.class); + } + + @Override + public List findAllCodeScanList(List idList) { + List allCodeScanList = codeScanDao.findAllCodeScanList(idList); + List taskCodeScans = BeanMapper.mapList(allCodeScanList, TaskCodeScan.class); + joinTemplate.joinQuery(taskCodeScans); + return taskCodeScans; + } + + +}