Bläddra i källkod

应用模块构建部署功能完成一大半

reghao 6 år sedan
förälder
incheckning
81a2db958e
62 ändrade filer med 701 tillägg och 287 borttagningar
  1. 9 6
      common/src/main/java/cn/reghao/autodop/common/config/BuildDeployResult.java
  2. 1 0
      common/src/main/java/cn/reghao/autodop/common/config/DeployConfig.java
  3. 16 0
      common/src/main/java/cn/reghao/autodop/common/config/DeployResult.java
  4. 16 0
      common/src/main/java/cn/reghao/autodop/common/config/StaticDeployConfig.java
  5. 4 4
      common/src/main/java/cn/reghao/autodop/common/deploy/BuilderUtil.java
  6. 3 4
      common/src/main/java/cn/reghao/autodop/common/deploy/Deploy.java
  7. 36 0
      common/src/main/java/cn/reghao/autodop/common/deploy/DockerDeploy.java
  8. 2 5
      common/src/main/java/cn/reghao/autodop/common/deploy/StaticDeploy.java
  9. 53 0
      common/src/main/java/cn/reghao/autodop/common/deploy/ZipDeploy.java
  10. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/docker/Container.java
  11. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/docker/ContainerConfig.java
  12. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/docker/ContainerInfo.java
  13. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/docker/ContainerOps.java
  14. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/docker/DockerApi.java
  15. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/docker/DockerAuth.java
  16. 3 5
      common/src/main/java/cn/reghao/autodop/common/deploy/docker/DockerClient.java
  17. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/docker/DockerException.java
  18. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/docker/DockerHeader.java
  19. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/docker/HostConfig.java
  20. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/docker/ImageOps.java
  21. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/docker/httpclient/HttpClientHandler.java
  22. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/docker/httpclient/UnixSocketClient.java
  23. 2 2
      common/src/main/java/cn/reghao/autodop/common/deploy/docker/httpclient/WebClient.java
  24. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/vc/GitImpl.java
  25. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/vc/SvnImpl.java
  26. 1 1
      common/src/main/java/cn/reghao/autodop/common/deploy/vc/VersionControl.java
  27. 1 16
      common/src/main/java/cn/reghao/autodop/common/grpc/client/GrpcClientProxy.java
  28. 1 1
      common/src/main/java/cn/reghao/autodop/common/grpc/facade/AppService.java
  29. 2 2
      common/src/main/java/cn/reghao/autodop/common/grpc/facade/DeployService.java
  30. 26 3
      common/src/main/java/cn/reghao/autodop/common/http/DefaultWebRequest.java
  31. 3 0
      common/src/main/java/cn/reghao/autodop/common/http/WebRequest.java
  32. 0 31
      common/src/main/java/cn/reghao/autodop/common/module/deploy/DockerDeploy.java
  33. 6 2
      common/src/main/java/cn/reghao/autodop/common/result/DeployResult.java
  34. 19 4
      common/src/main/java/cn/reghao/autodop/common/utils/JsonUtil.java
  35. 37 0
      common/src/main/java/cn/reghao/autodop/common/utils/NetworkUtil.java
  36. 45 21
      common/src/main/java/cn/reghao/autodop/common/utils/compression/ZipUtil.java
  37. 8 11
      dagent/src/main/java/cn/reghao/autodop/dagent/DagentApplication.java
  38. 23 19
      dagent/src/main/java/cn/reghao/autodop/dagent/service/DeployServiceImpl.java
  39. 2 2
      dagent/src/main/java/cn/reghao/autodop/dagent/service/DockerAppServiceImpl.java
  40. 0 0
      dagent/src/main/resources/application-dev.yml
  41. 0 0
      dagent/src/main/resources/application-prod.yml
  42. 0 0
      dagent/src/main/resources/application-test.yml
  43. 26 19
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildController.java
  44. 65 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/FileController.java
  45. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppManager.java
  46. 41 33
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppBuildPipeline.java
  47. 13 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppDeploy.java
  48. 19 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppIntegrate.java
  49. 22 20
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/BuildDispatcher.java
  50. 10 10
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/ProjectUpdateTask.java
  51. 27 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/compiler/DnktMgrPreCompile.java
  52. 3 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/compiler/DotnetPreCompile.java
  53. 13 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/compiler/NullCompile.java
  54. 3 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/compiler/PreCompile.java
  55. 37 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/packer/DnktZipTarPack.java
  56. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/packer/DockerPack.java
  57. 28 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/packer/ZipPack.java
  58. 29 22
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/vc/GitImpl.java
  59. 6 8
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/vc/SvnImpl.java
  60. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/vc/VersionControl.java
  61. 14 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/config/WebMvcConfig.java
  62. 8 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/SshUtil.java

+ 9 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/pojo/BuildResult.java → common/src/main/java/cn/reghao/autodop/common/config/BuildDeployResult.java

@@ -1,24 +1,27 @@
-package cn.reghao.autodop.dmaster.app.pojo;
+package cn.reghao.autodop.common.config;
 
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
 /**
- * 构建结果
+ * 构建部署结果
  *
  * @author reghao
  * @date 2020-03-10 11:22:05
  */
 @NoArgsConstructor
 @Data
-public class BuildResult {
+public class BuildDeployResult {
     private String appId;
-    private long versioin;
-    private String appPath;
+    private String stage;
     private String msg;
+    private String version;
+    private String appPath;
+    private String host;
 
-    public BuildResult(String appId, String msg) {
+    public BuildDeployResult(String appId, String stage, String msg) {
         this.appId = appId;
+        this.appId = stage;
         this.msg = msg;
     }
 }

+ 1 - 0
common/src/main/java/cn/reghao/autodop/common/config/DeployConfig.java

@@ -12,4 +12,5 @@ public class DeployConfig {
     private String appPath;
     private String packerType;
     private String runningDir;
+    private String host;
 }

+ 16 - 0
common/src/main/java/cn/reghao/autodop/common/config/DeployResult.java

@@ -0,0 +1,16 @@
+package cn.reghao.autodop.common.config;
+
+import lombok.Data;
+
+/**
+ * 部署操作的结果
+ *
+ * @author reghao
+ * @date 2019-10-10 00:51:36
+ */
+@Data
+public class DeployResult {
+    private String host;
+    private int code;
+    private String msg;
+}

+ 16 - 0
common/src/main/java/cn/reghao/autodop/common/config/StaticDeployConfig.java

@@ -0,0 +1,16 @@
+package cn.reghao.autodop.common.config;
+
+import lombok.Data;
+
+/**
+ * @author reghao
+ * @date 2020-01-03 08:43:03
+ */
+@Data
+public class StaticDeployConfig {
+    private String appId;
+    private String appPath;
+    private String packerType;
+    private String runningDir;
+    private String host;
+}

+ 4 - 4
common/src/main/java/cn/reghao/autodop/common/module/deploy/BuilderUtil.java → common/src/main/java/cn/reghao/autodop/common/deploy/BuilderUtil.java

@@ -1,8 +1,8 @@
-package cn.reghao.autodop.common.module.deploy;
+package cn.reghao.autodop.common.deploy;
 
-import cn.reghao.autodop.common.module.deploy.vc.GitImpl;
-import cn.reghao.autodop.common.module.deploy.vc.SvnImpl;
-import cn.reghao.autodop.common.module.deploy.vc.VersionControl;
+import cn.reghao.autodop.common.deploy.vc.GitImpl;
+import cn.reghao.autodop.common.deploy.vc.SvnImpl;
+import cn.reghao.autodop.common.deploy.vc.VersionControl;
 import cn.reghao.autodop.common.module.sys.GlobalConfig;
 import cn.reghao.autodop.common.module.sys.entity.AppConfig;
 import cn.reghao.autodop.common.module.sys.entity.deploy.RepoConfig;

+ 3 - 4
common/src/main/java/cn/reghao/autodop/common/module/deploy/Deploy.java → common/src/main/java/cn/reghao/autodop/common/deploy/Deploy.java

@@ -1,7 +1,6 @@
-package cn.reghao.autodop.common.module.deploy;
+package cn.reghao.autodop.common.deploy;
 
-import cn.reghao.autodop.common.result.DeployResult;
-import cn.reghao.autodop.common.module.sys.DeployConfig;
+import cn.reghao.autodop.common.config.BuildDeployResult;
 
 /**
  * 应用部署
@@ -16,5 +15,5 @@ public interface Deploy {
      * @return 0 - 部署成功,1 - 部署失败
      * @date 2019-10-15 下午4:57
      */
-    int deploy(String appId, String appPath) throws Exception;
+    BuildDeployResult deploy(String appId, String appPath, String runningDir);
 }

+ 36 - 0
common/src/main/java/cn/reghao/autodop/common/deploy/DockerDeploy.java

@@ -0,0 +1,36 @@
+package cn.reghao.autodop.common.deploy;
+
+import cn.reghao.autodop.common.config.BuildDeployResult;
+import cn.reghao.autodop.common.deploy.docker.DockerClient;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 部署 docker 镜像
+ *
+ * @author reghao
+ * @date 2019-10-08 09:57:18
+ */
+@Slf4j
+public class DockerDeploy implements Deploy {
+    private DockerClient docker = new DockerClient();
+
+    @Override
+    public BuildDeployResult deploy(String appId, String appPath, String runningDir) {
+        BuildDeployResult result = new BuildDeployResult();
+        result.setAppId(appId);
+        result.setStage("部署");
+        try {
+            docker.pull(appPath);
+            result.setMsg("部署成功");
+            //String containerId = docker.run(appId, appPath);
+        /*Thread.sleep(5_000L);
+        if (!docker.isRunning(containerId)) {
+
+        }*/
+        } catch (Exception e) {
+            result.setMsg(e.getMessage());
+        }
+
+        return result;
+    }
+}

+ 2 - 5
common/src/main/java/cn/reghao/autodop/common/module/deploy/StaticDeploy.java → common/src/main/java/cn/reghao/autodop/common/deploy/StaticDeploy.java

@@ -1,12 +1,9 @@
-package cn.reghao.autodop.common.module.deploy;
+package cn.reghao.autodop.common.deploy;
 
-import cn.reghao.autodop.common.module.deploy.vc.VersionControl;
+import cn.reghao.autodop.common.deploy.vc.VersionControl;
 import cn.reghao.autodop.common.module.sys.entity.AppConfig;
-import cn.reghao.autodop.common.module.sys.entity.Notifier;
 import cn.reghao.autodop.common.utils.FileUtil;
 import cn.reghao.autodop.common.result.DeployResult;
-import cn.reghao.autodop.common.result.DeployStage;
-import cn.reghao.autodop.common.result.ResultCode;
 import cn.reghao.autodop.common.utils.compression.ZipUtil;
 import cn.reghao.autodop.common.utils.spring.SpringBootUtil;
 import lombok.extern.slf4j.Slf4j;

+ 53 - 0
common/src/main/java/cn/reghao/autodop/common/deploy/ZipDeploy.java

@@ -0,0 +1,53 @@
+package cn.reghao.autodop.common.deploy;
+
+import cn.reghao.autodop.common.config.BuildDeployResult;
+import cn.reghao.autodop.common.http.DefaultWebRequest;
+import cn.reghao.autodop.common.http.WebRequest;
+import cn.reghao.autodop.common.utils.FileUtil;
+import cn.reghao.autodop.common.utils.compression.ZipUtil;
+
+import java.io.File;
+
+/**
+ * @author reghao
+ * @date 2020-03-11 17:13:02
+ */
+public class ZipDeploy implements Deploy {
+    @Override
+    public BuildDeployResult deploy(String appId, String appPath, String runningDir) {
+        String url = "http://localhost:4000/api/app/file/dl/" + appPath;
+        WebRequest request = new DefaultWebRequest();
+
+        BuildDeployResult result = new BuildDeployResult();
+        result.setAppId(appId);
+        result.setStage("部署");
+        try {
+            String appDir = runningDir + "/" + appId;
+            String appRunningDir = appDir + "/app";
+            checkDir(appDir, appRunningDir);
+
+            String filepath = appDir + "/" + appPath;
+            if (!new File(filepath).exists()) {
+                request.download(url, filepath);
+            }
+
+            FileUtil.eraseDir(new File(appRunningDir));
+            ZipUtil.unzip(filepath, appRunningDir);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setMsg(e.getMessage());
+        }
+
+        return result;
+    }
+
+    private void checkDir(String appDir, String appRunningDir) throws Exception {
+        if (!new File(appDir).exists() && !FileUtil.mkdir(appDir)) {
+            throw new Exception("创建 " + appDir + " 出错");
+        }
+
+        if (!new File(appRunningDir).exists() && !FileUtil.mkdir(appRunningDir)) {
+            throw new Exception("创建 " + appRunningDir + " 出错");
+        }
+    }
+}

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/docker/Container.java → common/src/main/java/cn/reghao/autodop/common/deploy/docker/Container.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.docker;
+package cn.reghao.autodop.common.deploy.docker;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/docker/ContainerConfig.java → common/src/main/java/cn/reghao/autodop/common/deploy/docker/ContainerConfig.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.docker;
+package cn.reghao.autodop.common.deploy.docker;
 
 /**
  * @author reghao

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/docker/ContainerInfo.java → common/src/main/java/cn/reghao/autodop/common/deploy/docker/ContainerInfo.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.docker;
+package cn.reghao.autodop.common.deploy.docker;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/docker/ContainerOps.java → common/src/main/java/cn/reghao/autodop/common/deploy/docker/ContainerOps.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.docker;
+package cn.reghao.autodop.common.deploy.docker;
 
 import java.io.IOException;
 import java.util.List;

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/docker/DockerApi.java → common/src/main/java/cn/reghao/autodop/common/deploy/docker/DockerApi.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.docker;
+package cn.reghao.autodop.common.deploy.docker;
 
 /**
  * Docker v1.40

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/docker/DockerAuth.java → common/src/main/java/cn/reghao/autodop/common/deploy/docker/DockerAuth.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.docker;
+package cn.reghao.autodop.common.deploy.docker;
 
 import lombok.Data;
 

+ 3 - 5
common/src/main/java/cn/reghao/autodop/common/module/deploy/docker/DockerClient.java → common/src/main/java/cn/reghao/autodop/common/deploy/docker/DockerClient.java

@@ -1,7 +1,7 @@
-package cn.reghao.autodop.common.module.deploy.docker;
+package cn.reghao.autodop.common.deploy.docker;
 
-import cn.reghao.autodop.common.module.deploy.docker.httpclient.UnixSocketClient;
-import cn.reghao.autodop.common.module.deploy.docker.httpclient.WebClient;
+import cn.reghao.autodop.common.deploy.docker.httpclient.UnixSocketClient;
+import cn.reghao.autodop.common.deploy.docker.httpclient.WebClient;
 import cn.reghao.autodop.common.utils.JsonUtil;
 import cn.reghao.autodop.common.utils.security.Base64Util;
 import cn.reghao.autodop.common.utils.compression.TarUtil;
@@ -66,7 +66,6 @@ public class DockerClient implements ImageOps, ContainerOps, AutoCloseable {
     }
 
     /* image 操作 */
-
     @Override
     public void build(String repoTag, String dockerfile) throws IOException, NoSuchAlgorithmException, DockerException {
         String dstPath = "/tmp/" + Md5Util.md5(dockerfile) + ".tar";
@@ -154,7 +153,6 @@ public class DockerClient implements ImageOps, ContainerOps, AutoCloseable {
     }
 
     /* container 操作 */
-
     @Override
     public String run(String name, String image) throws DockerException {
         String containerId = create(name, image);

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/docker/DockerException.java → common/src/main/java/cn/reghao/autodop/common/deploy/docker/DockerException.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.docker;
+package cn.reghao.autodop.common.deploy.docker;
 
 /**
  * @author reghao

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/docker/DockerHeader.java → common/src/main/java/cn/reghao/autodop/common/deploy/docker/DockerHeader.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.docker;
+package cn.reghao.autodop.common.deploy.docker;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/docker/HostConfig.java → common/src/main/java/cn/reghao/autodop/common/deploy/docker/HostConfig.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.docker;
+package cn.reghao.autodop.common.deploy.docker;
 
 /**
  * @author reghao

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/docker/ImageOps.java → common/src/main/java/cn/reghao/autodop/common/deploy/docker/ImageOps.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.docker;
+package cn.reghao.autodop.common.deploy.docker;
 
 /**
  * @author reghao

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/docker/httpclient/HttpClientHandler.java → common/src/main/java/cn/reghao/autodop/common/deploy/docker/httpclient/HttpClientHandler.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.docker.httpclient;
+package cn.reghao.autodop.common.deploy.docker.httpclient;
 
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/docker/httpclient/UnixSocketClient.java → common/src/main/java/cn/reghao/autodop/common/deploy/docker/httpclient/UnixSocketClient.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.docker.httpclient;
+package cn.reghao.autodop.common.deploy.docker.httpclient;
 
 import io.netty.bootstrap.Bootstrap;
 import io.netty.channel.*;

+ 2 - 2
common/src/main/java/cn/reghao/autodop/common/module/deploy/docker/httpclient/WebClient.java → common/src/main/java/cn/reghao/autodop/common/deploy/docker/httpclient/WebClient.java

@@ -1,6 +1,6 @@
-package cn.reghao.autodop.common.module.deploy.docker.httpclient;
+package cn.reghao.autodop.common.deploy.docker.httpclient;
 
-import cn.reghao.autodop.common.module.deploy.docker.DockerHeader;
+import cn.reghao.autodop.common.deploy.docker.DockerHeader;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.handler.codec.http.*;

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/vc/GitImpl.java → common/src/main/java/cn/reghao/autodop/common/deploy/vc/GitImpl.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.vc;
+package cn.reghao.autodop.common.deploy.vc;
 
 import org.eclipse.jgit.api.CloneCommand;
 import org.eclipse.jgit.api.Git;

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/vc/SvnImpl.java → common/src/main/java/cn/reghao/autodop/common/deploy/vc/SvnImpl.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.vc;
+package cn.reghao.autodop.common.deploy.vc;
 
 import org.tmatesoft.svn.core.SVNDepth;
 import org.tmatesoft.svn.core.SVNException;

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/module/deploy/vc/VersionControl.java → common/src/main/java/cn/reghao/autodop/common/deploy/vc/VersionControl.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.module.deploy.vc;
+package cn.reghao.autodop.common.deploy.vc;
 
 /**
  * 版本控制

+ 1 - 16
common/src/main/java/cn/reghao/autodop/common/grpc/client/GrpcClientProxy.java

@@ -8,7 +8,6 @@ import cn.reghao.autodop.common.grpc.common.serializer.Serializer;
 import cn.reghao.autodop.common.grpc.common.serializer.SerializerType;
 import cn.reghao.autodop.common.grpc.common.serializer.impl.FastJsonSerializerImpl;
 import cn.reghao.autodop.common.grpc.common.utils.SerializerUtil;
-import cn.reghao.autodop.common.grpc.facade.NodeService;
 import cn.reghao.autodop.common.rpc.CommonGrpc;
 import cn.reghao.autodop.common.rpc.CommonGrpcService;
 import com.google.protobuf.ByteString;
@@ -28,7 +27,7 @@ import java.util.concurrent.TimeUnit;
 import static cn.reghao.autodop.common.grpc.common.serializer.SerializerType.FastJson;
 
 /**
- * gRPC 服务客户端代理
+ * gRPC 客户端代理
  *
  * @author reghao
  * @date 2019-12-08 09:31:14
@@ -141,18 +140,4 @@ public class GrpcClientProxy<T> implements InvocationHandler {
             return grpcResponse.getResult();
         }
     }
-
-    public static void main(String[] args) throws Exception {
-        String host = "localhost";
-        int port = 4001;
-
-        NodeService nodeService = (NodeService)new GrpcClientProxy<NodeService>()
-                .getProxy(host, port, NodeService.class);
-
-        int pid = 10101;
-        boolean res = nodeService.kill(pid);
-        if (res) {
-            System.out.println(pid + " has killed");
-        }
-    }
 }

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/grpc/facade/AppService.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.common.grpc.facade;
 
-import cn.reghao.autodop.common.module.deploy.docker.DockerException;
+import cn.reghao.autodop.common.deploy.docker.DockerException;
 import cn.reghao.autodop.common.grpc.common.annotation.GrpcService;
 import cn.reghao.autodop.common.grpc.common.serializer.SerializerType;
 

+ 2 - 2
common/src/main/java/cn/reghao/autodop/common/grpc/facade/DeployService.java

@@ -2,6 +2,7 @@ package cn.reghao.autodop.common.grpc.facade;
 
 import cn.reghao.autodop.common.grpc.common.annotation.GrpcService;
 import cn.reghao.autodop.common.grpc.common.serializer.SerializerType;
+import cn.reghao.autodop.common.result.DeployResult;
 
 /**
  * 部署服务
@@ -11,6 +12,5 @@ import cn.reghao.autodop.common.grpc.common.serializer.SerializerType;
  */
 @GrpcService(service = "deploy", serialization = SerializerType.FastJson)
 public interface DeployService {
-    String deploy(Object object) throws Exception;
-    String deployStatic(Object object) throws Exception;
+    Object deploy(Object object);
 }

+ 26 - 3
common/src/main/java/cn/reghao/autodop/common/http/DefaultWebRequest.java

@@ -1,5 +1,6 @@
 package cn.reghao.autodop.common.http;
 
+import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpStatus;
 import org.apache.http.client.methods.CloseableHttpResponse;
@@ -13,9 +14,7 @@ import org.apache.http.impl.client.HttpClients;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 import java.nio.charset.StandardCharsets;
 
 /**
@@ -91,4 +90,28 @@ public class DefaultWebRequest implements WebRequest {
 
         return null;
     }
+
+    @Override
+    public void download(String url, String filepath) throws IOException {
+        File file = new File(filepath);
+        HttpGet get = new HttpGet(url);
+        CloseableHttpResponse response = client.execute(get);
+        int statusCode = response.getStatusLine().getStatusCode();
+        if (statusCode == 200) {
+            HttpEntity entity = response.getEntity();
+            InputStream in = entity.getContent();
+            saveFile(in, file);
+        }
+    }
+
+    private void saveFile(InputStream in, File file) throws IOException {
+        FileOutputStream fout = new FileOutputStream(file);
+        int i = -1;
+        byte[] tmp = new byte[1024];
+        while ((i = in.read(tmp)) != -1) {
+            fout.write(tmp, 0, i);
+        }
+        fout.flush();
+        fout.close();
+    }
 }

+ 3 - 0
common/src/main/java/cn/reghao/autodop/common/http/WebRequest.java

@@ -1,5 +1,7 @@
 package cn.reghao.autodop.common.http;
 
+import java.io.IOException;
+
 /**
  * HTTP 请求
  *
@@ -9,4 +11,5 @@ package cn.reghao.autodop.common.http;
 public interface WebRequest {
     String get(String url) throws Exception;
     String postJson(String url, String json) throws Exception;
+    void download(String url, String filepath) throws IOException;
 }

+ 0 - 31
common/src/main/java/cn/reghao/autodop/common/module/deploy/DockerDeploy.java

@@ -1,31 +0,0 @@
-package cn.reghao.autodop.common.module.deploy;
-
-import cn.reghao.autodop.common.module.deploy.docker.DockerClient;
-import cn.reghao.autodop.common.result.DeployResult;
-import cn.reghao.autodop.common.result.DeployStage;
-import cn.reghao.autodop.common.result.ResultCode;
-import cn.reghao.autodop.common.module.sys.DeployConfig;
-import cn.reghao.autodop.common.module.sys.entity.Notifier;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 部署 docker 镜像
- *
- * @author reghao
- * @date 2019-10-08 09:57:18
- */
-@Slf4j
-public class DockerDeploy implements Deploy {
-    private DockerClient docker = new DockerClient();
-
-    @Override
-    public int deploy(String appId, String appPath) throws Exception {
-        docker.pull(appPath);
-        //String containerId = docker.run(appId, appPath);
-        /*Thread.sleep(5_000L);
-        if (!docker.isRunning(containerId)) {
-
-        }*/
-        return 0;
-    }
-}

+ 6 - 2
common/src/main/java/cn/reghao/autodop/common/result/DeployResult.java

@@ -1,12 +1,16 @@
 package cn.reghao.autodop.common.result;
 
+import lombok.Data;
+
 /**
  * 部署操作的结果
  *
  * @author reghao
  * @date 2019-10-10 00:51:36
  */
+@Data
 public class DeployResult {
-    int code;
-    String msg;
+    private String host;
+    private int code;
+    private String msg;
 }

+ 19 - 4
common/src/main/java/cn/reghao/autodop/common/utils/JsonUtil.java

@@ -1,9 +1,6 @@
 package cn.reghao.autodop.common.utils;
 
-import com.google.gson.Gson;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
+import com.google.gson.*;
 import com.google.gson.stream.JsonReader;
 import org.apache.commons.io.FileUtils;
 
@@ -67,4 +64,22 @@ public class JsonUtil<T> {
     public static JsonObject jsonObject(String json) {
         return new JsonParser().parse(json).getAsJsonObject();
     }
+
+    public static List<Object> arrayToList(String json, Class clazz) {
+        List<Object> list = new ArrayList<>();
+        Gson gson = new Gson();
+        JsonParser parser = new JsonParser();
+        JsonElement jsonElement = parser.parse(json);
+        if (jsonElement.isJsonArray()) {
+            jsonElement.getAsJsonArray().forEach(jsonElement1 -> {
+                String json1 = jsonElement1.getAsJsonObject().toString();
+                list.add(gson.fromJson(json1, clazz));
+            });
+        } else {
+            String json1 = jsonElement.getAsJsonObject().toString();
+            list.add(gson.fromJson(json1, clazz));
+        }
+
+        return list;
+    }
 }

+ 37 - 0
common/src/main/java/cn/reghao/autodop/common/utils/NetworkUtil.java

@@ -0,0 +1,37 @@
+package cn.reghao.autodop.common.utils;
+
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.util.Enumeration;
+
+/**
+ * @author reghao
+ * @date 2020-03-11 09:12:36
+ */
+public class NetworkUtil {
+    public static String hostAddress(String prefix) {
+        try {
+            Enumeration<NetworkInterface> ifaces = NetworkInterface.getNetworkInterfaces();
+            // 遍历接口
+            while (ifaces.hasMoreElements()) {
+                NetworkInterface iface = ifaces.nextElement();
+                Enumeration<InetAddress> addresses = iface.getInetAddresses();
+                // 遍历接口上的地址
+                while (addresses.hasMoreElements()) {
+                    InetAddress inetAddress = addresses.nextElement();
+                    if (!inetAddress.isLoopbackAddress()) {
+                        if (inetAddress.isSiteLocalAddress()) {
+                            if (inetAddress.getHostAddress().startsWith(prefix)) {
+                                return inetAddress.getHostAddress();
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+}

+ 45 - 21
common/src/main/java/cn/reghao/autodop/common/utils/compression/ZipUtil.java

@@ -4,8 +4,8 @@ import cn.reghao.autodop.common.utils.FileUtil;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.*;
-import java.time.LocalDate;
 import java.util.Arrays;
+import java.util.Objects;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 import java.util.zip.ZipInputStream;
@@ -20,23 +20,17 @@ import java.util.zip.ZipOutputStream;
 @Slf4j
 public class ZipUtil {
     /**
-     * 压缩
+     * 将目录压缩为一个文件
      *
      * @param
-     * @return
      * @date 2019-08-28 上午12:42
      */
-    public static String zip(String src, String dst) throws IOException {
+    public static void zip(String src, String dst) throws IOException {
         // TODO: 判断 dst 是否为 src 的子目录
-        if (false) {
-            log.info("{} 是 {} 的子目录...", dst, src);
-            return null;
-        }
-
         File srcFile = new File(src);
         if (!srcFile.exists()) {
             log.info("{} 不存在...", src);
-            return null;
+            return;
         }
 
         String filePath;
@@ -45,17 +39,46 @@ public class ZipUtil {
         } else {
             filePath = dst + ".zip";
         }
+
         File dstFile = new File(filePath);
         if (dstFile.exists() && !dstFile.delete()) {
             log.info("删除 {} 失败...", dst);
-            return null;
+            return;
         }
 
         ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(dstFile));
         zipFile(null, srcFile, zipOut);
         zipOut.close();
+    }
 
-        return filePath;
+    /**
+     * 将目录中的文件压缩为一个文件
+     *
+     * @param
+     * @return
+     * @date 2020-03-11 下午11:12
+     */
+    public static void zip(File src, String dst) throws IOException {
+        // TODO: 判断 dst 是否为 src 的子目录
+        String filePath;
+        if (dst.endsWith(".zip")) {
+            filePath = dst;
+        } else {
+            filePath = dst + ".zip";
+        }
+
+        File dstFile = new File(filePath);
+        if (dstFile.exists() && !dstFile.delete()) {
+            log.info("删除 {} 失败...", dst);
+            return;
+        }
+
+        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(dstFile));
+        for (File file : Objects.requireNonNull(src.listFiles())) {
+            zipFile(null, file, zipOut);
+        }
+
+        zipOut.close();
     }
 
     /**
@@ -85,7 +108,7 @@ public class ZipUtil {
                     zipOut.write(tmp);
                 }
                 in.close();
-            } else if (file.isDirectory() && file.listFiles().length == 0) {
+            } else if (file.isDirectory() && Objects.requireNonNull(file.listFiles()).length == 0) {
                 if (srcRoot == null) {
                     zipOut.putNextEntry(new ZipEntry(file.getName() + File.separator));
                 } else {
@@ -93,6 +116,7 @@ public class ZipUtil {
                 }
             } else {
                 File[] files = file.listFiles();
+                assert files != null;
                 Arrays.asList(files).forEach(file1 -> {
                     if (srcRoot == null) {
                         zipFile(file.getName(), file1, zipOut);
@@ -107,17 +131,17 @@ public class ZipUtil {
     }
 
     /**
-     * 解压
+     * 解压到指定目录
      *
      * @param
      * @return
      * @date 2019-08-28 上午12:41
      */
-    public static boolean unzip(String src, String dst) throws IOException {
+    public static void unzip(String src, String dst) throws IOException {
         File file = new File(src);
         if (!file.exists()) {
             log.info("{} 不存在...", src);
-            return false;
+            return;
         }
 
         File dstFile = new File(dst);
@@ -148,13 +172,13 @@ public class ZipUtil {
                 out.close();
             }
         }
-
-        return true;
     }
 
     public static void main(String[] args) throws IOException {
-        String src = "/home/reghao/tmp/opt/webroot/iquizooFrontEnd";
-        String dst = "/home/reghao/tmp/opt/webroot/iquizooFrontEnd" + "-" + LocalDate.now().toString();
-        ZipUtil.zip(src, dst);
+        String src = "/home/reghao/tmp/autodop/opt/data/compile-dir/jigou-mgr/ant-design-pro/dist-test";
+        String zip = "/home/reghao/tmp/autodop/opt/webroot/jigou-mgr/jigou-mgr_526_2020-03-12.zip";
+        String dir = "/home/reghao/tmp/autodop/opt/webroot/jigou-mgr/app";
+        ZipUtil.zip(new File(src), zip);
+        ZipUtil.unzip(zip, dir);
     }
 }

+ 8 - 11
dagent/src/main/java/cn/reghao/autodop/dagent/DagentApplication.java

@@ -1,25 +1,22 @@
 package cn.reghao.autodop.dagent;
 
-import cn.reghao.autodop.dagent.utils.BeforeShutdown;
+import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.domain.EntityScan;
-import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
-import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 
 @SpringBootApplication
 @ComponentScan(basePackages={"cn.reghao.autodop.common", "cn.reghao.autodop.dagent"})
-@EnableJpaRepositories("cn.reghao.autodop.common")
-@EntityScan({"cn.reghao.autodop.common"})
-public class DagentApplication {
+public class DagentApplication implements CommandLineRunner {
 	public static void main(String[] args) {
 		SpringApplication.run(DagentApplication.class, args);
 	}
 
-	@Bean
+	@Override
+	public void run(String... args) throws Exception {
+	}
+
+	/*@Bean
 	public BeforeShutdown shutdownGracefully() {
 		return new BeforeShutdown(30);
 	}
@@ -29,5 +26,5 @@ public class DagentApplication {
 		TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
 		factory.addConnectorCustomizers(beforeShutdown);
 		return factory;
-	}
+	}*/
 }

+ 23 - 19
dagent/src/main/java/cn/reghao/autodop/dagent/service/DeployServiceImpl.java

@@ -1,12 +1,12 @@
 package cn.reghao.autodop.dagent.service;
 
+import cn.reghao.autodop.common.config.BuildDeployResult;
 import cn.reghao.autodop.common.config.DeployConfig;
-import cn.reghao.autodop.common.module.deploy.Deploy;
-import cn.reghao.autodop.common.module.deploy.DockerDeploy;
-import cn.reghao.autodop.common.module.deploy.StaticDeploy;
+import cn.reghao.autodop.common.deploy.Deploy;
+import cn.reghao.autodop.common.deploy.DockerDeploy;
+import cn.reghao.autodop.common.deploy.ZipDeploy;
 import cn.reghao.autodop.common.grpc.facade.DeployService;
-import cn.reghao.autodop.common.result.DeployResult;
-import cn.reghao.autodop.common.module.sys.entity.AppConfig;
+import cn.reghao.autodop.common.utils.NetworkUtil;
 import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -18,32 +18,36 @@ import org.springframework.stereotype.Service;
 @Slf4j
 @Service
 public class DeployServiceImpl implements DeployService {
-    private StaticDeploy deployStatic = new StaticDeploy();
-    private Deploy deployApp = new DockerDeploy();
-
     public DeployServiceImpl() {
     }
 
     @Override
-    public String deploy(Object object) throws Exception {
+    public BuildDeployResult deploy(Object object) {
         JSONObject jsonObject = (JSONObject) object;
         DeployConfig deployConfig = jsonObject.toJavaObject(DeployConfig.class);
 
         String appId = deployConfig.getAppId();
         String appPath = deployConfig.getAppPath();
+        String runningDir = deployConfig.getRunningDir();
         String packerType = deployConfig.getPackerType();
+
+        BuildDeployResult result;
         if ("docker".equalsIgnoreCase(packerType)) {
-            deployApp.deploy(appId, appPath);
+            Deploy deployApp = new DockerDeploy();
+            result = deployApp.deploy(appId, appPath, null);
+        } else if ("zip".equalsIgnoreCase(packerType)) {
+            Deploy deployApp = new ZipDeploy();
+            result = deployApp.deploy(appId, appPath, runningDir);
+        } else {
+            result = new BuildDeployResult();
+            result.setAppId(appId);
+            result.setStage("部署");
+            result.setMsg("打包类型不正确");
         }
 
-        return null;
-    }
-
-    @Override
-    public String deployStatic(Object object) throws Exception {
-        JSONObject jsonObject = (JSONObject) object;
-        AppConfig appConfig = jsonObject.toJavaObject(AppConfig.class);
-        DeployResult result = deployStatic.deploy(appConfig);
-        return null;
+        // TODO 指定主机 IP 地址的前缀,后期通过配置指定,不动态获取
+        result.setAppPath(appPath);
+        result.setHost(NetworkUtil.hostAddress("192.168"));
+        return result;
     }
 }

+ 2 - 2
dagent/src/main/java/cn/reghao/autodop/dagent/service/DockerAppServiceImpl.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.dagent.service;
 
-import cn.reghao.autodop.common.module.deploy.docker.DockerClient;
-import cn.reghao.autodop.common.module.deploy.docker.DockerException;
+import cn.reghao.autodop.common.deploy.docker.DockerClient;
+import cn.reghao.autodop.common.deploy.docker.DockerException;
 import cn.reghao.autodop.common.grpc.facade.AppService;
 import org.springframework.stereotype.Service;
 

+ 0 - 0
dagent/src/main/resources/application-dev.yml


+ 0 - 0
dagent/src/main/resources/application-prod.yml


+ 0 - 0
dagent/src/main/resources/application-test.yml


+ 26 - 19
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildController.java

@@ -1,19 +1,23 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
-import cn.reghao.autodop.common.result.ResultCode;
+import cn.reghao.autodop.common.config.BuildDeployResult;
 import cn.reghao.autodop.common.result.WebResult;
 import cn.reghao.autodop.dmaster.app.service.build.AppDeploy;
-import cn.reghao.autodop.dmaster.app.service.build.Builder;
+import cn.reghao.autodop.dmaster.app.service.build.BuildDispatcher;
+import cn.reghao.autodop.dmaster.orchestrate.pojo.SysConfig;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.util.StopWatch;
+import org.springframework.core.io.Resource;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -25,12 +29,10 @@ import java.util.Set;
 @RestController
 @RequestMapping("/api/app")
 public class BuildController {
-    private Builder builder;
-    private AppDeploy appDeploy;
+    private BuildDispatcher buildDispatcher;
 
-    public BuildController(Builder builder, AppDeploy appDeploy) {
-        this.builder = builder;
-        this.appDeploy = appDeploy;
+    public BuildController(BuildDispatcher buildDispatcher) {
+        this.buildDispatcher = buildDispatcher;
     }
 
     @ApiOperation(value = "构建应用")
@@ -41,14 +43,13 @@ public class BuildController {
     @PostMapping("/build/{appId}")
     public String buildApp(@PathVariable("appId") String appId) throws Exception {
         Set<String> apps = checkArgs(appId);
-        String result;
+        List<BuildDeployResult> results;
         if (apps.size() == 0) {
-            result = "ok";
+            return new WebResult<String>().jsonResult("ok");
         } else {
-            result = builder.dispatch(apps, false);
+            results = buildDispatcher.dispatch(apps, false);
+            return new WebResult<List>().jsonResult(results);
         }
-
-        return new WebResult<String>(ResultCode.SUCCESS).jsonResult(result);
     }
 
     @ApiOperation(value = "构建部署应用")
@@ -59,14 +60,13 @@ public class BuildController {
     @PostMapping("/deploy/{appId}")
     public String buildAndDeploy(@PathVariable("appId") String appId) throws Exception {
         Set<String> apps = checkArgs(appId);
-        String result;
+        List<BuildDeployResult> results;
         if (apps.size() == 0) {
-            result = "ok";
+            return new WebResult<String>().jsonResult("ok");
         } else {
-            result = builder.dispatch(apps, true);
+            results = buildDispatcher.dispatch(apps, true);
+            return new WebResult<List>().jsonResult(results);
         }
-
-        return result;
     }
 
     @ApiOperation(value = "部署应用")
@@ -87,7 +87,14 @@ public class BuildController {
     )
     @PostMapping("/deploy/static/{appId}")
     public String deployStatic(@PathVariable("appId") String appId) throws Exception {
-        return null;
+        Set<String> apps = checkArgs(appId);
+        List<BuildDeployResult> results;
+        if (apps.size() == 0) {
+            return new WebResult<String>().jsonResult("ok");
+        } else {
+            results = buildDispatcher.dispatch(apps, false);
+            return new WebResult<List>().jsonResult(results);
+        }
     }
 
     @ApiOperation(value = "部署 OSS 资源")

+ 65 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/FileController.java

@@ -0,0 +1,65 @@
+package cn.reghao.autodop.dmaster.app.controller;
+
+import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.common.utils.spring.SpringBootUtil;
+import cn.reghao.autodop.dmaster.orchestrate.pojo.SysConfig;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+
+/**
+ * @author reghao
+ * @date 2020-03-11 16:10:16
+ */
+@Slf4j
+@Api(tags = "文件上传/下载接口")
+@RestController
+@RequestMapping("/api/app")
+public class FileController {
+    @ApiOperation(value = "下载文件")
+    @ApiImplicitParams(
+            @ApiImplicitParam(name="oss_path", value="OSS 中的路径", paramType="query", dataType = "String")
+    )
+    @GetMapping("/file/dl/{filename}")
+    public String download(@PathVariable("filename") String filename, HttpServletResponse response) throws IOException {
+        String filepath = SysConfig.packDir + "/" + filename;
+        File file = new File(filepath);
+        if (file.exists()) {
+            response.setHeader("content-type", "application/octet-stream");
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition",
+                    "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
+
+            byte[] buffer = new byte[1024];
+            FileInputStream fis = new FileInputStream(file);
+            BufferedInputStream bis = new BufferedInputStream(fis);
+            OutputStream os = response.getOutputStream();
+            int i = bis.read(buffer);
+            while (i != -1) {
+                os.write(buffer, 0, i);
+                i = bis.read(buffer);
+            }
+
+            return new WebResult<String>().jsonResult("文件已下载");
+        }
+
+        return new WebResult<String>().jsonResult("文件不存在");
+    }
+
+    @ApiOperation(value = "上传文件")
+    @PostMapping("/file/upload")
+    public String ossUpload(@RequestParam("file") MultipartFile file) {
+        String filename = file.getOriginalFilename();
+        String filePath = SpringBootUtil.saveFile(file, "/tmp");
+
+        return filePath;
+    }
+}

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppManager.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.service;
 
-import cn.reghao.autodop.common.module.deploy.docker.DockerException;
+import cn.reghao.autodop.common.deploy.docker.DockerException;
 import cn.reghao.autodop.common.grpc.client.GrpcClientProxy;
 import cn.reghao.autodop.common.grpc.facade.AppService;
 import org.springframework.stereotype.Service;

+ 41 - 33
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppBuildPipeline.java

@@ -1,12 +1,14 @@
 package cn.reghao.autodop.dmaster.app.service.build;
 
-import cn.reghao.autodop.dmaster.app.pojo.BuildResult;
+import cn.reghao.autodop.common.config.BuildDeployResult;
+import cn.reghao.autodop.common.utils.JsonUtil;
 import cn.reghao.autodop.dmaster.orchestrate.pojo.SysConfig;
 import cn.reghao.autodop.dmaster.orchestrate.pojo.orchestration.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.service.build.tools.vc.VersionControl;
 import cn.reghao.autodop.dmaster.utils.ProxyUtils;
 import lombok.extern.slf4j.Slf4j;
 
+import java.util.List;
 import java.util.concurrent.Callable;
 
 /**
@@ -16,16 +18,16 @@ import java.util.concurrent.Callable;
  * @date 2019-11-16 21:39:53
  */
 @Slf4j
-public class AppBuildPipeline implements Callable<BuildResult> {
+public class AppBuildPipeline implements Callable<String> {
     private AppOrchestration app;
-    private long version;
+    private String version;
     private boolean isDeploy;
     private AppIntegrate appIntegrate;
 
     private final String appLocalRepo;
     private final String appCompileDir;
 
-    public AppBuildPipeline(AppOrchestration app, long version, boolean isDeploy) {
+    public AppBuildPipeline(AppOrchestration app, String version, boolean isDeploy) {
         this.app = app;
         this.version = version;
         this.isDeploy = isDeploy;
@@ -41,25 +43,26 @@ public class AppBuildPipeline implements Callable<BuildResult> {
      * 更新 -> 编译 -> 打包 -> 部署流水线
      *
      * @param
-     * @return
+     * @return 返回 JSON
      * @date 2019-11-07 下午10:14
      */
     @Override
-    public BuildResult call() {
-        BuildResult buildResult = new BuildResult();
-        buildResult.setAppId(app.getIdentifier());
+    public String call() {
+        BuildDeployResult result = new BuildDeployResult();
+        result.setAppId(app.getIdentifier());
         /* 更新阶段 */
-        if (version == -1 ) {
+        if (version == null ) {
             try {
                 version = updateApp();
                 BuilderUtil.copyToCompileDir(appLocalRepo, app);
             } catch (Exception e) {
                 e.printStackTrace();
-                buildResult.setMsg(e.getMessage());
-                return buildResult;
+                result.setStage("更新");
+                result.setMsg(e.getMessage());
+                return JsonUtil.objectToJson(result);
             }
         }
-        buildResult.setVersioin(version);
+        result.setVersion(version);
 
         String appEntryDir;
         if (app.getProjBuild() != null) {
@@ -70,14 +73,15 @@ public class AppBuildPipeline implements Callable<BuildResult> {
 
         try {
             /* 编译阶段 */
-            if ("dotnet".equals(app.getBuild().getCodeCompiler().getCompilerType())) {
-                appIntegrate.preCompile(app.getConfigFiles(), appEntryDir);
+            if (appIntegrate.needPreCompile()) {
+                appIntegrate.preCompile(appEntryDir);
             }
             appIntegrate.compile(appEntryDir);
         } catch (Exception e) {
             e.printStackTrace();
-            buildResult.setMsg(e.getMessage());
-            return buildResult;
+            result.setStage("编译");
+            result.setMsg(e.getMessage());
+            return JsonUtil.objectToJson(result);
         }
 
         /* 打包阶段 */
@@ -86,35 +90,39 @@ public class AppBuildPipeline implements Callable<BuildResult> {
             appPath = appIntegrate.pack(app.getIdentifier(), String.valueOf(version), appEntryDir);
         } catch (Exception e) {
             e.printStackTrace();
-            buildResult.setMsg(e.getMessage());
-            return buildResult;
+            result.setStage("打包");
+            result.setMsg(e.getMessage());
+            return JsonUtil.objectToJson(result);
         }
-        buildResult.setAppPath(appPath);
+        result.setAppPath(appPath);
 
         /* 部署阶段 */
         if (isDeploy) {
-            try {
-                AppDeploy.deploy(app, appPath);
-            } catch (Exception e) {
-                e.printStackTrace();
-                buildResult.setMsg(e.getMessage());
-                return buildResult;
-            }
+            List<BuildDeployResult> results = AppDeploy.deploy(app, appPath);
+            results.forEach(res -> {
+                if ("成功".equalsIgnoreCase(res.getMsg())) {
+                    // TODO 发出通知
+                }
+            });
+
+            return JsonUtil.objectToJson(results);
         }
 
-        return buildResult;
+        return JsonUtil.objectToJson(result);
     }
 
-    private long updateApp() throws Exception {
+    private String updateApp() throws Exception {
         String remoteRepo = app.getBuild().getCodeRepos().getReposUrl();
         VersionControl vc = BuilderUtil.versionControl(app.getBuild().getCodeRepos().getReposAuth());
-        long version = vc.update(remoteRepo, appLocalRepo + BuilderUtil.dirname(remoteRepo));
+        String version = vc.update(remoteRepo, appLocalRepo + BuilderUtil.dirname(remoteRepo));
 
-        String[] dependencyRepos = app.getBuild().getCodeRepos().getDependencyUrls().split(",");
-        for (String repo : dependencyRepos) {
-            vc.update(repo, appLocalRepo + BuilderUtil.dirname(repo));
+        String dep = app.getBuild().getCodeRepos().getDependencyUrls();
+        if (dep != null) {
+            String[] dependencyRepos = dep.split(",");
+            for (String repo : dependencyRepos) {
+                vc.update(repo, appLocalRepo + BuilderUtil.dirname(repo));
+            }
         }
-
         return version;
     }
 }

+ 13 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppDeploy.java

@@ -1,15 +1,16 @@
 package cn.reghao.autodop.dmaster.app.service.build;
 
+import cn.reghao.autodop.common.config.BuildDeployResult;
 import cn.reghao.autodop.common.grpc.client.GrpcClientProxy;
 import cn.reghao.autodop.common.grpc.facade.DeployService;
 import cn.reghao.autodop.common.config.DeployConfig;
 import cn.reghao.autodop.dmaster.orchestrate.pojo.orchestration.AppOrchestration;
+import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
 
 /**
  * 部署应用
@@ -20,28 +21,29 @@ import java.util.Set;
 @Slf4j
 @Service
 public class AppDeploy {
-    private static final int grpcPort = 4001;
+    private static final int GRPC_PORT = 4001;
 
-    public static String deploy(AppOrchestration app, String appPath) throws Exception {
+    public static List<BuildDeployResult> deploy(AppOrchestration app, String appPath) {
         DeployConfig deployConfig = new DeployConfig();
         deployConfig.setAppId(app.getIdentifier());
         deployConfig.setAppPath(appPath);
         deployConfig.setPackerType(app.getBuild().getAppPacker().getPackerType());
         deployConfig.setRunningDir(app.getRunning().getRunningDir());
 
+        List<BuildDeployResult> results = new ArrayList<>();
         String[] hosts = app.getDeploy().getHosts().split(",");
+        // TODO 异步调用
         for (String host : hosts) {
+            // TODO 公共网络下,gRPC 调用需要经过认证
             DeployService deployService = (DeployService)new GrpcClientProxy<DeployService>()
-                    .getProxy(host, grpcPort, DeployService.class);
+                    .getProxy(host, GRPC_PORT, DeployService.class);
 
-            deployService.deploy(deployConfig);
+            Object object = deployService.deploy(deployConfig);
+            JSONObject jsonObject = (JSONObject) object;
+            BuildDeployResult result = jsonObject.toJavaObject(BuildDeployResult.class);
+            results.add(result);
         }
 
-        //return deployService.deploy(deployConfig);
-        return null;
-    }
-
-    public static String deployStatic(Set<String> appIds) throws Exception {
-        return null;
+        return results;
     }
 }

+ 19 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppIntegrate.java

@@ -1,16 +1,16 @@
 package cn.reghao.autodop.dmaster.app.service.build;
 
 import cn.reghao.autodop.dmaster.app.service.build.tools.compiler.*;
+import cn.reghao.autodop.dmaster.app.service.build.tools.packer.DnktZipTarPack;
 import cn.reghao.autodop.dmaster.app.service.build.tools.packer.DockerPack;
 import cn.reghao.autodop.dmaster.app.service.build.tools.packer.PackApp;
+import cn.reghao.autodop.dmaster.app.service.build.tools.packer.ZipPack;
 import cn.reghao.autodop.dmaster.orchestrate.pojo.build.AppBuild;
 import cn.reghao.autodop.dmaster.orchestrate.pojo.build.AppPacker;
 import cn.reghao.autodop.dmaster.orchestrate.pojo.build.CodeCompiler;
 import cn.reghao.autodop.dmaster.orchestrate.pojo.orchestration.AppOrchestration;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.Map;
-
 /**
  * 应用集成,根据 AppOrchestration 中的值完成编译,打包,部署的配置
  *
@@ -48,6 +48,9 @@ public class AppIntegrate {
             compileCode = new ShellCompile(compiler.getScript());
         } else if ("maven".equals(compiler.getCompilerType())) {
             compileCode = new Maven();
+        } else if ("static".equals(compiler.getCompilerType())) {
+            compileCode = new NullCompile();
+            log.warn("静态应用,不需要编译器");
         } else {
             //throw new Exception("");
             log.error("没有编译器");
@@ -59,16 +62,28 @@ public class AppIntegrate {
             packApp = new DockerPack(appRootPath);
         } else if ("maven".equals(packer.getPackerType())) {
 
+        } else if ("zip".equals(packer.getPackerType())) {
+            packApp = new ZipPack();
+        }
+
+        // TODO 特定于 dnkt-mgr 应用
+        if (app.getIdentifier().startsWith("dnkt-mgr")) {
+            preCompile = new DnktMgrPreCompile();
+            packApp = new DnktZipTarPack();
         }
     }
 
+    public boolean needPreCompile() {
+        return preCompile != null;
+    }
+
     /**
      * 编译源码前的操作(一般是调整配置)
      *
      * @date 2019-11-07 下午2:03
      */
-    public void preCompile(Map<String, String> configFiles, String appEntryDir) throws Exception {
-        preCompile.preCompile(configFiles, appEntryDir);
+    public void preCompile(String appEntryDir) throws Exception {
+        preCompile.preCompile(app, appEntryDir);
     }
 
     /**

+ 22 - 20
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/Builder.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/BuildDispatcher.java

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.app.service.build;
 
-import cn.reghao.autodop.dmaster.app.pojo.BuildResult;
+import cn.reghao.autodop.common.config.BuildDeployResult;
+import cn.reghao.autodop.common.utils.JsonUtil;
 import cn.reghao.autodop.dmaster.orchestrate.caching.OrchestrationCaching;
 import cn.reghao.autodop.dmaster.orchestrate.pojo.build.AppBuild;
 import cn.reghao.autodop.dmaster.orchestrate.pojo.build.CodeRepos;
@@ -20,11 +21,11 @@ import java.util.concurrent.*;
  */
 @Slf4j
 @Service
-public class Builder {
+public class BuildDispatcher {
     private final String STANDALONE_APP = "standaloneApp";
     private OrchestrationCaching caching;
 
-    public Builder(OrchestrationCaching caching) {
+    public BuildDispatcher(OrchestrationCaching caching) {
         this.caching = caching;
     }
 
@@ -35,8 +36,8 @@ public class Builder {
      * @return
      * @date 2019-11-12 上午9:48
      */
-    public String dispatch(Set<String> appIds, boolean isDeploy) throws Exception {
-        List<BuildResult> results = new ArrayList<>();
+    public List<BuildDeployResult> dispatch(Set<String> appIds, boolean isDeploy) throws Exception {
+        List<BuildDeployResult> results = new ArrayList<>();
         List<AppOrchestration> existApps = new ArrayList<>();
         // 分离出存在的应用和不存在的应用
         if (appIds.remove("all")) {
@@ -48,17 +49,16 @@ public class Builder {
                 if (app != null) {
                     existApps.add(app);
                 } else {
-                    results.add(new BuildResult(appId, "应用不存在"));
+                    results.add(new BuildDeployResult(appId, "初始化", "应用不存在"));
                 }
             });
         }
 
-        // TODO 拆分为异步任务,等待所有任务完成后返回
-        List<Future<List<ProjectUpdateTask.AppVersion>>> projFutures = new ArrayList<>();
-        List<Future<BuildResult>> appFutures = new ArrayList<>();
-        ExecutorService threadPool = ThreadPoolWrapper.threadPool("dispatcher");
         // TODO 若应用当前正在进行构建,则忽略
         Map<String, List<AppOrchestration>> appsByProj = filterByProj(existApps);
+        List<Future<List<ProjectUpdateTask.AppVersion>>> projFutures = new ArrayList<>();
+        List<Future<String>> appFutures = new ArrayList<>();
+        ExecutorService threadPool = ThreadPoolWrapper.threadPool("dispatcher");
         for (Map.Entry<String, List<AppOrchestration>> entry : appsByProj.entrySet()) {
             String key = entry.getKey();
             List<AppOrchestration> apps = entry.getValue();
@@ -69,7 +69,7 @@ public class Builder {
             } else {
                 // 更新,编译,打包独立的应用
                 apps.forEach(app -> {
-                    appFutures.add(threadPool.submit(new AppBuildPipeline(app, -1, isDeploy)));
+                    appFutures.add(threadPool.submit(new AppBuildPipeline(app, null, isDeploy)));
                 });
             }
         }
@@ -91,11 +91,11 @@ public class Builder {
                         appFutures.add(threadPool.submit(
                                 new AppBuildPipeline(appVersion.getApp(), appVersion.getVersion(), isDeploy)));
                     } else {
-                        BuildResult buildResult = new BuildResult();
-                        buildResult.setAppId(appVersion.getApp().getIdentifier());
-                        buildResult.setVersioin(appVersion.getVersion());
-                        buildResult.setMsg("应用不需要更新");
-                        results.add(buildResult);
+                        BuildDeployResult buildDeployResult = new BuildDeployResult();
+                        buildDeployResult.setAppId(appVersion.getApp().getIdentifier());
+                        buildDeployResult.setVersion(appVersion.getVersion());
+                        buildDeployResult.setMsg("应用不需要更新");
+                        results.add(buildDeployResult);
                     }
                 });
             }
@@ -103,18 +103,20 @@ public class Builder {
         }
 
         // 等待所有正在构建的应用
-        Iterator<Future<BuildResult>> iterator1 = appFutures.iterator();
+        Iterator<Future<String>> iterator1 = appFutures.iterator();
         while (iterator1.hasNext()) {
-            Future<BuildResult> future = iterator1.next();
+            Future<String> future = iterator1.next();
             while (!future.isDone() && !future.isCancelled()) {
                 Thread.sleep(1_000);
             }
 
-            results.add(future.get());
+            JsonUtil.arrayToList(future.get(), BuildDeployResult.class).forEach(obj -> {
+                results.add((BuildDeployResult) obj);
+            });
             iterator1.remove();
         }
 
-        return results.toString();
+        return results;
     }
 
     /**

+ 10 - 10
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/ProjectUpdateTask.java

@@ -40,9 +40,9 @@ public class ProjectUpdateTask implements Callable<List<ProjectUpdateTask.AppVer
     @Override
     public List<AppVersion> call() {
         try {
-            Map<AppOrchestration, Long> current = checkAppVersion();
+            Map<AppOrchestration, String> current = checkAppVersion();
             updateProject();
-            Map<AppOrchestration, Long> updated = checkAppVersion();
+            Map<AppOrchestration, String> updated = checkAppVersion();
             return compareAppVersion(current, updated);
         } catch (Exception e) {
             e.printStackTrace();
@@ -69,24 +69,24 @@ public class ProjectUpdateTask implements Callable<List<ProjectUpdateTask.AppVer
      * @return map 中只有两个元素,update 对应需要更新的应用及其版本,notUpdate 对应不需要更新的应用及其版本
      * @date 2020-01-20 下午10:06
      */
-    private Map<AppOrchestration, Long> checkAppVersion() throws Exception {
-        Map<AppOrchestration, Long> map = new HashMap<>();
+    private Map<AppOrchestration, String> checkAppVersion() throws Exception {
+        Map<AppOrchestration, String> map = new HashMap<>();
         for (AppOrchestration app : apps) {
             String appLocalRepos = localRepos + "/" + proj.getIdentifier() + app.getProjBuild().getAppReposUrl();
-            long version = vc.localVersion(appLocalRepos);
+            String version = vc.localVersion(appLocalRepos);
             map.put(app, version);
         }
 
         return map;
     }
 
-    private List<AppVersion> compareAppVersion(Map<AppOrchestration, Long> current,
-                                               Map<AppOrchestration, Long> updated) {
+    private List<AppVersion> compareAppVersion(Map<AppOrchestration, String> current,
+                                               Map<AppOrchestration, String> updated) {
         List<AppVersion> list = new ArrayList<>();
         current.forEach((app, version) -> {
-            long version1 = updated.get(app);
+            String version1 = updated.get(app);
             // 无论代码是否更新,都要构建
-            if (version1 >= version) {
+            if (Long.parseLong(version1) >= Long.parseLong(version)) {
                 list.add(new AppVersion(app, version, true));
                 String appLocalRepos = localRepos + "/" + proj.getIdentifier();
                 // TODO 抛出异常
@@ -107,7 +107,7 @@ public class ProjectUpdateTask implements Callable<List<ProjectUpdateTask.AppVer
     @AllArgsConstructor
     static class AppVersion {
         private AppOrchestration app;
-        private long version;
+        private String version;
         private boolean isUpdated;
     }
 }

+ 27 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/compiler/DnktMgrPreCompile.java

@@ -0,0 +1,27 @@
+package cn.reghao.autodop.dmaster.app.service.build.tools.compiler;
+
+import cn.reghao.autodop.common.utils.FileUtil;
+import cn.reghao.autodop.dmaster.orchestrate.pojo.orchestration.AppOrchestration;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+
+/**
+ * @author reghao
+ * @date 2020-01-21 17:01:32
+ */
+@Slf4j
+public class DnktMgrPreCompile implements PreCompile {
+    @Override
+    public void preCompile(AppOrchestration app, String appEntryDir) throws IOException {
+        String env = app.getEnv();
+        String configFile = appEntryDir + "/src/config.js";
+        String oidcconfigFile = appEntryDir + "/src/controller/oidcconfig.js";
+
+        if ("dev".equalsIgnoreCase(env)) {
+            return;
+        }
+        FileUtil.copyFile(configFile + "." + env, configFile);
+        FileUtil.copyFile(oidcconfigFile + "." + env, oidcconfigFile);
+    }
+}

+ 3 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/compiler/DotnetPreCompile.java

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.app.service.build.tools.compiler;
 
 import cn.reghao.autodop.common.utils.FileUtil;
+import cn.reghao.autodop.dmaster.orchestrate.pojo.orchestration.AppOrchestration;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.IOException;
@@ -13,7 +14,8 @@ import java.util.Map;
 @Slf4j
 public class DotnetPreCompile implements PreCompile {
     @Override
-    public void preCompile(Map<String, String> configFiles, String appEntryDir) throws IOException {
+    public void preCompile(AppOrchestration app, String appEntryDir) throws IOException {
+        Map<String, String> configFiles = app.getConfigFiles();
         for (Map.Entry<String, String> entry : configFiles.entrySet()) {
             String filepath = appEntryDir + "/" + entry.getKey();
             String filecontent = entry.getValue();

+ 13 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/compiler/NullCompile.java

@@ -0,0 +1,13 @@
+package cn.reghao.autodop.dmaster.app.service.build.tools.compiler;
+
+/**
+ * 编译代码
+ *
+ * @author reghao
+ * @date 2019-10-12 23:55:01
+ */
+public class NullCompile implements CompileCode {
+    @Override
+    public void compile(String dir) throws Exception {
+    }
+}

+ 3 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/compiler/PreCompile.java

@@ -1,5 +1,7 @@
 package cn.reghao.autodop.dmaster.app.service.build.tools.compiler;
 
+import cn.reghao.autodop.dmaster.orchestrate.pojo.orchestration.AppOrchestration;
+
 import java.io.IOException;
 import java.util.Map;
 
@@ -8,5 +10,5 @@ import java.util.Map;
  * @date 2020-01-21 17:00:41
  */
 public interface PreCompile {
-    void preCompile(Map<String, String> configFiles, String appEntryDir) throws IOException;
+    void preCompile(AppOrchestration app, String appEntryDir) throws IOException;
 }

+ 37 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/packer/DnktZipTarPack.java

@@ -0,0 +1,37 @@
+package cn.reghao.autodop.dmaster.app.service.build.tools.packer;
+
+import cn.reghao.autodop.common.utils.FileUtil;
+import cn.reghao.autodop.common.utils.compression.TarUtil;
+import cn.reghao.autodop.common.utils.compression.ZipUtil;
+import cn.reghao.autodop.dmaster.orchestrate.pojo.SysConfig;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.File;
+import java.time.LocalDate;
+
+/**
+ * @author reghao
+ * @date 2020-03-11 13:37:36
+ */
+@Slf4j
+public class DnktZipTarPack implements PackApp {
+    @Override
+    public String pack(String appId, String version, String appEntryDir) throws Exception {
+        String tag = appId + "_" + version + "_" + LocalDate.now().toString();
+        String dst = SysConfig.packDir + "/" + tag;
+        if (new File(dst).exists()) {
+            return tag;
+        }
+
+        String src = appEntryDir + "/src";
+        String start = appEntryDir + "/start";
+        String app = appEntryDir + "/app";
+        FileUtil.mkdir(app);
+        FileUtil.mvDir(src, app);
+        FileUtil.mvDir(start, app);
+
+        ZipUtil.zip(new File(appEntryDir), dst);
+
+        return tag;
+    }
+}

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

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.service.build.tools.packer;
 
-import cn.reghao.autodop.common.module.deploy.docker.DockerClient;
+import cn.reghao.autodop.common.deploy.docker.DockerClient;
 
 import java.time.LocalDate;
 

+ 28 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/packer/ZipPack.java

@@ -0,0 +1,28 @@
+package cn.reghao.autodop.dmaster.app.service.build.tools.packer;
+
+import cn.reghao.autodop.common.utils.compression.ZipUtil;
+import cn.reghao.autodop.dmaster.orchestrate.pojo.SysConfig;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.File;
+import java.time.LocalDate;
+
+/**
+ * @author reghao
+ * @date 2020-03-11 13:37:36
+ */
+@Slf4j
+public class ZipPack implements PackApp {
+    private final String SUFFIX = ".zip";
+
+    @Override
+    public String pack(String appId, String version, String appEntryDir) throws Exception {
+        String tag = appId + "_" + version + "_" + LocalDate.now().toString() + SUFFIX;
+        String dst = SysConfig.packDir + "/" + tag;
+        if (new File(dst).exists()) {
+            return tag;
+        }
+        ZipUtil.zip(new File(appEntryDir), dst);
+        return tag;
+    }
+}

+ 29 - 22
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/vc/GitImpl.java

@@ -2,8 +2,10 @@ package cn.reghao.autodop.dmaster.app.service.build.tools.vc;
 
 import org.eclipse.jgit.api.CloneCommand;
 import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.PullCommand;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.internal.storage.file.FileRepository;
+import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
 
 import java.io.File;
@@ -15,6 +17,8 @@ import java.io.File;
  * @date 2019-10-12 22:22:00
  */
 public class GitImpl implements VersionControl {
+    private final String GIT = "/.git";
+
     private final UsernamePasswordCredentialsProvider credentials;
 
     public GitImpl(String username, String password) {
@@ -22,37 +26,40 @@ public class GitImpl implements VersionControl {
     }
 
     @Override
-    public long update(String remote, String local) throws Exception {
-        File localRepo = new File(local);
-        if (!localRepo.exists()) {
-            cloneRepo(remote, local);
-        } else {
-            Git git = new Git(new FileRepository(local + "/.git"));
-            git.pull().setRemoteBranchName("master").setCredentialsProvider(credentials).call();
-            return -1;
+    public String update(String remote, String local) throws Exception {
+        File localRepos = new File(local + GIT);
+        if (!localRepos.exists()) {
+            return null;
+        }
+
+        Repository repos = null;
+        try {
+            repos = new FileRepository(localRepos.getAbsolutePath());
+            Git git = new Git(repos);
+            PullCommand pull = git.pull();
+            pull.call();
+        } catch (Exception e) {
         }
-        return -1;
+
+        return null;
     }
 
-    private void cloneRepo(String remote, String local) throws GitAPIException {
-        CloneCommand clone = Git.cloneRepository();
-        Git git = clone.setURI(remote)
-                .setBranch("master")
-                .setDirectory(new File(local))
-                .setCredentialsProvider(credentials)
-                .call();
+    private void clone(String remote, String local) throws GitAPIException {
+        CloneCommand clone = Git.cloneRepository().setURI(remote);
+        clone.setDirectory(new File(local)).call();
     }
 
     @Override
-    public long localVersion(String local) throws Exception {
-        return -1;
+    public String localVersion(String local) throws Exception {
+        return null;
     }
 
     public static void main(String[] args) throws Exception {
-        GitImpl git = new GitImpl("git", "gjs");
-        String remote = "git@git.reghao.cn:/git/autodop.git";
-        String local = "/home/reghao/tmp/opt/repos/git";
+        GitImpl git = new GitImpl("reghao", "gjs");
+        String remote = "http://git.reghao.cn/reghao/autodop.git";
+        String local = "/home/reghao/tmp/autodop/opt/data/git";
 
-        git.update(remote, local);
+        CloneCommand clone = Git.cloneRepository().setURI(remote);
+        clone.setDirectory(new File(local)).call();
     }
 }

+ 6 - 8
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/vc/SvnImpl.java

@@ -12,7 +12,8 @@ import org.tmatesoft.svn.core.wc.*;
 import java.io.File;
 
 /**
- * svn 实现
+ * TODO 资源管理,完成后关闭连接
+ * SVN 实现
  *
  * @author reghao
  * @date 2019-09-07 16:18:46
@@ -33,11 +34,8 @@ public class SvnImpl implements VersionControl {
         updateClient.setIgnoreExternals(false);
     }
 
-    /**
-     * TODO 多线程问题
-     */
     @Override
-    public synchronized long update(String remote, String local) throws SVNException {
+    public String update(String remote, String local) throws SVNException {
         File localRepo = new File(local);
         if (!localRepo.exists()) {
             checkout(remote, localRepo);
@@ -63,15 +61,15 @@ public class SvnImpl implements VersionControl {
     }
 
     @Override
-    public long localVersion(String local) throws SVNException {
+    public String localVersion(String local) throws SVNException {
         File file = new File(local);
         if (!file.exists()) {
-            return -1;
+            return null;
         }
 
         SVNStatusClient statusClient = SVNClientManager.newInstance().getStatusClient();
         final SVNStatus status = statusClient.doStatus(new File(local), false);
 
-        return status != null ? status.getCommittedRevision().getNumber() : -1;
+        return status != null ? String.valueOf(status.getCommittedRevision().getNumber()) : null;
     }
 }

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/vc/VersionControl.java

@@ -15,7 +15,7 @@ public interface VersionControl {
      * @return 当前仓库的版本
      * @date 2019-10-12 下午11:08
      */
-    long update(String remote, String local) throws Exception;
+    String update(String remote, String local) throws Exception;
 
     /**
      * 本地仓库版本
@@ -24,5 +24,5 @@ public interface VersionControl {
      * @return 本地仓库版本
      * @date 2019-10-30 下午5:23
      */
-    long localVersion(String local) throws Exception;
+    String localVersion(String local) throws Exception;
 }

+ 14 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/config/WebMvcConfig.java

@@ -7,6 +7,7 @@ import org.springframework.http.converter.StringHttpMessageConverter;
 import org.springframework.web.servlet.config.annotation.*;
 
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 /**
@@ -70,7 +71,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
      */
     @Bean
     public HttpMessageConverter<String> responseBodyConverter() {
-        return new StringHttpMessageConverter(Charset.forName("UTF-8"));
+        return new StringHttpMessageConverter(StandardCharsets.UTF_8);
     }
 
     @Override
@@ -78,6 +79,18 @@ public class WebMvcConfig implements WebMvcConfigurer {
         converters.add(responseBodyConverter());
     }
 
+    /**
+     * 不忽略文件后缀名
+     *
+     * @param
+     * @return
+     * @date 2020-03-12 上午12:02
+     */
+    @Override
+    public void configurePathMatch(PathMatchConfigurer configurer) {
+        configurer.setUseSuffixPatternMatch(false);
+    }
+
     /**
      * 处理跨域
      *

+ 8 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/SshUtil.java

@@ -0,0 +1,8 @@
+package cn.reghao.autodop.dmaster.utils;
+
+/**
+ * @author reghao
+ * @date 2020-03-10 22:59:42
+ */
+public class SshUtil {
+}