Ver código fonte

milestone-test

测试环境运行版本
reghao 5 anos atrás
pai
commit
65820e659b
19 arquivos alterados com 223 adições e 121 exclusões
  1. 10 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppBuildController.java
  2. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/BuildStage.java
  3. 6 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildDeployLog.java
  4. 3 22
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/DeployLog.java
  5. 40 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/DeployResult.java
  6. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/DeployLogRepository.java
  7. 56 26
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/LogRepository.java
  8. 20 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppBuildService.java
  9. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppBuildPipeline.java
  10. 9 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppIntegrate.java
  11. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/BuildDispatcher.java
  12. 10 27
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/deploy/AppDeployer.java
  13. 7 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/log/LogConsumer.java
  14. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/packer/DockerPack.java
  15. 34 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/log/BuildLogVO.java
  16. 15 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/log/DeployLogVO.java
  17. 1 1
      dmaster/src/main/resources/application-test.yml
  18. 2 2
      scripts/build-and-deploy.sh
  19. 0 1
      scripts/test.json

+ 10 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppBuildController.java

@@ -2,10 +2,12 @@ package cn.reghao.autodop.dmaster.app.controller;
 
 import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployLog;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
+import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 import cn.reghao.autodop.dmaster.app.service.AppBuildService;
 import cn.reghao.autodop.dmaster.app.service.tools.updater.CommitLog;
 import cn.reghao.autodop.dmaster.app.vo.AppToBuild;
 import cn.reghao.autodop.dmaster.app.vo.PageList;
+import cn.reghao.autodop.dmaster.app.vo.log.BuildLogVO;
 import cn.reghao.autodop.dmaster.app.vo.result.BuildResult;
 import cn.reghao.autodop.dmaster.app.service.OssService;
 import cn.reghao.autodop.dmaster.app.service.build.BuildDispatcher;
@@ -148,7 +150,14 @@ public class AppBuildController {
     @ApiOperation(value = "")
     @GetMapping("/build/buildlog")
     public ResponseEntity<String> buildLog() {
-        List<BuildLog> res = buildService.buildLogs();
+        List<BuildLogVO> res = buildService.buildLogs();
+        return ResponseEntity.ok().body(WebResult.success(res));
+    }
+
+    @ApiOperation(value = "")
+    @GetMapping("/deploy/deploylog")
+    public ResponseEntity<String> deployLog() {
+        List<DeployLog> res = buildService.deployLogs();
         return ResponseEntity.ok().body(WebResult.success(res));
     }
 }

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/BuildDeployStage.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/BuildStage.java

@@ -1,12 +1,12 @@
 package cn.reghao.autodop.dmaster.app.entity.constant;
 
 /**
- * 应用构建部署时所处的阶段
+ * 应用构建时所处的阶段
  * TODO 后期使用状态机
  *
  * @author reghao
  * @date 2019-10-18 14:31:29
  */
-public enum BuildDeployStage {
-    update, compile, pack, build, deploy
+public enum BuildStage {
+    update, compile, pack, build
 }

+ 6 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildDeployLog.java

@@ -8,6 +8,7 @@ import lombok.Data;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 应用构建部署日志
@@ -19,11 +20,11 @@ import java.util.List;
 public class BuildDeployLog {
     private BuildLog buildLog;
     // 一个应用可能会部署到多台主机
-    private List<DeployLog> deployLogs;
+    private DeployLog deployLog;
 
-    public BuildDeployLog(BuildLog buildLog, List<DeployLog> deployLogs) {
+    public BuildDeployLog(BuildLog buildLog, DeployLog deployLog) {
         this.buildLog = buildLog;
-        this.deployLogs = deployLogs;
+        this.deployLog = deployLog;
     }
 
     /**
@@ -69,7 +70,7 @@ public class BuildDeployLog {
         }
 
         List<DeployStatus> list = new ArrayList<>();
-        this.deployLogs.forEach(deployLog -> {
+        /*this.deployLogs.forEach((host, deployLog) -> {
             DeployStatus deployStatus = new DeployStatus();
             deployStatus.setHost(deployLog.getHost());
             deployStatus.setDeployTime(deployLog.getDeployTime());
@@ -79,7 +80,7 @@ public class BuildDeployLog {
                 deployStatus.setMsg("部署失败");
             }
             list.add(deployStatus);
-        });
+        });*/
         deployResult.setDeployStatus(list);
         return deployResult;
     }

+ 3 - 22
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/DeployLog.java

@@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 
 import javax.persistence.*;
-import java.util.Date;
+import java.util.Set;
 
 /**
  * 应用部署日志
@@ -19,28 +19,9 @@ import java.util.Date;
 @EqualsAndHashCode(callSuper = false)
 @Entity
 public class DeployLog extends BaseEntity {
-    // 0 - 部署成功 1 - 部署失败
-    private int code;
-    private String msg;
-
     @ManyToOne(cascade = CascadeType.DETACH)
     @JoinColumn(name = "build_log_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
     private BuildLog buildLog;
-    private String host;
-    private Date deployTime;
-
-    public DeployLog(BuildLog buildLog, String host) {
-        this.buildLog = buildLog;
-        this.host = host;
-        this.deployTime = new Date();
-        this.code = 0;
-    }
-
-    public DeployLog(BuildLog buildLog, String host, String msg) {
-        this.buildLog = buildLog;
-        this.host = host;
-        this.deployTime = new Date();
-        this.code = 1;
-        this.msg = msg;
-    }
+    @ElementCollection(fetch = FetchType.EAGER)
+    private Set<DeployResult> deployResults;
 }

+ 40 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/DeployResult.java

@@ -0,0 +1,40 @@
+package cn.reghao.autodop.dmaster.app.entity.log;
+
+import lombok.Data;
+
+import javax.persistence.Embeddable;
+import java.util.Date;
+
+/**
+ * 应用部署到远程主机的结果
+ *
+ * @author reghao
+ * @date 2020-05-20 17:08:44
+ */
+@Data
+@Embeddable
+public class DeployResult {
+    // 0 - 部署成功 1 - 部署失败
+    private int code;
+    private String msg;
+    private String host;
+    private Date deployTime;
+
+    public static DeployResult success(String host) {
+        DeployResult deployResult = new DeployResult();
+        deployResult.setCode(0);
+        deployResult.setMsg("部署成功");
+        deployResult.setHost(host);
+        deployResult.setDeployTime(new Date());
+        return deployResult;
+    }
+
+    public static DeployResult fail(String host, String msg) {
+        DeployResult deployResult = new DeployResult();
+        deployResult.setCode(1);
+        deployResult.setMsg(msg);
+        deployResult.setHost(host);
+        deployResult.setDeployTime(new Date());
+        return deployResult;
+    }
+}

+ 2 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/DeployLogRepository.java

@@ -1,5 +1,6 @@
 package cn.reghao.autodop.dmaster.app.repository.log;
 
+import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
 import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 import org.springframework.data.jpa.repository.JpaRepository;
 
@@ -8,4 +9,5 @@ import org.springframework.data.jpa.repository.JpaRepository;
  * @date 2020-01-21 14:53:03
  */
 public interface DeployLogRepository extends JpaRepository<DeployLog, Long> {
+    DeployLog findByBuildLog(BuildLog buildLog);
 }

+ 56 - 26
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/LogRepository.java

@@ -1,22 +1,22 @@
 package cn.reghao.autodop.dmaster.app.repository.log;
 
 import cn.reghao.autodop.dmaster.app.entity.deploy.DeployedApp;
-import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployLog;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
 import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.repository.deploy.DeployedAppRepository;
 import cn.reghao.autodop.dmaster.app.repository.orchestration.AppOrchestrationRepository;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 
 /**
  * @author reghao
  * @date 2020-05-26 17:35:26
  */
+@Slf4j
 @Repository
 public class LogRepository {
     private BuildLogRepository buildLogRepository;
@@ -34,43 +34,73 @@ public class LogRepository {
         this.appRepository = appRepository;
     }
 
+    @Transactional
     public void saveBuildLog(BuildLog buildLog) {
         String repo = buildLog.getCommitLog().getRemoteRepoUrl();
         String commitId = buildLog.getCommitLog().getCommitId();
-        // 构建日志存在时不保存
+        // 构建日志存在且状态正确时不保存
         BuildLog entity = buildLogRepository.findByCommitLogRemoteRepoUrlAndCommitLogCommitId(repo, commitId);
-        if (entity == null) {
-            AppOrchestration app = buildLog.getApp();
-            Optional<AppOrchestration> appEntity = appRepository.findById(app.getId());
-            if (appEntity.isPresent()) {
-                buildLog.setApp(appEntity.get());
-                buildLogRepository.save(buildLog);
-            }
+        if (entity != null) {
+            buildLog.setId(entity.getId());
+            buildLog.setCreateTime(entity.getCreateTime());
+            buildLog.setUpdateTime(new Date());
+            saveOrUpdateBuildLog(buildLog);
+        } else {
+            saveOrUpdateBuildLog(buildLog);
         }
     }
 
-    public void saveDeployLogs(List<DeployLog> deployLogs) {
-        deployLogRepository.saveAll(deployLogs);
+    private void saveOrUpdateBuildLog(BuildLog buildLog) {
+        AppOrchestration app = buildLog.getApp();
+        Optional<AppOrchestration> appEntity = appRepository.findById(app.getId());
+        if (appEntity.isPresent()) {
+            buildLog.setApp(appEntity.get());
+            buildLogRepository.save(buildLog);
+        } else {
+            log.error("构建日志关联的应用不存在...");
+        }
     }
 
-    public void saveDeployedApp(BuildDeployLog buildDeployLog) {
-        AppOrchestration app = buildDeployLog.getBuildLog().getApp();
-        DeployedApp deployedApp = deployedAppRepository.findByApp(app);
+    @Transactional
+    public void saveOrUpdateDeployLog(DeployLog deployLog) {
+        BuildLog buildLog = deployLog.getBuildLog();
+        String repo = buildLog.getCommitLog().getRemoteRepoUrl();
+        String commitId = buildLog.getCommitLog().getCommitId();
+        BuildLog entity = buildLogRepository.findByCommitLogRemoteRepoUrlAndCommitLogCommitId(repo, commitId);
+        if (entity == null) {
+            log.error("部署关联的构建不存在...");
+            return;
+        }
+
+        DeployLog deployLogEntity = deployLogRepository.findByBuildLog(entity);
+        if (deployLogEntity == null) {
+            deployLogRepository.save(deployLog);
+            saveOrUpdateDeployedApp(buildLog);
+        } else {
+            deployLogEntity.setDeployResults(deployLog.getDeployResults());
+            deployLogEntity.setUpdateTime(new Date());
+            deployLogRepository.save(deployLogEntity);
+        }
+    }
+
+    private void saveOrUpdateDeployedApp(BuildLog buildLog) {
+        AppOrchestration app = buildLog.getApp();
+        DeployedApp entity = deployedAppRepository.findByApp(app);
         // TODO 新增或更新
-        if (deployedApp == null) {
-            deployedApp = deployedApp(buildDeployLog);
-            deployedAppRepository.save(deployedApp);
+        if (entity == null) {
+            entity = deployedApp(buildLog);
+            deployedAppRepository.save(entity);
         } else {
-            deployedApp.setCommitId(buildDeployLog.getBuildLog().getCommitLog().getCommitId());
-            deployedApp.setUpdateTime(new Date());
-            deployedAppRepository.save(deployedApp);
+            entity.setCommitId(buildLog.getCommitLog().getCommitId());
+            entity.setUpdateTime(new Date());
+            deployedAppRepository.save(entity);
         }
     }
 
-    private DeployedApp deployedApp(BuildDeployLog buildDeployLog) {
+    private DeployedApp deployedApp(BuildLog buildLog) {
         DeployedApp deployedApp = new DeployedApp();
-        deployedApp.setApp(buildDeployLog.getBuildLog().getApp());
-        deployedApp.setCommitId(buildDeployLog.getBuildLog().getCommitLog().getCommitId());
+        deployedApp.setApp(buildLog.getApp());
+        deployedApp.setCommitId(buildLog.getCommitLog().getCommitId());
         return deployedApp;
     }
 }

+ 20 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppBuildService.java

@@ -1,16 +1,17 @@
 package cn.reghao.autodop.dmaster.app.service;
 
-import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployLog;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
+import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.repository.log.BuildLogRepository;
+import cn.reghao.autodop.dmaster.app.repository.log.DeployLogRepository;
 import cn.reghao.autodop.dmaster.app.repository.orchestration.*;
 import cn.reghao.autodop.dmaster.app.service.tools.updater.CommitLog;
 import cn.reghao.autodop.dmaster.app.vo.AppToBuild;
+import cn.reghao.autodop.dmaster.app.vo.log.BuildLogVO;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -21,14 +22,18 @@ import java.util.stream.Collectors;
  */
 @Service
 public class AppBuildService {
+    private BuildLogRepository buildLogRepository;
+    private DeployLogRepository deployLogRepository;
     private AppOrchestrationRepository appRepository;
-    private BuildLogRepository logRepository;
     private AppDAO appDAO;
 
-    public AppBuildService(AppOrchestrationRepository appRepository, BuildLogRepository logRepository,
+    public AppBuildService(BuildLogRepository buildLogRepository,
+                           DeployLogRepository deployLogRepository,
+                           AppOrchestrationRepository appRepository,
                            AppDAO appDAO) {
+        this.buildLogRepository = buildLogRepository;
+        this.deployLogRepository = deployLogRepository;
         this.appRepository = appRepository;
-        this.logRepository = logRepository;
         this.appDAO = appDAO;
     }
 
@@ -56,14 +61,20 @@ public class AppBuildService {
     }
 
     public List<CommitLog> commitLogs() {
-        List<CommitLog> commitLogs = logRepository.findAll().stream()
+        return buildLogRepository.findAll().stream()
                 .map(BuildLog::getCommitLog)
                 .collect(Collectors.toList());
+    }
 
-        return commitLogs;
+    public List<BuildLogVO> buildLogs() {
+        List<BuildLog> buildLogs = buildLogRepository.findAll();
+        return buildLogs.stream()
+                .map(BuildLogVO::of)
+                .collect(Collectors.toList());
     }
 
-    public List<BuildLog> buildLogs() {
-        return null;
+    public List<DeployLog> deployLogs() {
+        List<DeployLog> deployLogs = deployLogRepository.findAll();
+        return deployLogs;
     }
 }

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

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.service.build;
 
-import cn.reghao.autodop.dmaster.app.entity.constant.BuildDeployStage;
+import cn.reghao.autodop.dmaster.app.entity.constant.BuildStage;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployLog;
 
 import java.util.concurrent.Callable;
@@ -56,7 +56,7 @@ public class AppBuildPipeline implements Callable<BuildDeployLog> {
 
     private void buildSuccessfully() {
         BuildDeployLog buildDeployLog = appIntegrate.log();
-        buildDeployLog.getBuildLog().setStage(BuildDeployStage.build.name());
+        buildDeployLog.getBuildLog().setStage(BuildStage.build.name());
         buildDeployLog.getBuildLog().setCode(0);
         buildDeployLog.getBuildLog().setMsg("构建成功");
     }

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

@@ -4,7 +4,7 @@ import cn.reghao.autodop.dmaster.app.entity.build.AppBuild;
 import cn.reghao.autodop.dmaster.app.entity.build.compile.AppCompile;
 import cn.reghao.autodop.dmaster.app.entity.build.pack.AppPack;
 import cn.reghao.autodop.dmaster.app.entity.build.update.AppUpdate;
-import cn.reghao.autodop.dmaster.app.entity.constant.BuildDeployStage;
+import cn.reghao.autodop.dmaster.app.entity.constant.BuildStage;
 import cn.reghao.autodop.dmaster.app.entity.constant.CompilerType;
 import cn.reghao.autodop.common.deploy.PackerType;
 import cn.reghao.autodop.dmaster.app.entity.constant.RepoType;
@@ -25,7 +25,7 @@ import cn.reghao.autodop.dmaster.common.config.SysConfig;
 import lombok.extern.slf4j.Slf4j;
 
 import java.util.Date;
-import java.util.List;
+import java.util.Map;
 
 /**
  * 应用构建部署,根据 AppOrchestration 的值完成应用构建和部署的配置
@@ -44,7 +44,7 @@ public class AppIntegrate {
     // 远程仓库最近一次提交的信息
     private CommitLog lastCommitLog;
     private BuildLog buildLog;
-    private List<DeployLog> deployLogs;
+    private DeployLog deployLog;
     private BuildDeployLog buildDeployLog;
 
     private CodeUpdater codeUpdater;
@@ -164,14 +164,14 @@ public class AppIntegrate {
                 BuilderUtil.copyToCompileDir(appLocalRepo, app);
                 return true;
             } else {
-                buildLog.setStage(BuildDeployStage.update.name());
+                buildLog.setStage(BuildStage.update.name());
                 buildLog.setCode(0);
                 buildLog.setMsg("应用代码未更新");
                 return false;
             }
         } catch (Exception e) {
             e.printStackTrace();
-            buildLog.setStage(BuildDeployStage.update.name());
+            buildLog.setStage(BuildStage.update.name());
             buildLog.setCode(1);
             buildLog.setMsg(e.getMessage());
             return false;
@@ -229,7 +229,7 @@ public class AppIntegrate {
             return true;
         } catch (Exception e) {
             e.printStackTrace();
-            buildLog.setStage(BuildDeployStage.compile.name());
+            buildLog.setStage(BuildStage.compile.name());
             buildLog.setCode(1);
             buildLog.setMsg(e.getMessage());
             return false;
@@ -245,7 +245,7 @@ public class AppIntegrate {
             return true;
         } catch (Exception e) {
             e.printStackTrace();
-            buildLog.setStage(BuildDeployStage.pack.name());
+            buildLog.setStage(BuildStage.pack.name());
             buildLog.setCode(1);
             // TODO 提取错误信息
             buildLog.setMsg(e.getMessage());
@@ -254,7 +254,7 @@ public class AppIntegrate {
     }
 
     public void deploy() {
-        deployLogs = AppDeployer.deploy(app, buildLog);
+        deployLog = AppDeployer.deploy(app, buildLog);
     }
 
     /**
@@ -265,7 +265,7 @@ public class AppIntegrate {
      * @date 2020-05-15 上午11:31
      */
     public BuildDeployLog log() {
-        buildDeployLog = new BuildDeployLog(buildLog, deployLogs);
+        buildDeployLog = new BuildDeployLog(buildLog, deployLog);
         return buildDeployLog;
     }
 }

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

@@ -84,8 +84,8 @@ public class BuildDispatcher {
         }
 
         // 使用一个单独的线程来持久化构建过程产生的日志,有一定的延时
-        results.forEach(buildLog -> {
-            logConsumer.addLog(buildLog);
+        results.forEach(buildDeployLog -> {
+            logConsumer.addLog(buildDeployLog);
         });
 
         return results;

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

@@ -3,16 +3,15 @@ package cn.reghao.autodop.dmaster.app.service.deploy;
 import cn.reghao.autodop.common.deploy.DeployConfig;
 import cn.reghao.autodop.common.notification.DingNotify;
 import cn.reghao.autodop.common.notification.Notify;
-import cn.reghao.autodop.common.utils.JsonUtil;
 import cn.reghao.autodop.dmaster.app.entity.build.pack.AppPack;
 import cn.reghao.autodop.dmaster.app.entity.constant.NotifierType;
 import cn.reghao.autodop.dmaster.app.entity.deploy.AppDeploy;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
 import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
+import cn.reghao.autodop.dmaster.app.entity.log.DeployResult;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.Notification;
 import cn.reghao.autodop.dmaster.app.thread.ThreadPoolWrapper;
-import lombok.Data;
 
 import java.util.*;
 import java.util.concurrent.ExecutorService;
@@ -32,7 +31,7 @@ public class AppDeployer {
      * @return
      * @date 2020-03-13 下午1:00
      */
-    public static List<DeployLog> deploy(AppOrchestration app, BuildLog buildLog) {
+    public static DeployLog deploy(AppOrchestration app, BuildLog buildLog) {
         Notification notification = app.getNotification();
         String notifierType = notification.getNotifierType();
         String dest = notification.getDestination();
@@ -56,7 +55,10 @@ public class AppDeployer {
             futureMap.put(host, threadPool.submit(new AppDeployTask(deployConfig)));
         }
 
-        List<DeployLog> deployLogs = new ArrayList<>();
+        DeployLog deployLog = new DeployLog();
+        deployLog.setBuildLog(buildLog);
+        Set<DeployResult> deployResults = new HashSet<>();
+        deployLog.setDeployResults(deployResults);
         for (Map.Entry<String, Future<Boolean>> entry : futureMap.entrySet()) {
             String host = entry.getKey();
             Future<Boolean> future = entry.getValue();
@@ -73,35 +75,16 @@ public class AppDeployer {
             try {
                 Boolean isDeploy = future.get();
                 if (isDeploy) {
-                    deployLogs.add(new DeployLog(buildLog, host));
+                    deployResults.add(DeployResult.success(host));
                 }
             } catch (Exception e) {
                 e.printStackTrace();
-                deployLogs.add(new DeployLog(buildLog, host, e.getMessage()));
+                deployResults.add(DeployResult.fail(host, e.getMessage()));
             }
         }
-
-        StringBuilder sb = new StringBuilder();
-        for (DeployLog deployLog : deployLogs) {
-            sb.append(deployLog.getHost());
-        }
-
-        DeployMsg deployMsg = new DeployMsg();
-        deployMsg.setAppId(app.getAppId());
-        deployMsg.setCommitId(buildLog.getCommitLog().getCommitId());
-        deployMsg.setHosts(sb.toString());
         // TODO 异步发送通知
-        notify.send(dest, JsonUtil.objectToJson(deployMsg));
-
+        //notify.send(dest, JsonUtil.objectToJson(deployMsg));
         // TODO 部署成功后记录到数据库
-        //buildDeployLog.setDeployLogs(deployLogs);
-        return deployLogs;
-    }
-
-    @Data
-    static class DeployMsg {
-        private String appId;
-        private String commitId;
-        private String hosts;
+        return deployLog;
     }
 }

+ 7 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/log/LogConsumer.java

@@ -1,13 +1,11 @@
 package cn.reghao.autodop.dmaster.app.service.log;
 
-import cn.reghao.autodop.dmaster.app.entity.constant.BuildDeployStage;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployLog;
 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.LogRepository;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.List;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 
@@ -32,26 +30,24 @@ public class LogConsumer implements Runnable {
 
     @Override
     public void run() {
-        log.info("构建部署日志持久化线程已启动...");
+        log.info("日志持久化线程已启动...");
         while (!Thread.interrupted()) {
             try {
                 BuildDeployLog buildDeployLog = queue.take();
                 BuildLog buildLog = buildDeployLog.getBuildLog();
-                logDAO.saveBuildLog(buildLog);
-                List<DeployLog> deployLogs = buildDeployLog.getDeployLogs();
-                if (deployLogs != null && !deployLogs.isEmpty()) {
-                    logDAO.saveDeployLogs(deployLogs);
+                if (buildLog != null) {
+                    logDAO.saveBuildLog(buildLog);
                 }
 
-                String stage = buildDeployLog.getBuildLog().getStage();
-                int code = buildDeployLog.getBuildLog().getCode();
-                if (stage.equals(BuildDeployStage.deploy.name()) && code == 0) {
-                    logDAO.saveDeployedApp(buildDeployLog);
+                DeployLog deployLog = buildDeployLog.getDeployLog();
+                if (deployLog != null && !deployLog.getDeployResults().isEmpty()) {
+                    logDAO.saveOrUpdateDeployLog(deployLog);
                 }
 
                 log.info("{} 构建部署日志已入库...", buildDeployLog.getBuildLog().getApp().getAppId());
             } catch (InterruptedException e) {
                 // 中断线程
+                log.info("中断日志持久化线程...");
                 Thread.currentThread().interrupt();
             } catch (Exception e) {
                 log.info("持久化异常...");

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

@@ -22,6 +22,7 @@ public class DockerPack implements CodePacker {
             String image = repo + ":" + version;
 
             docker.build(image, appEntryDir);
+            // TODO 有时不能成功 push,特别是 push 到远程主机上时
             docker.push(image);
             docker.close();
             return image;

+ 34 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/log/BuildLogVO.java

@@ -0,0 +1,34 @@
+package cn.reghao.autodop.dmaster.app.vo.log;
+
+import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author reghao
+ * @date 2020-06-02 14:32:45
+ */
+@Data
+public class BuildLogVO {
+    private String appId;
+    private String env;
+    private String remoteRepoUrl;
+    private String commitId;
+    private String status;
+    private String appPath;
+    private Date buildTime;
+
+    public static BuildLogVO of(BuildLog buildLog) {
+        BuildLogVO buildLogVO = new BuildLogVO();
+        buildLogVO.setAppId(buildLog.getApp().getAppId());
+        buildLogVO.setEnv(buildLog.getApp().getEnv());
+        buildLogVO.setRemoteRepoUrl(buildLog.getCommitLog().getRemoteRepoUrl());
+        buildLogVO.setCommitId(buildLog.getCommitLog().getCommitId());
+        buildLogVO.setStatus(buildLog.getMsg());
+        buildLogVO.setAppPath(buildLog.getAppPath());
+        buildLogVO.setBuildTime(buildLog.getBuildTime());
+
+        return buildLogVO;
+    }
+}

+ 15 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/log/DeployLogVO.java

@@ -0,0 +1,15 @@
+package cn.reghao.autodop.dmaster.app.vo.log;
+
+import lombok.Data;
+
+/**
+ * @author reghao
+ * @date 2020-06-02 14:40:17
+ */
+@Data
+public class DeployLogVO {
+    private String appId;
+    private String env;
+    private String remoteRepoUrl;
+    private String commitId;
+}

+ 1 - 1
dmaster/src/main/resources/application-test.yml

@@ -6,4 +6,4 @@ spring:
 sysconfig:
   localRepo: /opt/data/local-repo
   compileDir: /opt/data/compile-dir
-  packDir: /opt/data/pack-dir
+  packDir: /opt/data/pack-d

+ 2 - 2
scripts/build-and-deploy.sh

@@ -3,8 +3,8 @@
 ###
 #!/bin/sh
 
-sh build.sh test dmaster
-sh deploy.sh autodop-dmaster 192.168.0.50 gjs &
+#sh build.sh test dmaster
+#sh deploy.sh autodop-dmaster 192.168.0.50 gjs &
 
 sh build.sh test dagent
 sh deploy.sh autodop-dagent 192.168.0.171 gjs &

+ 0 - 1
scripts/test.json

@@ -1 +0,0 @@
-{}