Prechádzať zdrojové kódy

流水线构建应用的模版

shanshan 2 rokov pred
rodič
commit
5c9603e94e
27 zmenil súbory, kde vykonal 530 pridanie a 6 odobranie
  1. 10 0
      pom.xml
  2. 0 4
      src/main/java/cn/seecoder/fdroidrepository/Controller/ApkController.java
  3. 25 0
      src/main/java/cn/seecoder/fdroidrepository/Controller/AppController.java
  4. 16 0
      src/main/java/cn/seecoder/fdroidrepository/DataObject/ApplicationProperties.java
  5. 12 0
      src/main/java/cn/seecoder/fdroidrepository/DataObject/Enum/BuildTaskStatusEnum.java
  6. 23 0
      src/main/java/cn/seecoder/fdroidrepository/DataObject/Enum/BuildTypeEnum.java
  7. 24 0
      src/main/java/cn/seecoder/fdroidrepository/DataObject/MetaData.java
  8. 16 0
      src/main/java/cn/seecoder/fdroidrepository/DataObject/PO/AppInfoPO.java
  9. 24 0
      src/main/java/cn/seecoder/fdroidrepository/DataObject/PO/BuildTaskPO.java
  10. 18 0
      src/main/java/cn/seecoder/fdroidrepository/DataObject/VO/AppInfoVO.java
  11. 22 0
      src/main/java/cn/seecoder/fdroidrepository/DataObject/VO/BuildTaskVO.java
  12. 35 0
      src/main/java/cn/seecoder/fdroidrepository/DataObject/VO/Response.java
  13. 1 1
      src/main/java/cn/seecoder/fdroidrepository/Mapper/AppMapper.java
  14. 27 0
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/Config/DockerConfig.java
  15. 35 0
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/Config/HandlerConfigTable.java
  16. 41 0
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/Context.java
  17. 13 0
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handler.java
  18. 33 0
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/AbstractHandler.java
  19. 11 0
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/BuildHandler.java
  20. 11 0
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/CleanHandler.java
  21. 11 0
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/GitPullingHandler.java
  22. 11 0
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/GradleHandler.java
  23. 7 0
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/Pipeline.java
  24. 18 0
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/PipelineException.java
  25. 57 0
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/PipelineFactory.java
  26. 27 0
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/PipelineImpl.java
  27. 2 1
      src/main/java/cn/seecoder/fdroidrepository/Service/AppService.java

+ 10 - 0
pom.xml

@@ -50,6 +50,16 @@
             <artifactId>mysql-connector-java</artifactId>
             <version>8.0.23</version>
         </dependency>
+        <dependency>
+            <groupId>com.github.docker-java</groupId>
+            <artifactId>docker-java-core</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.docker-java</groupId>
+            <artifactId>docker-java-transport-httpclient5</artifactId>
+            <version>3.3.0</version>
+        </dependency>
 
     </dependencies>
 

+ 0 - 4
src/main/java/cn/seecoder/fdroidrepository/Controller/ApkController.java

@@ -1,4 +0,0 @@
-package cn.seecoder.fdroidrepository.Controller;
-
-public class ApkController {
-}

+ 25 - 0
src/main/java/cn/seecoder/fdroidrepository/Controller/AppController.java

@@ -0,0 +1,25 @@
+package cn.seecoder.fdroidrepository.Controller;
+
+import cn.seecoder.fdroidrepository.DataObject.VO.AppInfoVO;
+import cn.seecoder.fdroidrepository.DataObject.VO.BuildTaskVO;
+import cn.seecoder.fdroidrepository.DataObject.VO.Response;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/app")
+public class AppController {
+    @PostMapping("/createApp")
+    private Response createApp(@RequestBody AppInfoVO appInfoVO) {
+        return Response.buildSuccess();
+    }
+
+    @PostMapping("/buildApp")
+    private Response buildApp(@RequestBody BuildTaskVO buildTaskVO) {
+        return Response.buildSuccess();
+    }
+
+    @GetMapping("/checkStatus")
+    private Response checkStatus(@RequestParam("taskId") Integer taskId) {
+        return Response.buildSuccess();
+    }
+}

+ 16 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/ApplicationProperties.java

@@ -0,0 +1,16 @@
+package cn.seecoder.fdroidrepository.DataObject;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * ApplicationProperties 保存构建过程中使用到的应用的相关信息
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ApplicationProperties {
+    private String repoUrl;
+    private String branch;
+}

+ 12 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/Enum/BuildTaskStatusEnum.java

@@ -0,0 +1,12 @@
+package cn.seecoder.fdroidrepository.DataObject.Enum;
+
+
+public enum BuildTaskStatusEnum {
+    NEW("New"),
+    FETCHING("Fetching"),
+    BUILDING("Building"),
+    SUCCESS("Success"),
+    FAILED("Failed");
+    private final String value;
+    BuildTaskStatusEnum(String value) { this.value = value; }
+}

+ 23 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/Enum/BuildTypeEnum.java

@@ -0,0 +1,23 @@
+package cn.seecoder.fdroidrepository.DataObject.Enum;
+
+
+import com.google.common.collect.Lists;
+
+import java.lang.reflect.Array;
+import java.util.Arrays;
+import java.util.List;
+
+public enum BuildTypeEnum {
+    ANDROID("Android", Arrays.asList("GIT", "BUILD", "CLEAN")),
+    RISCV("RiscV", Arrays.asList("GIT", "GRADLE", "BUILD", "CLEAN"));
+    private final String value;
+    private final List<String> handlers;
+    BuildTypeEnum(String s, List<String> handlers) {
+        this.value = s;
+        this.handlers = handlers;
+    }
+
+    public List<String> getHandlers() {
+        return handlers;
+    }
+}

+ 24 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/MetaData.java

@@ -1,4 +1,28 @@
 package cn.seecoder.fdroidrepository.DataObject;
 
+import lombok.Data;
+
+import java.util.List;
+
+@Data
 public class MetaData {
+    Integer id;
+
+    List<String> categories;
+    String license;
+    String authorName;
+    String authorEmail;
+    String website;
+    String sourceCode;
+    String issueTracker;
+    String changeLog;
+    String donate;
+    String bitcoin;
+    String litecoin;
+
+    String name;
+    String autoName;
+
+    String repoType;
+    String repo;
 }

+ 16 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/PO/AppInfoPO.java

@@ -0,0 +1,16 @@
+package cn.seecoder.fdroidrepository.DataObject.PO;
+
+import lombok.Data;
+
+@Data
+public class AppInfoPO {
+    Integer id;
+    String appName;
+    Integer authorId;
+    String repoUrl;
+    String buildBranch;
+    String dailyBuildBranch;
+    Boolean enableDailyBuild; // 是否开启daily build功能
+
+    Integer metadataId;
+}

+ 24 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/PO/BuildTaskPO.java

@@ -0,0 +1,24 @@
+package cn.seecoder.fdroidrepository.DataObject.PO;
+
+import cn.seecoder.fdroidrepository.DataObject.Enum.BuildTaskStatusEnum;
+import cn.seecoder.fdroidrepository.DataObject.Enum.BuildTypeEnum;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 构建任务
+ */
+@Data
+public class BuildTaskPO {
+    Integer id;
+    Integer appId;
+    Integer createUserId;
+    Date createTime;
+    Date updateTime;
+    BuildTaskStatusEnum status;
+    BuildTypeEnum buildType;
+    String repoUrl;
+    String branch;
+    String message;
+}

+ 18 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/VO/AppInfoVO.java

@@ -0,0 +1,18 @@
+package cn.seecoder.fdroidrepository.DataObject.VO;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class AppInfoVO implements Serializable {
+    Integer id;
+    String appName;
+    Integer authorId;
+    String repoUrl;
+    String buildBranch;
+    String dailyBuildBranch;
+    Boolean enableDailyBuild; // 是否开启daily build功能
+
+    Integer metadataId;
+}

+ 22 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/VO/BuildTaskVO.java

@@ -0,0 +1,22 @@
+package cn.seecoder.fdroidrepository.DataObject.VO;
+
+import cn.seecoder.fdroidrepository.DataObject.Enum.BuildTaskStatusEnum;
+import cn.seecoder.fdroidrepository.DataObject.Enum.BuildTypeEnum;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class BuildTaskVO implements Serializable {
+    Integer id;
+    Integer appId;
+    Integer createUserId;
+    Date createTime;
+    Date updateTime;
+    BuildTaskStatusEnum status;
+    BuildTypeEnum buildType;
+    String repoUrl;
+    String branch;
+    String message;
+}

+ 35 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/VO/Response.java

@@ -0,0 +1,35 @@
+package cn.seecoder.fdroidrepository.DataObject.VO;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class Response<T> implements Serializable {
+
+    private Integer code;
+
+    private String msg;
+
+    private T data;
+
+    public Response(Integer code, String msg, T data) {
+        this.code = code;
+        this.msg = msg;
+        this.data = data;
+    }
+
+
+    public static Response<Object> buildSuccess() {
+        return new Response<>(200, "", null);
+    }
+
+
+    public static <T> Response<T> buildSuccess(T result) {
+        return new Response<>(200, "", result);
+    }
+
+    public static  Response<Object> buildFailure(Integer code, String message) {
+        return new Response<>(code, message, null);
+    }
+}

+ 1 - 1
src/main/java/cn/seecoder/fdroidrepository/Mapper/ApkMapper.java → src/main/java/cn/seecoder/fdroidrepository/Mapper/AppMapper.java

@@ -1,4 +1,4 @@
 package cn.seecoder.fdroidrepository.Mapper;
 
-public class ApkMapper {
+public class AppMapper {
 }

+ 27 - 0
src/main/java/cn/seecoder/fdroidrepository/Pipeline/Config/DockerConfig.java

@@ -0,0 +1,27 @@
+package cn.seecoder.fdroidrepository.Pipeline.Config;
+
+import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.core.DefaultDockerClientConfig;
+import com.github.dockerjava.core.DockerClientConfig;
+import com.github.dockerjava.core.DockerClientImpl;
+import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
+import com.github.dockerjava.transport.DockerHttpClient;
+
+import java.time.Duration;
+
+/**
+ * DockerConfig
+ * 使用docker-java所需的配置类
+ * 创建出DockerClient,后续执行docker命令进行构建时可以使用
+ */
+public class DockerConfig {
+    public static DockerClientConfig standardConfig = DefaultDockerClientConfig.createDefaultConfigBuilder().build();
+    public static DockerHttpClient dockerHttpClient = new ApacheDockerHttpClient.Builder()
+            .dockerHost(standardConfig.getDockerHost())
+            .sslConfig(standardConfig.getSSLConfig())
+            .maxConnections(100)
+            .connectionTimeout(Duration.ofSeconds(30))
+            .responseTimeout(Duration.ofSeconds(45))
+            .build();
+    public static DockerClient dockerClient = DockerClientImpl.getInstance(standardConfig, dockerHttpClient);
+}

+ 35 - 0
src/main/java/cn/seecoder/fdroidrepository/Pipeline/Config/HandlerConfigTable.java

@@ -0,0 +1,35 @@
+package cn.seecoder.fdroidrepository.Pipeline.Config;
+
+import cn.seecoder.fdroidrepository.Pipeline.Handler;
+import cn.seecoder.fdroidrepository.Pipeline.Handlers.BuildHandler;
+import cn.seecoder.fdroidrepository.Pipeline.Handlers.CleanHandler;
+import cn.seecoder.fdroidrepository.Pipeline.Handlers.GitPullingHandler;
+import cn.seecoder.fdroidrepository.Pipeline.Handlers.GradleHandler;
+import cn.seecoder.fdroidrepository.Pipeline.PipelineException;
+
+import java.util.Map;
+
+public class HandlerConfigTable {
+    public static Map<String, Class<?>> handlerMap;
+
+    static {
+        handlerMap.put("GIT", GitPullingHandler.class);
+        handlerMap.put("GRADLE", GradleHandler.class);
+        handlerMap.put("BUILD", BuildHandler.class);
+        handlerMap.put("CLEAN", CleanHandler.class);
+    }
+
+    public static Handler getHandler(String key) throws PipelineException {
+        Class<?> type = handlerMap.get(key);
+        if (type == null) {
+            throw new PipelineException(500, "不存在对应的Handler,key:" + key);
+        }
+        Handler result;
+        try {
+            result = (Handler) type.newInstance();
+        } catch (InstantiationException | IllegalAccessException exception) {
+            throw new PipelineException(500, "创建流水线Handler出现错误");
+        }
+        return result;
+    }
+}

+ 41 - 0
src/main/java/cn/seecoder/fdroidrepository/Pipeline/Context.java

@@ -0,0 +1,41 @@
+package cn.seecoder.fdroidrepository.Pipeline;
+
+import cn.seecoder.fdroidrepository.DataObject.ApplicationProperties;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class Context {
+    private Integer pipelineId;
+    private String projectName;
+    private ApplicationProperties applicationProperties;
+
+    /**
+     * configs存放一些杂项信息,根据key进行存取
+     * 可以留作拓展
+     */
+    @Builder.Default
+    private Map<String, String> configs = new HashMap<>();
+
+    /**
+     * 保存每个Handler模块的执行结果,每次结果都append在后面
+     */
+    @Builder.Default
+    private StringBuilder resultBuilder = new StringBuilder();
+
+    public void appendResult(String msg) {
+        this.resultBuilder.append(msg);
+    }
+
+    public String getResult() {
+        return resultBuilder.toString();
+    }
+}

+ 13 - 0
src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handler.java

@@ -0,0 +1,13 @@
+package cn.seecoder.fdroidrepository.Pipeline;
+
+public interface Handler {
+    void invoke(Context context) throws PipelineException;
+
+    void process(Context context) throws PipelineException;
+
+    void invokeNext(Context context) throws PipelineException;
+
+    void setNextHandler(Handler nextHandler);
+
+    Handler getNextHandler();
+}

+ 33 - 0
src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/AbstractHandler.java

@@ -0,0 +1,33 @@
+package cn.seecoder.fdroidrepository.Pipeline.Handlers;
+
+import cn.seecoder.fdroidrepository.Pipeline.Context;
+import cn.seecoder.fdroidrepository.Pipeline.Handler;
+import cn.seecoder.fdroidrepository.Pipeline.PipelineException;
+import lombok.Data;
+
+@Data
+public abstract class AbstractHandler implements Handler {
+    private Handler nextHandler;
+    @Override
+    public void invoke(Context context) throws PipelineException {
+        process(context);
+        invokeNext(context);
+    }
+
+    @Override
+    public void invokeNext(Context context) throws PipelineException {
+        if (nextHandler != null) {
+            nextHandler.invoke(context);
+        }
+    }
+
+    @Override
+    public void setNextHandler(Handler nextHandler) {
+        this.nextHandler = nextHandler;
+    }
+
+    @Override
+    public Handler getNextHandler() {
+        return nextHandler;
+    }
+}

+ 11 - 0
src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/BuildHandler.java

@@ -0,0 +1,11 @@
+package cn.seecoder.fdroidrepository.Pipeline.Handlers;
+
+import cn.seecoder.fdroidrepository.Pipeline.Context;
+import cn.seecoder.fdroidrepository.Pipeline.PipelineException;
+
+public class BuildHandler extends AbstractHandler{
+    @Override
+    public void process(Context context) throws PipelineException {
+
+    }
+}

+ 11 - 0
src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/CleanHandler.java

@@ -0,0 +1,11 @@
+package cn.seecoder.fdroidrepository.Pipeline.Handlers;
+
+import cn.seecoder.fdroidrepository.Pipeline.Context;
+import cn.seecoder.fdroidrepository.Pipeline.PipelineException;
+
+public class CleanHandler extends AbstractHandler{
+    @Override
+    public void process(Context context) throws PipelineException {
+
+    }
+}

+ 11 - 0
src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/GitPullingHandler.java

@@ -0,0 +1,11 @@
+package cn.seecoder.fdroidrepository.Pipeline.Handlers;
+
+import cn.seecoder.fdroidrepository.Pipeline.Context;
+import cn.seecoder.fdroidrepository.Pipeline.PipelineException;
+
+public class GitPullingHandler extends AbstractHandler{
+    @Override
+    public void process(Context context) throws PipelineException {
+
+    }
+}

+ 11 - 0
src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/GradleHandler.java

@@ -0,0 +1,11 @@
+package cn.seecoder.fdroidrepository.Pipeline.Handlers;
+
+import cn.seecoder.fdroidrepository.Pipeline.Context;
+import cn.seecoder.fdroidrepository.Pipeline.PipelineException;
+
+public class GradleHandler extends AbstractHandler{
+    @Override
+    public void process(Context context) throws PipelineException {
+
+    }
+}

+ 7 - 0
src/main/java/cn/seecoder/fdroidrepository/Pipeline/Pipeline.java

@@ -0,0 +1,7 @@
+package cn.seecoder.fdroidrepository.Pipeline;
+
+public interface Pipeline {
+    void start() throws PipelineException;
+    Context getContext();
+    void addConfig(String key, String value);
+}

+ 18 - 0
src/main/java/cn/seecoder/fdroidrepository/Pipeline/PipelineException.java

@@ -0,0 +1,18 @@
+package cn.seecoder.fdroidrepository.Pipeline;
+
+public class PipelineException extends Exception{
+    private int code;
+    private String msg;
+
+    public PipelineException(int code, String msg) {
+        super(msg);
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public PipelineException(int code, String msg, Throwable cause) {
+        super(msg, cause);
+        this.code = code;
+        this.msg = msg;
+    }
+}

+ 57 - 0
src/main/java/cn/seecoder/fdroidrepository/Pipeline/PipelineFactory.java

@@ -0,0 +1,57 @@
+package cn.seecoder.fdroidrepository.Pipeline;
+
+import cn.seecoder.fdroidrepository.DataObject.ApplicationProperties;
+import cn.seecoder.fdroidrepository.DataObject.PO.BuildTaskPO;
+import cn.seecoder.fdroidrepository.Pipeline.Config.HandlerConfigTable;
+import cn.seecoder.fdroidrepository.Pipeline.Handlers.AbstractHandler;
+
+import java.util.List;
+
+public class PipelineFactory {
+
+
+    /**
+     * 创建流水线任务
+     * @param id 流水线任务的id,即BuildTaskPO的id
+     * @param projectName 构建出的应用名称
+     * @param buildTaskPO 对应的创建的构建任务
+     * @param applicationProperties 构建过程中需要的相关信息
+     * @return
+     */
+    public static Pipeline init(Integer id, String projectName,
+                                BuildTaskPO buildTaskPO,
+                                ApplicationProperties applicationProperties) throws PipelineException {
+        Context context = Context.builder()
+                .pipelineId(id)
+                .projectName(projectName)
+                .applicationProperties(applicationProperties)
+                .build();
+        Handler firstHandler = initHandlerChain(buildTaskPO);
+        return new PipelineImpl(firstHandler, context);
+    }
+
+    /**
+     * 创建流水线Handler链
+     * @param buildTaskPO
+     * @return
+     * @throws PipelineException
+     */
+    public static Handler initHandlerChain(BuildTaskPO buildTaskPO) throws PipelineException {
+        Handler headHandler = new AbstractHandler() {
+            @Override
+            public void process(Context context) throws PipelineException {
+            }
+        };
+        Handler current = headHandler;
+        List<String> handlers = buildTaskPO.getBuildType().getHandlers();
+        for (String key : handlers) {
+            Handler next = HandlerConfigTable.getHandler(key);
+            if (next != null) {
+                current.setNextHandler(next);
+                current = next;
+            }
+        }
+        return headHandler;
+    }
+
+}

+ 27 - 0
src/main/java/cn/seecoder/fdroidrepository/Pipeline/PipelineImpl.java

@@ -0,0 +1,27 @@
+package cn.seecoder.fdroidrepository.Pipeline;
+
+
+public class PipelineImpl implements Pipeline {
+    private Handler firstHandler;
+    private Context context;
+
+    public PipelineImpl(Handler firstHandler, Context context) {
+        this.firstHandler = firstHandler;
+        this.context = context;
+    }
+
+    @Override
+    public void start() throws PipelineException {
+        firstHandler.invoke(context);
+    }
+
+    @Override
+    public Context getContext() {
+        return context;
+    }
+
+    @Override
+    public void addConfig(String key, String value) {
+        context.getConfigs().put(key, value);
+    }
+}

+ 2 - 1
src/main/java/cn/seecoder/fdroidrepository/Service/ApkService.java → src/main/java/cn/seecoder/fdroidrepository/Service/AppService.java

@@ -1,4 +1,5 @@
 package cn.seecoder.fdroidrepository.Service;
 
-public class ApkService {
+
+public interface AppService {
 }