Ver código fonte

添加 AppConfig 删除接口

reghao 3 anos atrás
pai
commit
59945290fa
15 arquivos alterados com 156 adições e 51 exclusões
  1. 8 0
      manager/src/main/java/cn/reghao/devops/manager/app/controller/config/AppConfigController.java
  2. 1 1
      manager/src/main/java/cn/reghao/devops/manager/app/controller/page/BuildDeployPageController.java
  3. 1 1
      manager/src/main/java/cn/reghao/devops/manager/app/controller/page/StatusPageController.java
  4. 1 1
      manager/src/main/java/cn/reghao/devops/manager/app/controller/page/config/AppConfigPageController.java
  5. 4 0
      manager/src/main/java/cn/reghao/devops/manager/app/db/repository/log/BuildLogRepository.java
  6. 1 0
      manager/src/main/java/cn/reghao/devops/manager/app/db/repository/log/DeployLogRepository.java
  7. 32 0
      manager/src/main/java/cn/reghao/devops/manager/app/service/bd/BuildLogService.java
  8. 2 1
      manager/src/main/java/cn/reghao/devops/manager/app/service/bd/DeployStat.java
  9. 29 2
      manager/src/main/java/cn/reghao/devops/manager/app/service/bd/impl/DeployStatImpl.java
  10. 3 0
      manager/src/main/java/cn/reghao/devops/manager/app/service/config/AppConfigService.java
  11. 4 0
      manager/src/main/java/cn/reghao/devops/manager/app/service/config/AppDeployConfigService.java
  12. 27 30
      manager/src/main/java/cn/reghao/devops/manager/app/service/config/impl/AppConfigServiceImpl.java
  13. 27 9
      manager/src/main/java/cn/reghao/devops/manager/app/service/config/impl/AppDeployConfigServiceImpl.java
  14. 9 3
      manager/src/main/java/cn/reghao/devops/manager/monitor/service/AppMonitorServiceImpl.java
  15. 7 3
      manager/src/main/resources/templates/app/config/app/index.html

+ 8 - 0
manager/src/main/java/cn/reghao/devops/manager/app/controller/config/AppConfigController.java

@@ -15,6 +15,8 @@ import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2019-11-27 11:29:43
@@ -67,4 +69,10 @@ public class AppConfigController {
         Result result = appConfigService.clearLocalRepo(appId);
         return WebResult.result(result);
     }
+
+    @PostMapping(value = "/enable", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String deleteAll(@RequestParam(value = "ids") List<String> appIds) {
+        Result result = appConfigService.batchDelete(appIds);
+        return WebResult.result(result);
+    }
 }

+ 1 - 1
manager/src/main/java/cn/reghao/devops/manager/app/controller/page/BuildDeployPageController.java

@@ -62,7 +62,7 @@ public class BuildDeployPageController {
             if (roles.contains("ROLE_FRONTEND")) {
                 type = AppType.npm.name();
             } else {
-                type = AppType.dotnetCore.name();
+                type = AppType.maven.name();
             }
         }
 

+ 1 - 1
manager/src/main/java/cn/reghao/devops/manager/app/controller/page/StatusPageController.java

@@ -49,7 +49,7 @@ public class StatusPageController {
         }
 
         if (type == null) {
-            type = AppType.dotnetCore.name();
+            type = AppType.maven.name();
         }
 
         if (status == null) {

+ 1 - 1
manager/src/main/java/cn/reghao/devops/manager/app/controller/page/config/AppConfigPageController.java

@@ -59,7 +59,7 @@ public class AppConfigPageController {
         }
 
         if (type == null) {
-            type = AppType.dotnetCore.name();
+            type = AppType.maven.name();
         }
 
         if (appName != null) {

+ 4 - 0
manager/src/main/java/cn/reghao/devops/manager/app/db/repository/log/BuildLogRepository.java

@@ -6,11 +6,15 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2020-01-21 14:53:03
  */
 public interface BuildLogRepository extends JpaRepository<BuildLog, String> {
     Page<BuildLog> findByAppConfig(AppConfig appConfig, Pageable pageable);
+    List<BuildLog> findByAppConfig(AppConfig appConfig);
     BuildLog findByBuildLogId(String buildLogId);
+    void deleteByAppConfig(AppConfig appConfig);
 }

+ 1 - 0
manager/src/main/java/cn/reghao/devops/manager/app/db/repository/log/DeployLogRepository.java

@@ -15,4 +15,5 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 public interface DeployLogRepository extends JpaRepository<DeployLog, String>, JpaSpecificationExecutor<DeployLog> {
     Page<DeployLog> findByBuildLogAndMachineHost(BuildLog buildLog, MachineHost machineHost, Pageable pageable);
     Page<DeployLog> findByMachineHostAndCode(MachineHost machineHost, int code, Pageable pageable);
+    void deleteByBuildLog(BuildLog buildLog);
 }

+ 32 - 0
manager/src/main/java/cn/reghao/devops/manager/app/service/bd/BuildLogService.java

@@ -0,0 +1,32 @@
+package cn.reghao.devops.manager.app.service.bd;
+
+import cn.reghao.devops.manager.app.db.repository.log.BuildLogRepository;
+import cn.reghao.devops.manager.app.db.repository.log.DeployLogRepository;
+import cn.reghao.devops.manager.app.model.po.config.AppConfig;
+import cn.reghao.devops.manager.app.model.po.log.BuildLog;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2023-04-21 21:19:04
+ */
+@Service
+public class BuildLogService {
+    private final BuildLogRepository buildLogRepository;
+    private final DeployLogRepository deployLogRepository;
+
+    public BuildLogService(BuildLogRepository buildLogRepository, DeployLogRepository deployLogRepository) {
+        this.buildLogRepository = buildLogRepository;
+        this.deployLogRepository = deployLogRepository;
+    }
+
+    public void delete(AppConfig appConfig) {
+        List<BuildLog> buildLogs = buildLogRepository.findByAppConfig(appConfig);
+        if (!buildLogs.isEmpty()) {
+            buildLogs.forEach(deployLogRepository::deleteByBuildLog);
+            buildLogRepository.deleteAll(buildLogs);
+        }
+    }
+}

+ 2 - 1
manager/src/main/java/cn/reghao/devops/manager/app/service/bd/DeployStat.java

@@ -18,7 +18,7 @@ import java.util.List;
 public interface DeployStat {
     void add(AppDeployConfig appDeployConfig);
     void update(AppDeployConfig appDeployConfig);
-    void delete(AppDeployConfig appDeployConfig);
+    boolean delete(AppDeployConfig appDeployConfig);
     void afterBuild(AppBuilding appBuilding);
     void beforeDeploy(AppBuilding appBuilding, String machineId, String deployBy);
     void afterDeploy(EvtAppStatResult statResult);
@@ -30,4 +30,5 @@ public interface DeployStat {
     List<AppRunning> getAppRunning(String appId);
     boolean isDeploying(String appId, String machineId);
     boolean isRunning(String appId);
+    boolean isRunning(String appId, String machineId);
 }

+ 29 - 2
manager/src/main/java/cn/reghao/devops/manager/app/service/bd/impl/DeployStatImpl.java

@@ -84,10 +84,23 @@ public class DeployStatImpl implements DeployStat {
     }
 
     @Override
-    public void delete(AppDeployConfig appDeployConfig) {
+    public boolean delete(AppDeployConfig appDeployConfig) {
         String appId = appDeployConfig.getAppConfig().getAppId();
+        if (appDeployings.get(appId) == null) {
+            return true;
+        }
+
         String machineId = appDeployConfig.getMachineHost().getMachineId();
-        appDeployings.get(appId).remove(machineId);
+        boolean running = isRunning(appId, machineId);
+        if (!running) {
+            appDeployings.get(appId).remove(machineId);
+            if (appDeployings.get(appId).isEmpty()) {
+                appDeployings.remove(appId);
+                return true;
+            }
+        }
+
+        return false;
     }
 
     @Override
@@ -245,4 +258,18 @@ public class DeployStatImpl implements DeployStat {
         Map<String, AppDeploying> map = appDeployings.get(appId);
         return map != null;
     }
+
+    @Override
+    public boolean isRunning(String appId, String machineId) {
+        Map<String, AppDeploying> map = appDeployings.get(appId);
+        if (map != null) {
+            AppDeploying appDeploying = map.get(machineId);
+            if (appDeploying != null) {
+                int pid = appDeploying.getPid();
+                return pid != -1;
+            }
+        }
+
+        return false;
+    }
 }

+ 3 - 0
manager/src/main/java/cn/reghao/devops/manager/app/service/config/AppConfigService.java

@@ -5,6 +5,8 @@ import cn.reghao.devops.manager.app.model.dto.AppConfigUpdateDto;
 import cn.reghao.devops.manager.app.model.dto.CopyAppDto;
 import cn.reghao.jutil.jdk.result.Result;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2021-09-16 18:28:51
@@ -14,5 +16,6 @@ public interface AppConfigService {
     Result createByCopy(CopyAppDto copyAppDto);
     Result update(AppConfigUpdateDto appConfigUpdateDto);
     Result delete(String appId);
+    Result batchDelete(List<String> appIds);
     Result clearLocalRepo(String appId);
 }

+ 4 - 0
manager/src/main/java/cn/reghao/devops/manager/app/service/config/AppDeployConfigService.java

@@ -1,6 +1,8 @@
 package cn.reghao.devops.manager.app.service.config;
 
 import cn.reghao.devops.manager.app.model.dto.DeployConfigDto;
+import cn.reghao.devops.manager.app.model.po.config.AppConfig;
+import cn.reghao.devops.manager.app.model.po.config.AppDeployConfig;
 import cn.reghao.jutil.jdk.result.Result;
 
 /**
@@ -11,4 +13,6 @@ public interface AppDeployConfigService {
     Result add(DeployConfigDto deployConfigDto);
     Result modify(DeployConfigDto deployConfigDto);
     Result delete(int appDeployConfigId);
+    boolean delete(AppDeployConfig appDeployConfig);
+    boolean delete(AppConfig appConfig);
 }

+ 27 - 30
manager/src/main/java/cn/reghao/devops/manager/app/service/config/impl/AppConfigServiceImpl.java

@@ -10,10 +10,12 @@ import cn.reghao.devops.manager.app.model.dto.CopyAppDto;
 import cn.reghao.devops.common.build.model.LocalBuildDir;
 import cn.reghao.devops.manager.app.model.po.config.AppDeployConfig;
 import cn.reghao.devops.manager.app.model.vo.BuildConfig;
+import cn.reghao.devops.manager.app.service.bd.BuildLogService;
 import cn.reghao.devops.manager.app.service.bd.BuildStat;
 import cn.reghao.devops.manager.app.service.config.AppConfigService;
 import cn.reghao.devops.manager.app.service.bd.DeployStat;
 import cn.reghao.devops.common.build.chain.BuildTools;
+import cn.reghao.devops.manager.app.service.config.AppDeployConfigService;
 import cn.reghao.devops.manager.monitor.service.AppMonitorService;
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.jdk.result.ResultStatus;
@@ -33,21 +35,21 @@ import java.util.List;
 @Service
 public class AppConfigServiceImpl implements AppConfigService {
     private final AppConfigRepository appConfigRepository;
-    private final AppDeployConfigRepository deployConfigRepository;
     private final BuildConfigChecker buildConfigChecker;
     private final BuildStat buildStat;
-    private final DeployStat deployStat;
     private final AppMonitorService appMonitorService;
+    private final AppDeployConfigService deployConfigService;
+    private final BuildLogService buildLogService;
 
-    public AppConfigServiceImpl(AppConfigRepository appConfigRepository, AppDeployConfigRepository deployConfigRepository,
-                                BuildConfigChecker buildConfigChecker, BuildStat buildStat, DeployStat deployStat,
-                                AppMonitorService appMonitorService) {
+    public AppConfigServiceImpl(AppConfigRepository appConfigRepository, BuildConfigChecker buildConfigChecker,
+                                BuildStat buildStat, AppMonitorService appMonitorService,
+                                AppDeployConfigService deployConfigService, BuildLogService buildLogService) {
         this.appConfigRepository = appConfigRepository;
-        this.deployConfigRepository = deployConfigRepository;
         this.buildConfigChecker = buildConfigChecker;
         this.buildStat = buildStat;
-        this.deployStat = deployStat;
         this.appMonitorService = appMonitorService;
+        this.deployConfigService = deployConfigService;
+        this.buildLogService = buildLogService;
     }
 
     @Override
@@ -159,34 +161,18 @@ public class AppConfigServiceImpl implements AppConfigService {
 
     @Override
     public Result delete(String appId) {
-        //return Result.success("暂未实现删除");
-
-        if (deployStat.isRunning(appId)) {
-            return Result.result(ResultStatus.FAIL, appId + " 正在运行中, 不能删除");
-        }
-
-        AppConfig appConfig = appConfigRepository.findByAppId(appId);
-        if (appConfig == null) {
+        AppConfig app = appConfigRepository.findByAppId(appId);
+        if (app == null) {
             return Result.result(ResultStatus.FAIL, appId + " 不存在");
         }
 
-        List<AppDeployConfig> deployConfigs = deployConfigRepository.findByAppConfig(appConfig);
-        if (!deployConfigs.isEmpty()) {
-            deployConfigs.forEach(appDeployConfig -> {
-
-            });
-
-            return Result.result(ResultStatus.FAIL, "应用还有部署配置, 不能删除");
-        }
-
-        delete(appConfig);
-        return Result.result(ResultStatus.SUCCESS);
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    public void delete(AppConfig app) {
         BuildTools.removeApp(app.getAppId());
+        appMonitorService.delete(app);
+        deployConfigService.delete(app);
+        buildLogService.delete(app);
         appConfigRepository.delete(app);
+        buildStat.delete(app);
+        return Result.result(ResultStatus.SUCCESS);
     }
 
     @Override
@@ -201,4 +187,15 @@ public class AppConfigServiceImpl implements AppConfigService {
             return Result.result(ResultStatus.FAIL, e.getMessage());
         }
     }
+
+    @Override
+    public Result batchDelete(List<String> appIds) {
+        for (String appId : appIds) {
+            Result result = delete(appId);
+            if (result.getCode() != 0) {
+                return result;
+            }
+        }
+        return Result.result(ResultStatus.SUCCESS);
+    }
 }

+ 27 - 9
manager/src/main/java/cn/reghao/devops/manager/app/service/config/impl/AppDeployConfigServiceImpl.java

@@ -18,6 +18,8 @@ import cn.reghao.jutil.jdk.serializer.JsonConverter;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2021-09-16 18:28:51
@@ -101,20 +103,36 @@ public class AppDeployConfigServiceImpl implements AppDeployConfigService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Result delete(int appDeployConfigId) {
-        return Result.success("暂未实现");
+        AppDeployConfig appDeployConfig = deployConfigQuery.findById(appDeployConfigId);
+        boolean ret = delete(appDeployConfig);
+        if (!ret) {
+            return Result.result(ResultStatus.FAIL, "应用正在节点上运行, 不能删除其部署配置");
+        }
 
-        // TODO 处理与 AppDeployConfig 关联的数据
-        /*AppDeployConfig appDeployConfig = deployConfigQuery.findById(appDeployConfigId);
-        if (appDeployConfig != null) {
-            if (deployStat.onRunning(appDeployConfig.getAppConfig().getAppId())) {
-                return Result.result(ResultStatus.FAIL, "应用正在当前节点上运行, 不能删除其配置");
-            }
+        return Result.result(ResultStatus.SUCCESS);
+    }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean delete(AppDeployConfig appDeployConfig) {
+        String appId = appDeployConfig.getAppConfig().getAppId();
+        String machineId = appDeployConfig.getMachineHost().getMachineId();
+        if (!deployStat.isRunning(appId, machineId)) {
             deployStat.delete(appDeployConfig);
             deployConfigRepository.delete(appDeployConfig);
-            return Result.result(ResultStatus.SUCCESS);
+            return true;
         }
 
-        return Result.result(ResultStatus.FAIL, "没有删除和 AppDeployConfig 关联的数据");*/
+        return false;
+    }
+
+    @Override
+    public boolean delete(AppConfig appConfig) {
+        List<AppDeployConfig> deployConfigs = deployConfigRepository.findByAppConfig(appConfig);
+        if (!deployConfigs.isEmpty()) {
+            deployConfigs.forEach(this::delete);
+            return true;
+        }
+        return false;
     }
 }

+ 9 - 3
manager/src/main/java/cn/reghao/devops/manager/monitor/service/AppMonitorServiceImpl.java

@@ -3,6 +3,7 @@ package cn.reghao.devops.manager.monitor.service;
 import cn.reghao.devops.manager.app.model.po.config.AppConfig;
 import cn.reghao.devops.manager.monitor.db.crud.AppMonitorCrud;
 import cn.reghao.devops.manager.monitor.db.query.AppMonitorQuery;
+import cn.reghao.devops.manager.monitor.db.repository.AppMonitorRepository;
 import cn.reghao.devops.manager.monitor.model.dto.AppMonitorDto;
 import cn.reghao.devops.manager.monitor.model.dto.AppNotifyDto;
 import cn.reghao.devops.manager.monitor.model.po.AppMonitor;
@@ -19,12 +20,14 @@ import java.util.stream.Collectors;
  */
 @Service
 public class AppMonitorServiceImpl implements AppMonitorService {
+    private final AppMonitorRepository appMonitorRepository;
     private final AppMonitorQuery appMonitorQuery;
     private final AppMonitorCrud appMonitorCrud;
     private final NotifyGroupQuery notifyGroupQuery;
 
-    public AppMonitorServiceImpl(AppMonitorQuery appMonitorQuery, AppMonitorCrud appMonitorCrud,
-                                 NotifyGroupQuery notifyGroupQuery) {
+    public AppMonitorServiceImpl(AppMonitorRepository appMonitorRepository, AppMonitorQuery appMonitorQuery,
+                                 AppMonitorCrud appMonitorCrud, NotifyGroupQuery notifyGroupQuery) {
+        this.appMonitorRepository = appMonitorRepository;
         this.appMonitorQuery = appMonitorQuery;
         this.appMonitorCrud = appMonitorCrud;
         this.notifyGroupQuery = notifyGroupQuery;
@@ -81,6 +84,9 @@ public class AppMonitorServiceImpl implements AppMonitorService {
 
     @Override
     public void delete(AppConfig appConfig) {
-
+        AppMonitor appMonitor = appMonitorRepository.findByAppConfig(appConfig);
+        if (appMonitor != null) {
+            appMonitorRepository.delete(appMonitor);
+        }
     }
 }

+ 7 - 3
manager/src/main/resources/templates/app/config/app/index.html

@@ -51,7 +51,7 @@
                         <div class="btn-group">
                             <button class="layui-btn">启用/禁用<span class="caret"></span></button>
                             <dl class="layui-nav-child layui-anim layui-anim-upbit">
-                                <dd><a class="ajax-status" th:href="@{/api/app/config/app/enable}">启用</a></dd>
+                                <dd><a class="ajax-status" th:href="@{/api/app/config/app/enable}">批量删除</a></dd>
                                 <dd><a class="ajax-status" th:href="@{/api/app/config/app/disable}">禁用</a></dd>
                             </dl>
                         </div>
@@ -78,8 +78,12 @@
                 </thead>
                 <tbody>
                 <tr th:each="item:${list}">
-                    <td><label class="timo-checkbox"><input type="checkbox" th:value="${item.id}">
-                        <i class="layui-icon layui-icon-ok"></i></label></td>
+                    <td>
+                        <label class="timo-checkbox">
+                            <input type="checkbox" th:value="${item.appId}">
+                            <i class="layui-icon layui-icon-ok"></i>
+                        </label>
+                    </td>
                     <td th:text="${item.appName}">应用名</td>
                     <td th:text="${item.appId}">应用 ID</td>
                     <td th:text="${item.repoBranch}">分支</td>