reghao 5 лет назад
Родитель
Сommit
38017ad858

+ 14 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildDeployController.java

@@ -2,9 +2,11 @@ package cn.reghao.autodop.dmaster.app.controller;
 
 import cn.reghao.autodop.dmaster.app.constant.EnvType;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployApp;
+import cn.reghao.autodop.dmaster.app.vo.CurrentRunningCommit;
 import cn.reghao.autodop.dmaster.app.vo.SuccessfullyBuildVO;
 import cn.reghao.autodop.dmaster.app.service.BuildService;
 import cn.reghao.autodop.common.utils.data.db.PageList;
+import cn.reghao.autodop.dmaster.app.vo.log.BuildDeployAppVO;
 import cn.reghao.autodop.dmaster.app.vo.log.BuildLogVO;
 import cn.reghao.autodop.dmaster.app.vo.log.CommitLogVO;
 import cn.reghao.autodop.dmaster.app.vo.log.DeployLogVO;
@@ -42,7 +44,7 @@ public class BuildDeployController {
     @PostMapping("/update")
     public String buildAndDeploy(@RequestParam("appId") String appId) throws Exception {
         BuildDeployApp buildDeployApp = buildDeployDispatcher.buildAndDeploy(appId, true);
-        return WebResult.success(buildDeployApp.vo());
+        return WebResult.success(BuildDeployAppVO.of(buildDeployApp));
     }
 
     @ApiOperation(value = "构建应用")
@@ -50,7 +52,7 @@ public class BuildDeployController {
     @PostMapping("/build")
     public String build(@RequestParam("appId") String appId) throws Exception {
         BuildDeployApp buildDeployApp = buildDeployDispatcher.buildAndDeploy(appId, false);
-        return WebResult.success(buildDeployApp.vo());
+        return WebResult.success(BuildDeployAppVO.of(buildDeployApp));
     }
 
     @ApiOperation(value = "部署应用")
@@ -61,17 +63,25 @@ public class BuildDeployController {
     @PostMapping("/deploy")
     public String deploy(@RequestParam("appId") String appId, @RequestParam("commitId") String commitId) {
         BuildDeployApp buildDeployApp = buildDeployDispatcher.deploy(appId, commitId);
-        return WebResult.success(buildDeployApp.vo());
+        return WebResult.success(BuildDeployAppVO.of(buildDeployApp));
     }
 
     @ApiOperation(value = "某个环境需要构建部署的应用")
     @GetMapping("/list")
     public ResponseEntity<String> buildList(@RequestParam("page") int page, @RequestParam("size") int size,
                                             @RequestParam("env") String env) {
-        PageList<BuildDeployApp> pageList = buildService.buildList(page, size, EnvType.valueOf(env).name());
+        PageList<BuildDeployAppVO> pageList = buildService.buildList(page, size, EnvType.valueOf(env).name());
         return ResponseEntity.ok().body(WebResult.success(pageList));
     }
 
+    @GetMapping("/deployed_app")
+    public ResponseEntity<String> deployedApp(@RequestParam("appId") String appId,
+                                              @RequestParam("page") int page, @RequestParam("size") int size) {
+
+        PageList<CurrentRunningCommit> latestDeployedApps = buildService.deployedApp(appId, page, size);
+        return ResponseEntity.ok().body(WebResult.success(latestDeployedApps));
+    }
+
     @ApiOperation(value = "某个应用成功的构建列表")
     @GetMapping("/list/successfully")
     public ResponseEntity<String> successfullyBuilds(@RequestParam("appId") String appId,

+ 2 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/DeployConfig.java

@@ -19,9 +19,10 @@ public class DeployConfig {
     private String packerType;
     private String startHome;
     private String startScript;
-    // docker 启动参数
+    // docker 容器启动参数
     // cn.reghao.autodop.common.dockerc.pojo.Config 序列化为 JSON 后的字符串
     //private Config dockerConfig;
+    // 参照 https://docs.docker.com/engine/api/v1.40/#operation/ContainerCreate 的 reqeust body
     @Lob
     @Column(columnDefinition="text")
     private String dockerConfig;

+ 11 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildDeployApp.java

@@ -31,15 +31,7 @@ public class BuildDeployApp extends BaseEntity {
     private LocalDateTime bdTime;
     // 0 - 成功 1 - 失败
     private int statusCode;
-    private String errDetail;
-
-    public BuildDeployApp vo() {
-        this.setId(null);
-        this.setIsDelete(null);
-        this.setCreateTime(null);
-        this.setUpdateTime(null);
-        return this;
-    }
+    private String result;
 
     public static BuildDeployApp of(AppOrchestration app) {
         BuildDeployApp buildDeployApp = new BuildDeployApp();
@@ -59,7 +51,14 @@ public class BuildDeployApp extends BaseEntity {
         buildDeployApp.setBdTime(buildLog.getBuildTime());
         buildDeployApp.setStatusCode(buildLog.getStatusCode());
         if (buildLog.getStatusCode() != 0) {
-            buildDeployApp.setErrDetail(buildLog.getErrDetail().substring(0, 100));
+            String errDetail = buildLog.getErrDetail();
+            if (errDetail.length() > 100) {
+                buildDeployApp.setResult(errDetail.substring(0, 100));
+            } else {
+                buildDeployApp.setResult(errDetail);
+            }
+        } else {
+            buildDeployApp.setResult("构建成功");
         }
 
         return buildDeployApp;
@@ -80,9 +79,10 @@ public class BuildDeployApp extends BaseEntity {
                 .collect(Collectors.toList());
         if (!deployFailure.isEmpty()) {
             buildDeployApp.setStatusCode(1);
-            buildDeployApp.setErrDetail(deployFailure.toString());
+            buildDeployApp.setResult(deployFailure.toString());
         } else {
             buildDeployApp.setStatusCode(0);
+            buildDeployApp.setResult("部署成功");
         }
 
         return buildDeployApp;

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/DeployLog.java

@@ -21,6 +21,7 @@ public class DeployLog extends BaseDocument {
     private String env;
     private String commitId;
     private String machineId;
+    private LocalDateTime deployTime;
     private long deployCostTime;
     // 0 - 成功 1 - 失败
     private int statusCode;

+ 0 - 66
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/dao/BaseDAO.java

@@ -1,66 +0,0 @@
-package cn.reghao.autodop.dmaster.app.repository.dao;
-
-import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
-import cn.reghao.autodop.common.utils.data.db.PageList;
-import cn.reghao.autodop.dmaster.app.vo.log.CommitLogVO;
-import org.hibernate.Session;
-import org.hibernate.query.Query;
-import org.springframework.stereotype.Repository;
-
-import javax.persistence.EntityManager;
-import javax.persistence.criteria.*;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2020-03-02 16:45:12
- */
-@Deprecated
-@Repository
-public class BaseDAO {
-    private EntityManager em;
-
-    public BaseDAO(EntityManager em) {
-        this.em = em;
-    }
-
-    public PageList<CommitLogVO> findCommitLogsByEnv(String env, int page, int size) {
-        Session session = (Session) em.getDelegate();
-        CriteriaBuilder cb = session.getCriteriaBuilder();
-
-        /*CriteriaQuery<Long> countCriteria = cb.createQuery(Long.class);
-        Root<BuildLog> root = countCriteria.from(BuildLog.class);
-        countCriteria.groupBy(root.get("commitLog"));
-        countCriteria.where(cb.equal(root.get("env"), "test"));
-        countCriteria.select(cb.count(root));
-        Query<Long> query = session.createQuery(countCriteria);
-        Long count = query.getSingleResult();*/
-
-        CriteriaQuery<BuildLog> criteria = cb.createQuery(BuildLog.class);
-        Root<BuildLog> root = criteria.from(BuildLog.class);
-        criteria.groupBy(root.get("commitLog"));
-        criteria.where(cb.equal(root.get("env"), "test"));
-        criteria.orderBy(cb.desc(root.get("createTime")));
-        cb.count(root.get("id"));
-
-        Query<BuildLog> query = session.createQuery(criteria);
-        int totalSize = query.getResultList().size();
-
-        query.setFirstResult(0);
-        query.setMaxResults(size);
-        // TODO 分页
-        List<BuildLog> result = query.getResultList();
-        PageList<CommitLogVO> pageList = new PageList<>();
-        return pageList;
-
-        // TODO 使用 try-with-resource 会关闭共享的 Session
-        /*try (Session session = (Session) em.getDelegate()) {
-        }*/
-    }
-
-    private int totalSize(CriteriaQuery<Long> criteria) {
-        Session session = (Session) em.getDelegate();
-        Query<Long> query = session.createQuery(criteria);
-        return 0;
-    }
-}

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/BuildDeployAppRepository.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/BuildDeployAppRepository.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.app.repository;
+package cn.reghao.autodop.dmaster.app.repository.log;
 
 import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployApp;
 import org.springframework.data.domain.Page;

+ 40 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildService.java

@@ -1,19 +1,26 @@
 package cn.reghao.autodop.dmaster.app.service;
 
+import cn.reghao.autodop.dmaster.app.cache.BuildDeployCache;
+import cn.reghao.autodop.dmaster.app.entity.config.orchestration.AppOrchestration;
+import cn.reghao.autodop.dmaster.app.entity.deploy.DeployConfig;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployApp;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
+import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 import cn.reghao.autodop.dmaster.app.repository.log.BuildLogRepository;
 import cn.reghao.autodop.dmaster.app.repository.log.CommitLogRepository;
 import cn.reghao.autodop.dmaster.app.repository.log.DeployLogRepository;
 import cn.reghao.autodop.dmaster.app.entity.log.CommitLog;
 import cn.reghao.autodop.common.utils.data.db.PageList;
 import cn.reghao.autodop.dmaster.app.service.crud.BuildDeployAppCrudService;
+import cn.reghao.autodop.dmaster.app.vo.CurrentRunningCommit;
 import cn.reghao.autodop.dmaster.app.vo.SuccessfullyBuildVO;
 import cn.reghao.autodop.dmaster.app.vo.log.*;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.stream.Collectors;
 
 /**
@@ -22,30 +29,32 @@ import java.util.stream.Collectors;
  */
 @Service
 public class BuildService {
+    private BuildDeployCache cache;
     private BuildDeployAppCrudService buildDeployAppCrudService;
     private CommitLogRepository commitLogRepository;
     private BuildLogRepository buildLogRepository;
     private DeployLogRepository deployLogRepository;
 
-    public BuildService(BuildDeployAppCrudService buildDeployAppCrudService,
+    public BuildService(BuildDeployCache cache,
+                        BuildDeployAppCrudService buildDeployAppCrudService,
                         CommitLogRepository commitLogRepository,
                         BuildLogRepository buildLogRepository,
                         DeployLogRepository deployLogRepository) {
+        this.cache = cache;
         this.buildDeployAppCrudService = buildDeployAppCrudService;
         this.commitLogRepository = commitLogRepository;
         this.buildLogRepository = buildLogRepository;
         this.deployLogRepository = deployLogRepository;
     }
 
-    public PageList<BuildDeployApp> buildList(int page, int size, String env) {
+    public PageList<BuildDeployAppVO> buildList(int page, int size, String env) {
         PageList<BuildDeployApp> pageList = buildDeployAppCrudService.getByPage(page, size);
-        PageList<BuildDeployApp> vos = new PageList<>();
+        PageList<BuildDeployAppVO> vos = new PageList<>();
         vos.setTotalPages(pageList.getTotalPages());
         vos.setTotalSize(pageList.getTotalSize());
         vos.setPageSize(vos.getPageSize());
         vos.setHasNext(pageList.isHasNext());
-        vos.setList(pageList.getList().stream().map(BuildDeployApp::vo).collect(Collectors.toList()));
-
+        vos.setList(pageList.getList().stream().map(BuildDeployAppVO::of).collect(Collectors.toList()));
         return vos;
     }
 
@@ -114,4 +123,30 @@ public class BuildService {
         pageList.setList(deployLogs.stream().map(DeployLogVO::from).collect(Collectors.toList()));*/
         return pageList;
     }
+
+    public PageList<CurrentRunningCommit> deployedApp(String appId, int page, int size) {
+        PageRequest pageRequest =
+                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "createTime"));
+        Page<DeployLog> deployLogs = deployLogRepository.findDeployLogByAppId(appId, pageRequest);
+        List<CurrentRunningCommit> apps = deployLogs.getContent().stream()
+                .map(deployLog -> new CurrentRunningCommit(deployLog.getMachineId(), deployLog.getCommitId(), ""))
+                .collect(Collectors.toList());
+
+        PageList<CurrentRunningCommit> pageList = new PageList<>();
+        AppOrchestration app = cache.findByAppId(appId);
+        if (app == null) {
+            return pageList;
+        }
+
+        List<DeployConfig> deployConfigs = app.getDeployConfigs();
+        pageList.setPageSize(deployConfigs.size());
+        pageList.setTotalSize(deployConfigs.size());
+        pageList.setTotalPages(1);
+        pageList.setHasNext(false);
+        pageList.setList(apps);
+        /*pageList.setList(deployConfigs.stream()
+                .map(deployConfig -> new LatestDeployedApp(deployConfig.getMachineId()))
+                .collect(Collectors.toList()));*/
+        return pageList;
+    }
 }

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

@@ -5,7 +5,7 @@ import cn.reghao.autodop.common.dockerc.exception.DockerException;
 import cn.reghao.autodop.dmaster.app.cache.BuildDeployCache;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployApp;
 import cn.reghao.autodop.dmaster.app.entity.config.orchestration.AppOrchestration;
-import cn.reghao.autodop.dmaster.app.repository.BuildDeployAppRepository;
+import cn.reghao.autodop.dmaster.app.repository.log.BuildDeployAppRepository;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Service;

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

@@ -3,7 +3,7 @@ package cn.reghao.autodop.dmaster.app.service.crud;
 import cn.reghao.autodop.common.utils.data.db.CrudOps;
 import cn.reghao.autodop.common.utils.data.db.PageList;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployApp;
-import cn.reghao.autodop.dmaster.app.repository.BuildDeployAppRepository;
+import cn.reghao.autodop.dmaster.app.repository.log.BuildDeployAppRepository;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Sort;

+ 8 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/deploy/AppDeployer.java

@@ -67,14 +67,10 @@ public class AppDeployer {
         deployResult.setAppId(buildLog.getAppId());
         deployResult.setEnv(buildLog.getEnv());
         deployResult.setCommitId(buildLog.getCommitId());
-        deployResult.setDeployTime(LocalDateTime.now());
+        LocalDateTime deployTime = LocalDateTime.now();
+        deployResult.setDeployTime(deployTime);
         List<DeployLog> deployLogs = new ArrayList<>();
         for (Map.Entry<String, Future<RPCResult>> entry : futureMap.entrySet()) {
-            DeployLog deployLog = new DeployLog();
-            deployLog.setAppId(buildLog.getAppId());
-            deployLog.setEnv(buildLog.getEnv());
-            deployLog.setCommitId(buildLog.getCommitId());
-
             Future<RPCResult> future = entry.getValue();
             while (!future.isDone() && !future.isCancelled()) {
                 // 休眠等待异步任务结束
@@ -85,9 +81,15 @@ public class AppDeployer {
                 }
             }
 
+            DeployLog deployLog = new DeployLog();
+            deployLog.setAppId(buildLog.getAppId());
+            deployLog.setEnv(buildLog.getEnv());
+            deployLog.setCommitId(buildLog.getCommitId());
+            deployLog.setMachineId(entry.getKey());
             try {
                 RPCResult rpcResult = future.get();
                 if (rpcResult != null) {
+                    deployLog.setDeployTime(deployTime);
                     deployLog.setStatusCode(rpcResult.getStatusCode());
                     deployLog.setErrDetail(rpcResult.getResult());
                 } else {

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/log/BuildDeployLogService.java

@@ -50,5 +50,6 @@ public class BuildDeployLogService {
     @Transactional(rollbackFor = {Exception.class})
     public void saveDeployLog(DeployLog deployLog) {
         deployLogRepository.save(deployLog);
+        //buildDeployAppCrudService.addOrUpdate(BuildDeployApp.of(deployLog));
     }
 }

+ 24 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/CurrentRunningCommit.java

@@ -0,0 +1,24 @@
+package cn.reghao.autodop.dmaster.app.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 应用当前运行的版本
+ *
+ * @author reghao
+ * @date 2021-02-20 15:16:44
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class CurrentRunningCommit {
+    private String machineId;
+    private String commitId;
+    private String deployTime;
+
+    public CurrentRunningCommit(String machineId) {
+        this.machineId = machineId;
+    }
+}

+ 36 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/log/BuildDeployAppVO.java

@@ -0,0 +1,36 @@
+package cn.reghao.autodop.dmaster.app.vo.log;
+
+import cn.reghao.autodop.common.utils.DatetimeConverter;
+import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployApp;
+import lombok.Data;
+
+/**
+ * @author reghao
+ * @date 2021-02-20 13:41:04
+ */
+@Data
+public class BuildDeployAppVO {
+    private String appId;
+    private String env;
+    private String commitId;
+    private String bdType;
+    private String bdTime;
+    // 0 - 成功 1 - 失败
+    private int statusCode;
+    private String result;
+
+    public static BuildDeployAppVO of(BuildDeployApp buildDeployApp) {
+        BuildDeployAppVO vo = new BuildDeployAppVO();
+        vo.setAppId(buildDeployApp.getAppId());
+        vo.setEnv(buildDeployApp.getEnv());
+        vo.setCommitId(buildDeployApp.getCommitId());
+        vo.setBdType(buildDeployApp.getBdType());
+        if (buildDeployApp.getBdTime() != null) {
+            vo.setBdTime(DatetimeConverter.format(buildDeployApp.getBdTime()));
+        }
+
+        vo.setStatusCode(buildDeployApp.getStatusCode());
+        vo.setResult(buildDeployApp.getResult());
+        return vo;
+    }
+}

+ 3 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/exception/ExceptionUtil.java

@@ -6,6 +6,9 @@ package cn.reghao.autodop.dmaster.common.exception;
  */
 public class ExceptionUtil {
     public static String errorMsg(Exception e) {
+        // TODO 记录栈跟踪
+        String stackTrace = stackTrace(e);
+
         StringBuilder sb = new StringBuilder();
         sb.append(e.getMessage());
         Throwable throwable = e.getCause();

+ 1 - 1
scripts/test1.json

@@ -1,7 +1,7 @@
 {
   "env":[
     "ASPNETCORE_ENVIRONMENT=Staging",
-    "ASPNETCORE_URLS=http://192.168.0.172:8002;https://192.168.0.172:8102"
+    "ASPNETCORE_URLS=http://192.168.0.111:8002;https://192.168.0.111:8102"
   ],
   "hostConfig":{
     "networkMode":"host",