فهرست منبع

refactor: deployment增加实体类

370774330@qq.com 5 سال پیش
والد
کامیت
771ab080e4

+ 1 - 3
core/src/main/java/seecoder/devcloud/core/pipeline/PipelineFactory.java

@@ -22,16 +22,14 @@ public class PipelineFactory {
      * @param configJson configJson 流水线配置的json字符串
      * @param namespace 流水线的k8s namespace,devcloud后端采用{@code Project}中的{@code name}作为namespace
      * @param deployName 流水线部署k8s的应用名称,devcloud后端采用{@code Pipeline}中的{@code name} 作为project name
-     * @param pipelineId 流水线id
      * @param templateName 模板名称
      * @return
      */
-    public static Pipeline init(String configJson, String namespace, String deployName, Integer pipelineId, String templateName) throws PipelineException {
+    public static Pipeline init(String configJson, String namespace, String deployName,  String templateName) throws PipelineException {
         //初始化context
         Context context = Context.builder()
                 .deployName(deployName)
                 .namespace(namespace)
-                .pipelineId(pipelineId)
                 .templateName(templateName)
                 .build();
         Handler firstHandler = initHandlerChainAndContext(configJson);

+ 1 - 5
core/src/main/java/seecoder/devcloud/core/pipeline/inspector/PipelineInspectorFactory.java

@@ -15,17 +15,13 @@ public class PipelineInspectorFactory {
      * namespace deployname是k8s种实例的唯一标识符
      * @param namespace 流水线的k8s namespace,devcloud后端采用{@code Project}中的{@code name}作为namespace
      * @param deployName 流水线部署k8s的应用名称,devcloud后端采用{@code Pipeline}中的{@code name} 作为project name
-     * @param pipelineId 流水线id
-     * @param templateName 模板名称
      */
-    public static PipelineInspector init(String namespace, String deployName, Integer pipelineId, String templateName) {
+    public static PipelineInspector init(String namespace, String deployName) {
 
         //初始化context
         Context context = Context.builder()
                 .deployName(deployName)
                 .namespace(namespace)
-                .pipelineId(pipelineId)
-                .templateName(templateName)
                 .build();
 
         return new PipelineInspector(context);

+ 40 - 0
web/src/main/java/seecoder/devcloud/web/dao/pipeline/DeploymentMapper.java

@@ -0,0 +1,40 @@
+package seecoder.devcloud.web.dao.pipeline;
+
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.UpdateProvider;
+import org.springframework.stereotype.Repository;
+import seecoder.devcloud.web.dao.provider.GeneralInsertUpdateSqlProvider;
+import seecoder.devcloud.web.model.po.pipeline.DeploymentPO;
+
+import java.util.List;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/4/10
+ * @description:
+ */
+@Repository
+public interface DeploymentMapper {
+
+    @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
+    @Options(useGeneratedKeys = true, keyProperty = "param1.id", keyColumn = "id")
+    boolean insert(DeploymentPO deploymentPO, String... ignoredCols);
+
+    @UpdateProvider(type= GeneralInsertUpdateSqlProvider.class, method="updateById")
+    int update(DeploymentPO deploymentPO);
+
+    @Select("select * from deployment where pipeline_id = #{pipelineId}")
+    DeploymentPO selectByPipelineId(Integer pipelineId);
+
+
+    @Select("<script>" +
+            "SELECT * " +
+            "   FROM deployment" +
+            "   WHERE pipeline_id in" +
+            "   <foreach collection='ids' open='(' item='id' separator=',' close=')'> #{id}</foreach>" +
+            "</script>")
+    List<DeploymentPO> selectByPipelineIds(List<Integer> ids);
+
+}

+ 33 - 0
web/src/main/java/seecoder/devcloud/web/model/po/pipeline/DeploymentPO.java

@@ -0,0 +1,33 @@
+package seecoder.devcloud.web.model.po.pipeline;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.sql.Timestamp;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/4/10
+ * @description:
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class DeploymentPO {
+
+    private Integer id;
+
+    private Integer pipelineId;
+
+    private String namespace;
+
+    private String deployName;
+
+    private Timestamp deployedTime;
+
+    private String accessUrl;
+
+}

+ 39 - 26
web/src/main/java/seecoder/devcloud/web/service/impl/pipeline/DeploymentServiceImpl.java

@@ -13,9 +13,11 @@ import seecoder.devcloud.core.pipeline.PipelineException;
 import seecoder.devcloud.core.pipeline.PipelineFactory;
 import seecoder.devcloud.core.pipeline.inspector.PipelineInspector;
 import seecoder.devcloud.core.pipeline.inspector.PipelineInspectorFactory;
+import seecoder.devcloud.web.dao.pipeline.DeploymentMapper;
 import seecoder.devcloud.web.dao.pipeline.PipelineHistoryMapper;
 import seecoder.devcloud.web.dao.pipeline.PipelineMapper;
 import seecoder.devcloud.web.dao.project.ProjectMapper;
+import seecoder.devcloud.web.model.po.pipeline.DeploymentPO;
 import seecoder.devcloud.web.model.po.pipeline.PipelineHistoryPO;
 import seecoder.devcloud.web.model.po.pipeline.PipelinePO;
 import seecoder.devcloud.web.model.po.project.ProjectPO;
@@ -23,8 +25,8 @@ import seecoder.devcloud.web.model.vo.pipeline.DeploymentInfoVO;
 import seecoder.devcloud.web.service.pipeline.DeploymentService;
 import seecoder.devcloud.web.service.user.UserService;
 
+import java.sql.Timestamp;
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -43,13 +45,16 @@ public class DeploymentServiceImpl implements DeploymentService {
 
     private final ApplicationProperties properties;
 
+    private final DeploymentMapper deploymentMapper;
+
 
     @Autowired
-    public DeploymentServiceImpl(PipelineMapper pipelineMapper, PipelineHistoryMapper pipelineHistoryMapper, ProjectMapper projectMapper, ApplicationProperties properties) {
+    public DeploymentServiceImpl(PipelineMapper pipelineMapper, PipelineHistoryMapper pipelineHistoryMapper, ProjectMapper projectMapper, ApplicationProperties properties, DeploymentMapper deploymentMapper) {
         this.pipelineMapper = pipelineMapper;
         this.pipelineHistoryMapper = pipelineHistoryMapper;
         this.projectMapper = projectMapper;
         this.properties = properties;
+        this.deploymentMapper = deploymentMapper;
     }
 
 
@@ -60,13 +65,10 @@ public class DeploymentServiceImpl implements DeploymentService {
         List<PipelinePO> pipelines = pipelineMapper.selectByProjectId(projectId);
         // 获取项目所关联的所有流水线
         List<Integer> pipelineIds = pipelines.stream().map(PipelinePO::getId).collect(Collectors.toList());
-        // 获取流水线历史
-        List<PipelineHistoryPO> histories = pipelineHistoryMapper.selectPipelinesRecentlyHistory(pipelineIds);
-        Map<Integer, PipelineHistoryPO> historyMap = histories.stream().collect(Collectors.toMap(PipelineHistoryPO::getPipelineId, x->x));
-        return pipelines.stream().map(x->{
-            String accessUrl = x.getName()+"."+project.getName()+ properties.getK8s().getIngressHostSuffix();
-            PipelineHistoryPO history = historyMap.get(x.getId());
-            PipelineInspector inspector = PipelineInspectorFactory.init(project.getName(),x.getName(),x.getId(),x.getTemplateName());
+
+        List<DeploymentPO> deployments = deploymentMapper.selectByPipelineIds(pipelineIds);
+        return deployments.stream().map(x->{
+            PipelineInspector inspector = PipelineInspectorFactory.init(x.getNamespace(),x.getDeployName());
             //获取状态
             String status = null;
             DeploymentStatus deploymentStatus = inspector.inspectStatus();
@@ -76,10 +78,10 @@ public class DeploymentServiceImpl implements DeploymentService {
                 status = "不可用: " + deploymentStatus.getProgressingMessage();
             }
             return DeploymentInfoVO.builder()
-                    .pipelineId(x.getId())
-                    .name(x.getName())
-                    .deployedTime(history.getStartTime())
-                    .accessUrl(accessUrl)
+                    .pipelineId(x.getPipelineId())
+                    .name(x.getDeployName()+"."+x.getNamespace())
+                    .deployedTime(x.getDeployedTime())
+                    .accessUrl(x.getAccessUrl())
                     .status(status)
                     .build();
         }).collect(Collectors.toList());
@@ -88,27 +90,39 @@ public class DeploymentServiceImpl implements DeploymentService {
     @Override
     @Async
     public void deploy(Integer projectId, Integer pipelineId) throws ServiceException {
-        try {
-            Thread.sleep(3000);
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
-        System.out.println(Thread.currentThread().getName());
-        System.out.println(System.currentTimeMillis());
-
         //projectAuthentication(projectId);
         PipelinePO pipelinePO = pipelineMapper.selectById(pipelineId);
         ProjectPO projectPO = projectMapper.getProjectById(projectId);
+        //历史记录
         PipelineHistoryPO history = PipelineHistoryPO.builder()
                 .result("部署中")
                 .pipelineId(pipelinePO.getId())
                 .userId(UserService.loginUser().getId())
                 .details("")
+                .startTime(new Timestamp(System.currentTimeMillis()))
                 .build();
-        pipelineHistoryMapper.insert(history,"id","startTime");
+        pipelineHistoryMapper.insert(history);
+
+
+        DeploymentPO deployment = deploymentMapper.selectByPipelineId(pipelineId);
+        if (deployment == null){
+            //第一次部署
+            String accessUrl = pipelinePO.getName()+"."+projectPO.getUniqueK8sNamespace()+ properties.getK8s().getIngressHostSuffix();
+            deploymentMapper.insert(DeploymentPO.builder()
+                    .namespace(projectPO.getUniqueK8sNamespace())
+                    .deployName(pipelinePO.getName())
+                    .accessUrl(accessUrl)
+                    .pipelineId(pipelineId)
+                    .deployedTime(history.getStartTime())
+                    .build());
+        } else {
+            deployment.setDeployedTime(history.getStartTime());
+            deploymentMapper.update(deployment);
+        }
+
         Pipeline pipeline = null;
         try {
-            pipeline = PipelineFactory.init(pipelinePO.getConfigJson(), projectPO.getName(), pipelinePO.getName(), pipelineId, pipelinePO.getTemplateName());
+            pipeline = PipelineFactory.init(pipelinePO.getConfigJson(), projectPO.getName(), pipelinePO.getName(),pipelinePO.getTemplateName());
             pipeline.start();
             history.setResult("部署成功");
             history.setDetails(pipeline.getContext().getResult());
@@ -126,9 +140,8 @@ public class DeploymentServiceImpl implements DeploymentService {
     @Async
     public void delete(Integer projectId, Integer pipelineId) throws AccessDeniedException {
         //projectAuthentication(projectId);
-        ProjectPO project = projectMapper.getProjectById(projectId);
-        PipelinePO pipelinePO = pipelineMapper.selectById(pipelineId);
-        PipelineInspector inspector = PipelineInspectorFactory.init(project.getName(),pipelinePO.getName(),pipelineId,pipelinePO.getTemplateName());
+        DeploymentPO deployment = deploymentMapper.selectByPipelineId(pipelineId);
+        PipelineInspector inspector = PipelineInspectorFactory.init(deployment.getNamespace(),deployment.getDeployName());
         inspector.delete();
     }
 }

+ 1 - 7
web/src/main/java/seecoder/devcloud/web/service/impl/pipeline/PipelineServiceImpl.java

@@ -5,8 +5,6 @@ import org.springframework.stereotype.Service;
 import seecoder.devcloud.common.exceptions.AccessDeniedException;
 import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.core.pipeline.PipelineException;
-import seecoder.devcloud.core.pipeline.inspector.PipelineInspector;
-import seecoder.devcloud.core.pipeline.inspector.PipelineInspectorFactory;
 import seecoder.devcloud.core.pipeline.template.PipelineTemplateTable;
 import seecoder.devcloud.web.dao.pipeline.PipelineHistoryMapper;
 import seecoder.devcloud.web.dao.pipeline.PipelineMapper;
@@ -14,7 +12,6 @@ import seecoder.devcloud.web.dao.project.ProjectMapper;
 import seecoder.devcloud.web.dao.user.UserMapper;
 import seecoder.devcloud.web.model.po.pipeline.PipelineHistoryPO;
 import seecoder.devcloud.web.model.po.pipeline.PipelinePO;
-import seecoder.devcloud.web.model.po.project.ProjectPO;
 import seecoder.devcloud.web.model.po.user.UserPO;
 import seecoder.devcloud.web.model.vo.pipeline.PipelineConfigVO;
 import seecoder.devcloud.web.model.vo.pipeline.PipelineCreateVO;
@@ -111,10 +108,7 @@ public class PipelineServiceImpl implements PipelineService {
     @Override
     public void deletePipelineConfig(Integer projectId, Integer pipelineId) throws AccessDeniedException {
         //projectAuthentication(projectId);
-        ProjectPO projectPO = projectMapper.getProjectById(projectId);
-        PipelinePO pipelinePO = pipelineMapper.selectById(pipelineId);
-        PipelineInspector inspector = PipelineInspectorFactory.init(projectPO.getUniqueK8sNamespace(), pipelinePO.getName(),pipelinePO.getId(),pipelinePO.getTemplateName());
-        inspector.delete();
+        //todo 是否要连带部署实例一起删除
         pipelineMapper.delete(pipelineId);
 
     }

+ 1 - 4
web/src/main/java/seecoder/devcloud/web/service/impl/project/ProjectServiceImpl.java

@@ -111,8 +111,5 @@ public class ProjectServiceImpl implements ProjectService {
         return userMapper.selectByIds(userIds).stream().map(UserVO::new).collect(Collectors.toList());
     }
 
-    @Override
-    public void deleteProject(int projectId) {
-        //TODO:不知道该怎么做,懒删除?还是直接删? 暂时不提供
-    }
+
 }

+ 0 - 7
web/src/main/java/seecoder/devcloud/web/service/project/ProjectService.java

@@ -28,13 +28,6 @@ public interface ProjectService {
      */
     ProjectVO createProject(ProjectCreateVO vo) throws ServiceException;
 
-    /**
-     * 删除项目,懒删除
-     * todo 目前统一代码服务没有提供对应接口,此方法过期,待统一代码服务api更新后再补回
-     */
-    @Deprecated
-    void deleteProject(int projectId);
-
     void addMember(Integer projectId, Integer userId) throws ServiceException;
 
     List<UserVO> getProjectMembers(Integer projectId) throws ServiceException;