Parcourir la source

修改更新,编译,打包,部署四个阶段的数据模型

reghao il y a 5 ans
Parent
commit
d776954911
38 fichiers modifiés avec 544 ajouts et 220 suppressions
  1. 3 2
      common/src/main/java/cn/reghao/autodop/common/amqp/RabbitProducer.java
  2. 2 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/cache/BuildDeployCache.java
  3. 23 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/BuildDeployResult.java
  4. 21 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/BuildDeployType.java
  5. 7 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildDeployController.java
  6. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/crud/GlobalCrudController.java
  7. 2 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/AppConfig.java
  8. 13 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildLog.java
  9. 28 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/CommitLog.java
  10. 3 15
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/DeployLog.java
  11. 41 14
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/status/BuildDeployApp.java
  12. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/status/DeployedAppStatus.java
  13. 7 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/BuildLogRepository.java
  14. 4 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/CommitLogRepository.java
  15. 8 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/DeployLogRepository.java
  16. 21 20
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildDeployDispatcher.java
  17. 5 25
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildService.java
  18. 1 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/RefreshService.java
  19. 14 15
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppIntegrate.java
  20. 3 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/repo/CodeUpdater.java
  21. 27 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/repo/CommitInfo.java
  22. 22 23
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/repo/GitImpl.java
  23. 20 19
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/repo/SvnImpl.java
  24. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/crud/BuildDeployAppCrudService.java
  25. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/crud/NotifierCrudService.java
  26. 49 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/crud/log/BuildLogCrudService.java
  27. 48 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/crud/log/CommitLogCrudService.java
  28. 50 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/crud/log/DeployLogCrudService.java
  29. 24 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/deploy/AppDeployer.java
  30. 21 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/deploy/DeployNotifyMsg.java
  31. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/log/BuildDeployLogConsumer.java
  32. 16 25
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/log/BuildDeployLogService.java
  33. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/orchestration/AppVO.java
  34. 0 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/cluster/service/crud/MachineCrudService.java
  35. 4 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/db/orm/BaseDocument.java
  36. 4 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/db/orm/BaseEntity.java
  37. 35 10
      dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/notifier/DingMsg.java
  38. 8 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/notifier/NotifyService.java

+ 3 - 2
common/src/main/java/cn/reghao/autodop/common/amqp/RabbitProducer.java

@@ -64,11 +64,12 @@ public class RabbitProducer {
      */
     public RpcResult callRemote(String exchange, String routeKey, MqMessage mqMessage) {
         // TODO 处理 RPC 调用在超时后才成功的情况
-        rabbitTemplate.setReplyTimeout(90_000);
+        long timeout = 60_000;
+        rabbitTemplate.setReplyTimeout(timeout);
         String msg = JsonConverter.objectToJson(mqMessage);
         String result = (String) rabbitTemplate.convertSendAndReceive(exchange, routeKey, msg);
         if (result == null) {
-            return RpcResult.fail("RPC 调用超时...");
+            return RpcResult.fail("RPC 调用等待 " + timeout/1000 + "s 后超时");
         } else {
             return (RpcResult) JsonConverter.jsonToObject(result, RpcResult.class);
         }

+ 2 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/cache/BuildDeployCache.java

@@ -51,7 +51,8 @@ public class BuildDeployCache {
     }
 
     public BuildLog findByAppIdAndCommitId(String appId, String commitId) {
-        return buildLogRepository.findBuildLogByAppIdAndCommitIdAndStatusCode(appId, commitId, 0);
+        //return buildLogRepository.findByAppIdAndCommitIdAndStatusCode(appId, commitId, 0);
+        return null;
     }
 
     public MachineInfo findMachineInfoById(String machineId) {

+ 23 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/BuildDeployResult.java

@@ -0,0 +1,23 @@
+package cn.reghao.autodop.dmaster.app.constant;
+
+/**
+ * 构建部署结果
+ *
+ * @author reghao
+ * @date 2021-03-05 10:19:16
+ */
+public enum BuildDeployResult {
+    onBuilding("正在构建中"), buildDone("构建成功"),
+    noDeployConfig("应用未配置需部署的机器"), onDeploying("正在部署中"), deployDone("部署成功"),
+    noDeploy("当前运行的应用已是最新版本,不需要更新");
+
+    private String name;
+
+    private BuildDeployResult(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 21 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/BuildDeployType.java

@@ -0,0 +1,21 @@
+package cn.reghao.autodop.dmaster.app.constant;
+
+/**
+ * 构建部署类型
+ *
+ * @author reghao
+ * @date 2021-03-05 10:19:16
+ */
+public enum BuildDeployType {
+    build("构建"), deploy("部署");
+
+    private String name;
+
+    private BuildDeployType(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 7 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildDeployController.java

@@ -2,6 +2,7 @@ package cn.reghao.autodop.dmaster.app.controller;
 
 import cn.reghao.autodop.dmaster.app.constant.EnvType;
 import cn.reghao.autodop.dmaster.app.entity.status.BuildDeployApp;
+import cn.reghao.autodop.dmaster.app.service.RefreshService;
 import cn.reghao.autodop.dmaster.app.vo.CurrentRunningCommit;
 import cn.reghao.autodop.dmaster.app.vo.SuccessfullyBuildVO;
 import cn.reghao.autodop.dmaster.app.service.BuildService;
@@ -29,10 +30,14 @@ import org.springframework.web.bind.annotation.*;
 public class BuildDeployController {
     private BuildService buildService;
     private BuildDeployDispatcher buildDeployDispatcher;
+    private RefreshService refreshService;
 
-    public BuildDeployController(BuildService buildService, BuildDeployDispatcher buildDeployDispatcher) {
+    public BuildDeployController(BuildService buildService,
+                                 BuildDeployDispatcher buildDeployDispatcher,
+                                 RefreshService refreshService) {
         this.buildService = buildService;
         this.buildDeployDispatcher = buildDeployDispatcher;
+        this.refreshService = refreshService;
     }
 
     @ApiOperation(value = "某个环境需要构建部署的应用列表")
@@ -46,7 +51,7 @@ public class BuildDeployController {
     @ApiOperation(value = "刷新某个环境需要构建部署的应用列表")
     @PostMapping("/list/refresh/{env}")
     public ResponseEntity<String> refreshBuildList(@PathVariable("env") String env) {
-        buildService.refreshBuildList(EnvType.valueOf(env).name());
+        refreshService.refreshBuildList(EnvType.valueOf(env).name());
         return ResponseEntity.ok().body(WebResult.success("ok"));
     }
 

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/crud/GlobalCrudController.java

@@ -4,7 +4,7 @@ import cn.reghao.autodop.common.result.WebResult;
 import cn.reghao.autodop.dmaster.common.db.PageList;
 import cn.reghao.autodop.common.utils.serializer.JsonConverter;
 import cn.reghao.autodop.dmaster.app.entity.config.NotifierConfig;
-import cn.reghao.autodop.dmaster.app.service.crud.global.NotifierCrudService;
+import cn.reghao.autodop.dmaster.app.service.crud.NotifierCrudService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;

+ 2 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/AppConfig.java

@@ -61,9 +61,10 @@ public class AppConfig extends BaseEntity implements Cloneable {
     // TODO 检查 compileHome 格式
     @Column(nullable = false)
     private String compileHome;
+    // 打包脚本,若使用的 docker,则是 dockerfile 的内容
     @Lob
     @Column(columnDefinition="text")
-    private String dockerfile;
+    private String packScript;
 
     /* 部署配置 */
     @ElementCollection(targetClass = DeployConfig.class)

+ 13 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildLog.java

@@ -1,6 +1,5 @@
 package cn.reghao.autodop.dmaster.app.entity.log;
 
-import cn.reghao.autodop.common.utils.DateTimeConverter;
 import cn.reghao.autodop.dmaster.app.entity.config.AppConfig;
 import cn.reghao.autodop.dmaster.common.db.orm.BaseDocument;
 import cn.reghao.autodop.dmaster.app.constant.BuildStage;
@@ -9,7 +8,6 @@ import lombok.EqualsAndHashCode;
 import org.springframework.data.mongodb.core.mapping.Document;
 
 import javax.persistence.Column;
-import javax.persistence.Transient;
 import java.time.LocalDateTime;
 
 /**
@@ -28,9 +26,16 @@ public class BuildLog extends BaseDocument {
     private String appType;
     @Column(nullable = false)
     private String env;
+    @Column(nullable = false)
+    private String repo;
+    @Column(nullable = false)
+    private String compiler;
+    @Column(nullable = false)
+    private String packer;
+    @Column(nullable = false)
+    private String packScript;
+
     private BuildStage stage;
-    // 代码是否更新
-    private Boolean isUpdate;
     private String commitId;
     private LocalDateTime commitTime;
     private String packagePath;
@@ -56,6 +61,10 @@ public class BuildLog extends BaseDocument {
         buildLog.setAppId(appConfig.getAppId());
         buildLog.setAppType(appConfig.getAppType());
         buildLog.setEnv(appConfig.getEnv());
+        buildLog.setRepo(appConfig.getBuildConfig().getRepoConfig().getName());
+        buildLog.setCompiler(appConfig.getBuildConfig().getCompilerConfig().getName());
+        buildLog.setPacker(appConfig.getBuildConfig().getPackerConfig().getName());
+        buildLog.setPackScript(appConfig.getPackScript());
         return buildLog;
     }
 }

+ 28 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/CommitLog.java

@@ -1,10 +1,14 @@
 package cn.reghao.autodop.dmaster.app.entity.log;
 
+import cn.reghao.autodop.dmaster.app.entity.config.AppConfig;
+import cn.reghao.autodop.dmaster.app.service.build.tools.repo.CommitInfo;
 import cn.reghao.autodop.dmaster.common.db.orm.BaseDocument;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springframework.data.mongodb.core.mapping.Document;
 
+import javax.persistence.Column;
+import javax.persistence.Transient;
 import java.util.List;
 
 /**
@@ -17,13 +21,18 @@ import java.util.List;
 @EqualsAndHashCode(callSuper = false)
 @Document("CommitLog")
 public class CommitLog extends BaseDocument {
+    @Column(nullable = false, unique = true)
     private String appId;
+    @Column(nullable = false, unique = true)
     private String env;
-    // 代码是否更新
-    private boolean isUpdate;
+    @Column(nullable = false, unique = true)
+    private String repo;
     private String remote;
     private String branch;
     private String local;
+    // 代码是否更新
+    @Transient
+    private boolean isUpdate;
     private String commitId;
     private String commitAuthor;
     private String commitMsg;
@@ -38,4 +47,21 @@ public class CommitLog extends BaseDocument {
         this.setUpdateTime(null);
         return this;
     }
+
+    public static CommitLog of (AppConfig app, CommitInfo commitInfo) {
+        CommitLog commitLog = new CommitLog();
+        commitLog.setAppId(app.getAppId());
+        commitLog.setEnv(app.getEnv());
+        commitLog.setRepo(app.getBuildConfig().getRepoConfig().getName());
+        commitLog.setRemote(commitInfo.getRemote());
+        commitLog.setBranch(commitInfo.getBranch());
+        commitLog.setLocal(commitInfo.getLocal());
+        commitLog.setUpdate(commitInfo.isUpdate());
+        commitLog.setCommitId(commitInfo.getCommitId());
+        commitLog.setCommitAuthor(commitInfo.getCommitAuthor());
+        commitLog.setCommitMsg(commitInfo.getCommitMsg());
+        commitLog.setMsCommitTime(commitInfo.getMsCommitTime());
+        commitLog.setChangedFiles(commitInfo.getChangedFiles());
+        return commitLog;
+    }
 }

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

@@ -5,7 +5,6 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springframework.data.mongodb.core.mapping.Document;
 
-import javax.persistence.Column;
 import java.time.LocalDateTime;
 
 /**
@@ -18,15 +17,9 @@ import java.time.LocalDateTime;
 @EqualsAndHashCode(callSuper = false)
 @Document("DeployLog")
 public class DeployLog extends BaseDocument {
-    @Column(nullable = false, unique = true)
-    private String appId;
-    @Column(nullable = false)
-    private String appType;
-    @Column(nullable = false)
-    private String env;
-    private String commitId;
-    private LocalDateTime commitTime;
+    private BuildLog buildLog;
     private String machineId;
+    private String machineAddress;
     private LocalDateTime deployTime;
     private long deployTotalTime;
     // 0 - 成功 1 - 失败
@@ -43,12 +36,7 @@ public class DeployLog extends BaseDocument {
 
     public static DeployLog of(BuildLog buildLog) {
         DeployLog deployLog = new DeployLog();
-        deployLog.setAppId(buildLog.getAppId());
-        deployLog.setAppType(buildLog.getAppType());
-        deployLog.setEnv(buildLog.getEnv());
-        deployLog.setCommitId(buildLog.getCommitId());
-        deployLog.setCommitTime(buildLog.getCommitTime());
-        deployLog.setCommitTime(buildLog.getCommitTime());
+        deployLog.setBuildLog(buildLog);
         return deployLog;
     }
 }

+ 41 - 14
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/status/BuildDeployApp.java

@@ -1,5 +1,7 @@
 package cn.reghao.autodop.dmaster.app.entity.status;
 
+import cn.reghao.autodop.dmaster.app.constant.BuildDeployResult;
+import cn.reghao.autodop.dmaster.app.constant.BuildDeployType;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
 import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 import cn.reghao.autodop.dmaster.common.db.orm.BaseEntity;
@@ -55,21 +57,45 @@ public class BuildDeployApp extends BaseEntity {
         return buildDeployApp;
     }
 
+    public static BuildDeployApp deployResult(BuildLog buildLog, int statusCode, String result) {
+        BuildDeployApp buildDeployApp = new BuildDeployApp();
+        buildDeployApp.setAppId(buildLog.getAppId());
+        buildDeployApp.setAppType(buildLog.getAppType());
+        buildDeployApp.setEnv(buildLog.getEnv());
+        buildDeployApp.setEnable(true);
+        buildDeployApp.setCommitId(buildLog.getCommitId());
+        buildDeployApp.setCommitTime(buildLog.getCommitTime());
+        buildDeployApp.setBdType(BuildDeployType.deploy.getName());
+        buildDeployApp.setBdTime(buildLog.getBuildTime());
+        buildDeployApp.setStatusCode(statusCode);
+        buildDeployApp.setResult(result);
+        return buildDeployApp;
+    }
+
+    public static BuildDeployApp result(String appId, BuildDeployType bdType, int statusCode, String result) {
+        BuildDeployApp buildDeployApp = new BuildDeployApp();
+        buildDeployApp.setAppId(appId);
+        buildDeployApp.setBdType(bdType.getName());
+        buildDeployApp.setStatusCode(statusCode);
+        buildDeployApp.setResult(result);
+        return buildDeployApp;
+    }
+
     public static BuildDeployApp onBuilding(String appId) {
         BuildDeployApp buildDeployApp = new BuildDeployApp();
         buildDeployApp.setAppId(appId);
-        buildDeployApp.setBdType("构建");
+        buildDeployApp.setBdType(BuildDeployType.build.getName());
         buildDeployApp.setStatusCode(0);
-        buildDeployApp.setResult("正在构建中");
+        buildDeployApp.setResult(BuildDeployResult.onBuilding.getName());
         return buildDeployApp;
     }
 
     public static BuildDeployApp onDeploying(String appId) {
         BuildDeployApp buildDeployApp = new BuildDeployApp();
         buildDeployApp.setAppId(appId);
-        buildDeployApp.setBdType("部署");
+        buildDeployApp.setBdType(BuildDeployType.deploy.getName());
         buildDeployApp.setStatusCode(0);
-        buildDeployApp.setResult("正在部署中");
+        buildDeployApp.setResult(BuildDeployResult.onDeploying.getName());
         return buildDeployApp;
     }
 
@@ -80,9 +106,8 @@ public class BuildDeployApp extends BaseEntity {
         buildDeployApp.setEnv(buildLog.getEnv());
         buildDeployApp.setEnable(true);
         buildDeployApp.setCommitId(buildLog.getCommitId());
-        // TODO BuildLog 中的 LocalDateTime 对象在经过 Hibernate 持久化后,BuildDeployApp 中会变为 NULL
         buildDeployApp.setCommitTime(buildLog.getCommitTime());
-        buildDeployApp.setBdType("构建");
+        buildDeployApp.setBdType(BuildDeployType.build.getName());
         buildDeployApp.setBdTime(buildLog.getBuildTime());
 
         buildDeployApp.setStatusCode(buildLog.getStatusCode());
@@ -94,7 +119,7 @@ public class BuildDeployApp extends BaseEntity {
                 buildDeployApp.setResult(errDetail);
             }
         } else {
-            buildDeployApp.setResult("构建成功");
+            buildDeployApp.setResult(buildLog.getResult());
         }
 
         return buildDeployApp;
@@ -103,14 +128,16 @@ public class BuildDeployApp extends BaseEntity {
     public static BuildDeployApp of(List<DeployLog> deployLogs) {
         // TODO deployLogs 不为空
         DeployLog deployLog = deployLogs.get(0);
+        BuildLog buildLog = deployLog.getBuildLog();
+
         BuildDeployApp buildDeployApp = new BuildDeployApp();
-        buildDeployApp.setAppId(deployLog.getAppId());
-        buildDeployApp.setAppType(deployLog.getAppType());
-        buildDeployApp.setEnv(deployLog.getEnv());
+        buildDeployApp.setAppId(buildLog.getAppId());
+        buildDeployApp.setAppType(buildLog.getAppType());
+        buildDeployApp.setEnv(buildLog.getEnv());
         buildDeployApp.setEnable(true);
-        buildDeployApp.setCommitId(deployLog.getCommitId());
-        buildDeployApp.setCommitTime(deployLog.getCommitTime());
-        buildDeployApp.setBdType("部署");
+        buildDeployApp.setCommitId(buildLog.getCommitId());
+        buildDeployApp.setCommitTime(buildLog.getCommitTime());
+        buildDeployApp.setBdType(BuildDeployType.deploy.getName());
         buildDeployApp.setBdTime(deployLog.getDeployTime());
 
         List<String> deployFailure = deployLogs.stream()
@@ -122,7 +149,7 @@ public class BuildDeployApp extends BaseEntity {
             buildDeployApp.setResult(deployFailure.toString());
         } else {
             buildDeployApp.setStatusCode(0);
-            buildDeployApp.setResult("部署成功");
+            buildDeployApp.setResult(BuildDeployResult.deployDone.getName());
         }
 
         return buildDeployApp;

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/status/DeployedAppStatus.java

@@ -44,9 +44,9 @@ public class DeployedAppStatus extends BaseEntity {
     public DeployedAppStatus of(DeployLog deployLog) {
         DeployedAppStatus deployedAppStatus = new DeployedAppStatus();
         deployedAppStatus.setMachineId(deployLog.getMachineId());
-        deployedAppStatus.setAppId(deployLog.getAppId());
-        deployedAppStatus.setEnv(deployLog.getEnv());
-        deployedAppStatus.setCommitId(deployLog.getCommitId());
+        deployedAppStatus.setAppId(deployLog.getBuildLog().getAppId());
+        deployedAppStatus.setEnv(deployLog.getBuildLog().getEnv());
+        deployedAppStatus.setCommitId(deployLog.getBuildLog().getCommitId());
         return deployedAppStatus;
     }
 }

+ 7 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/BuildLogRepository.java

@@ -10,7 +10,11 @@ import org.springframework.data.mongodb.repository.MongoRepository;
  * @date 2020-01-21 14:53:03
  */
 public interface BuildLogRepository extends MongoRepository<BuildLog, Long> {
-    BuildLog findBuildLogByAppIdAndCommitIdAndStatusCode(String appId, String commitId, int statusCode);
-    BuildLog findBuildLogByAppIdAndStatusCode(String appId, int statusCode);
-    Page<BuildLog> findBuildLogByAppIdAndStatusCode(String appId, int statusCode, Pageable pageable);
+    // 唯一值
+    BuildLog findByAppIdAndRepoAndCompilerAndPackerAndPackScriptAndCommitIdAndStatusCode(
+            String appId, String repo, String compiler, String packer, String packScript,
+            String commitId, int statusCode);
+    Page<BuildLog> findByEnv(String env, Pageable pageable);
+    Page<BuildLog> findByEnvAndAppId(String env, String appId, Pageable pageable);
+    Page<BuildLog> findByEnvAndAppIdAndStatusCode(String env, String appId, int statusCode, Pageable pageable);
 }

+ 4 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/CommitLogRepository.java

@@ -10,7 +10,8 @@ import org.springframework.data.mongodb.repository.MongoRepository;
  * @date 2020-01-21 14:53:03
  */
 public interface CommitLogRepository extends MongoRepository<CommitLog, Long> {
-    CommitLog findByAppIdAndCommitId(String appId, String commitId);
-    Page<CommitLog> findCommitLogByEnv(String env, Pageable pageable);
-    Page<CommitLog> findCommitLogByAppId(String appId, Pageable pageable);
+    // 唯一值
+    CommitLog findByAppIdAndRepoAndCommitId(String appId, String repo, String commitId);
+    Page<CommitLog> findByEnv(String env, Pageable pageable);
+    Page<CommitLog> findByEnvAndAppId(String env, String appId, Pageable pageable);
 }

+ 8 - 2
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.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -10,6 +11,11 @@ import org.springframework.data.mongodb.repository.MongoRepository;
  * @date 2020-01-21 14:53:03
  */
 public interface DeployLogRepository extends MongoRepository<DeployLog, Long> {
-    DeployLog findByAppIdAndCommitIdAndMachineIdAndStatusCode(String appId, String commitId, String machineId, int statusCode);
-    Page<DeployLog> findDeployLogByAppIdAndStatusCode(String appId, int statusCode, Pageable pageable);
+    // 唯一值
+    DeployLog findByBuildLogAndMachineId(BuildLog buildLog, String machineId);
+    /*DeployLog findByMachineIdAndAppIdAndPackerAndCommitIdAndStatusCode(
+            String machineId, String appId, String packer, String commitId, int statusCode);*/
+    Page<DeployLog> findByBuildLog_Env(String env, Pageable pageable);
+    Page<DeployLog> findByBuildLog_EnvAndBuildLog_AppId(String env, String appId, Pageable pageable);
+    Page<DeployLog> findByBuildLog_EnvAndBuildLog_AppIdAndStatusCode(String env, String appId, int statusCode, Pageable pageable);
 }

+ 21 - 20
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildDeployDispatcher.java

@@ -2,6 +2,7 @@ package cn.reghao.autodop.dmaster.app.service;
 
 import cn.reghao.autodop.common.utils.DateTimeConverter;
 import cn.reghao.autodop.dmaster.app.cache.BuildDeployCache;
+import cn.reghao.autodop.dmaster.app.constant.BuildDeployResult;
 import cn.reghao.autodop.dmaster.app.constant.BuildStage;
 import cn.reghao.autodop.dmaster.app.entity.config.NotifierConfig;
 import cn.reghao.autodop.dmaster.app.entity.config.deploy.DeployConfig;
@@ -9,6 +10,7 @@ import cn.reghao.autodop.dmaster.app.entity.log.*;
 import cn.reghao.autodop.dmaster.app.entity.status.BuildDeployApp;
 import cn.reghao.autodop.dmaster.app.interceptor.AppIntegrateReinitInterceptor;
 import cn.reghao.autodop.dmaster.app.service.build.AppIntegrate;
+import cn.reghao.autodop.dmaster.app.service.build.tools.repo.CommitInfo;
 import cn.reghao.autodop.dmaster.app.service.deploy.AppDeployer;
 import cn.reghao.autodop.dmaster.app.entity.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.service.deploy.DeployNotifyMsg;
@@ -89,15 +91,11 @@ public class BuildDeployDispatcher {
         onBuilding.remove(appId);
         BuildDeployApp buildDeployApp;
         if (buildLog.getStatusCode() == 0 && isDeploy) {
-            List<DeployLog> deployLogs = deployApp(buildLog);
-            if (deployLogs == null) {
-                return BuildDeployApp.onDeploying(appId);
-            }
-            buildDeployApp = BuildDeployApp.of(deployLogs);
+            buildDeployApp = deployApp(buildLog);
         } else {
             buildDeployApp = BuildDeployApp.of(buildLog);
         }
-        logConsumer.addBuildDeployApp(BuildDeployApp.of(buildLog));
+        logConsumer.addBuildDeployApp(buildDeployApp);
         return buildDeployApp;
     }
 
@@ -112,13 +110,12 @@ public class BuildDeployDispatcher {
         long start = System.currentTimeMillis();
         // TODO 只使用一个 try-catch
         try {
-            CommitLog commitLog = appIntegrate.update();
-            buildLog.setIsUpdate(commitLog.isUpdate());
-            buildLog.setCommitId(commitLog.getCommitId());
-            buildLog.setCommitTime(DateTimeConverter.localDateTime(commitLog.getMsCommitTime()));
+            CommitInfo commitInfo = appIntegrate.update();
+            buildLog.setCommitId(commitInfo.getCommitId());
+            buildLog.setCommitTime(DateTimeConverter.localDateTime(commitInfo.getMsCommitTime()));
             buildLog.setUpdateTotalTime(System.currentTimeMillis()-start);
 
-            commitLog.setEnv(appIntegrate.app().getEnv());
+            CommitLog commitLog = CommitLog.of(appIntegrate.app(), commitInfo);
             logConsumer.addCommitLog(commitLog);
         } catch (Exception e) {
             buildException(buildLog, BuildStage.update, e);
@@ -146,6 +143,7 @@ public class BuildDeployDispatcher {
 
         buildLog.setStage(BuildStage.done);
         buildLog.setStatusCode(0);
+        buildLog.setResult(BuildDeployResult.buildDone.getName());
         buildLog.setBuildTime(LocalDateTime.now());
         return buildLog;
     }
@@ -164,20 +162,27 @@ public class BuildDeployDispatcher {
      * @return
      * @date 2021-02-06 上午2:02
      */
-    private List<DeployLog> deployApp(BuildLog buildLog) {
-        if (!onDeploying.add(buildLog.getAppId())) {
-            return null;
+    private BuildDeployApp deployApp(BuildLog buildLog) {
+        String appId = buildLog.getAppId();
+        if (!onDeploying.add(appId)) {
+            return BuildDeployApp.onDeploying(appId);
         }
 
         List<DeployConfig> deployConfigs = cache.findByAppId(buildLog.getAppId()).getDeployConfigs();
+        if (deployConfigs.isEmpty()) {
+            return BuildDeployApp.deployResult(buildLog, 0, BuildDeployResult.noDeployConfig.getName());
+        }
+
         List<DeployLog> deployLogs = appDeployer.deploy(buildLog, deployConfigs);
         onDeploying.remove(buildLog.getAppId());
         deployLogs.forEach(deployLog -> logConsumer.addDeployLog(deployLog));
+
         // TODO 部署完成后发出通知
         NotifierConfig notifierConfig = cache.findByAppId(buildLog.getAppId()).getNotifierConfig();
         DeployNotifyMsg deployNotifyMsg = DeployNotifyMsg.deployNotifyMsg(deployLogs);
         notifyService.notify(notifierConfig, deployNotifyMsg);
-        return deployLogs;
+
+        return BuildDeployApp.of(deployLogs);
     }
 
     /**
@@ -189,11 +194,7 @@ public class BuildDeployDispatcher {
      */
     public BuildDeployApp deploy(String appId, String commitId) {
         BuildLog buildLog = cache.findByAppIdAndCommitId(appId, commitId);
-        List<DeployLog> deployLogs = deployApp(buildLog);
-        if (deployLogs == null) {
-            return BuildDeployApp.onDeploying(appId);
-        }
-        BuildDeployApp buildDeployApp = BuildDeployApp.of(deployLogs);
+        BuildDeployApp buildDeployApp = deployApp(buildLog);
         logConsumer.addBuildDeployApp(buildDeployApp);
         return buildDeployApp;
     }

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

@@ -66,11 +66,13 @@ public class BuildService {
     }
 
     public void refreshBuildList(String env) {
+
     }
 
     public PageList<SuccessfullyBuildVO> successfullyBuilds(String appId, PageRequest pageRequest) {
         PageList<SuccessfullyBuildVO> pageList = new PageList<>();
-        Page<BuildLog> buildLogs = buildLogRepository.findBuildLogByAppIdAndStatusCode(appId, 0, pageRequest);
+        Page<BuildLog> buildLogs =
+                buildLogRepository.findByEnvAndAppIdAndStatusCode("test", appId, 0, pageRequest);
         pageList.setTotalPages(buildLogs.getTotalPages());
         pageList.setTotalSize(buildLogs.getTotalElements());
         pageList.setHasNext(buildLogs.hasNext());
@@ -103,7 +105,7 @@ public class BuildService {
         PageRequest pageRequest =
                 PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "createTime"));
 
-        Page<CommitLog> commitLogs = commitLogRepository.findCommitLogByAppId(appId, pageRequest);
+        Page<CommitLog> commitLogs = commitLogRepository.findByEnvAndAppId("test", appId, pageRequest);
         PageList<CommitLog> pageList = new PageList<>();
         pageList.setTotalPages(commitLogs.getTotalPages());
         pageList.setTotalSize(commitLogs.getTotalElements());
@@ -165,28 +167,6 @@ public class BuildService {
     }
 
     public PageList<CurrentRunningCommit> deployedApp(String appId, int page, int size) {
-        PageRequest pageRequest =
-                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "deployTime"));
-        Page<DeployLog> deployLogs = deployLogRepository.findDeployLogByAppIdAndStatusCode(appId, 0, pageRequest);
-        List<CurrentRunningCommit> apps = deployLogs.getContent().stream()
-                .map(deployLog -> new CurrentRunningCommit(deployLog.getMachineId(), deployLog.getCommitId(), ""))
-                .collect(Collectors.toList());
-
-        PageList<CurrentRunningCommit> pageList = new PageList<>();
-        AppConfig 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;
+        return new PageList<>();
     }
 }

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

@@ -52,7 +52,7 @@ public class RefreshService {
                 .map(BuildDeployApp::getAppId).collect(Collectors.toSet());
 
         int page = 1;
-        int size = 5;
+        int size = 50;
         Page<AppConfig> appConfigPage = appConfigRepository.findByIsDeleteFalseAndEnv(env, pageRequest(page, size));
         List<AppConfig> apps = appConfigPage.stream()
                 .filter(appConfig -> !buildDeployAppIds.contains(appConfig.getAppId()))
@@ -95,6 +95,5 @@ public class RefreshService {
      * @date 2021-03-04 下午4:46
      */
     private void refreshAppStatus() {
-
     }
 }

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

@@ -17,7 +17,7 @@ import cn.reghao.autodop.dmaster.app.service.build.tools.packer.CodePacker;
 import cn.reghao.autodop.dmaster.app.service.build.tools.packer.DockerPack;
 import cn.reghao.autodop.dmaster.app.service.build.tools.packer.ZipPack;
 import cn.reghao.autodop.dmaster.app.service.build.tools.repo.CodeUpdater;
-import cn.reghao.autodop.dmaster.app.entity.log.CommitLog;
+import cn.reghao.autodop.dmaster.app.service.build.tools.repo.CommitInfo;
 import cn.reghao.autodop.dmaster.app.service.build.tools.repo.GitImpl;
 import cn.reghao.autodop.dmaster.app.service.build.tools.repo.SvnImpl;
 import cn.reghao.autodop.dmaster.common.config.SysConfig;
@@ -40,7 +40,7 @@ public class AppIntegrate {
 
     private AppConfig app;
     // 远程仓库最近一次提交的信息
-    private CommitLog lastCommitLog;
+    private CommitInfo latestCommitInfo;
 
     private CodeUpdater codeUpdater;
     private CodeCompiler codeCompiler;
@@ -132,7 +132,7 @@ public class AppIntegrate {
         PackerConfig packerConfig = buildConfig.getPackerConfig();
         switch (PackerType.valueOf(packerConfig.getType())) {
             case docker:
-                codePacker = new DockerPack(packerConfig, app.getDockerfile());
+                codePacker = new DockerPack(packerConfig, app.getPackScript());
                 break;
             case zip:
                 codePacker = new ZipPack(packerConfig);
@@ -141,7 +141,7 @@ public class AppIntegrate {
         }
     }
 
-    public CommitLog update() throws Exception {
+    public CommitInfo update() throws Exception {
         String remote;
         String branch;
         // TODO 区分 GIT 和 SVN pull 代码时的不同
@@ -155,28 +155,27 @@ public class AppIntegrate {
             branch = app.getBranch();
         }
 
-        if (lastCommitLog == null) {
-            lastCommitLog = codeUpdater.lastCommitInfo(local, branch);
+        if (latestCommitInfo == null) {
+            latestCommitInfo = codeUpdater.latestCommitInfo(local, branch);
         }
 
         UpdateStatus updateStatus = update0(remote, branch, local);
         // TODO 代码版本未更改的情况下,是否应该构建
         if (updateStatus.isUpdated || app.getAlwaysBuild()) {
-            lastCommitLog = updateStatus.getLastCommitLog();
+            latestCommitInfo = updateStatus.getLatestCommitInfo();
             // 将代码由本地仓库复制到编译目录
             BuilderUtil.copyToCompileDir(local, app);
         }
 
-        return lastCommitLog;
+        return latestCommitInfo;
     }
 
     private UpdateStatus update0(String remote, String branch, String local) throws Exception {
-        CommitLog current = codeUpdater.update(remote, branch, local);
-        current.setAppId(app.getAppId());
-        if (lastCommitLog != null) {
-            if (lastCommitLog.getCommitId().equals(current.getCommitId())) {
+        CommitInfo current = codeUpdater.update(remote, branch, local);
+        if (latestCommitInfo != null) {
+            if (latestCommitInfo.getCommitId().equals(current.getCommitId())) {
                 return new UpdateStatus(current, false);
-            } else if (lastCommitLog.getMsCommitTime() > current.getMsCommitTime()) {
+            } else if (latestCommitInfo.getMsCommitTime() > current.getMsCommitTime()) {
                 throw new Exception("本地仓库代码比远程仓库更新...");
             }
         }
@@ -191,7 +190,7 @@ public class AppIntegrate {
     }
 
     public String pack() throws Exception {
-        return codePacker.pack(app.getAppId(), lastCommitLog.getCommitId(), compileDir());
+        return codePacker.pack(app.getAppId(), latestCommitInfo.getCommitId(), compileDir());
     }
 
     private String compileDir() {
@@ -201,7 +200,7 @@ public class AppIntegrate {
     @Data
     @AllArgsConstructor
     static class UpdateStatus {
-        private CommitLog lastCommitLog;
+        private CommitInfo latestCommitInfo;
         private boolean isUpdated;
     }
 }

+ 3 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/repo/CodeUpdater.java

@@ -1,7 +1,5 @@
 package cn.reghao.autodop.dmaster.app.service.build.tools.repo;
 
-import cn.reghao.autodop.dmaster.app.entity.log.CommitLog;
-
 /**
  * 更新代码
  *
@@ -18,7 +16,7 @@ public interface CodeUpdater {
      * @return 当前代码仓库的版本
      * @date 2019-10-12 下午11:08
      */
-    CommitLog update(String remote, String branch, String local) throws Exception;
+    CommitInfo update(String remote, String branch, String local) throws Exception;
 
     /**
      * // TODO 拉取指定版本的代码
@@ -27,7 +25,7 @@ public interface CodeUpdater {
      * @return
      * @date 2020-09-08 下午6:18
      */
-    CommitLog update(String remote, String branch, String local, String commitId) throws Exception;
+    CommitInfo update(String remote, String branch, String local, String commitId) throws Exception;
 
     /**
      * 本地代码仓库最近一次提交的信息
@@ -36,5 +34,5 @@ public interface CodeUpdater {
      * @param local 本地代码仓库路径
      * @date 2019-10-30 下午5:23
      */
-    CommitLog lastCommitInfo(String local, String branch) throws Exception;
+    CommitInfo latestCommitInfo(String local, String branch) throws Exception;
 }

+ 27 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/repo/CommitInfo.java

@@ -0,0 +1,27 @@
+package cn.reghao.autodop.dmaster.app.service.build.tools.repo;
+
+import cn.reghao.autodop.dmaster.app.entity.log.ChangedFile;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 代码提交信息
+ *
+ * @author reghao
+ * @date 2020-05-13 22:50:38
+ */
+@Data
+public class CommitInfo {
+    private String remote;
+    private String branch;
+    private String local;
+    // 代码是否更新
+    private boolean isUpdate;
+    private String commitId;
+    private String commitAuthor;
+    private String commitMsg;
+    // 毫秒级时间戳
+    private Long msCommitTime;
+    private List<ChangedFile> changedFiles;
+}

+ 22 - 23
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/repo/GitImpl.java

@@ -4,7 +4,6 @@ import cn.reghao.autodop.common.utils.text.TextFile;
 import cn.reghao.autodop.dmaster.app.constant.build.RepoAuthType;
 import cn.reghao.autodop.dmaster.app.entity.config.build.RepoConfig;
 import cn.reghao.autodop.dmaster.app.entity.log.ChangedFile;
-import cn.reghao.autodop.dmaster.app.entity.log.CommitLog;
 import cn.reghao.autodop.dmaster.app.exception.UpdateException;
 import com.jcraft.jsch.JSch;
 import com.jcraft.jsch.JSchException;
@@ -95,7 +94,7 @@ public class GitImpl implements CodeUpdater {
      * @date 2020-05-13 下午9:22
      */
     @Override
-    public CommitLog update(String remote, String branch, String local) throws Exception {
+    public CommitInfo update(String remote, String branch, String local) throws Exception {
         String localRepoDir = local + dirname(remote);
         File file = new File(localRepoDir);
         if (!file.exists() && !file.mkdirs()) {
@@ -103,9 +102,9 @@ public class GitImpl implements CodeUpdater {
         }
 
         File localRepo = new File(localRepoDir + "/.git");
-        CommitLog commitLog;
+        CommitInfo commitInfo;
         if (!localRepo.exists()) {
-            commitLog = clone(remote, branch, localRepoDir);
+            commitInfo = clone(remote, branch, localRepoDir);
         } else {
             try (Repository repo = new FileRepository(localRepo.getAbsolutePath())) {
                 if (sshSessionFactory != null) {
@@ -122,16 +121,16 @@ public class GitImpl implements CodeUpdater {
                     gitPull.call();
                 }
 
-                commitLog = commitInfo(repo, branch);
-                commitLog.setChangedFiles(changedFileList(repo, branch));
+                commitInfo = commitInfo(repo, branch);
+                commitInfo.setChangedFiles(changedFileList(repo, branch));
             }
         }
-        commitLog.setRemote(remote);
-        commitLog.setBranch(branch);
-        return commitLog;
+        commitInfo.setRemote(remote);
+        commitInfo.setBranch(branch);
+        return commitInfo;
     }
 
-    private CommitLog clone(String remote, String branch, String local) throws Exception {
+    private CommitInfo clone(String remote, String branch, String local) throws Exception {
         CloneCommand gitClone;
         if (sshSessionFactory != null) {
             gitClone = Git.cloneRepository()
@@ -155,13 +154,13 @@ public class GitImpl implements CodeUpdater {
 
         try (Git git = gitClone.call()) {
             Repository repo = git.getRepository();
-            CommitLog commitLog = commitInfo(repo, branch);
-            commitLog.setChangedFiles(changedFileList(repo, branch));
-            return commitLog;
+            CommitInfo commitInfo = commitInfo(repo, branch);
+            commitInfo.setChangedFiles(changedFileList(repo, branch));
+            return commitInfo;
         }
     }
 
-    private CommitLog commitInfo(Repository repo, String branch) throws Exception {
+    private CommitInfo commitInfo(Repository repo, String branch) throws Exception {
         Ref head = repo.findRef("refs/heads/" + branch);
         ObjectId objectId = head.getObjectId();
         try (RevWalk walk = new RevWalk(repo)) {
@@ -171,16 +170,16 @@ public class GitImpl implements CodeUpdater {
             String commitAuthor = lastCommit.getAuthorIdent().getName();
             String commitMsg = lastCommit.getFullMessage();
 
-            CommitLog commitLog = new CommitLog();
-            commitLog.setCommitId(objectId.name().substring(0, 8));
-            commitLog.setMsCommitTime(commitTime*1000);
-            commitLog.setCommitAuthor(commitAuthor);
+            CommitInfo commitInfo = new CommitInfo();
+            commitInfo.setCommitId(objectId.name().substring(0, 8));
+            commitInfo.setMsCommitTime(commitTime*1000);
+            commitInfo.setCommitAuthor(commitAuthor);
             if (commitMsg.length() > 1000) {
-                commitLog.setCommitMsg(commitMsg.substring(0, 1000));
+                commitInfo.setCommitMsg(commitMsg.substring(0, 1000));
             } else {
-                commitLog.setCommitMsg(commitMsg);
+                commitInfo.setCommitMsg(commitMsg);
             }
-            return commitLog;
+            return commitInfo;
         }
     }
 
@@ -226,12 +225,12 @@ public class GitImpl implements CodeUpdater {
     }
 
     @Override
-    public CommitLog update(String remote, String branch, String local, String commitId) throws Exception {
+    public CommitInfo update(String remote, String branch, String local, String commitId) throws Exception {
         return null;
     }
 
     @Override
-    public CommitLog lastCommitInfo(String local, String branch) throws Exception {
+    public CommitInfo latestCommitInfo(String local, String branch) throws Exception {
         File localRepo = new File(local + "/.git");
         if (!localRepo.exists()) {
             return null;

+ 20 - 19
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/tools/repo/SvnImpl.java

@@ -52,7 +52,7 @@ public class SvnImpl implements CodeUpdater {
     }
 
     @Override
-    public CommitLog update(String remote, String branch, String local) throws SVNException {
+    public CommitInfo update(String remote, String branch, String local) throws SVNException {
         File localRepo = new File(local);
         if (!localRepo.exists()) {
             checkout(remote, localRepo);
@@ -61,10 +61,10 @@ public class SvnImpl implements CodeUpdater {
                     true, false);
         }
 
-        CommitLog commitLog = lastCommitInfo(local, branch);
-        commitLog.setRemote(remote);
-        commitLog.setBranch(branch);
-        return commitLog;
+        CommitInfo commitInfo = latestCommitInfo(local, branch);
+        commitInfo.setRemote(remote);
+        commitInfo.setBranch(branch);
+        return commitInfo;
     }
 
     private List<ChangedFile> changedFileList(Map<String, SVNLogEntryPath> changedPaths) {
@@ -93,12 +93,13 @@ public class SvnImpl implements CodeUpdater {
     }
 
     @Override
-    public CommitLog update(String remote, String branch, String local, String commitId) throws Exception {
+    public CommitInfo update(String remote, String branch, String local, String commitId) throws Exception {
+        // TODO 待实现
         return null;
     }
 
     @Override
-    public CommitLog lastCommitInfo(String local, String branch) throws SVNException {
+    public CommitInfo latestCommitInfo(String local, String branch) throws SVNException {
         File localRepo = new File(local);
         if (!localRepo.exists()) {
             return null;
@@ -107,17 +108,17 @@ public class SvnImpl implements CodeUpdater {
         SVNStatus status = statusClient.doStatus(localRepo, false);
         long version = status.getCommittedRevision().getNumber();
 
-        CommitLog commitLog = commitInfo(localRepo, version);
-        commitLog.setBranch(branch);
-        return commitLog;
+        CommitInfo commitInfo = commitInfo(localRepo, version);
+        commitInfo.setBranch(branch);
+        return commitInfo;
     }
 
-    private CommitLog commitInfo(File localRepo, long version) throws SVNException {
+    private CommitInfo commitInfo(File localRepo, long version) throws SVNException {
         File[] paths = { localRepo };
         SVNRevision start = SVNRevision.create(version);
         SVNRevision end = SVNRevision.create(version);
         long limit = 9999L;
-        CommitLog commitLog = new CommitLog();
+        CommitInfo commitInfo = new CommitInfo();
         logClient.doLog(paths, start, end, false, true, limit, logEntry -> {
             String commitAuthor = logEntry.getAuthor();
             String commitMsg = logEntry.getMessage();
@@ -125,17 +126,17 @@ public class SvnImpl implements CodeUpdater {
             String commitId = String.valueOf(logEntry.getRevision());
             Map<String, SVNLogEntryPath> changedPaths = logEntry.getChangedPaths();
 
-            commitLog.setCommitId(commitId);
+            commitInfo.setCommitId(commitId);
             if (commitMsg.length() > 1000) {
-                commitLog.setCommitMsg(commitMsg.substring(0, 1000));
+                commitInfo.setCommitMsg(commitMsg.substring(0, 1000));
             } else {
-                commitLog.setCommitMsg(commitMsg);
+                commitInfo.setCommitMsg(commitMsg);
             }
-            commitLog.setCommitAuthor(commitAuthor);
-            commitLog.setMsCommitTime(commitTime);
-            commitLog.setChangedFiles(changedFileList(changedPaths));
+            commitInfo.setCommitAuthor(commitAuthor);
+            commitInfo.setMsCommitTime(commitTime);
+            commitInfo.setChangedFiles(changedFileList(changedPaths));
         });
 
-        return commitLog;
+        return commitInfo;
     }
 }

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

@@ -70,7 +70,7 @@ public class BuildDeployAppCrudService implements CrudOps<BuildDeployApp> {
 
     @Override
     public PageList<BuildDeployApp> getByPage(int page, int size, String env) {
-        // 默认按更新时间倒
+        // 按最近更新时间降
         PageRequest pageRequest =
                 PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
         Page<BuildDeployApp> page1 =

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/crud/global/NotifierCrudService.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/crud/NotifierCrudService.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.app.service.crud.global;
+package cn.reghao.autodop.dmaster.app.service.crud;
 
 import cn.reghao.autodop.dmaster.common.db.CrudOps;
 import cn.reghao.autodop.dmaster.common.db.PageList;

+ 49 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/crud/log/BuildLogCrudService.java

@@ -0,0 +1,49 @@
+package cn.reghao.autodop.dmaster.app.service.crud.log;
+
+import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
+import cn.reghao.autodop.dmaster.app.repository.log.BuildLogRepository;
+import cn.reghao.autodop.dmaster.common.db.CrudOps;
+import cn.reghao.autodop.dmaster.common.db.PageList;
+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.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2021-02-19 16:39:29
+ */
+@Service
+public class BuildLogCrudService implements CrudOps<BuildLog> {
+    private BuildLogRepository buildLogRepository;
+
+    public BuildLogCrudService(BuildLogRepository buildLogRepository) {
+        this.buildLogRepository = buildLogRepository;
+    }
+
+    @Override
+    public void add(BuildLog buildLog) {
+        BuildLog entity =
+                buildLogRepository.findByAppIdAndRepoAndCompilerAndPackerAndPackScriptAndCommitIdAndStatusCode(
+                buildLog.getAppId(), buildLog.getRepo(), buildLog.getCompiler(), buildLog.getPacker(),
+                buildLog.getPackScript(), buildLog.getCommitId(), buildLog.getStatusCode());
+        if (entity == null) {
+            buildLogRepository.save(buildLog);
+        }
+    }
+
+    @Override
+    public PageList<BuildLog> getByPage(int page, int size, String env) {
+        // 默认按更新时间倒序
+        Sort sortBy = Sort.by(Sort.Direction.DESC, "updateTime");
+        PageRequest pageRequest = PageRequest.of(page-1, size, sortBy);
+        Page<BuildLog> page1 = buildLogRepository.findAll(pageRequest);
+        PageList<BuildLog> pageList = new PageList<>();
+        pageList.setTotalSize(page1.getTotalElements());
+        pageList.setTotalPages(page1.getTotalPages());
+        pageList.setList(page1.getContent().stream().map(BuildLog::vo).collect(Collectors.toList()));
+        return pageList;
+    }
+}

+ 48 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/crud/log/CommitLogCrudService.java

@@ -0,0 +1,48 @@
+package cn.reghao.autodop.dmaster.app.service.crud.log;
+
+import cn.reghao.autodop.dmaster.app.entity.log.CommitLog;
+import cn.reghao.autodop.dmaster.app.repository.log.CommitLogRepository;
+import cn.reghao.autodop.dmaster.common.db.CrudOps;
+import cn.reghao.autodop.dmaster.common.db.PageList;
+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.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2021-02-19 16:39:29
+ */
+@Service
+public class CommitLogCrudService implements CrudOps<CommitLog> {
+    private CommitLogRepository commitLogRepository;
+
+    public CommitLogCrudService(CommitLogRepository commitLogRepository) {
+        this.commitLogRepository = commitLogRepository;
+    }
+
+    @Override
+    public void add(CommitLog commitLog) {
+        CommitLog entity = commitLogRepository.findByAppIdAndRepoAndCommitId(
+                commitLog.getAppId(), commitLog.getRepo(), commitLog.getCommitId());
+        if (entity == null) {
+            commitLogRepository.save(commitLog);
+        }
+    }
+
+    @Override
+    public PageList<CommitLog> getByPage(int page, int size, String env) {
+        // 默认按更新时间倒序
+        PageRequest pageRequest =
+                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
+
+        Page<CommitLog> page1 = commitLogRepository.findAll(pageRequest);
+        PageList<CommitLog> pageList = new PageList<>();
+        pageList.setTotalSize(page1.getTotalElements());
+        pageList.setTotalPages(page1.getTotalPages());
+        pageList.setList(page1.getContent().stream().map(CommitLog::vo).collect(Collectors.toList()));
+        return pageList;
+    }
+}

+ 50 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/crud/log/DeployLogCrudService.java

@@ -0,0 +1,50 @@
+package cn.reghao.autodop.dmaster.app.service.crud.log;
+
+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.DeployLogRepository;
+import cn.reghao.autodop.dmaster.common.db.CrudOps;
+import cn.reghao.autodop.dmaster.common.db.PageList;
+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.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2021-02-19 16:39:29
+ */
+@Service
+public class DeployLogCrudService implements CrudOps<DeployLog> {
+    private DeployLogRepository deployLogRepository;
+
+    public DeployLogCrudService(DeployLogRepository deployLogRepository) {
+        this.deployLogRepository = deployLogRepository;
+    }
+
+    @Override
+    public void add(DeployLog deployLog) {
+        String machineId = deployLog.getMachineId();
+        BuildLog buildLog = deployLog.getBuildLog();
+        DeployLog entity = deployLogRepository.findByBuildLogAndMachineId(buildLog, machineId);
+        if (entity == null) {
+            deployLogRepository.save(deployLog);
+        }
+    }
+
+    @Override
+    public PageList<DeployLog> getByPage(int page, int size, String env) {
+        // 默认按更新时间倒序
+        PageRequest pageRequest =
+                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
+
+        Page<DeployLog> page1 = deployLogRepository.findAll(pageRequest);
+        PageList<DeployLog> pageList = new PageList<>();
+        pageList.setTotalSize(page1.getTotalElements());
+        pageList.setTotalPages(page1.getTotalPages());
+        pageList.setList(page1.getContent().stream().map(DeployLog::vo).collect(Collectors.toList()));
+        return pageList;
+    }
+}

+ 24 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/deploy/AppDeployer.java

@@ -7,12 +7,16 @@ import cn.reghao.autodop.common.dagent.app.api.AppOps;
 import cn.reghao.autodop.common.dagent.app.api.data.deploy.AppDeployArgs;
 import cn.reghao.autodop.common.dockerc.pojo.Config;
 import cn.reghao.autodop.common.utils.serializer.JsonConverter;
+import cn.reghao.autodop.dmaster.app.constant.BuildDeployResult;
 import cn.reghao.autodop.dmaster.app.entity.config.deploy.DeployConfig;
 import cn.reghao.autodop.dmaster.app.entity.status.DeployedAppStatus;
 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.RemoteCallService;
 import cn.reghao.autodop.dmaster.app.service.log.BuildDeployLogConsumer;
+import cn.reghao.autodop.dmaster.cluster.entity.MachineInfo;
+import cn.reghao.autodop.dmaster.cluster.entity.NetworkInfo;
+import cn.reghao.autodop.dmaster.cluster.repository.MachineInfoRepository;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
@@ -30,10 +34,14 @@ import java.util.*;
 public class AppDeployer {
     private RemoteCallService callService;
     private BuildDeployLogConsumer logConsumer;
+    private MachineInfoRepository machineInfoRepository;
 
-    public AppDeployer(RemoteCallService callService, BuildDeployLogConsumer logConsumer) {
+    public AppDeployer(RemoteCallService callService,
+                       BuildDeployLogConsumer logConsumer,
+                       MachineInfoRepository machineInfoRepository) {
         this.callService = callService;
         this.logConsumer = logConsumer;
+        this.machineInfoRepository = machineInfoRepository;
     }
 
     /**
@@ -71,7 +79,9 @@ public class AppDeployer {
         rpcResultMap.forEach((machineId, rpcResult) -> {
             DeployLog deployLog = DeployLog.of(buildLog);
             deployLog.setMachineId(machineId);
+            deployLog.setMachineAddress(machineAddress(machineId));
             deployLog.setDeployTime(deployTime);
+
             deployLog.setStatusCode(rpcResult.getStatusCode());
             if (rpcResult.getStatusCode() == 0) {
                 DeployedAppStatus deployedAppStatus =
@@ -80,11 +90,23 @@ public class AppDeployer {
                 deployedAppStatus.setCommitId(buildLog.getCommitId());
 
                 logConsumer.addAppStatus(deployedAppStatus);
-                deployLog.setResult("部署成功");
+                deployLog.setResult(BuildDeployResult.deployDone.getName());
+            } else {
+                deployLog.setResult(rpcResult.getResult());
             }
             deployLogs.add(deployLog);
         });
 
         return deployLogs;
     }
+
+    private String machineAddress(String machineId) {
+        MachineInfo machineInfo = machineInfoRepository.findByMachineId(machineId);
+        List<NetworkInfo> networkInfos = machineInfo.getNetworkInfo();
+        if (!networkInfos.isEmpty()) {
+            return networkInfos.get(0).getIpv4();
+        } else {
+            return "0.0.0.0";
+        }
+    }
 }

+ 21 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/deploy/DeployNotifyMsg.java

@@ -1,20 +1,24 @@
 package cn.reghao.autodop.dmaster.app.service.deploy;
 
+import cn.reghao.autodop.common.utils.DateTimeConverter;
+import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
 import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 import lombok.Data;
 
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 /**
- * 部署通知消息
+ * 应用部署通知消息
  *
  * @author reghao
  * @date 2020-06-24 10:32:34
  */
 @Data
 public class DeployNotifyMsg {
+    private String title;
+    private String text;
+
     private String appId;
     private String env;
     private String commitId;
@@ -22,15 +26,23 @@ public class DeployNotifyMsg {
 
     public static DeployNotifyMsg deployNotifyMsg(List<DeployLog> deployLogs) {
         DeployLog deployLog = deployLogs.get(0);
+        BuildLog buildLog = deployLog.getBuildLog();
+
         DeployNotifyMsg deployNotifyMsg = new DeployNotifyMsg();
-        deployNotifyMsg.setAppId(deployLog.getAppId());
-        deployNotifyMsg.setEnv(deployLog.getEnv());
-        deployNotifyMsg.setCommitId(deployLog.getCommitId());
-        Map<String, String> map = new HashMap<>(deployLogs.size());
-        for (DeployLog deployLog1 : deployLogs) {
-            map.put(deployLog1.getMachineId(), deployLog1.getResult());
+        deployNotifyMsg.title = "应用更新消息";
+        StringBuilder sb = new StringBuilder();
+        sb.append("应用更新").append(System.lineSeparator());
+        sb.append("# 应用: ").append(buildLog.getAppId()).append(System.lineSeparator());
+        sb.append("# 版本: ").append(buildLog.getCommitId()).append(System.lineSeparator());
+        sb.append("# 环境: ").append(buildLog.getEnv()).append(System.lineSeparator());
+        sb.append("# 更新时间: ").append(DateTimeConverter.format(deployLog.getDeployTime()))
+                .append(System.lineSeparator());
+        sb.append("# 更新结果: ").append(System.lineSeparator());
+        for (int i = 0; i < deployLogs.size(); i++) {
+            sb.append(i+1).append(".").append(deployLogs.get(i).getMachineAddress()).append(" -> ")
+                    .append(deployLogs.get(i).getResult()).append(System.lineSeparator());
         }
-        deployNotifyMsg.setMap(map);
+        deployNotifyMsg.text = sb.toString();
         return deployNotifyMsg;
     }
 }

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

@@ -62,7 +62,7 @@ public class BuildDeployLogConsumer implements Runnable {
                 } else if (object instanceof DeployLog) {
                     DeployLog deployLog = (DeployLog) object;
                     logService.saveDeployLog(deployLog);
-                    log.info("持久化 {} 部署日志完成...", deployLog.getAppId());
+                    log.info("持久化 {} 部署日志完成...", deployLog.getBuildLog().getAppId());
                 } else if (object instanceof BuildDeployApp) {
                     BuildDeployApp buildDeployApp = (BuildDeployApp) object;
                     logService.saveBuildDeployApp(buildDeployApp);

+ 16 - 25
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/log/BuildDeployLogService.java

@@ -8,6 +8,9 @@ import cn.reghao.autodop.dmaster.app.repository.log.CommitLogRepository;
 import cn.reghao.autodop.dmaster.app.repository.log.DeployLogRepository;
 import cn.reghao.autodop.dmaster.app.service.crud.log.AppStatusCrudService;
 import cn.reghao.autodop.dmaster.app.service.crud.BuildDeployAppCrudService;
+import cn.reghao.autodop.dmaster.app.service.crud.log.BuildLogCrudService;
+import cn.reghao.autodop.dmaster.app.service.crud.log.CommitLogCrudService;
+import cn.reghao.autodop.dmaster.app.service.crud.log.DeployLogCrudService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -21,49 +24,37 @@ import org.springframework.transaction.annotation.Transactional;
 @Slf4j
 @Service
 public class BuildDeployLogService {
-    private CommitLogRepository commitLogRepository;
-    private BuildLogRepository buildLogRepository;
-    private DeployLogRepository deployLogRepository;
+    private CommitLogCrudService commitLogCrudService;
+    private BuildLogCrudService buildLogCrudService;
+    private DeployLogCrudService deployLogCrudService;
     private BuildDeployAppCrudService buildDeployAppCrudService;
     private AppStatusCrudService statusCrudService;
-
-    public BuildDeployLogService(CommitLogRepository commitLogRepository,
-                                 BuildLogRepository buildLogRepository,
-                                 DeployLogRepository deployLogRepository,
+    
+    public BuildDeployLogService(CommitLogCrudService commitLogCrudService,
+                                 BuildLogCrudService buildLogCrudService,
+                                 DeployLogCrudService deployLogCrudService,
                                  BuildDeployAppCrudService buildDeployAppCrudService,
                                  AppStatusCrudService statusCrudService) {
-        this.commitLogRepository = commitLogRepository;
-        this.buildLogRepository = buildLogRepository;
-        this.deployLogRepository = deployLogRepository;
+        this.commitLogCrudService = commitLogCrudService;
+        this.buildLogCrudService = buildLogCrudService;
+        this.deployLogCrudService = deployLogCrudService;
         this.buildDeployAppCrudService = buildDeployAppCrudService;
         this.statusCrudService = statusCrudService;
     }
 
     @Transactional(rollbackFor = {Exception.class})
     public void saveCommitLog(CommitLog commitLog) {
-        CommitLog commitLog1 =
-                commitLogRepository.findByAppIdAndCommitId(commitLog.getAppId(), commitLog.getCommitId());
-        if (commitLog1 == null) {
-            commitLogRepository.save(commitLog);
-        }
+        commitLogCrudService.add(commitLog);
     }
 
     @Transactional(rollbackFor = {Exception.class})
     public void saveBuildLog(BuildLog buildLog) throws Exception {
-        BuildLog buildLog1 = buildLogRepository.findBuildLogByAppIdAndCommitIdAndStatusCode(
-                buildLog.getAppId(), buildLog.getCommitId(), buildLog.getStatusCode());
-        if (buildLog1 == null) {
-            buildLogRepository.save(buildLog);
-        }
+        buildLogCrudService.add(buildLog);
     }
 
     @Transactional(rollbackFor = {Exception.class})
     public void saveDeployLog(DeployLog deployLog) throws Exception {
-        DeployLog deployLog1 = deployLogRepository.findByAppIdAndCommitIdAndMachineIdAndStatusCode(
-                deployLog.getAppId(), deployLog.getCommitId(), deployLog.getMachineId(), deployLog.getStatusCode());
-        if (deployLog1 == null) {
-            deployLogRepository.save(deployLog);
-        }
+        deployLogCrudService.add(deployLog);
     }
 
     @Transactional(rollbackFor = {Exception.class})

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/orchestration/AppVO.java

@@ -45,7 +45,7 @@ public class AppVO {
     private String branch;
     private String dirname;
     private String compileHome;
-    private String dockerfile;
+    private String packScript;
 
     private BuildConfigVO buildConfig;
     private String projId;
@@ -71,7 +71,7 @@ public class AppVO {
         vo.branch = app.getBranch();
         vo.dirname = app.getDirname();
         vo.compileHome = app.getCompileHome();
-        vo.dockerfile = app.getDockerfile();
+        vo.packScript = app.getPackScript();
 
         if (app.getBuildConfig() != null) {
             vo.buildConfig = BuildConfigVO.from(app.getBuildConfig());
@@ -106,7 +106,7 @@ public class AppVO {
         app.setBranch(vo.branch);
         app.setDirname(vo.dirname);
         app.setCompileHome(vo.compileHome);
-        app.setDockerfile(vo.getDockerfile());
+        app.setPackScript(vo.getPackScript());
 
         if (vo.getBuildConfig() != null) {
             app.setBuildConfig(BuildConfigVO.to(vo.getBuildConfig()));

+ 0 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/cluster/service/crud/MachineCrudService.java

@@ -32,7 +32,6 @@ public class MachineCrudService implements CrudOps<MachineInfo> {
             machineInfo.setCreateTime(machineEntity.getCreateTime());
             machineInfo.setUpdateTime(LocalDateTime.now());
         }
-        machineInfo.setIsDelete(false);
         machineRepository.save(machineInfo);
     }
 

+ 4 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/db/orm/BaseDocument.java

@@ -1,7 +1,6 @@
 package cn.reghao.autodop.dmaster.common.db.orm;
 
 import lombok.Data;
-import lombok.NoArgsConstructor;
 import org.springframework.data.annotation.Id;
 
 import java.io.Serializable;
@@ -12,7 +11,6 @@ import java.time.LocalDateTime;
  * @date 2019-10-18 14:42:48
  */
 @Data
-@NoArgsConstructor
 public class BaseDocument implements Serializable {
     private static final long serialVersionUID = 1L;
     @Id
@@ -22,4 +20,8 @@ public class BaseDocument implements Serializable {
 
     protected LocalDateTime createTime;
     protected LocalDateTime updateTime;
+
+    public BaseDocument() {
+        this.isDelete = false;
+    }
 }

+ 4 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/db/orm/BaseEntity.java

@@ -18,7 +18,6 @@ import java.time.LocalDateTime;
 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
 @Table
 @Data
-@NoArgsConstructor
 public class BaseEntity implements Serializable {
     private static final long serialVersionUID = 1L;
     @Id
@@ -32,4 +31,8 @@ public class BaseEntity implements Serializable {
     protected LocalDateTime createTime;
     @CreationTimestamp
     protected LocalDateTime updateTime;
+
+    public BaseEntity() {
+        this.isDelete = false;
+    }
 }

+ 35 - 10
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/notifier/DingMsg.java

@@ -1,6 +1,5 @@
 package cn.reghao.autodop.dmaster.utils.notifier;
 
-import cn.reghao.autodop.common.utils.serializer.JsonConverter;
 import lombok.Data;
 
 import java.util.Arrays;
@@ -14,15 +13,48 @@ import java.util.Arrays;
 @Data
 public class DingMsg {
     private Text text;
+    private Markdown markdown;
     private String msgtype;
     private At at;
 
+    /**
+     * 文本消息
+     * https://developers.dingtalk.com/document/app/custom-robot-access
+     *
+     * @param
+     * @return
+     * @date 2021-03-05 下午4:52
+     */
     public DingMsg(Object content) {
         this.text = new DingMsg.Text(content);
-        this.msgtype = DingMsg.MsgType.text.name();
+        this.msgtype = MsgType.text.name();
+        this.msgtype = MsgType.markdown.name();
         this.at = new DingMsg.At(true);
     }
 
+    /**
+     * markdown 消息
+     *
+     * @param
+     * @return
+     * @date 2021-03-05 下午4:52
+     */
+    public DingMsg(String title, String text) {
+        this.markdown = new DingMsg.Markdown(title, text);
+        this.msgtype = MsgType.markdown.name();
+        this.at = new DingMsg.At(true);
+    }
+
+    static class Markdown {
+        private String title;
+        private String text;
+
+        public Markdown(String title, String text) {
+            this.title = title;
+            this.text = text;
+        }
+    }
+
     static class Text {
         private Object content;
 
@@ -46,13 +78,6 @@ public class DingMsg {
     }
 
     enum MsgType {
-        text
-    }
-
-    public static void main(String[] args) {
-        DingMsg dingMsg = new DingMsg("dalaoshu");
-
-        String json = JsonConverter.objectToJson(dingMsg);
-        System.out.println();
+        text, markdown
     }
 }

+ 8 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/notifier/NotifyService.java

@@ -2,6 +2,7 @@ package cn.reghao.autodop.dmaster.utils.notifier;
 
 import cn.reghao.autodop.dmaster.app.constant.NotifierType;
 import cn.reghao.autodop.dmaster.app.entity.config.NotifierConfig;
+import cn.reghao.autodop.dmaster.app.service.deploy.DeployNotifyMsg;
 import cn.reghao.autodop.dmaster.common.thread.ThreadPoolWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -24,8 +25,13 @@ public class NotifyService {
         switch (NotifierType.valueOf(notifierConfig.getType())) {
             case webhook:
                 DingNotify dingNotify = new DingNotify();
-                notifierConfig.getReceivers().forEach(receiver ->
-                        threadPool.execute(new NotifyTask<>(dingNotify, receiver, new DingMsg(msg))));
+                if (msg instanceof DeployNotifyMsg) {
+                    DeployNotifyMsg deployNotifyMsg = (DeployNotifyMsg) msg;
+                    notifierConfig.getReceivers().forEach(receiver ->
+                            threadPool.execute(
+                                    new NotifyTask<>(dingNotify, receiver,
+                                            new DingMsg(deployNotifyMsg.getTitle(), deployNotifyMsg.getText()))));
+                }
                 break;
             case sms:
                 Map<String, String> payload = notifierConfig.getPayload();