Browse Source

feat: 添加项目关联,查看部署实例日志

370774330@qq.com 5 năm trước cách đây
mục cha
commit
093d0c134d

+ 12 - 0
web/src/main/java/cn/seecoder/web/controller/pipeline/DeploymentController.java

@@ -63,4 +63,16 @@ public class DeploymentController {
         deploymentService.delete(projectId,pipelineId);
         return Response.buildSuccess();
     }
+
+    @ApiOperation(value = "获取一个部署的实例的日志", httpMethod = "GET")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "projectId", dataType ="int",paramType = "query"),
+            @ApiImplicitParam(name = "pipelineId", dataType ="int",paramType = "query")
+    })
+    @GetMapping("/log")
+    public Response log(@RequestParam("projectId")Integer projectId,
+                           @RequestParam("pipelineId")Integer pipelineId) throws ServiceException {
+        deploymentService.log(projectId,pipelineId);
+        return Response.buildSuccess();
+    }
 }

+ 19 - 0
web/src/main/java/cn/seecoder/web/controller/project/ProjectController.java

@@ -70,4 +70,23 @@ public class ProjectController {
         projectService.addMember(projectId, userId);
         return Response.buildSuccess();
     }
+
+    @ApiOperation(value = "生成项目关联邀请码", httpMethod = "POST")
+    @PostMapping("/relate/code")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query")
+    })
+    public Response generaterelateCode(@RequestParam("projectId") Integer projectId) {
+        return Response.buildSuccess(projectService.generaterelateCode(projectId));
+    }
+
+    @ApiOperation(value = "通过邀请码关联两个项目", httpMethod = "POST")
+    @PostMapping("/relate")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query"),
+            @ApiImplicitParam(name = "relateCode", dataType = "int", paramType = "query")
+    })
+    public Response generaterelateCode(@RequestParam("projectId") Integer projectId,@RequestParam("projectId") String relateCode) {
+        return Response.buildSuccess(projectService.relateProjects(projectId,relateCode));
+    }
 }

+ 22 - 2
web/src/main/java/cn/seecoder/web/core/pipeline/inspector/PipelineInspector.java

@@ -2,10 +2,11 @@ package cn.seecoder.web.core.pipeline.inspector;
 
 import cn.seecoder.api.k8s.*;
 import cn.seecoder.api.k8s.model.*;
+import cn.seecoder.common.util.SpringUtil;
 import cn.seecoder.web.core.pipeline.Context;
 import io.kubernetes.client.openapi.models.V1DeploymentStatus;
-import cn.seecoder.common.util.SpringUtil;
 
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -27,13 +28,18 @@ public class PipelineInspector {
 
     private final IngressApi ingressApi;
 
+    private final LogApi logApi;
+
+    private final PodApi podApi;
+
     public PipelineInspector(Context context) {
         this.context = context;
+        this.logApi = SpringUtil.getBean(LogApi.class);
         this.deploymentApi = SpringUtil.getBean(DeploymentApi.class);
         namespaceApi = SpringUtil.getBean(NamespaceApi.class);
         serviceApi = SpringUtil.getBean(ServiceApi.class);
         ingressApi = SpringUtil.getBean(IngressApi.class);
-
+        podApi = SpringUtil.getBean(PodApi.class);
     }
 
     public V1DeploymentStatus inspectStatus(){
@@ -68,5 +74,19 @@ public class PipelineInspector {
         ingressApi.delete(ingress);
     }
 
+    /**
+     * 获取日志信息
+     */
+    public String log(){
+        String namespace = context.getNamespace();
+        String deployName = context.getDeployName();
+        //为学生部署的时候有限制 只有一个pod 所以这里直接取第一个
+        List<Pod> pods = podApi.getByCondition(K8sObjectRequest.builder()
+                .namespace(namespace)
+                .labels(Collections.singletonMap(K8sConstants.APPLICATION_LABEL,deployName))
+                .build());
+        return logApi.getAll(namespace,pods.get(0).getName());
+    }
+
 
 }

+ 0 - 1
web/src/main/java/cn/seecoder/web/core/pipeline/inspector/PipelineInspectorFactory.java

@@ -23,7 +23,6 @@ public class PipelineInspectorFactory {
                 .deployName(deployName)
                 .namespace(namespace)
                 .build();
-
         return new PipelineInspector(context);
     }
 

+ 0 - 1
web/src/main/java/cn/seecoder/web/dao/project/CommitMapper.java

@@ -17,7 +17,6 @@ import java.util.List;
 public interface CommitMapper {
 
     @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
-    @Options(useGeneratedKeys = true, keyProperty = "param1.id", keyColumn = "id")
     int insert(CommitPO commitPO, String... ignoredCols);
 
     @UpdateProvider(type= GeneralInsertUpdateSqlProvider.class, method="updateById")

+ 26 - 0
web/src/main/java/cn/seecoder/web/dao/project/ProjectRelatedMapper.java

@@ -0,0 +1,26 @@
+package cn.seecoder.web.dao.project;
+
+import cn.seecoder.web.dao.provider.GeneralInsertUpdateSqlProvider;
+import cn.seecoder.web.model.po.project.ProjectRelatedPO;
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/5/7
+ * @description:
+ */
+@Repository
+public interface ProjectRelatedMapper {
+
+    @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
+    @Options(useGeneratedKeys = true, keyProperty = "param1.id", keyColumn = "id")
+    int insert(ProjectRelatedPO projectRelatedPO, String... ignoredCols);
+
+    @Select("select * from project_related where project_id_a = #{projectId} or project_id_b = #{projectId} ")
+    List<ProjectRelatedPO> selectByProjectId(Integer projectId);
+}

+ 22 - 0
web/src/main/java/cn/seecoder/web/model/po/project/ProjectRelatedPO.java

@@ -0,0 +1,22 @@
+package cn.seecoder.web.model.po.project;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/5/6
+ * @description:
+ * 项目的关联关系
+ */
+@Data
+@Builder
+public class ProjectRelatedPO {
+
+    Integer id;
+
+    Integer projectIdA;
+
+    Integer projectIdB;
+
+}

+ 14 - 1
web/src/main/java/cn/seecoder/web/service/impl/bug_list/BugListServiceImpl.java

@@ -3,9 +3,11 @@ package cn.seecoder.web.service.impl.bug_list;
 import cn.seecoder.web.core.commit.model.CommitState;
 import cn.seecoder.web.dao.bug_list.BugListMapper;
 import cn.seecoder.web.dao.project.CommitMapper;
+import cn.seecoder.web.dao.project.ProjectRelatedMapper;
 import cn.seecoder.web.dao.user.UserMapper;
 import cn.seecoder.web.model.enums.BugListStateEnum;
 import cn.seecoder.web.model.po.bug_list.BugListPO;
+import cn.seecoder.web.model.po.project.ProjectRelatedPO;
 import cn.seecoder.web.model.po.user.UserPO;
 import cn.seecoder.web.model.vo.bug_list.BugListCreateVO;
 import cn.seecoder.web.model.vo.bug_list.BugListUpdateBasicVO;
@@ -36,11 +38,15 @@ public class BugListServiceImpl implements BugListService {
 
     private final UserMapper userMapper;
 
+    private final ProjectRelatedMapper projectRelatedMapper;
+
+
     @Autowired
-    public BugListServiceImpl(BugListMapper bugListMapper, CommitMapper commitMapper, UserMapper userMapper) {
+    public BugListServiceImpl(BugListMapper bugListMapper, CommitMapper commitMapper, UserMapper userMapper, ProjectRelatedMapper projectRelatedMapper) {
         this.bugListMapper = bugListMapper;
         this.commitMapper = commitMapper;
         this.userMapper = userMapper;
+        this.projectRelatedMapper = projectRelatedMapper;
     }
 
 
@@ -61,7 +67,14 @@ public class BugListServiceImpl implements BugListService {
 
     @Override
     public List<BugListVO> list(Integer projectId) {
+        List<ProjectRelatedPO> related = projectRelatedMapper.selectByProjectId(projectId);
         List<BugListPO> bugs = bugListMapper.selectByProjectId(projectId);
+        // 相关项目的bug一并展示
+        for (ProjectRelatedPO po : related){
+            bugs.addAll(bugListMapper.selectByProjectId(po.getProjectIdA() != projectId? po.getProjectIdA() : po.getProjectIdB()));
+        }
+
+
         //List<CommitPO> commits = commitMapper.selectByProjectIdAndType(projectId, CommitRelatedEnum.BUG_ID);
         //Map<Integer, List<CommitPO>> commitsMap = commits.stream().collect(Collectors.groupingBy(CommitPO::getRelatedId));
         List<Integer> userIds = bugs.stream().map(x -> {

+ 8 - 0
web/src/main/java/cn/seecoder/web/service/impl/pipeline/DeploymentServiceImpl.java

@@ -153,5 +153,13 @@ public class DeploymentServiceImpl implements DeploymentService {
         DeploymentPO deployment = deploymentMapper.selectByPipelineId(pipelineId);
         PipelineInspector inspector = PipelineInspectorFactory.init(deployment.getNamespace(),deployment.getDeployName());
         inspector.delete();
+        deploymentMapper.delete(pipelineId);
+    }
+
+    @Override
+    public String log(Integer projectId, Integer pipelineId) {
+        DeploymentPO deployment = deploymentMapper.selectByPipelineId(pipelineId);
+        PipelineInspector inspector = PipelineInspectorFactory.init(deployment.getNamespace(),deployment.getDeployName());
+        return inspector.log();
     }
 }

+ 28 - 7
web/src/main/java/cn/seecoder/web/service/impl/project/ProjectServiceImpl.java

@@ -1,8 +1,17 @@
 package cn.seecoder.web.service.impl.project;
 
+import cn.seecoder.api.ApplicationProperties;
+import cn.seecoder.common.exceptions.ServiceException;
+import cn.seecoder.common.util.ShareCodeUtil;
+import cn.seecoder.web.dao.project.ProjectMapper;
+import cn.seecoder.web.dao.project.ProjectRelatedMapper;
 import cn.seecoder.web.dao.user.UserMapper;
 import cn.seecoder.web.model.po.project.ProjectPO;
+import cn.seecoder.web.model.po.project.ProjectRelatedPO;
 import cn.seecoder.web.model.vo.project.ProjectCreateVO;
+import cn.seecoder.web.model.vo.project.ProjectVO;
+import cn.seecoder.web.model.vo.user.UserVO;
+import cn.seecoder.web.service.project.ProjectService;
 import cn.seecoder.web.service.user.UserService;
 import com.nju.edu.gitlab.SeecoderGitlabApi;
 import com.nju.edu.gitlab.SeecoderGitlabException;
@@ -12,12 +21,6 @@ import org.apache.http.HttpStatus;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import cn.seecoder.api.ApplicationProperties;
-import cn.seecoder.common.exceptions.ServiceException;
-import cn.seecoder.web.dao.project.ProjectMapper;
-import cn.seecoder.web.model.vo.project.ProjectVO;
-import cn.seecoder.web.model.vo.user.UserVO;
-import cn.seecoder.web.service.project.ProjectService;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -28,6 +31,8 @@ public class ProjectServiceImpl implements ProjectService {
 
     private final ProjectMapper projectMapper;
 
+    private final ProjectRelatedMapper projectRelatedMapper;
+
     private final UserMapper userMapper;
 
     private final SeecoderGitlabApi seecoderGitlabApi;
@@ -35,8 +40,9 @@ public class ProjectServiceImpl implements ProjectService {
     private final ApplicationProperties properties;
 
     @Autowired
-    public ProjectServiceImpl(ProjectMapper projectMapper, UserMapper userMapper, SeecoderGitlabApi seecoderGitlabApi, ApplicationProperties properties) {
+    public ProjectServiceImpl(ProjectMapper projectMapper, ProjectRelatedMapper projectRelatedMapper, UserMapper userMapper, SeecoderGitlabApi seecoderGitlabApi, ApplicationProperties properties) {
         this.projectMapper = projectMapper;
+        this.projectRelatedMapper = projectRelatedMapper;
         this.userMapper = userMapper;
         this.seecoderGitlabApi = seecoderGitlabApi;
         this.properties = properties;
@@ -112,5 +118,20 @@ public class ProjectServiceImpl implements ProjectService {
         return userMapper.selectByIds(userIds).stream().map(UserVO::new).collect(Collectors.toList());
     }
 
+    @Override
+    public String generaterelateCode(Integer projectId) {
+        return ShareCodeUtil.idToCode(projectId.longValue());
+    }
 
+    @Override
+    public String relateProjects(Integer projectId, String relateCode) {
+        Long[] result = ShareCodeUtil.codeToId(relateCode);
+        if (System.currentTimeMillis() - result[1] > 1000 * 60 * 5) {
+            return "验证码有效时间为五分钟,已过期";
+        };
+        projectRelatedMapper.insert(ProjectRelatedPO.builder()
+                .projectIdA(projectId)
+                .projectIdB(result[0].intValue()).build(),"id");
+        return "关联项目成功";
+    }
 }

+ 2 - 0
web/src/main/java/cn/seecoder/web/service/pipeline/DeploymentService.java

@@ -29,4 +29,6 @@ public interface DeploymentService {
      * todo 异步/异步异常捕获刷新result
      */
     void delete(Integer projectId,Integer pipelineId) throws AccessDeniedException;
+
+    String log(Integer projectId,Integer pipelineId);
 }

+ 12 - 0
web/src/main/java/cn/seecoder/web/service/project/ProjectService.java

@@ -32,4 +32,16 @@ public interface ProjectService {
 
     List<UserVO> getProjectMembers(Integer projectId) throws ServiceException;
 
+    /**
+     * 生成项目关联邀请码
+     * @param projectId
+     */
+    String generaterelateCode(Integer projectId);
+
+    /**
+     * 关联项目
+     * @param relateCode
+     */
+    String relateProjects(Integer projectId, String relateCode);
+
 }

+ 14 - 0
web/src/main/resources/sql/table_init.sql

@@ -85,6 +85,20 @@ create table if not exists devcloud.deployment
         foreign key (pipeline_id) references devcloud.pipeline (id)
 );
 
+create table if not exists devcloud.project_related
+(
+    id           int auto_increment
+        primary key,
+    project_id_a int null,
+    project_id_b int null,
+    constraint project_related_project_id_fk
+        foreign key (project_id_a) references devcloud.project (id)
+            on delete cascade,
+    constraint project_related_project_id_fk_2
+        foreign key (project_id_b) references devcloud.project (id)
+            on delete cascade
+);
+
 create table if not exists devcloud.stage
 (
     id          int auto_increment