补充trigger代码块;
新增util/variable/version/wehHook模块;
task模块代码初步提交,包含子模块artifact/build/code/codescan;
调整部分service和impl位置,进行统一包路径管理,对service和impl相互关系做代码补充以及编译调试(可能影响部分原先包目录结构);
新增部分工具类/注解以及系统字段
This commit is contained in:
Hope Li 2025-05-05 20:37:03 +08:00
parent 2572798cc9
commit 9feee4fd45
67 changed files with 5344 additions and 30 deletions

View File

@ -23,6 +23,10 @@
<groupId>cd.casic.boot</groupId>
<artifactId>module-system-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -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<T> 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<T> dataList;
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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();
}

View File

@ -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<Pipeline> allPipeline = pipelineService.findAllPipelineNoQuery();
for (Pipeline pipeline : allPipeline) {
String domainId = pipeline.getId();
MessageDmNoticeQuery messageDmNoticeQuery = new MessageDmNoticeQuery();
messageDmNoticeQuery.setDomainId(domainId);
List<MessageDmNotice> 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);
}
}
}

View File

@ -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<String> 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<String> 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";
}
}

View File

@ -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";

View File

@ -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> T requestPost(HttpHeaders headers, String requestUrl, Object param, Class<T> tClass){
// 创建带有头部和请求体的 HttpEntity
HttpEntity<Object> requestEntity = new HttpEntity<>(param, headers);
ResponseEntity<JSONObject> 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 <T> List<T> requestPostList(HttpHeaders headers, String requestUrl, Object param, Class<T> tClass){
// 创建带有头部和请求体的 HttpEntity
HttpEntity<Object> requestEntity = new HttpEntity<>(param, headers);
ResponseEntity<JSONObject> 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> T requestGet(HttpHeaders headers, String requestUrl, Object param, Class<T> tClass){
// 创建带有头部和请求体的 HttpEntity
HttpEntity<Object> requestEntity = new HttpEntity<>(param, headers);
ResponseEntity<JSONObject> 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 <T> List<T> requestGetList(HttpHeaders headers, String requestUrl, Object param, Class<T> tClass){
// 创建带有头部和请求体的 HttpEntity
HttpEntity<Object> requestEntity = new HttpEntity<>(param, headers);
ResponseEntity<JSONObject> 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 <T> 对象类型
*/
public <T> T findBody(JSONObject jsonObject,Class<T> 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 <T> 对象类型
*/
public <T> List<T> findBodyList(JSONObject jsonObject,Class<T> 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<String,String> headerMap){
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(mediaType));
if (Objects.isNull(headerMap)){
return headers;
}
for (Map.Entry<String, String> header : headerMap.entrySet()) {
String key = header.getKey();
String value = header.getValue();
headers.set(key,value);
}
return headers;
}
}

View File

@ -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<VariableDo> {
String createVariable(Variable variable);
void deleteVariable(String varId);
void updateVariable(Variable variable);
Variable findOneVariable(String varId);
List<Variable> findAllVariable();
List<VariableDo> findVariableList(VariableQuery query);
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;
/**
* 执行变量服务接口

View File

@ -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;

View File

@ -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 {
}

View File

@ -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<String , String > map = new HashMap<>();
//替换全局变量
List<Variable> allVariable = findAllVariable(pipelineId);
if (!allVariable.isEmpty()){
for (Variable variable : allVariable) {
String varKey = variable.getVarKey();
String varValue = variable.getVarValue();
map.put(varKey,varValue);
}
}
//替换局部变量
List<Variable> 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<String> 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<Variable> findAllVariable() {
List<Variable> allVariable = variableDao.findAllVariable();
if (allVariable == null || allVariable.isEmpty()){
return Collections.emptyList();
}
return allVariable;
}
/**
* 查询流水线所有变量
* @param taskId 流水线id
* @return 变量
*/
@Override
public List<Variable> findAllVariable(String taskId) {
List<Variable> allVariable = findAllVariable();
if (allVariable.isEmpty()){
return Collections.emptyList();
}
List<Variable> 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<String> stringList = new ArrayList<>(List.of(split));
variable.setValueList(stringList);
}
list.add(variable);
}
list.sort(Comparator.comparing(Variable::getCreateTime).reversed());
return list;
}
@Override
public List<Variable> findVariableList(VariableQuery query){
List<VariableDo> 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<Variable> variableList = findVariableList(variableQuery);
for (Variable variable : variableList) {
variable.setTaskId(cloneId);
createVariable(variable);
}
}
}

View File

@ -1,4 +1,4 @@
package cd.casic.module.process.support.home;
package cd.casic.module.process.support.version.service;
public interface PipelineVersionService {

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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<TaskArtifactDo> findAllProduct() {
return null;
}
public List<TaskArtifactDo> findAllProductList(List<String> idList) {
return null;
}
}

View File

@ -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;
}

View File

@ -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<TaskArtifact> findAllProduct();
/**
* 根据ID列表查询流水线推送制品
* @param idList ID列表
* @return 流水线推送制品列表
*/
@FindList
List<TaskArtifact> findAllProductList(List<String> idList);
}

View File

@ -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<TaskArtifact> findAllProduct() {
List<TaskArtifactDo> allProduct = productDao.findAllProduct();
return BeanMapper.mapList(allProduct, TaskArtifact.class);
}
@Override
public List<TaskArtifact> findAllProductList(List<String> idList) {
List<TaskArtifactDo> 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);
}
}

View File

@ -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<XpackRepository> 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<String, String> 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);
}
}
}

View File

@ -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<TaskBuildDo> findAllBuild(){
return jpaTemplate.findAll(TaskBuildDo.class);
}
public List<TaskBuildDo> findAllCodeList(List<String> idList){
return jpaTemplate.findList(TaskBuildDo.class,idList);
}
}

View File

@ -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<TaskBuildProductDo> findAllBuildProduct(){
return jpaTemplate.findAll(TaskBuildProductDo.class);
}
public List<TaskBuildProductDo> 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<TaskBuildProductDo> findAllBuildProductList(List<String> idList){
return jpaTemplate.findList(TaskBuildProductDo.class,idList);
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<TaskBuild> findAllBuild();
/**
* 根据ID列表查询构建
* @param idList ID列表
* @return 构建列表
*/
@FindList
List<TaskBuild> findAllBuildList(List<String> idList);
}

View File

@ -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<TaskBuildProduct> findAllBuildProduct() {
List<TaskBuildProductDo> allBuildProduct = taskBuildProductDao.findAllBuildProduct();
if (allBuildProduct == null || allBuildProduct.isEmpty()){
return Collections.emptyList();
}
return BeanMapper.mapList(allBuildProduct, TaskBuildProduct.class);
}
@Override
public List<TaskBuildProduct> findBuildProductList(TaskBuildProductQuery taskBuildProductQuery) {
List<TaskBuildProductDo> 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<TaskBuildProduct> buildProductList = findBuildProductList(taskBuildProductQuery);
if (buildProductList.isEmpty()){
return strings;
}
for (TaskBuildProduct taskBuildProduct : buildProductList) {
LinkedHashMap<String,Object> linkedHashMap = JSONObject.parseObject(taskBuildProduct.getValue(), LinkedHashMap.class);
for (Map.Entry<String, Object> entry : linkedHashMap.entrySet()) {
String value = (String)entry.getValue();
String key = entry.getKey();
strings = strings.replaceAll("\\$\\{" + key + "}",value);
strings = strings.replaceAll(key,value);
}
}
return strings;
}
}

View File

@ -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<TaskBuild> findAllBuild() {
return BeanMapper.mapList(taskBuildDao.findAllBuild(), TaskBuild.class);
}
@Override
public List<TaskBuild> findAllBuildList(List<String> idList) {
return BeanMapper.mapList(taskBuildDao.findAllCodeList(idList), TaskBuild.class);
}
}

View File

@ -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<ThirdHouse>> findAllRepository(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){
List<ThirdHouse> 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<List<ThirdBranch>> findHouseBranchList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){
List<ThirdBranch> allRepository = gitHubService.findStoreBranchList(thirdQuery);
return Result.ok(allRepository);
}
}

View File

@ -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<List<ThirdHouse>> findStoreHouseList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){
List<ThirdHouse> 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<List<ThirdBranch>> findHouseBranchList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){
List<ThirdBranch> allRepository = gitLabService.findStoreBranchList(thirdQuery);
return Result.ok(allRepository);
}
}

View File

@ -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<List<ThirdHouse>> findAllRepository(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){
List<ThirdHouse> 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<List<ThirdBranch>> findHouseBranchList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){
List<ThirdBranch> allRepository = giteeService.findStoreBranchList(thirdQuery);
return Result.ok(allRepository);
}
}

View File

@ -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<List<ThirdHouse>> findStoreHouseList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){
List<ThirdHouse> 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<List<ThirdBranch>> findHouseBranchList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){
List<ThirdBranch> allRepository = gittokService.findHouseBranchList(thirdQuery);
return Result.ok(allRepository);
}
}

View File

@ -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<List<ThirdHouse>> findStoreHouseList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){
List<ThirdHouse> 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<List<ThirdBranch>> findHouseBranchList(@RequestBody @Valid @NotNull ThirdQuery thirdQuery){
List<ThirdBranch> allRepository = priGitLabService.findStoreBranchList(thirdQuery);
return Result.ok(allRepository);
}
}

View File

@ -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<TaskCodeDo> findAllCode(){
return jpaTemplate.findAll(TaskCodeDo.class);
}
public List<TaskCodeDo> findAllCodeList(List<String> idList){
return jpaTemplate.findList(TaskCodeDo.class,idList);
}
}

View File

@ -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;
}

View File

@ -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 {
}

View File

@ -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 <T, ID> ID save(T entity, Class<ID> idClass) throws DataAccessException {
return null;
}
public <T> void update(T entity) throws DataAccessException {
}
public <T, ID> void delete(Class<T> entityClass, ID id) throws DataAccessException {
}
public <T> List<T> findAll(Class<T> entityClass) throws DataAccessException {
return null;
}
public <T, ID> T findOne(Class<T> entityClass, ID id) throws DataAccessException {
return null;
}
public <T, ID> List<T> findList(Class<T> entityClass, List<ID> idList) throws DataAccessException {
return null;
}
public <T> List<T> findList(Object queryObject, Class<T> resultType) throws DataAccessException {
return null;
}
public <T> Pagination<T> findPage(Object queryObject, Class<T> resultType) throws DataAccessException {
return null;
}
}

View File

@ -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;
}

View File

@ -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<ThirdHouse> findStoreHouseList(ThirdQuery thirdQuery);
/**
* 获取指定仓库信息
* @param thirdQuery 仓库
* @return 仓库信息
*/
ThirdHouse findStoreHouse(ThirdQuery thirdQuery);
/**
* 获取凭证认证的仓库分支列表
* @param thirdQuery 凭证
* @return 分支列表
*/
List<ThirdBranch> findStoreBranchList(ThirdQuery thirdQuery);
}

View File

@ -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<ThirdHouse> findStoreHouseList(ThirdQuery thirdQuery);
/**
* 获取指定仓库信息
* @param thirdQuery 仓库
* @return 仓库信息
*/
ThirdHouse findStoreHouse(ThirdQuery thirdQuery);
/**
* 获取凭证认证的仓库分支列表
* @param thirdQuery 凭证
* @return 分支列表
*/
List<ThirdBranch> findStoreBranchList(ThirdQuery thirdQuery);
}

View File

@ -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<ThirdHouse> findStoreHouseList(ThirdQuery thirdQuery);
/**
* 获取指定仓库信息
* @param thirdQuery 仓库
* @return 仓库信息
*/
ThirdHouse findStoreHouse(ThirdQuery thirdQuery);
/**
* 获取凭证认证的仓库分支列表
* @param thirdQuery 凭证
* @return 分支列表
*/
List<ThirdBranch> findStoreBranchList(ThirdQuery thirdQuery);
}

View File

@ -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<ThirdHouse> findStoreHouseList(ThirdQuery thirdQuery);
/**
* 获取指定仓库信息
* @param thirdQuery 仓库
* @return 仓库信息
*/
ThirdHouse findStoreHouse(ThirdQuery thirdQuery);
/**
* 获取凭证认证的仓库分支列表
* @param thirdQuery 凭证
* @return 分支列表
*/
List<ThirdBranch> findStoreBranchList(ThirdQuery thirdQuery);
}

View File

@ -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<TaskCode> findAllCode();
@FindList
List<TaskCode> findAllCodeList(List<String> idList);
}

View File

@ -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<ThirdHouse> findStoreHouseList(ThirdQuery thirdQuery){
String accessToken = findAccessToken(thirdQuery.getAuthId());
List<ThirdHouse> 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<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(paramMap, headers);
ResponseEntity<String> 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<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(paramMap, headers);
ResponseEntity<String> 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<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(paramMap, headers);
ResponseEntity<String> 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<ThirdBranch> findStoreBranchList(ThirdQuery thirdQuery){
String accessToken = findAccessToken(thirdQuery.getAuthId());
String[] split = thirdQuery.getHouseId().split("/");
List<ThirdBranch> 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<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(paramMap, headers);
ResponseEntity<String> 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("服务器暂时超载,无法处理该请求!");}
}
}
}

View File

@ -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<ThirdHouse> findStoreHouseList(ThirdQuery thirdQuery){
String accessToken = findAccessToken(thirdQuery.getAuthId());
List<ThirdHouse> 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<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(paramMap, headers);
ResponseEntity<String> 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<String> forEntity;
try {
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer"+" "+accessToken);
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> 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<String> forEntity;
try {
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer"+" "+accessToken);
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> 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<ThirdBranch> findStoreBranchList(ThirdQuery thirdQuery){
String accessToken = findAccessToken(thirdQuery.getAuthId());
List<ThirdBranch> branchList= new ArrayList<>();
RestTemplate restTemplate = new RestTemplate();
String url = String.format("https://gitlab.com/api/v4/projects/%s/repository/branches",thirdQuery.getHouseId());
ResponseEntity<String> forEntity;
try {
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer"+" "+accessToken);
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> 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("服务器暂时超载,无法处理该请求!");}
}
}
}

View File

@ -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<ThirdHouse> findStoreHouseList(ThirdQuery thirdQuery){
List<ThirdHouse> 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<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(paramMap, headers);
ResponseEntity<String> 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<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(paramMap, headers);
ResponseEntity<String> 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<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(paramMap, headers);
ResponseEntity<String> 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<ThirdBranch> findStoreBranchList(ThirdQuery thirdQuery){
List<ThirdBranch> 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<String> forEntity;
try {
HttpHeaders headers = new HttpHeaders();
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> 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("服务器暂时超载,无法处理该请求!");}
}
}
}

View File

@ -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<ThirdHouse> 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<String, Object> valueMap = new LinkedMultiValueMap<>();
valueMap.add("account",username);
valueMap.add("password",password);
valueMap.add("dirId","1");
String requestUrl = serverAddress+"/api/rpy/findRepositoryByUser";
HttpEntity<Object> requestEntity = new HttpEntity<>(valueMap, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<JSONObject> response = restTemplate.exchange(requestUrl, HttpMethod.POST, requestEntity, JSONObject.class);
JSONObject jsonObject = response.getBody();
JSONArray jsonArray = validBody(jsonObject, JSONArray.class);
List<ThirdHouse> 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<ThirdBranch> 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<String, Object> valueMap = new LinkedMultiValueMap<>();
valueMap.add("rpyId",houseId);
String requestUrl = serverAddress+"/api/branch/findAllBranch";
HttpEntity<Object> requestEntity = new HttpEntity<>(valueMap, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<JSONObject> response = restTemplate.exchange(requestUrl, HttpMethod.POST, requestEntity, JSONObject.class);
JSONObject jsonObject = response.getBody();
List<ThirdBranch> 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<String, Object> valueMap = new LinkedMultiValueMap<>();
valueMap.add("rpyId",rpyId);
valueMap.add("commitId",branchId);
String requestUrl = serverAddress+"/api/branch/findBranch";
HttpEntity<Object> requestEntity = new HttpEntity<>(valueMap, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<JSONObject> 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<String, Object> valueMap = new LinkedMultiValueMap<>();
valueMap.add("id",houseId);
String requestUrl = serverAddress+"/api/rpy/findRepository";
HttpEntity<Object> requestEntity = new HttpEntity<>(valueMap, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<JSONObject> 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> T validBody(JSONObject jsonObject,Class<T> 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;
}
}

View File

@ -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<ThirdHouse> findStoreHouseList(ThirdQuery thirdQuery){
AuthThird authServer = findAccessToken(thirdQuery.getAuthId());
String accessToken = authServer.getAccessToken();
String serverAddress = authServer.getServerAddress();
List<ThirdHouse> 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<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(paramMap, headers);
ResponseEntity<String> 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<String> forEntity;
try {
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer"+" "+accessToken);
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> 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<String> forEntity;
try {
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer"+" "+accessToken);
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> 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<ThirdBranch> findStoreBranchList(ThirdQuery thirdQuery){
AuthThird authServer = findAccessToken(thirdQuery.getAuthId());
String accessToken = authServer.getAccessToken();
String serverAddress = authServer.getServerAddress();
List<ThirdBranch> branchList= new ArrayList<>();
RestTemplate restTemplate = new RestTemplate();
String url = String.format("%s/api/v4/projects/%s/repository/branches",serverAddress,thirdQuery.getHouseId());
ResponseEntity<String> forEntity;
try {
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer"+" "+accessToken);
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
HttpEntity<MultiValueMap<String, Object>> 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("服务器暂时超载,无法处理该请求!");}
}
}
}

View File

@ -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<TaskCode> findAllCode() {
List<TaskCodeDo> allCode = taskCodeDao.findAllCode();
List<TaskCode> 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<TaskCode> findAllCodeList(List<String> 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);
}
}

View File

@ -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<List<SpotbugsBugSummary>> findSpotbugsList(@RequestBody @Valid @NotNull SpotbugsBugQuery spotbugsBugQuery) {
List<SpotbugsBugSummary> 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<Pagination<SpotbugsBugSummary>> findSpotbugsPage(@RequestBody @Valid @NotNull SpotbugsBugQuery spotbugsBugQuery) {
PageResult<SpotbugsBugSummary> 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<List<SpotbugsBugInstance>> findAllRepository(@NotNull String xmlPath) {
List<SpotbugsBugInstance> 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<List<SpotbugsBugPackageStats>> deleteSpotbugs(@NotNull String bugId) {
spotbugsScanService.deleteSpotbugs(bugId);
return Result.ok();
}
}

View File

@ -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<SpotbugsBugSummary> findAllSpotbugs() {
List<SpotbugsScanEntity> scanEntityList = jpaTemplate.findAll(SpotbugsScanEntity.class);
if (scanEntityList == null || scanEntityList.isEmpty()){
return Collections.emptyList();
}
return BeanMapper.mapList(scanEntityList,SpotbugsBugSummary.class);
}
public List<SpotbugsBugSummary> findSpotbugsList(SpotbugsBugQuery bugQuery) {
return BeanMapper.mapList(null,SpotbugsBugSummary.class);
}
public PageResult<SpotbugsBugSummary> findSpotbugsPage(SpotbugsBugQuery bugQuery) {
return null;
}
}

View File

@ -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<TaskCodeScanEntity> findAllCodeScan(){
return jpaTemplate.findAll(TaskCodeScanEntity.class);
}
public List<TaskCodeScanEntity> findAllCodeScanList(List<String> idList){
return jpaTemplate.findList(TaskCodeScanEntity.class,idList);
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<SpotbugsBugSummary> findAllSpotbugs() {
return spotbugsScanDao.findAllSpotbugs();
}
@Override
public List<SpotbugsBugSummary> findSpotbugsList(SpotbugsBugQuery bugQuery) {
return spotbugsScanDao.findSpotbugsList(bugQuery);
}
@Override
public PageResult<SpotbugsBugSummary> findSpotbugsPage(SpotbugsBugQuery bugQuery) {
return spotbugsScanDao.findSpotbugsPage(bugQuery);
}
}

View File

@ -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<SpotbugsBugFileStats> 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<SpotbugsBugFileStats> 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<SpotbugsBugInstance> scanBugsList = findScanBugs(xmlPath);
List<SpotbugsBugInstance> 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<SpotbugsBugPackageStats> 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<SpotbugsBugPackageStats> 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<SpotbugsBugClassStats> 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<SpotbugsBugInstance> scanBugsList = findScanBugs(xmlPath);
List<SpotbugsBugInstance> 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<SpotbugsBugInstance> 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<SpotbugsBugInstance> list = new ArrayList<>();
Map<String, SpotbugsBugCategory> categoryMap = analysisBugCategory(rootElement);
Map<String, SpotbugsBugPattern> patternMap = analysisBugPattern(rootElement);
Map<String, SpotbugsBugCode> 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<String, SpotbugsBugCategory> analysisBugCategory(Element element){
NodeList bugInstanceList = element.getElementsByTagName("BugCategory");
Map<String, SpotbugsBugCategory> 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<String, SpotbugsBugPattern> analysisBugPattern(Element element){
NodeList bugInstanceList = element.getElementsByTagName("BugPattern");
Map<String, SpotbugsBugPattern> 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<String, SpotbugsBugCode> analysisBugCode(Element element){
NodeList bugInstanceList = element.getElementsByTagName("BugCode");
Map<String, SpotbugsBugCode> 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<String,String> findJavaFilePath(String filePath){
File file = new File(filePath);
if (!file.exists() || file.isFile()){
throw new ApplicationException("文件夹不存在!" + filePath);
}
Map<String , String> map = new HashMap<>();
List<String> 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;
}
}

View File

@ -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<TaskCodeScan> findAllCodeScan() {
List<TaskCodeScanEntity> allCodeScan = codeScanDao.findAllCodeScan();
return BeanMapper.mapList(allCodeScan, TaskCodeScan.class);
}
@Override
public List<TaskCodeScan> findAllCodeScanList(List<String> idList) {
List<TaskCodeScanEntity> allCodeScanList = codeScanDao.findAllCodeScanList(idList);
List<TaskCodeScan> taskCodeScans = BeanMapper.mapList(allCodeScanList, TaskCodeScan.class);
joinTemplate.joinQuery(taskCodeScans);
return taskCodeScans;
}
}