Parcourir la source

完成构建包下载功能

reghao il y a 4 ans
Parent
commit
8a1b5f9122

+ 10 - 18
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildDeployController.java

@@ -12,8 +12,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletResponse;
-
 /**
  * @author reghao
  * @date 2019-08-30 18:49:15
@@ -51,7 +49,8 @@ public class BuildDeployController {
             @ApiImplicitParam(name="machineId", value="机器 ID", paramType="path", dataType = "String")
     })
     @PostMapping(value = "/deploy/{buildLogId}/{machineId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String deploy(@PathVariable("buildLogId") String buildLogId, @PathVariable("machineId") String machineId) {
+    public String deploy(@PathVariable("buildLogId") String buildLogId, @PathVariable("machineId") String machineId)
+            throws Exception {
         buildDeployService.deploy(buildLogId, machineId);
         return WebBody.success();
     }
@@ -73,6 +72,7 @@ public class BuildDeployController {
         return WebBody.success();
     }
 
+    @Deprecated
     @ApiOperation(value = "清除当前正在构建和部署的应用")
     @PostMapping(value = "/clear", produces = MediaType.APPLICATION_JSON_VALUE)
     public String clearCurrentBuildingOrDeploy() {
@@ -80,22 +80,14 @@ public class BuildDeployController {
     }
 
     @ApiOperation(value = "构建包下载接口")
-    @GetMapping("/dl/{buildLogId}")
-    public void dlPackage(@PathVariable("buildLogId") String buildLogId, HttpServletResponse response) throws Exception {
-        buildDeployService.downloadPackage(buildLogId);
+    @GetMapping("/dl/{filename}")
+    public void dlPackage(@PathVariable("filename") String filename) throws Exception {
+        buildDeployService.dlPackage(filename);
     }
 
-    @ApiOperation(value = "当前正在构建的应用")
-    @GetMapping(value = "/building", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String currentlyBuilding() {
-        buildDeployService.currentlyBuilding();
-        return WebBody.success("暂未实现");
-    }
-
-    @ApiOperation(value = "当前正在部署的应用")
-    @GetMapping(value = "/deploying", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String currentlyDeploying() {
-        buildDeployService.currentlyDeploying();
-        return WebBody.success("暂未实现");
+    @ApiOperation(value = "构建包下载接口")
+    @GetMapping("/dl1/{buildLogId}")
+    public void dlPackage1(@PathVariable("buildLogId") String buildLogId) throws Exception {
+        buildDeployService.downloadPackage(buildLogId);
     }
 }

+ 5 - 10
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppDeployer.java

@@ -46,18 +46,9 @@ public class AppDeployer {
             return;
         }
 
-        String buildLogId = buildLog.getId();
-        String packagePath = buildLog.getPackagePath();
-        String deployBy = buildLog.getBuildBy();
-        String commitId = buildLog.getCommitInfo().getCommitId();
-
         List<AppDeployConfig> deployConfigs = deployConfigQuery.findByAppId(appId);
         // TODO 使用线程池并发执行
         for (AppDeployConfig appDeployConfig : deployConfigs) {
-            String machineId = appDeployConfig.getMachineHost().getMachineId();
-            String machineIpv4 = appDeployConfig.getMachineHost().getMachineIpv4();
-            deployingService.refreshBeforeDeploy(appDeployConfig, buildLog);
-            deployingService.addDeployLog(new DeployLog(buildLogId, machineId, machineIpv4, deployBy));
             deploy(buildLog, appDeployConfig);
         }
 
@@ -72,8 +63,8 @@ public class AppDeployer {
      * @date 2020-03-13 下午1:00
      */
     public void deploy(BuildLog buildLog, AppDeployConfig appDeployConfig) throws MqttException {
-        String buildLogId = buildLog.getId();
         String appId = buildLog.getAppId();
+        String buildLogId = buildLog.getId();
         String packagePath = buildLog.getPackagePath();
         String deployBy = buildLog.getBuildBy();
         String commitId = buildLog.getCommitInfo().getCommitId();
@@ -93,11 +84,15 @@ public class AppDeployer {
         deployParam.setStartScript(startScript);
         deployParam.setStartHome(startHome);
 
+        deployingService.refreshBeforeDeploy(appDeployConfig, buildLog);
+        deployingService.addDeployLog(new DeployLog(buildLogId, machineId, machineIpv4, deployBy));
+
         RpcMsg rpcMsg = RpcMsg.paramMsg(AppRpcClazz.class.getSimpleName(), AppRpcClazz.deploy.name(),
                 JsonConverter.objectToJson(deployParam));
         Message message = Message.rpcParamMsg(rpcMsg);
         // TODO 对于需要返回值的 pub,需要做一个记录,pub 和 sub 一一对应
         String topic = MsgQueue.dagentTopic(machineId);
         mqttClient.pubWithResult(topic, 1, message);
+        onDeploying.remove(appId);
     }
 }

+ 3 - 7
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildDeployService.java

@@ -1,17 +1,13 @@
 package cn.reghao.autodop.dmaster.app.service;
 
-import java.util.List;
-
 /**
  * @author reghao
  * @date 2021-09-17 11:30:16
  */
 public interface BuildDeployService {
     void buildAndDeploy(String appId, boolean isDeploy) throws Exception;
-    default void build(String appId, String commitId) {
-    }
-    void deploy(String buildLogId, String machineId);
+    default void build(String appId, String commitId) {}
+    void deploy(String buildLogId, String machineId) throws Exception;
+    void dlPackage(String filename) throws Exception;
     void downloadPackage(String buildLogId) throws Exception;
-    List<String> currentlyBuilding();
-    List<String> currentlyDeploying();
 }

+ 31 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/impl/BuildDeployServiceImpl.java

@@ -7,8 +7,11 @@ import cn.reghao.autodop.common.msg.rpc.dto.app.PackType;
 import cn.reghao.autodop.common.util.ExceptionUtil;
 import cn.reghao.autodop.common.util.thread.ThreadPoolWrapper;
 import cn.reghao.autodop.dmaster.app.db.query.config.AppConfigQuery;
+import cn.reghao.autodop.dmaster.app.db.query.config.AppDeployConfigQuery;
 import cn.reghao.autodop.dmaster.app.db.query.log.BuildLogQuery;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import cn.reghao.autodop.dmaster.app.model.po.config.build.LocalBuildDir;
 import cn.reghao.autodop.dmaster.app.model.po.log.BuildLog;
 import cn.reghao.autodop.dmaster.app.service.AppBuildSupplier;
 import cn.reghao.autodop.dmaster.app.service.BuildDeployService;
@@ -16,14 +19,13 @@ import cn.reghao.autodop.dmaster.app.service.AppDeployer;
 import cn.reghao.autodop.dmaster.app.service.AppBuilder;
 import cn.reghao.autodop.dmaster.app.service.bd.AppBuildingService;
 import cn.reghao.autodop.dmaster.util.UploadDownload;
-import cn.reghao.autodop.dmaster.spring.HttpRequestUtil;
+import cn.reghao.autodop.dmaster.spring.HttpUtil;
 import cn.reghao.jdkutil.result.ResultStatus;
 import cn.reghao.jdkutil.serializer.JsonConverter;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.paho.client.mqttv3.MqttException;
 import org.springframework.stereotype.Service;
 
-import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.util.List;
@@ -48,10 +50,12 @@ public class BuildDeployServiceImpl implements BuildDeployService {
     private final UploadDownload uploadDownload;
     private final AppConfigQuery appConfigQuery;
     private final BuildLogQuery buildLogQuery;
+    private AppDeployConfigQuery deployConfigQuery;
 
     public BuildDeployServiceImpl(AsyncMqttClient mqttClient, AppDeployer appDeployer,
                                   AppBuildingService buildingService, UploadDownload uploadDownload,
-                                  AppConfigQuery appConfigQuery, BuildLogQuery buildLogQuery) {
+                                  AppConfigQuery appConfigQuery, BuildLogQuery buildLogQuery,
+                                  AppDeployConfigQuery deployConfigQuery) {
         this.threadPool = ThreadPoolWrapper.threadPool("build-deploy");
         this.mqttClient = mqttClient;
         this.buildingService = buildingService;
@@ -59,6 +63,7 @@ public class BuildDeployServiceImpl implements BuildDeployService {
         this.uploadDownload = uploadDownload;
         this.appConfigQuery = appConfigQuery;
         this.buildLogQuery = buildLogQuery;
+        this.deployConfigQuery = deployConfigQuery;
     }
 
     @Override
@@ -112,13 +117,34 @@ public class BuildDeployServiceImpl implements BuildDeployService {
     }
 
     @Override
-    public void deploy(String buildLogId, String machineId) {
+    public void deploy(String buildLogId, String machineId) throws MqttException {
         BuildLog buildLog = buildLogQuery.findById(buildLogId);
         if (buildLog == null) {
             return;
         }
 
         String appId = buildLog.getAppId();
+        AppDeployConfig deployConfig = deployConfigQuery.findByAppIdAndMachineId(appId, machineId);
+        if (deployConfig != null) {
+            appDeployer.deploy(buildLog, deployConfig);
+        }
+    }
+
+    @Override
+    public void dlPackage(String filename) throws Exception {
+        String[] arr = filename.split("_");
+        if (arr.length != 2) {
+            String errMsg = String.format("%s 不合法", filename);
+            throw new Exception(errMsg);
+        }
+
+        String appId = arr[0];
+        String commitId = arr[1];
+        String localPath = String.format("%s%s%s%s%s",
+                LocalBuildDir.packDir, File.separator, appId, File.separator, filename);
+        FileInputStream fileInputStream = new FileInputStream(localPath);
+        //BufferedInputStream bis = new BufferedInputStream(fileInputStream);
+        uploadDownload.download(filename, fileInputStream, HttpUtil.getResponse());
     }
 
     @Override
@@ -144,9 +170,7 @@ public class BuildDeployServiceImpl implements BuildDeployService {
             case zip:
                 String packagePath = buildLog.getPackagePath();
                 String filename = packagePath.substring(packagePath.lastIndexOf(File.separator)+1);
-                FileInputStream fileInputStream = new FileInputStream(packagePath);
-                BufferedInputStream bis = new BufferedInputStream(fileInputStream);
-                uploadDownload.download(filename, bis, HttpRequestUtil.getResponse());
+                dlPackage(filename);
                 break;
             case zipHttp:
                 throw new Exception(String.format("打包类型 %s 暂未实现", packType));
@@ -155,12 +179,10 @@ public class BuildDeployServiceImpl implements BuildDeployService {
         }
     }
 
-    @Override
     public List<String> currentlyBuilding() {
         return List.copyOf(onBuilding);
     }
 
-    @Override
     public List<String> currentlyDeploying() {
         List<DeployParam> list = mqttClient.unreturnedRpc().values().stream()
                 .filter(rpcMsg -> {

+ 0 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/util/buildtool/packer/ZipPack.java

@@ -49,7 +49,6 @@ public class ZipPack implements CodePacker {
             throw new Exception(dst + " 已存在");
         }
         ZipFiles.zip(new File(binfilesDirPath), dst);
-
         return String.format("http://localhost:4020/api/app/bd/dl/%s", filename);
     }
 

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/spring/HttpRequestUtil.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/spring/HttpUtil.java

@@ -11,7 +11,7 @@ import javax.servlet.http.HttpServletResponse;
  * @author reghao
  * @date 2021-06-02 13:16:58
  */
-public class HttpRequestUtil {
+public class HttpUtil {
     /**
      * 获取 query 参数值
      *

+ 9 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/util/db/PageSort.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.util.db;
 
-import cn.reghao.autodop.dmaster.spring.HttpRequestUtil;
+import cn.reghao.autodop.dmaster.spring.HttpUtil;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Sort;
 
@@ -27,19 +27,19 @@ public class PageSort {
      * @date 2021-06-02 下午1:25
      */
     public static PageRequest pageRequest(int pageSize, String orderBy, Sort.Direction sortDirection) {
-        int index = Integer.parseInt(HttpRequestUtil.getParameter("page", String.valueOf(1)));
-        int size = Integer.parseInt(HttpRequestUtil.getParameter("size", String.valueOf(pageSize)));
-        String order =  HttpRequestUtil.getParameter("orderBy", orderBy);
-        String direction = HttpRequestUtil.getParameter("direction", sortDirection.toString());
+        int index = Integer.parseInt(HttpUtil.getParameter("page", String.valueOf(1)));
+        int size = Integer.parseInt(HttpUtil.getParameter("size", String.valueOf(pageSize)));
+        String order =  HttpUtil.getParameter("orderBy", orderBy);
+        String direction = HttpUtil.getParameter("direction", sortDirection.toString());
         Sort sort = Sort.by(sortDirection, order);
         return PageRequest.of(index-1, size, sort);
     }
 
     public static PageRequest pageRequest(String orderBy, Sort.Direction sortDirection) {
-        int index = Integer.parseInt(HttpRequestUtil.getParameter("page", String.valueOf(1)));
-        int size = Integer.parseInt(HttpRequestUtil.getParameter("size", String.valueOf(DEFAULT_PAGE_SIZE)));
-        String order =  HttpRequestUtil.getParameter("orderBy", orderBy);
-        String direction = HttpRequestUtil.getParameter("direction", sortDirection.toString());
+        int index = Integer.parseInt(HttpUtil.getParameter("page", String.valueOf(1)));
+        int size = Integer.parseInt(HttpUtil.getParameter("size", String.valueOf(DEFAULT_PAGE_SIZE)));
+        String order =  HttpUtil.getParameter("orderBy", orderBy);
+        String direction = HttpUtil.getParameter("direction", sortDirection.toString());
         Sort sort = Sort.by(sortDirection, order);
         return PageRequest.of(index-1, size, sort);
     }

+ 15 - 1
dmaster/src/main/resources/templates/app/bd/deploy.html

@@ -24,7 +24,7 @@
                     <td th:text="${item?.packagePath}">包路径</td>
                     <td th:text="${item?.deployBy}">部署用户</td>
                     <td th:text="${item?.deployTime}">部署时间</td>
-                    <td th:text="${item?.deployResult}">部署结果</td>
+                    <td class="deploy-result" th:text="${item?.deployResult}">部署结果</td>
                     <td>
                         <a class="ajax-post"
                            th:href="@{'/api/app/bd/deploy/'+${buildLogId}+'/'+${item.machineId}}">部署</a>
@@ -36,5 +36,19 @@
     </div>
 </div>
 <script th:replace="/common/template :: script"></script>
+<script type="text/javascript">
+    $(".deploy-result").each(function () {
+        var text = $(this).text().trim()
+        if (text === '从未部署') {
+            $(this).css("color", "#4169e1")
+        } else if (text === '部署中') {
+            $(this).css("color", "#e3cf57")
+        } else if (text === '部署成功') {
+            $(this).css("color", "#009688")
+        } else if (text === '部署失败') {
+            $(this).css("color", "#ff0000")
+        }
+    })
+</script>
 </body>
 </html>

+ 9 - 4
dmaster/src/main/resources/templates/app/bd/index.html

@@ -75,7 +75,8 @@
                     <td>
                         <a class="ajax-post" th:href="@{'/api/app/bd/update/'+${item.appId}}">更新</a>
                         <a class="ajax-post" th:href="@{'/api/app/bd/build/'+${item.appId}}">构建</a>
-                        <a class="ajax-get" th:href="@{'/api/app/bd/dl/'+${item.buildLogId}}">下载</a>
+                        <!--<a class="ajax-get" th:href="@{'/api/app/bd/dl1/'+${item.buildLogId}}">下载</a>-->
+                        <a th:href="@{'/api/app/bd/dl1/'+${item.buildLogId}}">下载</a>
                         <a class="open-popup" data-title="应用部署状态" th:attr="data-url=@{'/app/bd/deploy/'+${item.appId}}"
                            data-size="1000,500" href="#">部署状态</a>
                     </td>
@@ -99,10 +100,14 @@
 
     $(".build-result").each(function () {
         var text = $(this).text().trim()
-        if (text === '构建失败') {
-            $(this).css("color", "#ff0000")
-        } else {
+        if (text === '从未构建') {
+            $(this).css("color", "#4169e1")
+        } else if (text === '构建中') {
+            $(this).css("color", "#e3cf57")
+        } else if (text === '构建成功') {
             $(this).css("color", "#009688")
+        } else if (text === '构建失败') {
+            $(this).css("color", "#ff0000")
         }
     })
 </script>