Kaynağa Gözat

固定数据模型,若之后有修改数据模型,哪怕只修改一个字段,都应在提交中说明

reghao 6 yıl önce
ebeveyn
işleme
3974bbd669
39 değiştirilmiş dosya ile 384 ekleme ve 189 silme
  1. 1 2
      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. 1 1
      common/src/main/java/cn/reghao/autodop/common/docker/Container.java
  4. 1 1
      common/src/main/java/cn/reghao/autodop/common/docker/ContainerConfig.java
  5. 1 1
      common/src/main/java/cn/reghao/autodop/common/docker/ContainerInfo.java
  6. 1 1
      common/src/main/java/cn/reghao/autodop/common/docker/ContainerOps.java
  7. 1 1
      common/src/main/java/cn/reghao/autodop/common/docker/DockerApi.java
  8. 1 1
      common/src/main/java/cn/reghao/autodop/common/docker/DockerAuth.java
  9. 4 3
      common/src/main/java/cn/reghao/autodop/common/docker/DockerClient.java
  10. 1 1
      common/src/main/java/cn/reghao/autodop/common/docker/DockerException.java
  11. 1 1
      common/src/main/java/cn/reghao/autodop/common/docker/DockerHeader.java
  12. 1 1
      common/src/main/java/cn/reghao/autodop/common/docker/HostConfig.java
  13. 1 1
      common/src/main/java/cn/reghao/autodop/common/docker/ImageOps.java
  14. 1 1
      common/src/main/java/cn/reghao/autodop/common/docker/httpclient/HttpClientHandler.java
  15. 1 1
      common/src/main/java/cn/reghao/autodop/common/docker/httpclient/UnixSocketClient.java
  16. 2 2
      common/src/main/java/cn/reghao/autodop/common/docker/httpclient/WebClient.java
  17. 6 5
      common/src/main/java/cn/reghao/autodop/common/grpc/facade/AppService.java
  18. 2 2
      dagent/src/main/java/cn/reghao/autodop/dagent/deploy/Deploy.java
  19. 7 8
      dagent/src/main/java/cn/reghao/autodop/dagent/deploy/DockerDeploy.java
  20. 8 4
      dagent/src/main/java/cn/reghao/autodop/dagent/deploy/ZipDeploy.java
  21. 58 0
      dagent/src/main/java/cn/reghao/autodop/dagent/deploy/ZipRemoteDeploy.java
  22. 11 6
      dagent/src/main/java/cn/reghao/autodop/dagent/service/DeployServiceImpl.java
  23. 11 2
      dagent/src/main/java/cn/reghao/autodop/dagent/service/DockerAppServiceImpl.java
  24. 23 18
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildController.java
  25. 61 8
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppManager.java
  26. 10 16
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppBuildPipeline.java
  27. 40 31
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppDeploy.java
  28. 6 34
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppIntegrate.java
  29. 7 14
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/BuildDispatcher.java
  30. 53 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/Deployer.java
  31. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/compiler/DefaultCompile.java
  32. 9 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/packer/DnktMgrZipPack.java
  33. 7 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/packer/DockerPack.java
  34. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/packer/PackApp.java
  35. 8 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/packer/ZipPack.java
  36. 33 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/packer/ZipRemotePack.java
  37. 0 0
      scripts/batch-build.sh
  38. 1 1
      scripts/build.sh
  39. 0 0
      scripts/run-jar.sh

+ 1 - 2
common/src/main/java/cn/reghao/autodop/common/config/BuildDeployResult.java

@@ -13,10 +13,9 @@ import lombok.NoArgsConstructor;
 @Data
 public class BuildDeployResult {
     private String appId;
+    private String version;
     private String stage;
     private String msg;
-    private String version;
-    private String appPath;
     private String host;
 
     public BuildDeployResult(String appId, String stage, String msg) {

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

@@ -13,4 +13,5 @@ public class DeployConfig {
     private String packerType;
     private String runningDir;
     private String host;
+    private boolean isRun;
 }

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -1,7 +1,7 @@
-package cn.reghao.autodop.common.deploy.docker;
+package cn.reghao.autodop.common.docker;
 
-import cn.reghao.autodop.common.deploy.docker.httpclient.UnixSocketClient;
-import cn.reghao.autodop.common.deploy.docker.httpclient.WebClient;
+import cn.reghao.autodop.common.docker.httpclient.UnixSocketClient;
+import cn.reghao.autodop.common.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;
@@ -154,6 +154,7 @@ public class DockerClient implements ImageOps, ContainerOps, AutoCloseable {
 
     /* container 操作 */
     // TODO 挂载宿主机目录
+    // TODO 停止并删除当前正在运行的应用,然后运行新应用
     @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/deploy/docker/DockerException.java → common/src/main/java/cn/reghao/autodop/common/docker/DockerException.java

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

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

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

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

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

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

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

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

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

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

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

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

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

+ 6 - 5
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.deploy.docker.DockerException;
+import cn.reghao.autodop.common.docker.DockerException;
 import cn.reghao.autodop.common.grpc.common.annotation.GrpcService;
 import cn.reghao.autodop.common.grpc.common.serializer.SerializerType;
 
@@ -13,8 +13,9 @@ import java.util.List;
  */
 @GrpcService(service = "app", serialization = SerializerType.FastJson)
 public interface AppService {
-    void start(String app) throws DockerException;
-    void stop(String app) throws DockerException;
-    void restart(String app) throws DockerException;
-    List<String> log(String app) throws DockerException, IOException;
+    void run(String appId, String version) throws DockerException;
+    void start(String appId) throws DockerException;
+    void stop(String appId) throws DockerException;
+    void restart(String appId) throws DockerException;
+    List<String> log(String appId) throws DockerException, IOException;
 }

+ 2 - 2
common/src/main/java/cn/reghao/autodop/common/deploy/Deploy.java → dagent/src/main/java/cn/reghao/autodop/dagent/deploy/Deploy.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.deploy;
+package cn.reghao.autodop.dagent.deploy;
 
 import cn.reghao.autodop.common.config.BuildDeployResult;
 
@@ -15,5 +15,5 @@ public interface Deploy {
      * @return 0 - 部署成功,1 - 部署失败
      * @date 2019-10-15 下午4:57
      */
-    BuildDeployResult deploy(String appId, String appPath, String runningDir);
+    BuildDeployResult deploy(String appId, String appPath, String runningDir, boolean isRun);
 }

+ 7 - 8
common/src/main/java/cn/reghao/autodop/common/deploy/DockerDeploy.java → dagent/src/main/java/cn/reghao/autodop/dagent/deploy/DockerDeploy.java

@@ -1,7 +1,7 @@
-package cn.reghao.autodop.common.deploy;
+package cn.reghao.autodop.dagent.deploy;
 
 import cn.reghao.autodop.common.config.BuildDeployResult;
-import cn.reghao.autodop.common.deploy.docker.DockerClient;
+import cn.reghao.autodop.common.docker.DockerClient;
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -15,18 +15,17 @@ public class DockerDeploy implements Deploy {
     private DockerClient docker = new DockerClient();
 
     @Override
-    public BuildDeployResult deploy(String appId, String appPath, String runningDir) {
+    public BuildDeployResult deploy(String appId, String appPath, String runningDir, boolean isRun) {
         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)) {
+            if (isRun) {
+                docker.run(appId, appPath);
+            }
 
-        }*/
+            result.setMsg("成功");
         } catch (Exception e) {
             result.setMsg(e.getMessage());
         }

+ 8 - 4
common/src/main/java/cn/reghao/autodop/common/deploy/ZipDeploy.java → dagent/src/main/java/cn/reghao/autodop/dagent/deploy/ZipDeploy.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.deploy;
+package cn.reghao.autodop.dagent.deploy;
 
 import cn.reghao.autodop.common.config.BuildDeployResult;
 import cn.reghao.autodop.common.http.DefaultWebRequest;
@@ -14,7 +14,7 @@ import java.io.File;
  */
 public class ZipDeploy implements Deploy {
     @Override
-    public BuildDeployResult deploy(String appId, String appPath, String runningDir) {
+    public BuildDeployResult deploy(String appId, String appPath, String runningDir, boolean isRun) {
         String url = "http://localhost:4000/api/app/file/dl/" + appPath;
         WebRequest request = new DefaultWebRequest();
 
@@ -31,8 +31,12 @@ public class ZipDeploy implements Deploy {
                 request.download(url, filepath);
             }
 
-            FileUtil.eraseDir(new File(appRunningDir));
-            ZipUtil.unzip(filepath, appRunningDir);
+            // TODO 前端静态文件并不存在运行的概念,它与二进制运行文件和 Python 之类的应用不同
+            if (isRun) {
+                FileUtil.eraseDir(new File(appRunningDir));
+                ZipUtil.unzip(filepath, appRunningDir);
+            }
+
             result.setMsg("成功");
         } catch (Exception e) {
             e.printStackTrace();

+ 58 - 0
dagent/src/main/java/cn/reghao/autodop/dagent/deploy/ZipRemoteDeploy.java

@@ -0,0 +1,58 @@
+package cn.reghao.autodop.dagent.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;
+
+/**
+ * TODO zip 打包远程部署
+ *
+ * @author reghao
+ * @date 2020-03-11 17:13:02
+ */
+public class ZipRemoteDeploy implements Deploy {
+    @Override
+    public BuildDeployResult deploy(String appId, String appPath, String runningDir, boolean isRun) {
+        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(appPath, filepath);
+            }
+
+            if (isRun) {
+                FileUtil.eraseDir(new File(appRunningDir));
+                ZipUtil.unzip(filepath, appRunningDir);
+            }
+
+            result.setMsg("成功");
+        } 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 + " 出错");
+        }
+    }
+}

+ 11 - 6
dagent/src/main/java/cn/reghao/autodop/dagent/service/DeployServiceImpl.java

@@ -2,9 +2,10 @@ 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.deploy.Deploy;
-import cn.reghao.autodop.common.deploy.DockerDeploy;
-import cn.reghao.autodop.common.deploy.ZipDeploy;
+import cn.reghao.autodop.dagent.deploy.Deploy;
+import cn.reghao.autodop.dagent.deploy.DockerDeploy;
+import cn.reghao.autodop.dagent.deploy.ZipDeploy;
+import cn.reghao.autodop.dagent.deploy.ZipRemoteDeploy;
 import cn.reghao.autodop.common.grpc.facade.DeployService;
 import cn.reghao.autodop.common.utils.NetworkUtil;
 import com.alibaba.fastjson.JSONObject;
@@ -30,14 +31,18 @@ public class DeployServiceImpl implements DeployService {
         String appPath = deployConfig.getAppPath();
         String runningDir = deployConfig.getRunningDir();
         String packerType = deployConfig.getPackerType();
+        boolean isRun = deployConfig.isRun();
 
         BuildDeployResult result;
         if ("docker".equalsIgnoreCase(packerType)) {
             Deploy deployApp = new DockerDeploy();
-            result = deployApp.deploy(appId, appPath, null);
+            result = deployApp.deploy(appId, appPath, null, isRun);
         } else if ("zip".equalsIgnoreCase(packerType)) {
             Deploy deployApp = new ZipDeploy();
-            result = deployApp.deploy(appId, appPath, runningDir);
+            result = deployApp.deploy(appId, appPath, runningDir, isRun);
+        } else if ("zip-remote".equalsIgnoreCase(packerType)) {
+            Deploy deployApp = new ZipRemoteDeploy();
+            result = deployApp.deploy(appId, appPath, runningDir, isRun);
         } else {
             result = new BuildDeployResult();
             result.setAppId(appId);
@@ -46,7 +51,7 @@ public class DeployServiceImpl implements DeployService {
         }
 
         // TODO 指定主机 IP 地址的前缀,后期通过配置指定,不动态获取
-        result.setAppPath(appPath);
+        //result.setAppPath(appPath);
         result.setHost(NetworkUtil.hostAddress("192.168"));
         return result;
     }

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

@@ -1,21 +1,30 @@
 package cn.reghao.autodop.dagent.service;
 
-import cn.reghao.autodop.common.deploy.docker.DockerClient;
-import cn.reghao.autodop.common.deploy.docker.DockerException;
+import cn.reghao.autodop.common.docker.DockerClient;
+import cn.reghao.autodop.common.docker.DockerException;
 import cn.reghao.autodop.common.grpc.facade.AppService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
 import java.util.List;
 
 /**
+ * Docker 应用管理
+ *
  * @author reghao
  * @date 2020-01-19 21:51:37
  */
+@Slf4j
 @Service
 public class DockerAppServiceImpl implements AppService {
     private DockerClient docker = new DockerClient();
 
+    @Override
+    public void run(String appId, String version) throws DockerException {
+        log.info("运行 {} 应用的 {} 版本", appId, version);
+    }
+
     @Override
     public void start(String app) throws DockerException {
         String containerId = docker.getIdByName(app);

+ 23 - 18
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildController.java

@@ -1,6 +1,8 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
 import cn.reghao.autodop.common.config.BuildDeployResult;
+import cn.reghao.autodop.dmaster.app.service.AppManager;
+import cn.reghao.autodop.dmaster.app.service.build.AppDeploy;
 import cn.reghao.autodop.dmaster.result.WebResult;
 import cn.reghao.autodop.dmaster.app.service.build.BuildDispatcher;
 import io.swagger.annotations.Api;
@@ -25,9 +27,11 @@ import java.util.Set;
 @RequestMapping("/api/app")
 public class BuildController {
     private BuildDispatcher buildDispatcher;
+    private AppManager appManager;
 
-    public BuildController(BuildDispatcher buildDispatcher) {
+    public BuildController(BuildDispatcher buildDispatcher, AppManager appManager) {
         this.buildDispatcher = buildDispatcher;
+        this.appManager = appManager;
     }
 
     @ApiOperation(value = "构建应用")
@@ -42,7 +46,7 @@ public class BuildController {
         if (apps.size() == 0) {
             return new WebResult<String>().jsonResult("ok");
         } else {
-            results = buildDispatcher.dispatch(apps, false);
+            results = buildDispatcher.dispatch(apps, false, false);
             return new WebResult<List>().jsonResult(results);
         }
     }
@@ -59,39 +63,40 @@ public class BuildController {
         if (apps.size() == 0) {
             return new WebResult<String>().jsonResult("ok");
         } else {
-            results = buildDispatcher.dispatch(apps, true);
+            results = buildDispatcher.dispatch(apps, true, false);
             return new WebResult<List>().jsonResult(results);
         }
     }
 
-    @ApiOperation(value = "部署应用")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name="appId", value="应用标识", paramType="query", dataType = "String"),
-            @ApiImplicitParam(name="appPath", value="应用地址", paramType="query", dataType = "String")
-    })
-    @PostMapping("/deploy")
-    public String deployApp(@RequestParam("appId") String appId, @RequestParam("appPath") String appPath)
-            throws Exception {
-        return null;
-    }
-
-    @ApiOperation(value = "部署静态资源")
+    @ApiOperation(value = "构建部署运行应用")
     @ApiImplicitParams(
             @ApiImplicitParam(name="appId", value="一个或多个应用(多个应用间使用 , 分隔)",
                     paramType="path", dataType = "String")
     )
-    @PostMapping("/deploy/static/{appId}")
-    public String deployStatic(@PathVariable("appId") String appId) throws Exception {
+    @PostMapping("/pipeline/{appId}")
+    public String buildDeployAndRun(@PathVariable("appId") String appId) throws Exception {
         Set<String> apps = checkArgs(appId);
         List<BuildDeployResult> results;
         if (apps.size() == 0) {
             return new WebResult<String>().jsonResult("ok");
         } else {
-            results = buildDispatcher.dispatch(apps, false);
+            results = buildDispatcher.dispatch(apps, true, true);
             return new WebResult<List>().jsonResult(results);
         }
     }
 
+    @ApiOperation(value = "部署应用")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name="appId", value="应用标识", paramType="query", dataType = "String"),
+            @ApiImplicitParam(name="appPath", value="应用地址", paramType="query", dataType = "String")
+    })
+    @PostMapping("/deploy")
+    public String deployApp(@RequestParam("appId") String appId, @RequestParam("appPath") String appPath)
+            throws Exception {
+
+        return null;
+    }
+
     @ApiOperation(value = "部署 OSS 资源")
     @ApiImplicitParams(
             @ApiImplicitParam(name="appId", value="一个或多个应用(多个应用间使用 , 分隔)",

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

@@ -1,24 +1,77 @@
 package cn.reghao.autodop.dmaster.app.service;
 
-import cn.reghao.autodop.common.deploy.docker.DockerException;
+import cn.reghao.autodop.common.docker.DockerException;
 import cn.reghao.autodop.common.grpc.client.GrpcClientProxy;
 import cn.reghao.autodop.common.grpc.facade.AppService;
+import cn.reghao.autodop.dmaster.orchestrate.caching.OrchestrationCaching;
+import cn.reghao.autodop.dmaster.orchestrate.pojo.orchestration.AppOrchestration;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
+import java.util.List;
+
 /**
- * 应用状态管理
+ * 应用管理
  *
  * @author reghao
  * @date 2019-11-27 11:30:28
  */
 @Service
 public class AppManager {
-    public void start() throws DockerException {
-        String host = "";
-        AppService appService = (AppService) new GrpcClientProxy<AppService>()
-                .getProxy(host, 4001, AppService.class);
+    private final int GRPC_PORT = 4001;
+    private OrchestrationCaching caching;
+
+    public AppManager(OrchestrationCaching caching) {
+        this.caching = caching;
+    }
+
+    public void run(String appId, String version) {
+
+    }
+
+    public void start(String appId) throws DockerException {
+        AppOrchestration app = caching.findAppByIdentifier(appId);
+        String[] hosts = app.getDeploy().getHosts().split(",");
+        for (String host : hosts) {
+            AppService appService = (AppService) new GrpcClientProxy<AppService>()
+                    .getProxy(host, GRPC_PORT, AppService.class);
+
+            appService.start(appId);
+        }
+    }
+
+    public void stop(String appId) throws DockerException {
+        AppOrchestration app = caching.findAppByIdentifier(appId);
+        String[] hosts = app.getDeploy().getHosts().split(",");
+        for (String host : hosts) {
+            AppService appService = (AppService) new GrpcClientProxy<AppService>()
+                    .getProxy(host, GRPC_PORT, AppService.class);
+
+            appService.stop(appId);
+        }
+    }
+
+    public void restart(String appId) throws DockerException {
+        AppOrchestration app = caching.findAppByIdentifier(appId);
+        String[] hosts = app.getDeploy().getHosts().split(",");
+        for (String host : hosts) {
+            AppService appService = (AppService) new GrpcClientProxy<AppService>()
+                    .getProxy(host, GRPC_PORT, AppService.class);
+
+            appService.restart(appId);
+        }
+    }
+
+    public List<String> log(String appId) throws DockerException, IOException {
+        AppOrchestration app = caching.findAppByIdentifier(appId);
+        String[] hosts = app.getDeploy().getHosts().split(",");
+        for (String host : hosts) {
+            AppService appService = (AppService) new GrpcClientProxy<AppService>()
+                    .getProxy(host, GRPC_PORT, AppService.class);
+
+            List<String> logs = appService.log(appId);
+        }
 
-        String app = "";
-        appService.start(app);
+        return null;
     }
 }

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

@@ -2,11 +2,9 @@ package cn.reghao.autodop.dmaster.app.service.build;
 
 import cn.reghao.autodop.common.config.BuildDeployResult;
 import cn.reghao.autodop.common.utils.JsonUtil;
-import cn.reghao.autodop.dmaster.app.pojo.BuildMsg;
 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;
@@ -23,15 +21,17 @@ public class AppBuildPipeline implements Callable<String> {
     private AppOrchestration app;
     private String version;
     private boolean isDeploy;
+    private boolean isRun;
     private AppIntegrate appIntegrate;
 
     private final String appLocalRepo;
     private final String appCompileDir;
 
-    public AppBuildPipeline(AppOrchestration app, String version, boolean isDeploy) {
+    public AppBuildPipeline(AppOrchestration app, String version, boolean isDeploy, boolean isRun) {
         this.app = app;
         this.version = version;
         this.isDeploy = isDeploy;
+        this.isRun = isRun;
         this.appIntegrate = new AppIntegrate(app);
         // TODO 暂时不使用动态代理
         //this.appIntegrate = ProxyUtils.createProxyObject(AppIntegrate.class);
@@ -87,29 +87,23 @@ public class AppBuildPipeline implements Callable<String> {
         }
 
         /* 打包阶段 */
-        String appPath;
         try {
-            appPath = appIntegrate.pack(app.getIdentifier(), String.valueOf(version), appEntryDir);
+            appIntegrate.pack(app.getIdentifier(), String.valueOf(version), appEntryDir);
         } catch (Exception e) {
             e.printStackTrace();
             result.setStage("打包");
             result.setMsg(e.getMessage());
             return JsonUtil.objectToJson(result);
         }
-        result.setAppPath(appPath);
 
         /* 部署阶段 */
         if (isDeploy) {
-            List<BuildDeployResult> results = AppDeploy.deploy(app, appPath);
-            results.forEach(res -> {
-                if ("成功".equalsIgnoreCase(res.getMsg())) {
-                    log.info("{} 部署成功", app.getIdentifier());
-                    BuildMsg buildMsg =
-                            new BuildMsg(app.getIdentifier(), app.getDescription(), version, app.getEnv());
-                    // TODO 异步通知
-                    appIntegrate.sendNotify(buildMsg);
-                }
-            });
+            List<BuildDeployResult> results = null;
+            try {
+                results = AppDeploy.deploy(app, version, isRun);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
 
             return JsonUtil.objectToJson(results);
         }

+ 40 - 31
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppDeploy.java

@@ -1,51 +1,60 @@
 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.common.utils.JsonUtil;
+import cn.reghao.autodop.dmaster.app.pojo.BuildMsg;
+import cn.reghao.autodop.dmaster.app.service.build.tools.notifier.DingNotify;
+import cn.reghao.autodop.dmaster.app.service.build.tools.notifier.Notify;
 import cn.reghao.autodop.dmaster.orchestrate.pojo.orchestration.AppOrchestration;
-import com.alibaba.fastjson.JSONObject;
+import cn.reghao.autodop.dmaster.orchestrate.pojo.tools.AppPacker;
+import cn.reghao.autodop.dmaster.orchestrate.pojo.tools.Notifier;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
 import java.util.List;
 
 /**
- * 部署应用
- *
  * @author reghao
- * @date 2019-11-11 17:33:56
+ * @date 2020-03-13 10:26:22
  */
 @Slf4j
-@Service
 public class AppDeploy {
-    private static final int GRPC_PORT = 4001;
-
     /**
-     * @return 返回 List 是因为可能是集群部署
-     * @date 2020-03-12 下午3:18
+     * 部署和/或运行应用
+     *
+     * @param
+     * @return
+     * @date 2020-03-13 下午1:00
      */
-    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());
+    public static List<BuildDeployResult> deploy(AppOrchestration app, String version, boolean isRun) throws Exception {
+        Notifier notifier = app.getBuild().getNotifier();
+
+        Notify notify = null;
+        if ("ding".equalsIgnoreCase(notifier.getNotifierType())) {
+            notify = new DingNotify(notifier.getNotifierAddress());
+        }
 
-        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, GRPC_PORT, DeployService.class);
+        AppPacker appPacker = app.getBuild().getAppPacker();
+        String packerType = appPacker.getPackerType();
+        String appPath = "";
+        if ("docker".equalsIgnoreCase(packerType)) {
+            appPath = appPacker.getAppRootPath() + "/" + app.getIdentifier() + ":" + version;
+        } else if ("zip".equalsIgnoreCase(packerType)) {
+            appPath = app.getIdentifier() + "_" + version;
+        } else if ("zip-remote".equalsIgnoreCase(packerType)) {
+            // TODO zip-remote 使用 zip 打包,并将应用包上传到远程服务器,appRootPath 是一个 HTTP 链接
+            appPath = appPacker.getAppRootPath() + app.getIdentifier() + "_" + version;
+        }
 
-            Object object = deployService.deploy(deployConfig);
-            JSONObject jsonObject = (JSONObject) object;
-            BuildDeployResult result = jsonObject.toJavaObject(BuildDeployResult.class);
-            results.add(result);
+        List<BuildDeployResult> results = Deployer.deploy(app, appPath, isRun);
+        for (BuildDeployResult result : results) {
+            if ("成功".equalsIgnoreCase(result.getMsg())) {
+                log.info("{} 部署成功", app.getIdentifier());
+                BuildMsg buildMsg =
+                        new BuildMsg(app.getIdentifier(), app.getDescription(), version, app.getEnv());
+                // TODO 异步通知
+                assert notify != null;
+                notify.sendJson(JsonUtil.objectToJson(buildMsg));
+            }
         }
 
         return results;

+ 6 - 34
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppIntegrate.java

@@ -1,14 +1,10 @@
 package cn.reghao.autodop.dmaster.app.service.build;
 
-import cn.reghao.autodop.common.utils.JsonUtil;
 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.DnktMgrZipPack;
 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.app.service.build.tools.notifier.DingNotify;
-import cn.reghao.autodop.dmaster.app.service.build.tools.notifier.Notify;
-import cn.reghao.autodop.dmaster.orchestrate.pojo.tools.Notifier;
 import cn.reghao.autodop.dmaster.orchestrate.pojo.build.AppBuild;
 import cn.reghao.autodop.dmaster.orchestrate.pojo.tools.AppPacker;
 import cn.reghao.autodop.dmaster.orchestrate.pojo.tools.CodeCompiler;
@@ -16,7 +12,7 @@ import cn.reghao.autodop.dmaster.orchestrate.pojo.orchestration.AppOrchestration
 import lombok.extern.slf4j.Slf4j;
 
 /**
- * 应用集成,根据 AppOrchestration 中的值完成编译,打包,部署和通知的配置
+ * 应用集成,根据 AppOrchestration 中的值完成编译,打包的配置
  *
  * @author reghao
  * @date 2019-10-09 10:54:43
@@ -27,7 +23,6 @@ public class AppIntegrate {
     private PreCompile preCompile;
     private CompileCode compileCode;
     private PackApp packApp;
-    private Notify notify;
 
     public AppIntegrate() {
     }
@@ -44,8 +39,6 @@ public class AppIntegrate {
 
     private void init() {
         AppBuild appBuild = app.getBuild();
-        String appRootPath = appBuild.getAppPacker().getAppRootPath();
-
         // 编译初始化
         CodeCompiler compiler = appBuild.getCodeCompiler();
         if ("dotnet".equals(compiler.getCompilerType())) {
@@ -54,7 +47,7 @@ public class AppIntegrate {
         } else if ("maven".equals(compiler.getCompilerType())) {
             compileCode = new Maven();
         } else if ("static".equals(compiler.getCompilerType())) {
-            compileCode = new NullCompile();
+            compileCode = new DefaultCompile();
             log.warn("静态应用,不需要编译器");
         } else {
             //throw new Exception("");
@@ -64,23 +57,17 @@ public class AppIntegrate {
         // 打包初始化
         AppPacker packer = appBuild.getAppPacker();
         if ("docker".equals(packer.getPackerType())) {
-            packApp = new DockerPack(appRootPath);
+            packApp = new DockerPack(packer);
         } else if ("maven".equals(packer.getPackerType())) {
 
         } else if ("zip".equals(packer.getPackerType())) {
-            packApp = new ZipPack();
-        }
-
-        // 通知初始化
-        Notifier notifier = appBuild.getNotifier();
-        if ("ding".equalsIgnoreCase(notifier.getNotifierType())) {
-            notify = new DingNotify(notifier.getNotifierAddress());
+            packApp = new ZipPack(packer);
         }
 
         // TODO 特定于 dnkt-mgr 项目的处理
         if (app.getIdentifier().startsWith("dnkt-mgr")) {
             preCompile = new DnktMgrPreCompile();
-            packApp = new DnktZipTarPack();
+            packApp = new DnktMgrZipPack(packer);
         }
     }
 
@@ -118,19 +105,4 @@ public class AppIntegrate {
     public String pack(String appId, String version, String appEntryDir) throws Exception {
         return packApp.pack(appId, version, appEntryDir);
     }
-
-    /**
-     * 发送通知
-     *
-     * @param
-     * @return
-     * @date 2020-03-12 下午2:52
-     */
-    public void sendNotify(Object object) {
-        try {
-            notify.sendJson(JsonUtil.objectToJson(object));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
 }

+ 7 - 14
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/BuildDispatcher.java

@@ -36,7 +36,7 @@ public class BuildDispatcher {
      * @return
      * @date 2019-11-12 上午9:48
      */
-    public List<BuildDeployResult> dispatch(Set<String> appIds, boolean isDeploy) throws Exception {
+    public List<BuildDeployResult> dispatch(Set<String> appIds, boolean isDeploy, boolean isRun) throws Exception {
         List<BuildDeployResult> results = new ArrayList<>();
         List<AppOrchestration> existApps = new ArrayList<>();
         // 分离出存在的应用和不存在的应用
@@ -69,7 +69,7 @@ public class BuildDispatcher {
             } else {
                 // 更新,编译,打包独立的应用
                 apps.forEach(app -> {
-                    appFutures.add(threadPool.submit(new AppBuildPipeline(app, null, isDeploy)));
+                    appFutures.add(threadPool.submit(new AppBuildPipeline(app, null, isDeploy, isRun)));
                 });
             }
         }
@@ -89,7 +89,7 @@ public class BuildDispatcher {
                 appVersions.forEach(appVersion -> {
                     if (appVersion.isUpdated()) {
                         appFutures.add(threadPool.submit(
-                                new AppBuildPipeline(appVersion.getApp(), appVersion.getVersion(), isDeploy)));
+                                new AppBuildPipeline(appVersion.getApp(), appVersion.getVersion(), isDeploy, isRun)));
                     } else {
                         BuildDeployResult buildDeployResult = new BuildDeployResult();
                         buildDeployResult.setAppId(appVersion.getApp().getIdentifier());
@@ -134,7 +134,7 @@ public class BuildDispatcher {
                 mapkey = app.getProjBuild().getProjId();
                 ProjOrchestration proj = caching.findProjByIdentifier(mapkey);
                 AppBuild projBuild = proj.getBuild();
-                fillAppBuild(projBuild, app, proj);
+                fillAppBuild(projBuild, app);
             } else {
                 // 单独的应用,不隶属于任何项目
                 mapkey = STANDALONE_APP;
@@ -153,6 +153,7 @@ public class BuildDispatcher {
     }
 
     /**
+     * TODO 系统在初始化完成后自动填充属于项目的应用,并在项目有改动后自动更新
      * 填充项目中的应用在构建阶段的一些配置
      * 属于同一项目的应用具有很多共性,在构建阶段,只有仓库地址和依赖地址不同
      *
@@ -160,10 +161,11 @@ public class BuildDispatcher {
      * @return
      * @date 2020-03-09 下午4:39
      */
-    private void fillAppBuild(AppBuild build, AppOrchestration app, ProjOrchestration proj) {
+    private void fillAppBuild(AppBuild build, AppOrchestration app) {
         ProjBuild projBuild = app.getProjBuild();
 
         AppBuild appBuild = new AppBuild();
+        appBuild.setNotifier(build.getNotifier());
         appBuild.setCodeCompiler(build.getCodeCompiler());
         appBuild.setAppPacker(build.getAppPacker());
 
@@ -185,14 +187,5 @@ public class BuildDispatcher {
 
         appBuild.setCodeRepos(codeRepos);
         app.setBuild(appBuild);
-
-        /*app.setEnv(proj.getEnv());
-        Notifier projNotifier = proj.getNotifier();
-        Notifier notifier = new Notifier();
-        notifier.setNotifierType(projNotifier.getNotifierType());
-        notifier.setNotifierName(projNotifier.getNotifierName());
-        notifier.setNotifierAddress(projNotifier.getNotifierAddress());
-
-        app.setNotifier(notifier);*/
     }
 }

+ 53 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/Deployer.java

@@ -0,0 +1,53 @@
+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;
+
+/**
+ * 部署应用到远程主机
+ *
+ * @author reghao
+ * @date 2019-11-11 17:33:56
+ */
+@Slf4j
+public class Deployer {
+    private static final int GRPC_PORT = 4001;
+
+    /**
+     * @return 返回 List 是因为可能是集群部署
+     * @date 2020-03-12 下午3:18
+     */
+    public static List<BuildDeployResult> deploy(AppOrchestration app, String appPath, boolean isRun) {
+        DeployConfig deployConfig = new DeployConfig();
+        deployConfig.setAppId(app.getIdentifier());
+        deployConfig.setAppPath(appPath);
+        deployConfig.setPackerType(app.getBuild().getAppPacker().getPackerType());
+        deployConfig.setRunningDir(app.getRunning().getRunningDir());
+        deployConfig.setRun(isRun);
+
+        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, GRPC_PORT, DeployService.class);
+
+            Object object = deployService.deploy(deployConfig);
+            JSONObject jsonObject = (JSONObject) object;
+            BuildDeployResult result = jsonObject.toJavaObject(BuildDeployResult.class);
+            results.add(result);
+        }
+
+        return results;
+    }
+}

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/compiler/NullCompile.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/compiler/DefaultCompile.java

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

+ 9 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/packer/DnktZipTarPack.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/packer/DnktMgrZipPack.java

@@ -1,13 +1,11 @@
 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 cn.reghao.autodop.dmaster.orchestrate.pojo.tools.AppPacker;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.File;
-import java.time.LocalDate;
 
 /**
  * TODO 特定于 dnkt-mgr 项目的处理
@@ -16,13 +14,18 @@ import java.time.LocalDate;
  * @date 2020-03-11 13:37:36
  */
 @Slf4j
-public class DnktZipTarPack implements PackApp {
+public class DnktMgrZipPack implements PackApp {
     private final String SUFFIX = ".zip";
+    private AppPacker appPacker;
+
+    public DnktMgrZipPack(AppPacker appPacker) {
+        this.appPacker = appPacker;
+    }
 
     @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;
+        String tag = appId + "_" + version + SUFFIX;
+        String dst = appPacker.getAppRootPath() + "/" + tag;
         if (new File(dst).exists()) {
             return tag;
         }

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

@@ -1,8 +1,7 @@
 package cn.reghao.autodop.dmaster.app.service.build.tools.packer;
 
-import cn.reghao.autodop.common.deploy.docker.DockerClient;
-
-import java.time.LocalDate;
+import cn.reghao.autodop.common.docker.DockerClient;
+import cn.reghao.autodop.dmaster.orchestrate.pojo.tools.AppPacker;
 
 /**
  * 打包为 docker 应用
@@ -11,18 +10,17 @@ import java.time.LocalDate;
  * @date 2019-10-14 22:02:04
  */
 public class DockerPack implements PackApp {
-    private String prefix;
+    private AppPacker appPacker;
 
-    public DockerPack(String prefix) {
-        this.prefix = prefix;
+    public DockerPack(AppPacker appPacker) {
+        this.appPacker = appPacker;
     }
 
     @Override
     public String pack(String appId, String version, String appEntryDir) throws Exception {
         DockerClient docker = new DockerClient();
-        String repo = prefix + "/" + appId;
-        String tag = version + "_" + LocalDate.now().toString();
-        String image = repo + ":" + tag;
+        String repo = appPacker.getAppRootPath() + "/" + appId;
+        String image = repo + ":" + version;
 
         docker.build(image, appEntryDir);
         docker.push(image);

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

@@ -2,6 +2,7 @@ package cn.reghao.autodop.dmaster.app.service.build.tools.packer;
 
 /**
  * 打包应用
+ * TODO 考虑一下如何打 apt,yum 之类的包以及如何运行这些包
  *
  * @author reghao
  * @date 2020-01-21 16:18:37

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

@@ -1,11 +1,10 @@
 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 cn.reghao.autodop.dmaster.orchestrate.pojo.tools.AppPacker;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.File;
-import java.time.LocalDate;
 
 /**
  * @author reghao
@@ -14,11 +13,16 @@ import java.time.LocalDate;
 @Slf4j
 public class ZipPack implements PackApp {
     private final String SUFFIX = ".zip";
+    private AppPacker appPacker;
+
+    public ZipPack(AppPacker appPacker) {
+        this.appPacker = appPacker;
+    }
 
     @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;
+        String tag = appId + "_" + version + SUFFIX;
+        String dst = appPacker.getAppRootPath() + "/" + tag;
         if (new File(dst).exists()) {
             return tag;
         }

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

@@ -0,0 +1,33 @@
+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.tools.AppPacker;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.File;
+
+/**
+ * @author reghao
+ * @date 2020-03-11 13:37:36
+ */
+@Slf4j
+public class ZipRemotePack implements PackApp {
+    private final String SUFFIX = ".zip";
+    private AppPacker appPacker;
+
+    public ZipRemotePack(AppPacker appPacker) {
+        this.appPacker = appPacker;
+    }
+
+    @Override
+    public String pack(String appId, String version, String appEntryDir) throws Exception {
+        String tag = appId + "_" + version + SUFFIX;
+        String dst = appPacker.getAppRootPath() + "/" + tag;
+        if (new File(dst).exists()) {
+            return tag;
+        }
+        ZipUtil.zip(new File(appEntryDir), dst);
+        // TODO 将应用包上传到远程服务器
+        return tag;
+    }
+}

+ 0 - 0
batch-build.sh → scripts/batch-build.sh


+ 1 - 1
build.sh → scripts/build.sh

@@ -30,8 +30,8 @@ fi
 SRC_DIR='/home/reghao/code/aha/autodop'
 cd ${SRC_DIR}
 mvn clean package -P${ENV}
-
 cp ${APP}/target/${APP}-1.0.0.jar ${DST_DIR}/app/${APP}-1.0.0_${TIMESTAMP}.jar
+mvn clean
 
 # 拷贝运行脚本到远程主机
 sshpass -p ${PASSWORD} scp run-jar.sh root@${REMOTE_HOST}:/opt/servers/jars/autodop

+ 0 - 0
run-jar.sh → scripts/run-jar.sh