Forráskód Böngészése

处于某种原因(例如应用进程异常结束), AppBuilding 的状态会出现不一致, 因此在 BuildStat 中添加了一个 resetState 方法, 在应用启动时会自动修复状态不一致的 AppBuilding. 并且提供了一个 web 接口, 但该接口未启用

reghao 2 éve
szülő
commit
7d4b8ddd91

+ 13 - 1
manager/src/main/java/cn/reghao/devops/manager/app/controller/BuildDeployController.java

@@ -1,6 +1,7 @@
 package cn.reghao.devops.manager.app.controller;
 
 import cn.reghao.devops.manager.app.service.bd.BuildApp;
+import cn.reghao.devops.manager.app.service.bd.BuildStat;
 import cn.reghao.devops.manager.app.service.bd.DeployApp;
 import cn.reghao.devops.manager.app.service.bd.webhook.WebhookService;
 import cn.reghao.jutil.jdk.result.WebResult;
@@ -23,11 +24,14 @@ import org.springframework.web.bind.annotation.*;
 public class BuildDeployController {
     private final BuildApp buildApp;
     private final DeployApp deployApp;
+    private final BuildStat buildStat;
     private final WebhookService webhookService;
 
-    public BuildDeployController(BuildApp buildApp, DeployApp deployApp, WebhookService webhookService) {
+    public BuildDeployController(BuildApp buildApp, DeployApp deployApp,
+                                 BuildStat buildStat, WebhookService webhookService) {
         this.buildApp = buildApp;
         this.deployApp = deployApp;
+        this.buildStat = buildStat;
         this.webhookService = webhookService;
     }
 
@@ -63,6 +67,14 @@ public class BuildDeployController {
         return WebResult.successWithMsg("部署请求已提交");
     }
 
+    @ApiOperation(value = "重置应用构建状态")
+    @PostMapping(value = "/reset", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String resetState() {
+        // TODO 暂不启用 web 接口, 只在应用启动时执行
+        //buildStat.resetState();
+        return WebResult.successWithMsg("应用构建状态已重置");
+    }
+
     @ApiOperation(value = "webhook 自动构建部署")
     @PostMapping("/hook")
     public String hook(@RequestBody String body) throws Exception {

+ 3 - 0
manager/src/main/java/cn/reghao/devops/manager/app/db/repository/AppBuildingRepository.java

@@ -5,6 +5,8 @@ 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 2023-11-15 21:24:50
@@ -13,4 +15,5 @@ public interface AppBuildingRepository extends JpaRepository<AppBuilding, Intege
     Page<AppBuilding> findAllByAppConfig_EnvAndAppConfig_AppType(String env, String type, Pageable pageable);
     Page<AppBuilding> findAllByAppConfig_AppName(String appName, Pageable pageable);
     AppBuilding findAllByAppConfig_AppId(String appId);
+    Page<AppBuilding> findAllByOnBuildingIsTrue(Pageable pageable);
 }

+ 8 - 0
manager/src/main/java/cn/reghao/devops/manager/app/service/bd/BuildStat.java

@@ -22,4 +22,12 @@ public interface BuildStat {
     AppConfig getAppConfig(String appId);
     AppBuilding getAppBuilding(String appId);
     boolean isBuilding(String appId);
+    /**
+     * 将应用构建状态重置为初始值
+     *
+     * @param
+     * @return
+     * @date 2024-02-21 08:59:59
+     */
+    void resetState();
 }

+ 1 - 5
manager/src/main/java/cn/reghao/devops/manager/app/service/bd/impl/BuildAppImpl.java

@@ -2,8 +2,6 @@ package cn.reghao.devops.manager.app.service.bd.impl;
 
 import cn.reghao.devops.common.build.chain.BuildHandlers;
 import cn.reghao.devops.common.build.model.AppDto;
-import cn.reghao.devops.common.build.model.constant.EnvType;
-import cn.reghao.devops.manager.account.service.UserContext;
 import cn.reghao.devops.manager.app.model.po.AppBuilding;
 import cn.reghao.devops.manager.app.model.po.config.AppConfig;
 import cn.reghao.devops.manager.app.service.PermissionCheck;
@@ -16,7 +14,6 @@ import cn.reghao.devops.common.build.chain.impl.BuildChainResult;
 import cn.reghao.devops.common.build.chain.BuildTools;
 import cn.reghao.devops.common.build.chain.Bootstrap;
 import cn.reghao.devops.common.build.chain.Handler;
-import cn.reghao.devops.manager.account.model.constant.RoleType;
 import cn.reghao.devops.manager.account.model.po.User;
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.jdk.result.ResultStatus;
@@ -26,7 +23,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
-import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutorService;
 
@@ -54,7 +50,7 @@ public class BuildAppImpl implements BuildApp {
     @Override
     public void buildAndDeploy(String appId, boolean deploy) throws Exception {
         if (buildStat.isBuilding(appId)) {
-            log.info("{} 正在异步构建", appId);
+            log.info("{} 正在构建", appId);
             return;
         }
 

+ 18 - 0
manager/src/main/java/cn/reghao/devops/manager/app/service/bd/impl/BuildStatImpl.java

@@ -12,7 +12,9 @@ import cn.reghao.devops.manager.app.service.bd.DeployStat;
 import cn.reghao.devops.manager.app.model.vo.AppBuildingVO;
 import cn.reghao.devops.manager.app.service.bd.BuildStat;
 import cn.reghao.devops.common.build.chain.impl.BuildChainResult;
+import cn.reghao.jutil.jdk.converter.DateTimeConverter;
 import cn.reghao.jutil.jdk.db.PageList;
+import cn.reghao.jutil.jdk.result.ResultStatus;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
@@ -137,4 +139,20 @@ public class BuildStatImpl implements BuildStat {
 
         return appBuilding1.isOnBuilding();
     }
+
+    @Override
+    public void resetState() {
+        PageRequest pageRequest = PageRequest.of(0, 100);
+        Page<AppBuilding> page = buildingRepository.findAllByOnBuildingIsTrue(pageRequest);
+        if (page.hasContent()) {
+            page.stream().forEach(appBuilding -> {
+                appBuilding.setCommitTime(DateTimeConverter.localDateTime(0));
+                appBuilding.setBuildTime(DateTimeConverter.localDateTime(0));
+                appBuilding.setBuildCode(ResultStatus.SUCCESS.getCode());
+                appBuilding.setBuildResult(BuildStatus.neverBuild.getDesc());
+                appBuilding.setOnBuilding(false);
+            });
+            buildingRepository.saveAll(page.getContent());
+        }
+    }
 }

+ 6 - 1
manager/src/main/java/cn/reghao/devops/manager/config/spring/AppLifecycle.java

@@ -6,6 +6,7 @@ import cn.reghao.devops.manager.account.service.FileService;
 import cn.reghao.devops.manager.account.service.RoleService;
 import cn.reghao.devops.manager.app.db.repository.config.build.CompilerConfigRepository;
 import cn.reghao.devops.manager.app.model.po.config.build.CompilerConfig;
+import cn.reghao.devops.manager.app.service.bd.BuildStat;
 import cn.reghao.devops.manager.app.service.config.BuildDirService;
 import cn.reghao.devops.manager.log.Appenders;
 import cn.reghao.devops.manager.log.LoggerConfig;
@@ -38,10 +39,12 @@ public class AppLifecycle implements ApplicationRunner, DisposableBean {
     private final RoleService roleService;
     private final AccountService accountService;
     private final SysMessageRepository sysMessageRepository;
+    private BuildStat buildStat;
 
     public AppLifecycle(BuildDirService buildDirService, MachineService machineService, LogHandler logHandler,
                         CompilerConfigRepository compilerConfigRepository, FileService fileService,
-                        RoleService roleService, AccountService accountService, SysMessageRepository sysMessageRepository) {
+                        RoleService roleService, AccountService accountService, SysMessageRepository sysMessageRepository,
+                        BuildStat buildStat) {
         this.buildDirService = buildDirService;
         this.machineService = machineService;
         this.logHandler = logHandler;
@@ -50,11 +53,13 @@ public class AppLifecycle implements ApplicationRunner, DisposableBean {
         this.roleService = roleService;
         this.accountService = accountService;
         this.sysMessageRepository = sysMessageRepository;
+        this.buildStat = buildStat;
     }
 
     @Override
     public void run(ApplicationArguments args) throws IOException {
         initSys();
+        buildStat.resetState();
         log.info("devops-manager started");
     }
 

+ 7 - 4
manager/src/main/resources/templates/app/bd/index.html

@@ -39,15 +39,18 @@
                     </button>
                 </div>
             </div>
+            <div class="pull-right">
+                <div class="btn-group-right">
+                    <button class="layui-btn">
+                        <i class="fa fa-recycle"><a class="ajax-post" th:href="@{/api/app/bd/reset}">重置</a></i>
+                    </button>
+                </div>
+            </div>
         </div>
         <div class="timo-table-wrap">
             <table class="layui-table timo-table">
                 <thead>
                 <tr>
-                    <!--<th class="timo-table-checkbox">
-                        <label class="timo-checkbox"><input type="checkbox">
-                            <i class="layui-icon layui-icon-ok"></i></label>
-                    </th>-->
                     <th class="sortable" data-field="appName">应用</th>
                     <th class="sortable" data-field="appType">类型</th>
                     <th class="sortable" data-field="repoBranch">分支</th>