Przeglądaj źródła

调整数据模型,使之符合 Hibernate 环境

实体之间只使用 join 关联,不使用外键。只有实体内部的集合才使用外键
reghao 5 lat temu
rodzic
commit
2ca80cc919
33 zmienionych plików z 265 dodań i 98 usunięć
  1. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/caching/DeployCaching.java
  2. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppBuildController.java
  3. 17 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppOrchestrateController.java
  4. 7 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppStatusController.java
  5. 48 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/IndexController.java
  6. 2 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/BaseEntity.java
  7. 4 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/build/AppBuild.java
  8. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/build/compile/AppCompile.java
  9. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/build/pack/AppPack.java
  10. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/build/update/AppUpdate.java
  11. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/NotifierType.java
  12. 0 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/AppLog.java
  13. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/DeployedApp.java
  14. 12 12
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildDeployLog.java
  15. 1 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildLog.java
  16. 4 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/AppOrchestration.java
  17. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/Notification.java
  18. 0 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/CommitLogRepository.java
  19. 24 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/AppDAO.java
  20. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/NotificationRepository.java
  21. 4 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppLogManager.java
  22. 36 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppOrchestrateService.java
  23. 1 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppIntegrate.java
  24. 2 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/BuildDispatcher.java
  25. 23 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/deploy/AppDeployer.java
  26. 5 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/log/LogConsumer.java
  27. 2 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/updater/CommitLog.java
  28. 25 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/AppToBuild.java
  29. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/ResultVO.java
  30. 1 1
      dmaster/src/main/resources/application-dev.yml
  31. 0 9
      dmaster/src/main/resources/application-prod.yml
  32. 1 1
      dmaster/src/main/resources/application-test.yml
  33. 34 4
      dmaster/src/test/java/cn/reghao/autodop/dmaster/app/entity/orchestration/AppOrchestrationTest.java

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/caching/DeployCaching.java

@@ -35,7 +35,7 @@ public class DeployCaching {
     public List<String> deployedApps() {
         List<DeployedApp> deployedApps = deployedAppRepository.findAll();
         return deployedApps.stream()
-                .map(DeployedApp::getAppId)
+                .map(deployedApp -> deployedApp.getAppId())
                 .collect(Collectors.toList());
     }
 }

+ 2 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppBuildController.java

@@ -11,6 +11,8 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.tmatesoft.svn.core.SVNException;
 

+ 17 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppOrchestrateController.java

@@ -1,6 +1,8 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
 import cn.reghao.autodop.dmaster.app.service.AppOrchestrateService;
+import cn.reghao.autodop.dmaster.app.vo.AppToBuild;
+import cn.reghao.autodop.dmaster.app.vo.PageList;
 import cn.reghao.autodop.dmaster.common.webresult.WebResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -9,6 +11,8 @@ import org.springframework.data.domain.PageRequest;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2019-11-27 11:29:43
@@ -79,4 +83,17 @@ public class AppOrchestrateController {
         appOrchestrateService.delete(type, appId);
         return ResponseEntity.ok().body(WebResult.success("ok"));
     }
+
+    @ApiOperation(value = "待构建的应用列表")
+    @GetMapping("/build/list")
+    public ResponseEntity<String> buildList(/*@RequestParam("page") int page, @RequestParam("size") int size*/) {
+        //PageRequest pageRequest = PageRequest.of(page-1, size);
+        List<AppToBuild> res = appOrchestrateService.buildList();
+
+        PageList<AppToBuild> pageList = new PageList<>();
+        pageList.setList(res);
+        pageList.setSize(res.size());
+
+        return ResponseEntity.ok().body(WebResult.success(pageList));
+    }
 }

+ 7 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppStatusController.java

@@ -2,7 +2,9 @@ package cn.reghao.autodop.dmaster.app.controller;
 
 import cn.reghao.autodop.common.deploy.AppStatus;
 import cn.reghao.autodop.common.dockerc.exception.DockerException;
+import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.service.AppStatusManager;
+import cn.reghao.autodop.dmaster.app.vo.PageList;
 import cn.reghao.autodop.dmaster.common.webresult.WebResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -66,6 +68,10 @@ public class AppStatusController {
     @GetMapping("/status")
     public ResponseEntity<String> status() throws DockerException {
         List<AppStatus> statusList = statusManager.status();
-        return ResponseEntity.ok().body(WebResult.success(statusList));
+        PageList<AppStatus> pageList = new PageList<>();
+        pageList.setList(statusList);
+        pageList.setSize(statusList.size());
+
+        return ResponseEntity.ok().body(WebResult.success(pageList));
     }
 }

+ 48 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/IndexController.java

@@ -0,0 +1,48 @@
+package cn.reghao.autodop.dmaster.app.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author reghao
+ * @date 2020-02-28 11:33:23
+ */
+@Slf4j
+@Api(tags = "测试接口")
+@RestController
+public class IndexController {
+    @ApiOperation(value = "获取用户信息")
+    @ApiImplicitParams(
+            @ApiImplicitParam(name="appId", value="应用 ID", paramType="path", dataType = "String")
+    )
+    @GetMapping("/admin/getInfo")
+    public ResponseEntity<String> adminInfo() {
+        String result = "{\"code\":0,\"data\":{\"name\":\"admin\",\"roles\":[\"Home\",\"Dashbord\",\"Driver\",\"Driver-index\",\"Permission\",\"PageUser\",\"PageAdmin\",\"Roles\",\"Table\",\"BaseTable\",\"ComplexTable\",\"Icons\",\"Icons-index\",\"Components\",\"Sldie-yz\",\"Upload\",\"Carousel\",\"Echarts\",\"Sldie-chart\",\"Dynamic-chart\",\"Map-chart\",\"Excel\",\"Excel-out\",\"Excel-in\",\"Mutiheader-out\",\"Error\",\"Page404\",\"Github\",\"NavTest\",\"Nav1\",\"Nav2\",\"Nav2-1\",\"Nav2-2\",\"Nav2-2-1\",\"Nav2-2-2\",\"*404\"],\"introduce\":\"哈哈哈\"},\"_res\":{\"status\":200}}";
+        return ResponseEntity.ok().body(result);
+    }
+
+    @Data
+    static class Result {
+        private int code;
+        private Map<String, Integer> _res;
+        private String data;
+    }
+
+    @Data
+    static class AdminInfo {
+        private String name;
+        private String introduce;
+        private List<String> roles;
+    }
+}

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

@@ -9,11 +9,12 @@ import java.io.Serializable;
 import java.util.Date;
 
 /**
+ * 继承策略为每个实体类一张表
+ *
  * @author reghao
  * @date 2019-10-18 14:42:48
  */
 @Entity
-// 每个实体类一张表
 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
 @Table
 @Data

+ 4 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/build/AppBuild.java

@@ -5,9 +5,7 @@ import cn.reghao.autodop.dmaster.app.entity.build.pack.AppPack;
 import cn.reghao.autodop.dmaster.app.entity.build.update.AppUpdate;
 import lombok.Data;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Embeddable;
-import javax.persistence.ManyToOne;
+import javax.persistence.*;
 
 /**
  * @author reghao
@@ -17,9 +15,12 @@ import javax.persistence.ManyToOne;
 @Embeddable
 public class AppBuild {
     @ManyToOne(cascade = CascadeType.PERSIST)
+    @JoinColumn(name = "repo_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
     private AppUpdate appUpdate;
     @ManyToOne(cascade = CascadeType.PERSIST)
+    @JoinColumn(name = "compiler_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
     private AppCompile appCompile;
     @ManyToOne(cascade = CascadeType.PERSIST)
+    @JoinColumn(name = "packer_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
     private AppPack appPack;
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/build/compile/AppCompile.java

@@ -15,9 +15,9 @@ import javax.persistence.Entity;
 @EqualsAndHashCode(callSuper = false)
 @Entity
 public class AppCompile extends BaseEntity {
+    private String compilerType;
     @Column(nullable = false, unique = true)
     private String compilerName;
-    private String compilerType;
     private String compilerHome;
     private String script;
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/build/pack/AppPack.java

@@ -15,9 +15,9 @@ import javax.persistence.Entity;
 @EqualsAndHashCode(callSuper = false)
 @Entity
 public class AppPack extends BaseEntity {
+    private String packerType;
     @Column(nullable = false, unique = true)
     private String packerName;
-    private String packerType;
     // 应用打包后存放的位置,可以是一个本地位置,也可以是一个网络位置
     // 根据打包类型来确定
     private String packerPath;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/build/update/AppUpdate.java

@@ -15,9 +15,9 @@ import javax.persistence.Entity;
 @EqualsAndHashCode(callSuper = false)
 @Entity
 public class AppUpdate extends BaseEntity {
+    private String repoType;
     @Column(nullable = false, unique = true)
     private String repoName;
-    private String repoType;
     private String username;
     private String password;
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/NotifyType.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/NotifierType.java

@@ -6,6 +6,6 @@ package cn.reghao.autodop.dmaster.app.entity.constant;
  * @author reghao
  * @date 2020-03-01 17:18:53
  */
-public enum NotifyType {
+public enum NotifierType {
     ding, email, sms;
 }

+ 0 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/AppLog.java

@@ -1,13 +1,10 @@
 package cn.reghao.autodop.dmaster.app.entity.deploy;
 
-import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
 import lombok.AllArgsConstructor;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 
 import javax.persistence.Embeddable;
-import javax.persistence.Entity;
 import javax.validation.constraints.NotNull;
 
 /**
@@ -17,8 +14,6 @@ import javax.validation.constraints.NotNull;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-/*@EqualsAndHashCode(callSuper = false)
-@Entity*/
 @Embeddable
 public class AppLog {
     @NotNull

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/DeployedApp.java

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.app.entity.deploy;
 
 import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
+import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 

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

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.app.entity.log;
 
 import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
+import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.service.tools.updater.CommitLog;
 import cn.reghao.autodop.dmaster.app.vo.result.BuildResult;
 import cn.reghao.autodop.dmaster.app.vo.result.DeployResult;
@@ -8,9 +9,7 @@ import cn.reghao.autodop.dmaster.app.vo.result.DeployStatus;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-import javax.persistence.ElementCollection;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
+import javax.persistence.*;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
@@ -25,9 +24,10 @@ import java.util.Set;
 @EqualsAndHashCode(callSuper = false)
 @Entity
 public class BuildDeployLog extends BaseEntity {
-    private String appId;
-    private String description;
-    private String env;
+    // TODO 是否需要关联到 AppOrchestration
+    @ManyToOne(cascade = CascadeType.PERSIST)
+    @JoinColumn(name = "app_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
+    private AppOrchestration app;
     private BuildLog buildLog;
     // 一个应用可能会部署到多台主机
     @ElementCollection(fetch = FetchType.EAGER)
@@ -46,9 +46,9 @@ public class BuildDeployLog extends BaseEntity {
         buildResult.setCode(this.buildLog.getCode());
         buildResult.setMsg(this.buildLog.getMsg());
 
-        buildResult.setAppId(this.getAppId());
-        buildResult.setDescription(this.getDescription());
-        buildResult.setEnv(this.getEnv());
+        buildResult.setAppId(this.getApp().getAppId());
+        buildResult.setDescription(this.getApp().getDescription());
+        buildResult.setEnv(this.getApp().getEnv());
         CommitLog commitLog = this.buildLog.getCommitLog();
         if (commitLog != null) {
             buildResult.setCommitId(commitLog.getCommitId());
@@ -67,9 +67,9 @@ public class BuildDeployLog extends BaseEntity {
      */
     public DeployResult deployResult() {
         DeployResult deployResult = new DeployResult();
-        deployResult.setAppId(this.getAppId());
-        deployResult.setDescription(this.getDescription());
-        deployResult.setEnv(this.getEnv());
+        deployResult.setAppId(this.getApp().getAppId());
+        deployResult.setDescription(this.getApp().getDescription());
+        deployResult.setEnv(this.getApp().getEnv());
         CommitLog commitLog = this.buildLog.getCommitLog();
         if (commitLog != null) {
             deployResult.setCommitId(commitLog.getCommitId());

+ 1 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildLog.java

@@ -4,10 +4,7 @@ import cn.reghao.autodop.dmaster.app.service.tools.updater.CommitLog;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.persistence.OneToOne;
+import javax.persistence.*;
 import java.util.Date;
 
 /**
@@ -25,8 +22,6 @@ public class BuildLog {
     private int code;
     @Column(length = 1024)
     private String msg;
-
-    @OneToOne(cascade = CascadeType.PERSIST)
     private CommitLog commitLog;
     private String appPath;
     private Date buildTime;

+ 4 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/AppOrchestration.java

@@ -3,12 +3,10 @@ package cn.reghao.autodop.dmaster.app.entity.orchestration;
 import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
 import cn.reghao.autodop.dmaster.app.entity.build.AppBuild;
 import cn.reghao.autodop.dmaster.app.entity.deploy.AppDeploy;
-import cn.reghao.autodop.dmaster.app.entity.deploy.AppLog;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import javax.persistence.*;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -40,10 +38,13 @@ public class AppOrchestration extends BaseEntity implements Cloneable {
     private String dependencyRepos;
 
     // projId 和 appBuild 二者只能存在一个
-    private String projId;
+    @ManyToOne(cascade = CascadeType.PERSIST)
+    @JoinColumn(name = "proj_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
+    private ProjOrchestration proj;
     private AppBuild appBuild;
     private AppDeploy appDeploy;
     @ManyToOne(cascade = CascadeType.PERSIST)
+    @JoinColumn(name = "notification_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
     private Notification notification;
     // 是否启用编排
     private boolean enable;

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/Notification.java

@@ -15,8 +15,8 @@ import javax.persistence.Entity;
 @EqualsAndHashCode(callSuper = false)
 @Entity
 public class Notification extends BaseEntity {
+    private String notifierType;
     @Column(nullable = false, unique = true)
-    private String notifyName;
-    private String notifyType;
+    private String notifierName;
     private String destination;
 }

+ 0 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/CommitLogRepository.java

@@ -1,11 +0,0 @@
-package cn.reghao.autodop.dmaster.app.repository.log;
-
-import cn.reghao.autodop.dmaster.app.service.tools.updater.CommitLog;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-/**
- * @author reghao
- * @date 2020-01-21 14:53:03
- */
-public interface CommitLogRepository extends JpaRepository<CommitLog, Long> {
-}

+ 24 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/AppDAO.java

@@ -5,6 +5,7 @@ import org.springframework.stereotype.Service;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
+import java.util.List;
 
 /**
  * @author reghao
@@ -27,4 +28,27 @@ public class AppDAO {
             Object obj = query.getSingleResult();
         }
     }
+
+    public List findBuildApps() {
+        try (Session session = (Session) em.getDelegate()) {
+            String hql = "select app.appId,log1.commitId,log1.commitMsg, log1.commitAuthor from AppOrchestration app " +
+                    "inner join BuildDeployLog log " +
+                    "inner join CommitLog log1 " +
+                    "on app.appId = log.appId and log.buildLog.commitLog =log1 " +
+                    "where app.enable=true " +
+                    "group by app.appId";
+            Query query = session.createQuery(hql);
+
+            String sql = "select app.app_id,log1.commit_id,log1.commit_msg,log1.commit_author from app_orchestration app \n" +
+                    "inner join build_deploy_log log\n" +
+                    "inner join commit_log log1\n" +
+                    "on app.app_id=log.app_id and log.commit_log_id=log1.id\n" +
+                    "where app.enable=1\n" +
+                    "group by app.app_id";
+            Query sqlQuery = session.createSQLQuery(sql);
+
+            List list = sqlQuery.getResultList();
+            return list;
+        }
+    }
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/NotificationRepository.java

@@ -8,5 +8,5 @@ import org.springframework.data.jpa.repository.JpaRepository;
  * @date 2020-01-21 14:53:03
  */
 public interface NotificationRepository extends JpaRepository<Notification, Long> {
-    Notification findByNotifyName(String notifyName);
+    Notification findByNotifierName(String notifierName);
 }

+ 4 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppLogManager.java

@@ -29,7 +29,7 @@ public class AppLogManager {
     }
 
     public List<String> logFiles(String appId, String logType, String logLevel) throws Exception {
-        /*AppOrchestration app = caching.findByAppId(appId);
+        AppOrchestration app = caching.findByAppId(appId);
         AppDeploy appDeploy = app.getAppDeploy();
         List<AppLog> appLogs = appDeploy.getLogs();
         if (appLogs.isEmpty()) {
@@ -53,13 +53,13 @@ public class AppLogManager {
             // TODO logs 为 null 表示没有日志
             List<String> logFiles = logService.logFiles(appId, logType, logLevel, logdirPath);
             return logFiles;
-        }*/
+        }
 
         return null;
     }
 
     public List<String> logContent(String appId, String logType, String logLevel, String logName) throws Exception {
-        /*AppOrchestration app = caching.findByAppId(appId);
+        AppOrchestration app = caching.findByAppId(appId);
         AppDeploy appDeploy = app.getAppDeploy();
         List<AppLog> appLogs = appDeploy.getLogs();
         if (appLogs.isEmpty()) {
@@ -83,7 +83,7 @@ public class AppLogManager {
             // TODO logs 为 null 表示没有日志
             List<String> logContent = logService.logContent(appId, logType, logLevel, logfilePath);
             return logContent;
-        }*/
+        }
 
         return null;
     }

+ 36 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppOrchestrateService.java

@@ -8,13 +8,14 @@ import cn.reghao.autodop.dmaster.app.entity.build.update.AppUpdate;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.Notification;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.ProjOrchestration;
-import cn.reghao.autodop.dmaster.app.repository.orchestration.ProjDAO;
 import cn.reghao.autodop.dmaster.app.repository.build.AppCompileRepository;
 import cn.reghao.autodop.dmaster.app.repository.build.AppPackRepository;
 import cn.reghao.autodop.dmaster.app.repository.build.AppUpdateRepository;
+import cn.reghao.autodop.dmaster.app.repository.orchestration.AppDAO;
 import cn.reghao.autodop.dmaster.app.repository.orchestration.AppOrchestrationRepository;
 import cn.reghao.autodop.dmaster.app.repository.orchestration.NotificationRepository;
 import cn.reghao.autodop.dmaster.app.repository.orchestration.ProjectOrchestrationRepository;
+import cn.reghao.autodop.dmaster.app.vo.AppToBuild;
 import cn.reghao.autodop.dmaster.app.vo.PageList;
 import cn.reghao.autodop.dmaster.app.vo.ResultVO;
 import org.springframework.data.domain.Page;
@@ -37,7 +38,7 @@ public class AppOrchestrateService {
     private AppCompileRepository appCompileRepository;
     private AppPackRepository appPackRepository;
     private NotificationRepository notificationRepository;
-    private ProjDAO projDAO;
+    private AppDAO appDAO;
 
     public AppOrchestrateService(ProjectOrchestrationRepository projRepository,
                                  AppOrchestrationRepository appRepository,
@@ -45,14 +46,14 @@ public class AppOrchestrateService {
                                  AppCompileRepository appCompileRepository,
                                  AppPackRepository appPackRepository,
                                  NotificationRepository notificationRepository,
-                                 ProjDAO projDAO) {
+                                 AppDAO appDAO) {
         this.projRepository = projRepository;
         this.appRepository = appRepository;
         this.appUpdateRepository = appUpdateRepository;
         this.appCompileRepository = appCompileRepository;
         this.appPackRepository = appPackRepository;
         this.notificationRepository = notificationRepository;
-        this.projDAO = projDAO;
+        this.appDAO = appDAO;
     }
 
     public void add(int type, String json) {
@@ -75,16 +76,23 @@ public class AppOrchestrateService {
     }
 
     private void saveApp(AppOrchestration app) {
-        String projId = app.getProjId();
-        if (projId == null) {
+        ProjOrchestration proj = app.getProj();
+        if (proj != null) {
+            ProjOrchestration projEntity = projRepository.findByProjId(proj.getProjId());
+            if (projEntity != null) {
+                app.setProj(projEntity);
+            } else {
+                projRepository.save(proj);
+            }
+        } else {
             AppBuild appBuild = app.getAppBuild();
             checkSharedEntity(appBuild);
         }
 
         Notification notification = app.getNotification();
-        Notification notifyEntity = notificationRepository.findByNotifyName(notification.getNotifyName());
-        if (notifyEntity != null) {
-            app.setNotification(notifyEntity);
+        Notification notifierEntity = notificationRepository.findByNotifierName(notification.getNotifierName());
+        if (notifierEntity != null) {
+            app.setNotification(notifierEntity);
         } else {
             notificationRepository.save(notification);
         }
@@ -202,6 +210,18 @@ public class AppOrchestrateService {
         }
     }
 
+    public List<AppToBuild> buildList() {
+        List list = appDAO.findBuildApps();
+        List<AppToBuild> appToBuilds = new ArrayList<>();
+        list.forEach(object -> {
+            Object[] objects = (Object[]) object;
+            appToBuilds.add(new AppToBuild(String.valueOf(objects[0]), String.valueOf(objects[1]),
+                    String.valueOf(objects[2]), String.valueOf(objects[3])));
+        });
+
+        return appToBuilds;
+    }
+
     public boolean modify(int type, String json) {
         switch (type) {
             case 1:
@@ -233,6 +253,13 @@ public class AppOrchestrateService {
         }
     }
 
+    /**
+     * TODO 除了删除数据库中所有与应用相关的数据,还应删除文件系统和 docker 中与应用相关的数据
+     *
+     * @param
+     * @return
+     * @date 2020-05-22 下午4:52
+     */
     public void delete(int type, String appId) {
         switch (type) {
             case 1:

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

@@ -80,9 +80,7 @@ public class AppIntegrate {
 
     private void initBuildDeployLog() {
         buildDeployLog = new BuildDeployLog();
-        buildDeployLog.setAppId(app.getAppId());
-        buildDeployLog.setDescription(app.getDescription());
-        buildDeployLog.setEnv(app.getEnv());
+        buildDeployLog.setApp(app);
     }
 
     private void initBuildDeployConfig() {

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

@@ -96,9 +96,8 @@ public class BuildDispatcher {
     private List<AppIntegrate> appIntegrates(List<AppOrchestration> apps) {
         List<AppIntegrate> list = new ArrayList<>();
         for (AppOrchestration app : apps) {
-            String projId = app.getProjId();
-            if (projId != null) {
-                ProjOrchestration proj = caching.findByProjId(projId);
+            ProjOrchestration proj = app.getProj();
+            if (proj != null) {
                 list.add(new AppIntegrate(app, proj));
             } else {
                 list.add(new AppIntegrate(app));

+ 23 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/deploy/AppDeployer.java

@@ -5,13 +5,14 @@ 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.NotifyType;
+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.BuildDeployLog;
 import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 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;
@@ -33,10 +34,10 @@ public class AppDeployer {
      */
     public static void deploy(AppOrchestration app, BuildDeployLog buildDeployLog) {
         Notification notification = app.getNotification();
-        String notifyType = notification.getNotifyType();
+        String notifierType = notification.getNotifierType();
         String dest = notification.getDestination();
         Notify notify = null;
-        if (notifyType.equals(NotifyType.ding.name())) {
+        if (notifierType.equals(NotifierType.ding.name())) {
             notify = new DingNotify();
         }
 
@@ -73,8 +74,6 @@ public class AppDeployer {
                 Boolean isDeploy = future.get();
                 if (isDeploy) {
                     deployLogs.add(new DeployLog(host));
-                    // TODO 异步发送通知
-                    notify.send(dest, JsonUtil.objectToJson("应用已部署"));
                 }
             } catch (Exception e) {
                 e.printStackTrace();
@@ -82,7 +81,26 @@ public class AppDeployer {
             }
         }
 
+        StringBuilder sb = new StringBuilder();
+        for (DeployLog deployLog : deployLogs) {
+            sb.append(deployLog.getHost());
+        }
+
+        DeployMsg deployMsg = new DeployMsg();
+        deployMsg.setAppId(app.getAppId());
+        deployMsg.setCommitId(buildDeployLog.getBuildLog().getCommitLog().getCommitId());
+        deployMsg.setHosts(sb.toString());
+        // TODO 异步发送通知
+        notify.send(dest, JsonUtil.objectToJson(deployMsg));
+
         // TODO 部署成功后记录到数据库
         buildDeployLog.setDeployLogs(deployLogs);
     }
+
+    @Data
+    static class DeployMsg {
+        private String appId;
+        private String commitId;
+        private String hosts;
+    }
 }

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

@@ -37,9 +37,9 @@ public class LogConsumer implements Runnable {
 
     public DeployedApp deployedApp(BuildDeployLog buildDeployLog) {
         DeployedApp deployedApp = new DeployedApp();
-        deployedApp.setAppId(buildDeployLog.getAppId());
-        deployedApp.setDescription(buildDeployLog.getDescription());
-        deployedApp.setEnv(buildDeployLog.getEnv());
+        deployedApp.setAppId(buildDeployLog.getApp().getAppId());
+        deployedApp.setDescription(buildDeployLog.getApp().getDescription());
+        deployedApp.setEnv(buildDeployLog.getApp().getEnv());
         deployedApp.setCommitId(buildDeployLog.getBuildLog().getCommitLog().getCommitId());
 
         return deployedApp;
@@ -53,13 +53,13 @@ public class LogConsumer implements Runnable {
                 BuildDeployLog buildDeployLog = queue.take();
                 logRepository.save(buildDeployLog);
 
-                String appId = buildDeployLog.getAppId();
+                String appId = buildDeployLog.getApp().getAppId();
                 DeployedApp deployedApp = deployCaching.isAppDeployed(appId);
                 if (deployedApp == null) {
                     deployedAppRepository.save(deployedApp(buildDeployLog));
                 }
 
-                log.info("{} 构建部署日志已入库...", buildDeployLog.getAppId());
+                log.info("{} 构建部署日志已入库...", buildDeployLog.getApp().getAppId());
             } catch (InterruptedException e) {
                 // 中断线程
                 Thread.currentThread().interrupt();

+ 2 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/updater/CommitLog.java

@@ -14,9 +14,8 @@ import java.util.List;
  * @date 2020-05-13 22:50:38
  */
 @Data
-@EqualsAndHashCode(callSuper = false)
-@Entity
-public class CommitLog extends BaseEntity {
+@Embeddable
+public class CommitLog {
     private String commitId;
     private String commitAuthor;
     private String remoteRepoUrl;

+ 25 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/AppToBuild.java

@@ -0,0 +1,25 @@
+package cn.reghao.autodop.dmaster.app.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * 需要构建部署的应用
+ *
+ * @author reghao
+ * @date 2020-05-25 11:23:28
+ */
+@AllArgsConstructor
+@Data
+public class AppToBuild {
+    private String appId;
+    private String commitId;
+    private String commitMsg;
+    private String commitAuthor;
+
+    public AppToBuild(String appId, String commitId, String commitMsg) {
+        this.appId = appId;
+        this.commitId = commitId;
+        this.commitMsg = commitMsg;
+    }
+}

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/ResultVO.java

@@ -30,7 +30,7 @@ public class ResultVO {
         notification.setCreateTime(null);
         notification.setUpdateTime(null);
 
-        if (app.getProjId() == null) {
+        if (app.getProj() == null) {
             appBuildVO(app.getAppBuild());
         }
 

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

@@ -1,6 +1,6 @@
 spring:
   datasource:
-    url: jdbc:mysql://localhost:3306/reghao_autodop_rdb1?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
+    url: jdbc:mysql://localhost:3306/reghao_autodop_rdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
     username: reghao
     password: 12345678
 sysconfig:

+ 0 - 9
dmaster/src/main/resources/application-prod.yml

@@ -1,9 +0,0 @@
-spring:
-  datasource:
-    url: jdbc:mysql://rdsr46zx53ze0ebceo1n168.mysql.rds.aliyuncs.com:3306/devops?useSSL=false&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
-    username: iquizoo
-    password: db62083886
-sysconfig:
-  localRepo: /opt/data/local-repo
-  compileDir: /opt/data/compile-dir
-  packDir: /opt/data/pack-dir

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

@@ -1,6 +1,6 @@
 spring:
   datasource:
-    url: jdbc:mysql://192.168.0.220:3306/autodop_tdb1?useSSL=false&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
+    url: jdbc:mysql://192.168.0.220:3306/autodop_tdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
     username: azy_test
     password: Test@123456
 sysconfig:

+ 34 - 4
dmaster/src/test/java/cn/reghao/autodop/dmaster/app/entity/orchestration/AppOrchestrationTest.java

@@ -6,7 +6,7 @@ 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.CompilerType;
-import cn.reghao.autodop.dmaster.app.entity.constant.NotifyType;
+import cn.reghao.autodop.dmaster.app.entity.constant.NotifierType;
 import cn.reghao.autodop.common.deploy.PackerType;
 import cn.reghao.autodop.dmaster.app.entity.constant.RepoType;
 import cn.reghao.autodop.dmaster.app.entity.deploy.AppDeploy;
@@ -17,6 +17,36 @@ import java.util.ArrayList;
 import java.util.List;
 
 class AppOrchestrationTest {
+    ProjOrchestration proj() {
+        AppUpdate appUpdate = new AppUpdate();
+        appUpdate.setRepoName("svn-214");
+        appUpdate.setRepoType(RepoType.svn.name());
+        appUpdate.setUsername("gjs");
+        appUpdate.setPassword("gjs1234");
+
+        AppCompile appCompile = new AppCompile();
+        appCompile.setCompilerName("dotnet2.2");
+        appCompile.setCompilerType(CompilerType.dotnet.name());
+        appCompile.setCompilerHome("/home/reghao/opt/env/dotnet/dotnet-sdk-2.2.101");
+        appCompile.setScript("dotnet publish");
+
+        AppPack appPack = new AppPack();
+        appPack.setPackerName("docker");
+        appPack.setPackerType(PackerType.docker.name());
+        appPack.setPackerPath("192.168.0.222:5000/iq3x");
+
+        AppBuild appBuild = new AppBuild();
+        appBuild.setAppUpdate(appUpdate);
+        appBuild.setAppCompile(appCompile);
+        appBuild.setAppPack(appPack);
+
+        ProjOrchestration proj = new ProjOrchestration();
+        proj.setProjId("branch-20200509");
+        proj.setDescription("20200509 分支");
+        proj.setProjRepo("svn://192.168.0.214/azy/CodeRepositories/IQuizoo.Service/branches/20200509");
+        proj.setAppBuild(appBuild);
+        return proj;
+    }
 
     @Test
     void main() {
@@ -56,8 +86,8 @@ class AppOrchestrationTest {
         appDeploy.setLogs(appLogs);
 
         Notification notification = new Notification();
-        notification.setNotifyName("ding 通知");
-        notification.setNotifyType(NotifyType.ding.name());
+        notification.setNotifierName("ding 通知");
+        notification.setNotifierType(NotifierType.ding.name());
         notification.setDestination("https://oapi.dingtalk.com/robot/send?access_token=ba9cf0d846cff8c471168e0d2f91ec0c44645a086cf5e4e421697c9b0c606bd2");
 
         AppOrchestration app = new AppOrchestration();
@@ -72,7 +102,7 @@ class AppOrchestrationTest {
         app.setEnv("dev");
         app.setEntryDir("/ContentService/4-ContentPresentation/Com.IQuizoo.ContentService");
 
-        app.setProjId("branch-20200509");
+        app.setProj(proj());
         //app.setAppBuild(appBuild);
 
         app.setNotification(notification);