Explorar el Código

feat: pipeline接口,未实现

370774330@qq.com hace 5 años
padre
commit
6e13abd624
Se han modificado 23 ficheros con 432 adiciones y 170 borrados
  1. 71 0
      web/src/main/java/seecoder/devcloud/web/controller/pipeline/PipelineController.java
  2. 2 0
      web/src/main/java/seecoder/devcloud/web/dao/impl/UserMapperImpl.java
  3. 1 1
      web/src/main/java/seecoder/devcloud/web/dao/provider/GeneralInsertUpdateSqlProvider.java
  4. 1 1
      web/src/main/java/seecoder/devcloud/web/dao/user/GroupMapper.java
  5. 2 0
      web/src/main/java/seecoder/devcloud/web/dao/user/UserMapper.java
  6. 6 1
      web/src/main/java/seecoder/devcloud/web/infrastructure/GlobalExceptionHandler.java
  7. 33 0
      web/src/main/java/seecoder/devcloud/web/model/po/pipeline/Deployment.java
  8. 28 0
      web/src/main/java/seecoder/devcloud/web/model/po/pipeline/Pipeline.java
  9. 42 0
      web/src/main/java/seecoder/devcloud/web/model/po/pipeline/PipelineHistory.java
  10. 9 0
      web/src/main/java/seecoder/devcloud/web/model/vo/pipeline/DeploymentInfoVO.java
  11. 14 0
      web/src/main/java/seecoder/devcloud/web/model/vo/pipeline/PipelineConfigVO.java
  12. 27 0
      web/src/main/java/seecoder/devcloud/web/model/vo/pipeline/PipelineHistoryVO.java
  13. 30 0
      web/src/main/java/seecoder/devcloud/web/model/vo/pipeline/PipelineInfoVO.java
  14. 0 85
      web/src/main/java/seecoder/devcloud/web/model/vo/user/CustomUserDetails.java
  15. 0 24
      web/src/main/java/seecoder/devcloud/web/model/vo/user/GroupDTO.java
  16. 0 31
      web/src/main/java/seecoder/devcloud/web/model/vo/user/InnerGroupVO.java
  17. 0 24
      web/src/main/java/seecoder/devcloud/web/model/vo/user/UserDTO.java
  18. 0 3
      web/src/main/java/seecoder/devcloud/web/model/vo/user/UserVO.java
  19. 27 0
      web/src/main/java/seecoder/devcloud/web/service/impl/pipeline/DeploymentServiceImpl.java
  20. 47 0
      web/src/main/java/seecoder/devcloud/web/service/impl/pipeline/PipelineServiceImpl.java
  21. 27 0
      web/src/main/java/seecoder/devcloud/web/service/pipeline/DeploymentService.java
  22. 56 0
      web/src/main/java/seecoder/devcloud/web/service/pipeline/PipelineService.java
  23. 9 0
      web/src/main/resources/SQLScripts/deployment.sql

+ 71 - 0
web/src/main/java/seecoder/devcloud/web/controller/pipeline/PipelineController.java

@@ -0,0 +1,71 @@
+package seecoder.devcloud.web.controller.pipeline;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+import seecoder.devcloud.web.model.vo.Response;
+import seecoder.devcloud.web.service.pipeline.PipelineService;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/11
+ * @description:
+ */
+@RestController("/pipelines")
+@ResponseBody
+public class PipelineController {
+
+    private final PipelineService pipelineService;
+
+    @Autowired
+    public PipelineController(PipelineService pipelineService) {
+        this.pipelineService = pipelineService;
+    }
+
+    /**
+     * 获取一个项目所有的流水线信息
+     */
+    public Response retrievePipelineInfos(Integer projectId){
+        return Response.buildSuccess(pipelineService.retrievePipelineInfos(projectId));
+    }
+
+    /**
+     * 获取指定一条流水线的配置json信息
+     */
+    public Response retrievePipelineConfig(Integer projectId, Integer pipelineId){
+
+        return Response.buildSuccess(pipelineService.retrievePipelineConfig(projectId, pipelineId));
+    }
+
+    /**
+     * 获取指定一条流水线的历史构建信息
+     */
+    public Response retrievePipelineHistory(Integer projectId, Integer pipelineId){
+        return Response.buildSuccess(pipelineService.retrievePipelineHistory(projectId,pipelineId));
+    }
+
+    /**
+     * 依据模板创建一个流水线配置
+     */
+    public Response createPipelineConfig(Integer projectId,Integer pipelineId, String templateName){
+        pipelineService.createPipelineConfig(projectId,pipelineId,templateName);
+        return Response.buildSuccess();
+    }
+
+    /**
+     * 保存一条流水线的配置json信息
+     */
+    public Response savePipelineConfig(Integer projectId,Integer pipelineId, String configJson){
+        pipelineService.savePipelineConfig(projectId,pipelineId, configJson);
+        return Response.buildSuccess();
+    }
+
+    /**
+     * 删除一条流水线
+     */
+    public Response deletePipelineInfo(Integer projectId,Integer pipelineId){
+        pipelineService.deletePipelineConfig(projectId, pipelineId);
+        return Response.buildSuccess();
+    }
+
+}

+ 2 - 0
web/src/main/java/seecoder/devcloud/web/dao/impl/UserMapperImpl.java

@@ -2,6 +2,7 @@ package seecoder.devcloud.web.dao.impl;
 
 
 import org.springframework.security.core.context.SecurityContext;
 import org.springframework.security.core.context.SecurityContext;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Component;
 import seecoder.devcloud.web.dao.user.UserMapper;
 import seecoder.devcloud.web.dao.user.UserMapper;
 import seecoder.devcloud.web.model.po.user.User;
 import seecoder.devcloud.web.model.po.user.User;
 
 
@@ -10,6 +11,7 @@ import seecoder.devcloud.web.model.po.user.User;
  * @date 2021/3/11
  * @date 2021/3/11
  * @description:
  * @description:
  */
  */
+@Component
 public class UserMapperImpl implements UserMapper {
 public class UserMapperImpl implements UserMapper {
 
 
 
 

+ 1 - 1
web/src/main/java/seecoder/devcloud/web/dao/GeneralInsertUpdateSqlProvider.java → web/src/main/java/seecoder/devcloud/web/dao/provider/GeneralInsertUpdateSqlProvider.java

@@ -1,4 +1,4 @@
-package seecoder.devcloud.web.dao;
+package seecoder.devcloud.web.dao.provider;
 
 
 import org.apache.ibatis.jdbc.SQL;
 import org.apache.ibatis.jdbc.SQL;
 
 

+ 1 - 1
web/src/main/java/seecoder/devcloud/web/dao/user/GroupMapper.java

@@ -3,7 +3,7 @@ package seecoder.devcloud.web.dao.user;
 
 
 
 
 import org.apache.ibatis.annotations.*;
 import org.apache.ibatis.annotations.*;
-import seecoder.devcloud.web.dao.GeneralInsertUpdateSqlProvider;
+import seecoder.devcloud.web.dao.provider.GeneralInsertUpdateSqlProvider;
 import seecoder.devcloud.web.model.po.user.Group;
 import seecoder.devcloud.web.model.po.user.Group;
 
 
 /**
 /**

+ 2 - 0
web/src/main/java/seecoder/devcloud/web/dao/user/UserMapper.java

@@ -13,6 +13,8 @@ public interface UserMapper {
 	 * 返回当前自己的用户信息
 	 * 返回当前自己的用户信息
 	 * 由于集成了门户系统而且使用了jwt作为安全认证机制,自己的用户信息存放在 SecurityContextHolder中
 	 * 由于集成了门户系统而且使用了jwt作为安全认证机制,自己的用户信息存放在 SecurityContextHolder中
 	 * 见 JwtAuthenticationTokenFilter.class
 	 * 见 JwtAuthenticationTokenFilter.class
+	 * 注意:SecurityContextHolder采用的是ThreadLocal实现的
+	 *     如果要新开子线程,且子线程需要用到用户信息,务必在父线程把用户信息取出
 	 */
 	 */
 	User findLoginUser();
 	User findLoginUser();
 
 

+ 6 - 1
web/src/main/java/seecoder/devcloud/web/infrastructure/GlobalExceptionHandler.java

@@ -25,5 +25,10 @@ public class GlobalExceptionHandler {
         return Response.buildFailure(e.getCode(),e.getMessage());
         return Response.buildFailure(e.getCode(),e.getMessage());
     }
     }
 
 
-
+    @ExceptionHandler(Exception.class)
+    @ResponseBody
+    public Response serviceExceptionHandler(Exception e){
+        log.error("Error: ",e);
+        return Response.buildFailure(503,e.getMessage());
+    }
 }
 }

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

@@ -0,0 +1,33 @@
+package seecoder.devcloud.web.model.po.pipeline;
+
+import java.sql.Timestamp;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/11
+ * @description: 已部署的软件实例
+ */
+public class Deployment {
+
+    Integer id;
+
+    /**
+     * 对应关联的流水线 todo sql外键
+     */
+    Integer pipelineId;
+
+    /**
+     * 部署的项目名称
+     */
+    String name;
+
+    /**
+     * 最新一次部署时间
+     */
+    Timestamp deployedTime;
+
+    /**
+     * 访问的url地址
+     */
+    String accessUrl;
+}

+ 28 - 0
web/src/main/java/seecoder/devcloud/web/model/po/pipeline/Pipeline.java

@@ -0,0 +1,28 @@
+package seecoder.devcloud.web.model.po.pipeline;
+
+import lombok.Data;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/11
+ * @description:
+ */
+@Data
+public class Pipeline {
+
+
+
+    Integer id;
+
+    /**
+     * 所属的项目id todo sql外键
+     */
+    Integer projectId;
+
+    String name;
+
+    /**
+     * 此pipeline的配置,格式未json
+     */
+    String configJson;
+}

+ 42 - 0
web/src/main/java/seecoder/devcloud/web/model/po/pipeline/PipelineHistory.java

@@ -0,0 +1,42 @@
+package seecoder.devcloud.web.model.po.pipeline;
+
+import java.sql.Timestamp;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/11
+ * @description:
+ */
+public class PipelineHistory {
+
+    /**
+     * pipeline id
+     */
+    Integer id;
+
+    /**
+     * pipeline id
+     */
+    Integer pipelineId;
+
+    /**
+     * 执行开始的时间
+     */
+    Timestamp startTime;
+
+    /**
+     * 发起执行流水线的人
+     */
+    String username;
+
+    /**
+     * 执行结果
+     */
+    String result;
+
+    /**
+     * 执行结果具体信息
+     */
+    String details;
+
+}

+ 9 - 0
web/src/main/java/seecoder/devcloud/web/model/vo/pipeline/DeploymentInfoVO.java

@@ -0,0 +1,9 @@
+package seecoder.devcloud.web.model.vo.pipeline;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/11
+ * @description:
+ */
+public class DeploymentInfoVO {
+}

+ 14 - 0
web/src/main/java/seecoder/devcloud/web/model/vo/pipeline/PipelineConfigVO.java

@@ -0,0 +1,14 @@
+package seecoder.devcloud.web.model.vo.pipeline;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/11
+ * @description:
+ */
+public class PipelineConfigVO {
+
+
+    Integer id;
+
+    String configJson;
+}

+ 27 - 0
web/src/main/java/seecoder/devcloud/web/model/vo/pipeline/PipelineHistoryVO.java

@@ -0,0 +1,27 @@
+package seecoder.devcloud.web.model.vo.pipeline;
+
+import java.sql.Timestamp;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/11
+ * @description:
+ */
+public class PipelineHistoryVO {
+    Integer id;
+
+    /**
+     * 执行开始的时间
+     */
+    Timestamp executionTime;
+
+    /**
+     * 发起执行流水线的人
+     */
+    String username;
+
+    /**
+     * 执行结果 todo
+     */
+    String result;
+}

+ 30 - 0
web/src/main/java/seecoder/devcloud/web/model/vo/pipeline/PipelineInfoVO.java

@@ -0,0 +1,30 @@
+package seecoder.devcloud.web.model.vo.pipeline;
+
+import java.sql.Timestamp;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/11
+ * @description:
+ */
+public class PipelineInfoVO {
+
+    Integer id;
+
+    String name;
+
+    /**
+     * 最后执行开始的时间
+     */
+    Timestamp executionTime;
+
+    /**
+     * 最后发起执行流水线的人
+     */
+    String username;
+
+    /**
+     * 最后的执行结果 todo
+     */
+    String result;
+}

+ 0 - 85
web/src/main/java/seecoder/devcloud/web/model/vo/user/CustomUserDetails.java

@@ -1,85 +0,0 @@
-//package seecoder.devcloud.web.vo.user;
-//
-//import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-//
-//import lombok.*;
-//import org.apache.commons.codec.digest.DigestUtils;
-//import org.springframework.beans.BeanUtils;
-//import org.springframework.security.core.GrantedAuthority;
-//import org.springframework.security.core.userdetails.UserDetails;
-//import org.springframework.security.core.userdetails.UsernameNotFoundException;
-//import seecoder.devcloud.web.po.user.User;
-//
-//import java.util.Collections;
-//import java.util.Set;
-//
-//import static seecoder.devcloud.web.model.enums.UserIdentity.STUDENT;
-//import static seecoder.devcloud.web.model.enums.UserIdentity.TEACHER;
-//import static seecoder.devcloud.web.infrastructure.security.WebSecurityConstants.*;
-//
-//
-//@Data
-//@EqualsAndHashCode
-//@ToString
-//@NoArgsConstructor
-//@AllArgsConstructor
-//@JsonIgnoreProperties(ignoreUnknown = true)
-//public class CustomUserDetails implements UserDetails {
-//	private Integer id;
-//	private String username;
-//	private String password;
-//	private Set<GrantedAuthority> authorities;
-//
-//	CustomUserDetails(User user) {
-//		BeanUtils.copyProperties(user, this);
-//		switch (user.getRole()) {
-//			case STUDENT:
-//				this.authorities = Collections.singleton(STUDENT_AUTHORITY);
-//				break;
-//			case TEACHER:
-//				this.authorities = Collections.singleton(TEACHER_AUTHORITY);
-//				break;
-//			default:
-//				throw new UsernameNotFoundException(username);
-//		}
-//	}
-//
-//	CustomUserDetails(String username, String password) {
-//		this.id = 0;
-//		this.username = username;
-//		this.password = DigestUtils.sha256Hex(password);
-//		this.authorities = Collections.singleton(ADMIN_AUTHORITY);
-//	}
-//
-//	@Override
-//	public boolean isAccountNonExpired() {
-//		return true;
-//	}
-//
-//	@Override
-//	public boolean isAccountNonLocked() {
-//		return true;
-//	}
-//
-//	@Override
-//	public boolean isCredentialsNonExpired() {
-//		return true;
-//	}
-//
-//	@Override
-//	public boolean isEnabled() {
-//		return true;
-//	}
-//
-//	public boolean isStudent() {
-//		return authorities.contains(STUDENT_AUTHORITY);
-//	}
-//
-//	public boolean isTeacher() {
-//		return authorities.contains(TEACHER_AUTHORITY);
-//	}
-//
-//	public boolean isAdmin() {
-//		return authorities.contains(ADMIN_AUTHORITY);
-//	}
-//}

+ 0 - 24
web/src/main/java/seecoder/devcloud/web/model/vo/user/GroupDTO.java

@@ -1,24 +0,0 @@
-package seecoder.devcloud.web.model.vo.user;
-
-import lombok.Data;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-
-import javax.validation.constraints.NotNull;
-
-/**
- * @ClassName GroupDTO
- * @PackageName com.moekr.moocoder.web.dto
- * @Author sheen
- * @Date 2019/1/9
- * @Version 1.0
- * @Description //TODO
- **/
-@Data
-public class GroupDTO {
-    private Integer id;
-    @NotNull(message = "小组名称不能为空!", groups = {PostMapping.class, PutMapping.class})
-    private String name;
-    @NotNull(message = "课程ID不能为空!", groups = {PostMapping.class, PutMapping.class})
-    private Integer courseId;
-}

+ 0 - 31
web/src/main/java/seecoder/devcloud/web/model/vo/user/InnerGroupVO.java

@@ -1,31 +0,0 @@
-package seecoder.devcloud.web.model.vo.user;
-
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import seecoder.devcloud.web.model.po.user.Group;
-import seecoder.devcloud.web.model.po.user.User;
-
-import java.util.List;
-
-/**
- * 暂定为系统内部给作业部分使用的VO
- */
-@Data
-@EqualsAndHashCode(exclude = {"members"})
-@ToString(exclude = {"members"})
-public class InnerGroupVO {
-    private Integer id;
-    private Integer namespace;
-    private String name;
-    private List<User> members;
-
-
-    public InnerGroupVO(Group group) {
-        this.id = group.getId();
-        this.namespace = group.getNamespace();
-        this.name = group.getName();
-        this.members = group.getMembers();
-    }
-}

+ 0 - 24
web/src/main/java/seecoder/devcloud/web/model/vo/user/UserDTO.java

@@ -1,24 +0,0 @@
-package seecoder.devcloud.web.model.vo.user;
-
-import lombok.Data;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import seecoder.devcloud.web.model.enums.UserIdentity;
-
-import javax.validation.constraints.Email;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
-
-@Data
-public class UserDTO {
-	@Pattern(regexp = "[0-9a-zA-Z_]{4,16}", message = "用户名只能包含大小写字母、数字和下划线,且必须为4-16位!", groups = PostMapping.class)
-	@NotNull(message = "请填写用户名!", groups = PostMapping.class)
-	private String username;
-	@Email(message = "邮箱格式不正确!", groups = {PostMapping.class, PutMapping.class})
-	@NotNull(message = "请填写邮箱!", groups = {PostMapping.class, PutMapping.class})
-	private String email;
-//	@NotNull(message = "请选择用户角色!", groups = PostMapping.class)
-	private UserIdentity role;
-	//string | null
-	private String nickname;
-}

+ 0 - 3
web/src/main/java/seecoder/devcloud/web/model/vo/user/UserVO.java

@@ -17,11 +17,8 @@ public class UserVO {
     private Integer id;
     private Integer id;
     private UserIdentity role;
     private UserIdentity role;
     private String username;
     private String username;
-    private String nickname;
     private String email;
     private String email;
     private String phone;
     private String phone;
-    @JsonProperty("created_at")
-    private Timestamp createdAt;
 
 
     public UserVO(User user) {
     public UserVO(User user) {
         BeanUtils.copyProperties(user,this);
         BeanUtils.copyProperties(user,this);

+ 27 - 0
web/src/main/java/seecoder/devcloud/web/service/impl/pipeline/DeploymentServiceImpl.java

@@ -0,0 +1,27 @@
+package seecoder.devcloud.web.service.impl.pipeline;
+
+import org.springframework.stereotype.Service;
+import seecoder.devcloud.web.service.pipeline.DeploymentService;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/12
+ * @description:
+ */
+@Service
+public class DeploymentServiceImpl implements DeploymentService {
+    @Override
+    public void retrieveDeploymentInfos(Integer projectId) {
+        //todo  需要远端查看k8s实例的status
+    }
+
+    @Override
+    public void deploy(Integer projectId, Integer pipelineId) {
+
+    }
+
+    @Override
+    public void delete(Integer projectId, Integer pipelineId) {
+
+    }
+}

+ 47 - 0
web/src/main/java/seecoder/devcloud/web/service/impl/pipeline/PipelineServiceImpl.java

@@ -0,0 +1,47 @@
+package seecoder.devcloud.web.service.impl.pipeline;
+
+import org.springframework.stereotype.Service;
+import seecoder.devcloud.web.model.vo.pipeline.PipelineConfigVO;
+import seecoder.devcloud.web.model.vo.pipeline.PipelineHistoryVO;
+import seecoder.devcloud.web.model.vo.pipeline.PipelineInfoVO;
+import seecoder.devcloud.web.service.pipeline.PipelineService;
+
+import java.util.List;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/12
+ * @description:
+ */
+@Service
+public class PipelineServiceImpl implements PipelineService {
+    @Override
+    public List<PipelineInfoVO> retrievePipelineInfos(Integer projectId) {
+        return null;
+    }
+
+    @Override
+    public PipelineConfigVO retrievePipelineConfig(Integer projectId, Integer pipelineId) {
+        return null;
+    }
+
+    @Override
+    public List<PipelineHistoryVO> retrievePipelineHistory(Integer projectId, Integer pipelineId) {
+        return null;
+    }
+
+    @Override
+    public void createPipelineConfig(Integer projectId, Integer pipelineId, String templateName) {
+
+    }
+
+    @Override
+    public void savePipelineConfig(Integer projectId, Integer pipelineId, String configJson) {
+        //todo 校验json格式
+    }
+
+    @Override
+    public void deletePipelineConfig(Integer projectId, Integer pipelineId) {
+
+    }
+}

+ 27 - 0
web/src/main/java/seecoder/devcloud/web/service/pipeline/DeploymentService.java

@@ -0,0 +1,27 @@
+package seecoder.devcloud.web.service.pipeline;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/11
+ * @description: 流水线实例部署相关的service
+ */
+public interface DeploymentService {
+
+    /**
+     * 获取项目部署的实例信息
+     */
+    void retrieveDeploymentInfos(Integer projectId);
+
+
+    /**
+     * 执行一条pipepine
+     * todo 异步/异步异常捕获刷新result
+     */
+    void deploy(Integer projectId,Integer pipelineId);
+
+    /**
+     * 执行一条pipepine
+     * todo 异步/异步异常捕获刷新result
+     */
+    void delete(Integer projectId,Integer pipelineId);
+}

+ 56 - 0
web/src/main/java/seecoder/devcloud/web/service/pipeline/PipelineService.java

@@ -0,0 +1,56 @@
+package seecoder.devcloud.web.service.pipeline;
+
+import seecoder.devcloud.web.model.po.pipeline.Deployment;
+import seecoder.devcloud.web.model.vo.pipeline.PipelineConfigVO;
+import seecoder.devcloud.web.model.vo.pipeline.PipelineHistoryVO;
+import seecoder.devcloud.web.model.vo.pipeline.PipelineInfoVO;
+
+import java.util.List;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/11
+ * @description: 流水线配置相关的service
+ *
+ *
+ * todo 验证是否有权限
+ */
+public interface PipelineService {
+
+//    /**
+//     * 获取此用户所在的所有组的所有的流水线信息
+//     */
+//    List<PipelineInfoVO> retrievePipelineInfos();
+
+    /**
+     * 获取一个项目所有的流水线信息
+     */
+    List<PipelineInfoVO> retrievePipelineInfos(Integer projectId);
+
+    /**
+     * 获取指定一条流水线的配置json信息
+     */
+    PipelineConfigVO retrievePipelineConfig(Integer projectId, Integer pipelineId);
+
+    /**
+     * 获取指定一条流水线的历史构建信息
+     */
+    List<PipelineHistoryVO> retrievePipelineHistory(Integer projectId, Integer pipelineId);
+
+    /**
+     * 依据模板创建一个流水线配置
+     */
+    void createPipelineConfig(Integer projectId,Integer pipelineId, String templateName);
+
+
+    /**
+     * 保存一条流水线的配置json信息
+     */
+    void savePipelineConfig(Integer projectId,Integer pipelineId, String configJson);
+
+    /**
+     * 删除一条流水线
+     */
+    void deletePipelineConfig(Integer projectId, Integer pipelineId);
+
+}

+ 9 - 0
web/src/main/resources/SQLScripts/deployment.sql

@@ -0,0 +1,9 @@
+create table if not exists devcloud.deployment
+(
+    id            int auto_increment
+        primary key,
+    name          varchar(23)                         not null,
+    deployed_time timestamp default CURRENT_TIMESTAMP not null,
+    access_url    varchar(127)                        not null
+);
+