Kaynağa Gözat

调整 maven 打包

reghao 4 yıl önce
ebeveyn
işleme
1130732e15
18 değiştirilmiş dosya ile 144 ekleme ve 53 silme
  1. 1 1
      common/src/main/java/cn/reghao/autodop/common/msg/rpc/dto/app/PackType.java
  2. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppBakController.java
  3. 0 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildDeployController.java
  4. 0 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/config/impl/AppConfigQueryImpl.java
  5. 5 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/constant/AppType.java
  6. 5 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/constant/EnvList.java
  7. 2 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/config/AppConfig.java
  8. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/tools/compiler/CodeCompiler.java
  9. 17 15
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/tools/compiler/MavenCompiler.java
  10. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/tools/compiler/ShellCompiler.java
  11. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/tools/packer/DockerPack.java
  12. 14 13
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/tools/packer/ZipPack.java
  13. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppConfigServiceImpl.java
  14. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/impl/BuildDeployConfigServiceImpl.java
  15. 45 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/impl/BuildDeployServiceImpl.java
  16. 40 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/controller/SysController.java
  17. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/controller/SysPageController.java
  18. 1 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/util/UploadDownload.java

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/msg/rpc/dto/app/PackType.java

@@ -7,7 +7,7 @@ package cn.reghao.autodop.common.msg.rpc.dto.app;
  * @date 2019-11-15 21:59:35
  */
 public enum PackType {
-    docker, zip;
+    docker, zip, zipHttp;
 
     public String getName() {
         return this.name();

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppBakController.java

@@ -25,7 +25,7 @@ import java.nio.charset.StandardCharsets;
 @RestController
 @RequestMapping("/api/bak")
 public class AppBakController {
-    private UploadDownload uploadDownload;
+    private final UploadDownload uploadDownload;
 
     public AppBakController(UploadDownload uploadDownload) {
         this.uploadDownload = uploadDownload;
@@ -38,7 +38,7 @@ public class AppBakController {
         String json = "";
         ByteArrayInputStream bytesIn = new ByteArrayInputStream(json.getBytes());
         BufferedInputStream bis = new BufferedInputStream(bytesIn);
-        uploadDownload.download(bis, response);
+        uploadDownload.download("test", bis, response);
     }
 
     @ApiOperation(value = "导入 JSON 数据")

+ 0 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildDeployController.java

@@ -22,7 +22,6 @@ import org.springframework.web.bind.annotation.*;
 @RequestMapping("/api/app/bd")
 public class BuildDeployController {
     private final BuildDeployService buildDeployService;
-
     private final BuildDeployDispatcher buildDeployDispatcher;
     private final BuildDeployConfigServiceImpl buildService;
 

+ 0 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/config/impl/AppConfigQueryImpl.java

@@ -7,7 +7,6 @@ import cn.reghao.autodop.dmaster.app.model.po.config.ProjConfig;
 import cn.reghao.autodop.dmaster.app.model.po.config.build.CompilerConfig;
 import cn.reghao.autodop.dmaster.app.model.po.config.build.PackerConfig;
 import cn.reghao.autodop.dmaster.app.model.po.config.build.RepoAuthConfig;
-import org.springframework.cache.annotation.CacheConfig;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.domain.Specification;

+ 5 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/constant/AppType.java

@@ -7,5 +7,9 @@ package cn.reghao.autodop.dmaster.app.model.constant;
  * @date 2019-10-18 14:31:29
  */
 public enum AppType {
-    maven, dotnetCore, npm, cmake, gradle
+    maven, dotnetCore, npm, cmake, gradle;
+
+    public String getName() {
+        return this.name();
+    }
 }

+ 5 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/constant/EnvList.java

@@ -8,5 +8,9 @@ package cn.reghao.autodop.dmaster.app.model.constant;
  * @date 2019-10-18 14:31:29
  */
 public enum EnvList {
-    dev, test, uat, prod
+    dev, test, uat, prod;
+
+    public String getName() {
+        return this.name();
+    }
 }

+ 2 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/config/AppConfig.java

@@ -34,11 +34,9 @@ public class AppConfig extends BaseEntity<Integer> implements Cloneable {
     @NotBlank(message = "应用名字不能为空白字符串")
     private String appName;
     private String description;
-    @NotBlank(message = "应用类型不能为空白字符串")
-    @ValidEnum(value = AppType.class, message = "请选择正确的编译类型")
+    @ValidEnum(value = AppType.class, message = "请选择正确的应用类型")
     private String appType;
-    @NotBlank(message = "应用所属环境不能为空白字符串")
-    @ValidEnum(value = EnvList.class, message = "请选择正确的编译类型")
+    @ValidEnum(value = EnvList.class, message = "请选择正确的环境类型")
     private String env;
     @NotBlank(message = "应用仓库不能为空白字符串")
     private String appRepo;

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/tools/compiler/CodeCompiler.java

@@ -8,9 +8,9 @@ package cn.reghao.autodop.dmaster.app.service.bd.tools.compiler;
  */
 public interface CodeCompiler {
     /**
-     * @param appName 应用名字
+     * @param appId 应用标识
      * @param appCompileHome 应用代码编译目录
      * @date 2020-01-21 下午4:20
      */
-    void compile(String appName, String appCompileHome) throws Exception;
+    void compile(String appId, String appCompileHome) throws Exception;
 }

+ 17 - 15
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/tools/compiler/MavenCompiler.java

@@ -17,12 +17,12 @@ import java.util.List;
  */
 @Slf4j
 public class MavenCompiler implements CodeCompiler {
-    private String dirname;
+    private final String dirname;
     // TODO 和 EnvType 关联
-    private String env;
-    private InvocationRequest request;
-    private Invoker invoker;
-    private List<String> compileLog;
+    private final String env;
+    private final InvocationRequest request;
+    private final Invoker invoker;
+    private final List<String> compileLog;
 
     public MavenCompiler(String homePath, String env, String dirname) {
         System.setProperty("maven.home", homePath);
@@ -34,28 +34,27 @@ public class MavenCompiler implements CodeCompiler {
     }
 
     @Override
-    public void compile(String appName, String appCompileHome) throws Exception {
+    public void compile(String appId, String appCompileHome) throws Exception {
         String pomPath = appCompileHome + "/pom.xml";
-        setInvocationRequest(pomPath);
+        setInvocationRequest(appId, pomPath);
         InvocationResult result = invoker.execute(request);
         if (result.getExitCode() != 0) {
-            throw new Exception(compileLog.toString());
+            StringBuilder sb = new StringBuilder();
+            compileLog.forEach(line -> sb.append(line).append(System.lineSeparator()));
+            throw new Exception(sb.toString());
         } else {
             log.info("构建成功");
         }
     }
 
     /**
-     * mvn clean package -am -Pdev -pl ${app} -Dmaven.test.skip=true
-     * // TODO 注意线程安全,也可每个线程创建一个对象
+     * mvn clean package -Dmaven.test.skip=true -am -Pdev -pl dmaster
      *
      * @param
      * @return
      * @date 2020-05-12 上午10:36
      */
-    private void setInvocationRequest(String pomPath) {
-        // 清空前一次构建的日志
-        compileLog.clear();
+    private void setInvocationRequest(String appId, String pomPath) {
         request.setPomFile(new File(pomPath));
         // mvn clean package -Dmaven.test.skip=true
         request.setGoals(Arrays.asList("clean", "package", "-Dmaven.test.skip=true"));
@@ -64,7 +63,10 @@ public class MavenCompiler implements CodeCompiler {
         // -Penv
         request.setProfiles(Collections.singletonList(env));
         // -pl app
-        request.setProjects(Collections.singletonList(dirname));
-        request.setOutputHandler(line -> compileLog.add(line));
+        request.setProjects(Collections.singletonList(appId));
+        // 清空前一次构建的日志
+        // TODO 多线程环境时编译日志会出现问题
+        compileLog.clear();
+        request.setOutputHandler(compileLog::add);
     }
 }

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/tools/compiler/ShellCompiler.java

@@ -12,7 +12,7 @@ import cn.reghao.autodop.dmaster.app.model.po.config.build.CompilerConfig;
  * @date 2019-10-12 23:55:01
  */
 public class ShellCompiler implements CodeCompiler {
-    private ShellExecutor shell;
+    private final ShellExecutor shell;
     private final String compileCmd;
 
     public ShellCompiler(CompilerConfig compilerConfig) {
@@ -21,7 +21,7 @@ public class ShellCompiler implements CodeCompiler {
     }
 
     @Override
-    public void compile(String appName, String appCompileHome) throws Exception {
+    public void compile(String appId, String appCompileHome) throws Exception {
         ShellResult result = shell.exec(compileCmd, appCompileHome);
         if (!result.isSuccess()) {
             throw new Exception(JsonConverter.objectToJson(result.getOutput()));

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/tools/packer/DockerPack.java

@@ -12,8 +12,8 @@ import lombok.extern.slf4j.Slf4j;
  */
 @Slf4j
 public class DockerPack implements CodePacker {
-    private String dockerfile;
-    private String targetPath;
+    private final String dockerfile;
+    private final String targetPath;
 
     public DockerPack(PackerConfig packerConfig, String dockerfile) {
         this.dockerfile = dockerfile;

+ 14 - 13
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/tools/packer/ZipPack.java

@@ -1,34 +1,35 @@
 package cn.reghao.autodop.dmaster.app.service.bd.tools.packer;
 
+import cn.reghao.autodop.common.msg.rpc.dto.app.PackType;
+import cn.reghao.autodop.common.util.compression.ZipFiles;
+import cn.reghao.autodop.dmaster.app.model.po.config.build.LocalBuildDir;
 import cn.reghao.autodop.dmaster.app.model.po.config.build.PackerConfig;
 import lombok.extern.slf4j.Slf4j;
 
+import java.io.File;
+
 /**
  * @author reghao
  * @date 2020-03-11 13:37:36
  */
 @Slf4j
 public class ZipPack implements CodePacker {
-    private final String SUFFIX = ".zip";
-    private String targetPath;
+    private final String targetPath;
 
     public ZipPack(PackerConfig packerConfig) {
-        this.targetPath = packerConfig.getTargetPath();
-    }
-
-    public ZipPack(String packDir) {
-        this.targetPath = packDir;
+        this.targetPath = packerConfig.getType().equals(PackType.zip.getName()) ?
+                LocalBuildDir.packDir : packerConfig.getTargetPath();
     }
 
     @Override
     public String pack(String appId, String commitId, String appCompileHome) throws Exception {
-        log.info("生成 zip 包");
-        /*String tag = appId + "_" + commitId + SUFFIX;
-        String dst = targetPath + "/" + tag;
+        String filename = String.format("%s-%s.zip", appId, commitId);
+        String dst = targetPath + "/" + filename;
         if (new File(dst).exists()) {
-            return null;
+            throw new Exception(dst + " 已存在");
         }
-        ZipFiles.zip(new File(appCompileHome), dst);*/
-        return null;
+        ZipFiles.zip(new File(appCompileHome), dst);
+
+        return String.format("http://localhost:4020/api/sys/package/%s", filename);
     }
 }

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppConfigServiceImpl.java

@@ -58,7 +58,7 @@ public class AppConfigServiceImpl implements AppConfigService {
         }
 
         appConfigCrud.save(app);
-        appBuildService.refreshApp(app);
+        appBuildService.refreshAppBuilding(app);
         String msg = String.format("添加 %s 成功", app.getAppId());
         return Result.result(ResultStatus.SUCCESS, msg);
     }
@@ -138,7 +138,7 @@ public class AppConfigServiceImpl implements AppConfigService {
         }
 
         appConfigCrud.save(app);
-        appBuildService.refreshApp(app);
+        appBuildService.refreshAppBuilding(app);
 
         String msg = String.format("更新 %s 成功", app.getAppId());
         return Result.result(ResultStatus.SUCCESS, msg);

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/impl/BuildDeployConfigServiceImpl.java

@@ -74,7 +74,7 @@ public class BuildDeployConfigServiceImpl implements BuildDeployConfigService {
      * @return
      * @date 2021-06-18 下午5:24
      */
-    private void refreshAppBuilding(AppConfig app) {
+    public void refreshAppBuilding(AppConfig app) {
         AppBuilding appBuilding = buildingRepository.findByAppId(app.getAppId());
         if (appBuilding == null) {
             appBuilding = new AppBuilding(app);
@@ -120,7 +120,7 @@ public class BuildDeployConfigServiceImpl implements BuildDeployConfigService {
      * @return
      * @date 2021-06-18 下午5:25
      */
-    private void refreshAppDeploying(AppConfig app) {
+    public void refreshAppDeploying(AppConfig app) {
         String appId = app.getAppId();
         List<AppDeploying> list = app.getDeployConfigs().stream()
                 .map(deployConfig -> {
@@ -144,7 +144,7 @@ public class BuildDeployConfigServiceImpl implements BuildDeployConfigService {
      * @return
      * @date 2021-06-18 下午5:29
      */
-    private void refreshAppRunning(AppConfig app) {
+    public void refreshAppRunning(AppConfig app) {
         String appId = app.getAppId();
         List<AppRunning> list = app.getDeployConfigs().stream()
                 .map(deployConfig -> {

+ 45 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/impl/BuildDeployServiceImpl.java

@@ -1,14 +1,59 @@
 package cn.reghao.autodop.dmaster.app.service.impl;
 
+import cn.reghao.autodop.common.util.thread.ThreadPoolWrapper;
+import cn.reghao.autodop.dmaster.app.db.query.config.AppConfigQuery;
+import cn.reghao.autodop.dmaster.app.db.repository.AppBuildingRepository;
+import cn.reghao.autodop.dmaster.app.db.repository.AppDeployingRepository;
+import cn.reghao.autodop.dmaster.app.db.repository.log.BuildLogRepository;
 import cn.reghao.autodop.dmaster.app.service.BuildDeployService;
+import cn.reghao.autodop.dmaster.app.service.bd.AppDeployer;
+import cn.reghao.autodop.dmaster.app.service.bd.AppIntegrate;
+import cn.reghao.autodop.dmaster.notification.service.NotifyService;
+import cn.reghao.autodop.dmaster.spring.interceptor.AppIntegrateReinitInterceptor;
 import org.springframework.stereotype.Service;
 
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentSkipListSet;
+import java.util.concurrent.ExecutorService;
+
 /**
  * @author reghao
  * @date 2021-09-17 11:30:16
  */
 @Service
 public class BuildDeployServiceImpl implements BuildDeployService {
+    private AppBuildingRepository appBuildingRepository;
+    private AppDeployingRepository appDeployingRepository;
+    private BuildLogRepository buildLogRepository;
+    private AppIntegrateReinitInterceptor reinitInterceptor;
+    // TODO 多线程访问的集合
+    private Set<String> onBuilding = new ConcurrentSkipListSet<>();
+    private Set<String> onDeploying = new ConcurrentSkipListSet<>();
+    private Map<String, AppIntegrate> integrateMap = new ConcurrentHashMap<>();
+    private AppConfigQuery appConfigQuery;
+    private ExecutorService threadPool;
+    private AppDeployer appDeployer;
+    private NotifyService notifyService;
+
+    public BuildDeployServiceImpl(AppBuildingRepository appBuildingRepository,
+                                 AppDeployingRepository appDeployingRepository,
+                                 AppIntegrateReinitInterceptor reinitInterceptor,
+                                 AppConfigQuery appConfigQuery,
+                                 BuildLogRepository buildLogRepository,
+                                 NotifyService notify,
+                                 AppDeployer appDeployer) {
+        this.appBuildingRepository = appBuildingRepository;
+        this.appDeployingRepository = appDeployingRepository;
+        this.reinitInterceptor = reinitInterceptor;
+        this.appConfigQuery = appConfigQuery;
+        this.buildLogRepository = buildLogRepository;
+        this.notifyService = notify;
+        this.appDeployer = appDeployer;
+        this.threadPool = ThreadPoolWrapper.threadPool("build-deploy");
+    }
+
     @Override
     public String buildAndDeploy(String appId) {
         return "";

+ 40 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/controller/SysController.java

@@ -0,0 +1,40 @@
+package cn.reghao.autodop.dmaster.sys.controller;
+
+import cn.reghao.autodop.dmaster.app.model.po.config.build.LocalBuildDir;
+import cn.reghao.autodop.dmaster.util.UploadDownload;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+/**
+ * @author reghao
+ * @date 2021-09-24 11:19:05
+ */
+@Api(tags = "系统接口")
+@RestController
+@RequestMapping("/api/sys")
+public class SysController {
+    private final UploadDownload uploadDownload;
+
+    public SysController(UploadDownload uploadDownload) {
+        this.uploadDownload = uploadDownload;
+    }
+
+    @ApiOperation(value = "下载构建的应用")
+    @GetMapping("/package/{filename}")
+    public void downloadPackage(@PathVariable("filename") String filename, HttpServletResponse response)
+            throws IOException {
+        String filePath = LocalBuildDir.packDir + "/" + filename;
+        FileInputStream fileInputStream = new FileInputStream(filePath);
+        BufferedInputStream bis = new BufferedInputStream(fileInputStream);
+        uploadDownload.download(filename, bis, response);
+    }
+}

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/controller/SysPageController.java

@@ -56,7 +56,7 @@ public class SysPageController {
         String json = "test data";
         ByteArrayInputStream bytesIn = new ByteArrayInputStream(json.getBytes());
         BufferedInputStream bis = new BufferedInputStream(bytesIn);
-        uploadDownload.download(bis, response);
+        uploadDownload.download("test1", bis, response);
     }
 
     @ApiOperation(value = "数据还原")

+ 1 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/util/UploadDownload.java

@@ -26,8 +26,7 @@ public class UploadDownload {
         download(bis, os);
     }
 
-    public void download(InputStream in, HttpServletResponse response) throws IOException {
-        String filename = "data.json";
+    public void download(String filename, InputStream in, HttpServletResponse response) throws IOException {
         prepareResponse(filename, response);
         download(in, response.getOutputStream());
     }