Parcourir la source

优化配置 API

reghao il y a 5 ans
Parent
commit
2c014f89ca
100 fichiers modifiés avec 1378 ajouts et 864 suppressions
  1. 11 1
      common/src/main/java/cn/reghao/autodop/common/deploy/PackerType.java
  2. 8 0
      common/src/main/java/cn/reghao/autodop/common/dockerc/DockerClient.java
  3. 1 1
      common/src/main/java/cn/reghao/autodop/common/dockerc/httpclient/UnixSocketClient.java
  4. 1 2
      common/src/main/java/cn/reghao/autodop/common/grpc/common/spring/GrpcAutoConfiguration.java
  5. 2 2
      common/src/main/java/cn/reghao/autodop/common/grpc/facade/app/AppLogService.java
  6. 0 6
      dagent/pom.xml
  7. 0 15
      dagent/src/main/java/cn/reghao/autodop/dagent/kvm/KvmManager.java
  8. 8 1
      dagent/src/main/resources/application-dev.yml
  9. 8 1
      dagent/src/main/resources/application-prod.yml
  10. 8 1
      dagent/src/main/resources/application-test.yml
  11. 1 27
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/cache/OrchestrationCache.java
  12. 21 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/AppEnv.java
  13. 22 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/BuildStage.java
  14. 21 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/CompilerType.java
  15. 23 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/ConfigType.java
  16. 21 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/NotifierType.java
  17. 21 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/RepoType.java
  18. 0 63
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppBuildConfigController.java
  19. 16 10
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildController.java
  20. 110 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/ConfigController.java
  21. 5 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/FileController.java
  22. 8 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/ManageController.java
  23. 19 20
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/OrchestrateController.java
  24. 1 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/BaseEntity.java
  25. 33 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/LocalFsDir.java
  26. 53 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/Notification.java
  27. 0 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/build/AppBuild.java
  28. 6 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/build/AppCompile.java
  29. 3 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/build/AppPack.java
  30. 3 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/build/AppUpdate.java
  31. 0 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/BuildDeployEnv.java
  32. 0 12
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/BuildStage.java
  33. 0 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/CompilerType.java
  34. 0 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/NotifierType.java
  35. 0 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/RepoType.java
  36. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/AppLog.java
  37. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/ConfigFile.java
  38. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/DeployedApp.java
  39. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/AppOrchestration.java
  40. 0 25
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/LocalFsConfig.java
  41. 0 29
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/Notification.java
  42. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/ProjOrchestration.java
  43. 0 26
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/Pagination.java
  44. 8 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/build/AppCompileRepository.java
  45. 8 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/build/AppPackRepository.java
  46. 8 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/build/AppUpdateRepository.java
  47. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/dao/AppDAO.java
  48. 68 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/dao/ConfigDAO.java
  49. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/dao/ProjDAO.java
  50. 8 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/LogRepository.java
  51. 25 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/AppRepository.java
  52. 0 13
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/LocalFsConfigRepository.java
  53. 12 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/LocalFsDirRepository.java
  54. 8 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/NotificationRepository.java
  55. 20 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/ProjOrchestrationRepository.java
  56. 0 33
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/ProjectOrchestrationRepository.java
  57. 0 160
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppBuildConfigService.java
  58. 6 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildService.java
  59. 250 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/ConfigService.java
  60. 5 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/LogManager.java
  61. 25 26
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/OrchestrateService.java
  62. 2 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/StatusManager.java
  63. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppBuildPipeline.java
  64. 63 62
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppIntegrate.java
  65. 13 24
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/BuildDispatcher.java
  66. 45 19
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/BuilderUtil.java
  67. 17 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/crud/CrudService.java
  68. 6 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/deploy/AppDeployer.java
  69. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/log/LogConsumer.java
  70. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/compiler/DotnetPreCompile.java
  71. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/compiler/ShellCompiler.java
  72. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/packer/DockerPack.java
  73. 5 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/updater/CodeUpdater.java
  74. 80 29
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/updater/GitImpl.java
  75. 8 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/updater/SvnImpl.java
  76. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/AppBuildVO.java
  77. 0 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/AppVO.java
  78. 9 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/BuildConfig.java
  79. 34 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/ClassUtil.java
  80. 38 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/OrchestrationVO.java
  81. 0 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/PageList.java
  82. 0 53
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/ResultVO.java
  83. 3 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/log/BuildDeployLog.java
  84. 9 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/log/BuildLogVO.java
  85. 3 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/UserController.java
  86. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/jwt/UsernamePasswordAuthFilter.java
  87. 0 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/service/UserService.java
  88. 13 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/exception/ExceptionUtil.java
  89. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/interceptor/MethodTimeInterceptor.java
  90. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/thread/ThreadPoolWrapper.java
  91. 68 18
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/utils/AfterAppStart.java
  92. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/utils/hibernate/HibernateSessionOps.java
  93. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vue/SelectOption.java
  94. 9 3
      dmaster/src/main/resources/application-dev.yml
  95. 11 0
      dmaster/src/main/resources/application-prod.yml
  96. 7 1
      dmaster/src/main/resources/application-test.yml
  97. 11 12
      dmaster/src/test/java/cn/reghao/autodop/dmaster/app/entity/orchestration/AppOrchestrationTest.java
  98. 6 6
      dmaster/src/test/java/cn/reghao/autodop/dmaster/app/entity/orchestration/ProjOrchestrationTest.java
  99. 3 3
      dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/tools/updater/GitImplTest.java
  100. 1 1
      dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/tools/updater/SvnImplTest.java

+ 11 - 1
common/src/main/java/cn/reghao/autodop/common/deploy/PackerType.java

@@ -7,5 +7,15 @@ package cn.reghao.autodop.common.deploy;
  * @date 2019-11-15 21:59:35
  */
 public enum PackerType {
-    docker, maven, jar, dotnetBinary, zip;
+    docker("Docker"), jar("Jar"), dotnetBinary("DotnetBinary"), zip("Zip");
+
+    private String value;
+
+    PackerType(String value) {
+        this.value = value;
+    }
+
+    public String getValue() {
+        return value;
+    }
 }

+ 8 - 0
common/src/main/java/cn/reghao/autodop/common/dockerc/DockerClient.java

@@ -347,4 +347,12 @@ public class DockerClient implements ImageOps, ContainerOps, AutoCloseable {
         // TODO 可能抛出 null 异常
         return containerInspect.getGraphDriver().getData().getMergedDir();
     }
+
+    public static void main(String[] args) throws Exception {
+        DockerClient docker = new DockerClient();
+        String image = "192.168.0.222:5000/iq3x/dnkt";
+        String appEntryDir = "/home/reghao/tmp/autodop/opt/data/local-repo/test-app/IQuizoo.Game/dist-test";
+        docker.build(image, appEntryDir);
+        docker.close();
+    }
 }

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/dockerc/httpclient/UnixSocketClient.java

@@ -18,7 +18,7 @@ import java.util.concurrent.TimeUnit;
  */
 public class UnixSocketClient {
     private static final Logger log = LoggerFactory.getLogger(UnixSocketClient.class);
-
+    // TODO 在配置中指定
     private final String DEFAULT_UNIX_ENDPOINT = "/var/run/docker.sock";
     private EventLoopGroup group;
     private Bootstrap bootstrap;

+ 1 - 2
common/src/main/java/cn/reghao/autodop/common/grpc/common/spring/GrpcAutoConfiguration.java

@@ -26,8 +26,7 @@ public class GrpcAutoConfiguration {
     private final AbstractApplicationContext applicationContext;
     private final GrpcProperties grpcProperties;
 
-    public GrpcAutoConfiguration(AbstractApplicationContext applicationContext,
-                                 GrpcProperties grpcProperties) {
+    public GrpcAutoConfiguration(AbstractApplicationContext applicationContext, GrpcProperties grpcProperties) {
         this.applicationContext = applicationContext;
         this.grpcProperties = grpcProperties;
     }

+ 2 - 2
common/src/main/java/cn/reghao/autodop/common/grpc/facade/app/AppLogService.java

@@ -19,12 +19,12 @@ public interface AppLogService {
      * @param appId 应用 ID
      * @param logType 日志类型
      * @param logLevel 日志等级
-     * @param logdirPath 日志目录相对路径
+     * @param logDir 日志目录
      *
      * @return 日志文件名列表
      * @date 2020-05-19 上午10:37
      */
-    List<String> logFiles(String appId, String logType, String logLevel, String logdirPath) throws Exception;
+    List<String> logFiles(String appId, String logType, String logLevel, String logDir) throws Exception;
 
     /**
      * 应用日志内容

+ 0 - 6
dagent/pom.xml

@@ -25,12 +25,6 @@
             <artifactId>common</artifactId>
             <version>1.0.0</version>
         </dependency>
-
-        <!--<dependency>
-            <groupId>org.libvirt</groupId>
-            <artifactId>libvirt</artifactId>
-            <version>0.5.1</version>
-        </dependency>-->
     </dependencies>
 
     <profiles>

+ 0 - 15
dagent/src/main/java/cn/reghao/autodop/dagent/kvm/KvmManager.java

@@ -1,15 +0,0 @@
-package cn.reghao.autodop.dagent.kvm;
-
-/**
- * @author reghao
- * @date 2020-05-08 22:37:05
- */
-public class KvmManager {
-    public static void main(String[] args) throws Exception {
-        /*Connect conn = new Connect("qemu:///system", true);
-        Domain testDomain=conn.domainLookupByName("test");
-        System.out.println("Domain:" + testDomain.getName() + " id " +
-                testDomain.getID() + " running " +
-                testDomain.getOSType());*/
-    }
-}

+ 8 - 1
dagent/src/main/resources/application-dev.yml

@@ -1,4 +1,11 @@
 dmaster:
   address: localhost
   port: 4000
-  api: /api/machine/status
+  api: /api/machine/status
+spring:
+  rabbitmq:
+    host: localhost
+    port: 5672
+    virtual-host: /
+    username: reghao
+    password: 12345678

+ 8 - 1
dagent/src/main/resources/application-prod.yml

@@ -1,4 +1,11 @@
 dmaster:
   address: 192.168.0.50
   port: 4000
-  api: /api/machine/status
+  api: /api/machine/status
+spring:
+  rabbitmq:
+    host: localhost
+    port: 5672
+    virtual-host: /
+    username: reghao
+    password: 12345678

+ 8 - 1
dagent/src/main/resources/application-test.yml

@@ -1,4 +1,11 @@
 dmaster:
   address: 192.168.0.50
   port: 4000
-  api: /api/machine/status
+  api: /api/machine/status
+spring:
+  rabbitmq:
+    host: localhost
+    port: 5672
+    virtual-host: /
+    username: reghao
+    password: 12345678

+ 1 - 27
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/cache/OrchestrationCache.java

@@ -1,15 +1,7 @@
 package cn.reghao.autodop.dmaster.app.cache;
 
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
-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.AppOrchestrationRepository;
-import cn.reghao.autodop.dmaster.app.repository.orchestration.NotificationRepository;
-import cn.reghao.autodop.dmaster.app.repository.orchestration.ProjectOrchestrationRepository;
-import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
 /**
@@ -20,28 +12,10 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class OrchestrationCache {
-    private ProjectOrchestrationRepository projRepository;
     private AppOrchestrationRepository appRepository;
-    private AppUpdateRepository appUpdateRepository;
-    private AppCompileRepository appCompileRepository;
-    private AppPackRepository appPackRepository;
-    private NotificationRepository notificationRepository;
-    private ProjDAO projDAO;
 
-    public OrchestrationCache(ProjectOrchestrationRepository projRepository,
-                              AppOrchestrationRepository appRepository,
-                              AppUpdateRepository appUpdateRepository,
-                              AppCompileRepository appCompileRepository,
-                              AppPackRepository appPackRepository,
-                              NotificationRepository notificationRepository,
-                              ProjDAO projDAO) {
-        this.projRepository = projRepository;
+    public OrchestrationCache(AppOrchestrationRepository appRepository) {
         this.appRepository = appRepository;
-        this.appUpdateRepository = appUpdateRepository;
-        this.appCompileRepository = appCompileRepository;
-        this.appPackRepository = appPackRepository;
-        this.notificationRepository = notificationRepository;
-        this.projDAO = projDAO;
     }
 
     // TODO @Cacheable(cacheNames = "app", key = "#appId")

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

@@ -0,0 +1,21 @@
+package cn.reghao.autodop.dmaster.app.constant;
+
+/**
+ * 应用构建部署时所处的环境
+ *
+ * @author reghao
+ * @date 2019-10-18 14:31:29
+ */
+public enum AppEnv {
+    dev("开发环境"), test("测试环境"), prod("生产环境");
+
+    private String value;
+
+    AppEnv(String value) {
+        this.value = value;
+    }
+
+    public String getValue() {
+        return value;
+    }
+}

+ 22 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/BuildStage.java

@@ -0,0 +1,22 @@
+package cn.reghao.autodop.dmaster.app.constant;
+
+/**
+ * 应用构建时所处的阶段
+ * TODO 后期使用状态机
+ *
+ * @author reghao
+ * @date 2019-10-18 14:31:29
+ */
+public enum BuildStage {
+    update("更新阶段"), compile("编译阶段"), pack("打包阶段"), build("构建完成");
+
+    private String name;
+
+    BuildStage(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

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

@@ -0,0 +1,21 @@
+package cn.reghao.autodop.dmaster.app.constant;
+
+/**
+ * 编译工具
+ *
+ * @author reghao
+ * @date 2019-10-18 14:31:29
+ */
+public enum CompilerType {
+    none("None"), mvn("Maven"), dotnet("Dotnet"), npm("NPM");
+
+    private String value;
+
+    CompilerType(String value) {
+        this.value = value;
+    }
+
+    public String getValue() {
+        return value;
+    }
+}

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

@@ -0,0 +1,23 @@
+package cn.reghao.autodop.dmaster.app.constant;
+
+/**
+ * 需要配置的类型
+ *
+ * @author reghao
+ * @date 2019-10-18 14:31:29
+ */
+public enum ConfigType {
+    appEnv("AppEnv"),
+    localDir("LocalDir"), notifier("Notifier"),
+    repo("Repo"), compiler("Compiler"), packer("Packer");
+
+    private String value;
+
+    ConfigType(String value) {
+        this.value = value;
+    }
+
+    public String getValue() {
+        return value;
+    }
+}

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

@@ -0,0 +1,21 @@
+package cn.reghao.autodop.dmaster.app.constant;
+
+/**
+ * 通知工具
+ *
+ * @author reghao
+ * @date 2020-03-01 17:18:53
+ */
+public enum NotifierType {
+    webhook("Webhook"), email("邮件"), sms("短信");
+
+    private String value;
+
+    NotifierType(String value) {
+        this.value = value;
+    }
+
+    public String getValue() {
+        return value;
+    }
+}

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

@@ -0,0 +1,21 @@
+package cn.reghao.autodop.dmaster.app.constant;
+
+/**
+ * 版本管理工具
+ *
+ * @author reghao
+ * @date 2019-11-15 22:41:04
+ */
+public enum RepoType {
+    svn("SVN"), git("GIT");
+
+    private String value;
+
+    RepoType(String value) {
+        this.value = value;
+    }
+
+    public String getValue() {
+        return value;
+    }
+}

+ 0 - 63
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppBuildConfigController.java

@@ -1,63 +0,0 @@
-package cn.reghao.autodop.dmaster.app.controller;
-
-import cn.reghao.autodop.dmaster.app.service.AppBuildConfigService;
-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;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * @author reghao
- * @date 2019-08-30 18:49:15
- */
-@Slf4j
-@Api(tags = "应用构建部署接口")
-@RestController
-@RequestMapping("/api/app/build/config")
-public class AppBuildConfigController {
-    private AppBuildConfigService buildConfigService;
-
-    public AppBuildConfigController(AppBuildConfigService buildConfigService) {
-        this.buildConfigService = buildConfigService;
-    }
-
-    @ApiOperation(value = "添加项目/应用编排")
-    @PostMapping(value = "/{type}", consumes = "application/json")
-    public ResponseEntity<String>addOrchestration(@PathVariable("type") int type,
-                                                  @RequestBody String json) throws Exception {
-        buildConfigService.saveOrUpdate(type, json);
-        return ResponseEntity.ok().body(WebResult.success("ok"));
-    }
-
-    @ApiOperation(value = "分页获取项目/应用编排(更新时间倒序)")
-    @GetMapping("/{type}")
-    public ResponseEntity<String>getOrchestrationByPage(@PathVariable("type") int type,
-                                                        @RequestParam("page") int page,
-                                                        @RequestParam("size") int size) {
-        PageRequest pageRequest =
-                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
-        PageList pageList = buildConfigService.getByPage(type, pageRequest);
-        return ResponseEntity.ok().body(WebResult.success(pageList));
-    }
-
-    @ApiOperation(value = "修改项目/应用编排")
-    @PutMapping("/{type}")
-    public ResponseEntity<String> modifyOrchestration(@PathVariable("type") int type,
-                                                      @RequestBody String json) throws Exception {
-        buildConfigService.saveOrUpdate(type, json);
-        return ResponseEntity.ok().body(WebResult.success("ok"));
-    }
-
-    @ApiOperation(value = "删除项目/应用编排")
-    @DeleteMapping("/{type}/{name}")
-    public ResponseEntity<String>deleteOrchestration(@PathVariable("type") int type,
-                                                     @PathVariable("name") String name) {
-        buildConfigService.delete(type, name);
-        return ResponseEntity.ok().body(WebResult.success("ok"));
-    }
-}

+ 16 - 10
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppBuildController.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildController.java

@@ -1,7 +1,8 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
-import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployLog;
-import cn.reghao.autodop.dmaster.app.service.AppBuildService;
+import cn.reghao.autodop.dmaster.app.constant.AppEnv;
+import cn.reghao.autodop.dmaster.app.vo.log.BuildDeployLog;
+import cn.reghao.autodop.dmaster.app.service.BuildService;
 import cn.reghao.autodop.dmaster.app.vo.AppToBuild;
 import cn.reghao.autodop.dmaster.app.vo.PageList;
 import cn.reghao.autodop.dmaster.app.vo.log.BuildLogVO;
@@ -35,12 +36,12 @@ import java.util.stream.Collectors;
 @Api(tags = "应用构建部署接口")
 @RestController
 @RequestMapping("/api/app/bd")
-public class AppBuildController {
-    private AppBuildService buildService;
+public class BuildController {
+    private BuildService buildService;
     private BuildDispatcher buildDispatcher;
     private OssService ossService;
 
-    public AppBuildController(AppBuildService buildService, BuildDispatcher buildDispatcher, OssService ossService) {
+    public BuildController(BuildService buildService, BuildDispatcher buildDispatcher, OssService ossService) {
         this.buildService = buildService;
         this.buildDispatcher = buildDispatcher;
         this.ossService = ossService;
@@ -131,8 +132,10 @@ public class AppBuildController {
     public ResponseEntity<String> buildList(@RequestParam("env") String env,
                                             @RequestParam("page") int page,
                                             @RequestParam("size") int size) {
-        PageRequest pageRequest = PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
-        PageList<AppToBuild> pageList = buildService.buildList(env, pageRequest);
+        String env1 = AppEnv.valueOf(env).name();
+        PageRequest pageRequest =
+                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
+        PageList<AppToBuild> pageList = buildService.buildList(env1, pageRequest);
         return ResponseEntity.ok().body(WebResult.success(pageList));
     }
 
@@ -141,9 +144,10 @@ public class AppBuildController {
     public ResponseEntity<String> commitLogs(@RequestParam("env") String env,
                                              @RequestParam("page") int page,
                                              @RequestParam("size") int size) {
+        String env1 = AppEnv.valueOf(env).name();
         PageRequest pageRequest =
                 PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "createTime"));
-        PageList<CommitLogVO> pageList = buildService.commitLogs(env, pageRequest);
+        PageList<CommitLogVO> pageList = buildService.commitLogs(env1, pageRequest);
         return ResponseEntity.ok().body(WebResult.success(pageList));
     }
 
@@ -152,9 +156,10 @@ public class AppBuildController {
     public ResponseEntity<String> buildLogs(@RequestParam("env") String env,
                                             @RequestParam("page") int page,
                                             @RequestParam("size") int size) {
+        String env1 = AppEnv.valueOf(env).name();
         PageRequest pageRequest =
                 PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "createTime"));
-        PageList<BuildLogVO> pageList = buildService.buildLogs(env, pageRequest);
+        PageList<BuildLogVO> pageList = buildService.buildLogs(env1, pageRequest);
         return ResponseEntity.ok().body(WebResult.success(pageList));
     }
 
@@ -163,9 +168,10 @@ public class AppBuildController {
     public ResponseEntity<String> deployLogs(@RequestParam("env") String env,
                                              @RequestParam("page") int page,
                                              @RequestParam("size") int size) {
+        String env1 = AppEnv.valueOf(env).name();
         PageRequest pageRequest =
                 PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "createTime"));
-        PageList<DeployLogVO> pageList = buildService.deployLogs(env, pageRequest);
+        PageList<DeployLogVO> pageList = buildService.deployLogs(env1, pageRequest);
         return ResponseEntity.ok().body(WebResult.success(pageList));
     }
 }

+ 110 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/ConfigController.java

@@ -0,0 +1,110 @@
+package cn.reghao.autodop.dmaster.app.controller;
+
+import cn.reghao.autodop.common.deploy.PackerType;
+import cn.reghao.autodop.common.dockerc.pojo.ContainerInspect;
+import cn.reghao.autodop.dmaster.app.constant.*;
+import cn.reghao.autodop.dmaster.app.service.ConfigService;
+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;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author reghao
+ * @date 2019-08-30 18:49:15
+ */
+@Slf4j
+@Api(tags = "配置 CRUD 接口")
+@RestController
+@RequestMapping("/api/config")
+public class ConfigController {
+    private ConfigService configService;
+
+    public ConfigController(ConfigService configService) {
+        this.configService = configService;
+    }
+
+    @ApiOperation(value = "添加配置")
+    @PostMapping(value = "/{configType}", consumes = "application/json")
+    public ResponseEntity<String> addConfig(@PathVariable("configType") String configType,
+                                            @RequestBody String json) throws Exception {
+        configService.add(configType, json);
+        return ResponseEntity.ok().body(WebResult.success("ok"));
+    }
+
+    @ApiOperation(value = "分页获取配置(更新时间倒序)")
+    @GetMapping("/{configType}")
+    public ResponseEntity<String> getConfigByPage(@PathVariable("configType") String configType,
+                                                  @RequestParam("page") int page,
+                                                  @RequestParam("size") int size) throws Exception {
+        PageRequest pageRequest =
+                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
+        PageList pageList = configService.getByPage(configType, pageRequest);
+        return ResponseEntity.ok().body(WebResult.success(pageList));
+    }
+
+    @ApiOperation(value = "修改配置")
+    @PutMapping("/{configType}")
+    public ResponseEntity<String> updateConfig(@PathVariable("configType") String configType,
+                                               @RequestBody String json) throws Exception {
+        configService.update(configType, json);
+        return ResponseEntity.ok().body(WebResult.success("ok"));
+    }
+
+    @ApiOperation(value = "删除配置")
+    @DeleteMapping("/{configType}/{uniqueKey}")
+    public ResponseEntity<String> deleteConfig(@PathVariable("configType") String configType,
+                                               @PathVariable("uniqueKey") String uniqueKey) throws Exception {
+        configService.delete(configType, uniqueKey);
+        return ResponseEntity.ok().body(WebResult.success("ok"));
+    }
+    
+    @GetMapping("/types/{configType}")
+    public ResponseEntity<String> getConfigType(@PathVariable("configType") String configType) {
+        Map<String, String> map = new HashMap<>();
+        switch (ConfigType.valueOf(configType)) {
+            case localDir:
+                for (AppEnv config : AppEnv.values()) {
+                    map.put(config.name(), config.getValue());
+                }
+                break;
+            case notifier:
+                for (NotifierType config : NotifierType.values()) {
+                    map.put(config.name(), config.getValue());
+                }
+                break;
+            case repo:
+                for (RepoType config : RepoType.values()) {
+                    map.put(config.name(), config.getValue());
+                }
+                break;
+            case compiler:
+                for (CompilerType config : CompilerType.values()) {
+                    map.put(config.name(), config.getValue());
+                }
+                break;
+            case packer:
+                for (PackerType config : PackerType.values()) {
+                    map.put(config.name(), config.getValue());
+                }
+                break;
+            default:
+        }
+
+        return ResponseEntity.ok().body(WebResult.success(map));
+    }
+
+    @GetMapping("/{configType}/list")
+    public ResponseEntity<String> getConfigList(@PathVariable("configType") String configType) throws Exception {
+        configService.buildConfigs();
+        return ResponseEntity.ok().body(WebResult.success("pageList"));
+    }
+}

+ 5 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/FileController.java

@@ -22,6 +22,11 @@ import java.io.*;
 @RestController
 @RequestMapping("/api/app")
 public class FileController {
+    @GetMapping("/test")
+    public String test() {
+        return WebResult.success("test api");
+    }
+
     @ApiOperation(value = "下载文件")
     @ApiImplicitParams(
             @ApiImplicitParam(name="oss_path", value="OSS 中的路径", paramType="query", dataType = "String")

+ 8 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppManageController.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/ManageController.java

@@ -2,10 +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.constant.BuildDeployEnv;
-import cn.reghao.autodop.dmaster.app.repository.deploy.DeployedAppRepository;
-import cn.reghao.autodop.dmaster.app.service.AppLogManager;
-import cn.reghao.autodop.dmaster.app.service.AppStatusManager;
+import cn.reghao.autodop.dmaster.app.constant.AppEnv;
+import cn.reghao.autodop.dmaster.app.service.LogManager;
+import cn.reghao.autodop.dmaster.app.service.StatusManager;
 import cn.reghao.autodop.dmaster.app.vo.LogFile;
 import cn.reghao.autodop.dmaster.app.vo.PageList;
 import cn.reghao.autodop.dmaster.common.webresult.WebResult;
@@ -27,11 +26,11 @@ import java.util.List;
 @Api(tags = "应用管理接口")
 @RestController
 @RequestMapping("/api/app/manage")
-public class AppManageController {
-    private AppStatusManager statusManager;
-    private AppLogManager logManager;
+public class ManageController {
+    private StatusManager statusManager;
+    private LogManager logManager;
     
-    public AppManageController(AppStatusManager statusManager, AppLogManager logManager) {
+    public ManageController(StatusManager statusManager, LogManager logManager) {
         this.statusManager = statusManager;
         this.logManager = logManager;
     }
@@ -62,7 +61,7 @@ public class AppManageController {
     public ResponseEntity<String> status(@RequestParam("env") String env,
                                          @RequestParam("page") int page,
                                          @RequestParam("size") int size) throws DockerException {
-        String env1 = BuildDeployEnv.valueOf(env).name();
+        String env1 = AppEnv.valueOf(env).name();
         PageRequest pageRequest =
                 PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
         List<AppStatus> statusList = statusManager.status(env1, pageRequest);

+ 19 - 20
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppOrchestrateController.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/OrchestrateController.java

@@ -1,9 +1,8 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
-import cn.reghao.autodop.common.utils.JsonUtil;
+import cn.reghao.autodop.dmaster.app.constant.AppEnv;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
-import cn.reghao.autodop.dmaster.app.entity.orchestration.ProjOrchestration;
-import cn.reghao.autodop.dmaster.app.service.AppOrchestrateService;
+import cn.reghao.autodop.dmaster.app.service.OrchestrateService;
 import cn.reghao.autodop.dmaster.app.vo.BuildConfig;
 import cn.reghao.autodop.dmaster.common.webresult.WebResult;
 import io.swagger.annotations.Api;
@@ -14,7 +13,6 @@ import org.springframework.data.domain.Sort;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -22,14 +20,14 @@ import java.util.stream.Collectors;
  * @date 2019-11-27 11:29:43
  */
 @Slf4j
-@Api(tags = "应用编排 CURD 接口")
+@Api(tags = "应用编排 CRUD 接口")
 @RestController
 @RequestMapping("/api/app/orchestrate")
-public class AppOrchestrateController {
-    private AppOrchestrateService appOrchestrateService;
+public class OrchestrateController {
+    private OrchestrateService orchestrateService;
 
-    public AppOrchestrateController(AppOrchestrateService appOrchestrateService) {
-        this.appOrchestrateService = appOrchestrateService;
+    public OrchestrateController(OrchestrateService orchestrateService) {
+        this.orchestrateService = orchestrateService;
     }
 
     @ApiOperation(value = "添加项目/应用编排")
@@ -49,15 +47,13 @@ public class AppOrchestrateController {
             default:
                 break;
         }*/
-        appOrchestrateService.add(type, json);
+        //orchestrateService.add(type, json);
         return ResponseEntity.ok().body(WebResult.success("ok"));
     }
 
-    //private void addOr
-
     private void checkApp(AppOrchestration app) {
         app.setConfigFiles(app.getConfigFiles().stream()
-                .filter(configFile -> !configFile.getFilename().isEmpty())
+                .filter(configFile -> !configFile.getName().isEmpty())
                 .collect(Collectors.toSet()));
 
         app.setDependencyRepos(app.getDependencyRepos().stream()
@@ -71,7 +67,7 @@ public class AppOrchestrateController {
     public ResponseEntity<String> copyOrchestration(@PathVariable("type") int type,
                                                     @RequestParam("from") String from,
                                                     @RequestParam("to") String to) throws Exception {
-        boolean res = appOrchestrateService.copy(type, from, to);
+        boolean res = orchestrateService.copy(type, from, to);
         if (res) {
             return ResponseEntity.ok().body(WebResult.success("拷贝成功"));
         } else {
@@ -82,7 +78,7 @@ public class AppOrchestrateController {
     @ApiOperation(value = "获取项目/应用编排")
     @GetMapping("/{type}/{id}")
     public ResponseEntity<String> getOrchestration(@PathVariable("type") int type, @PathVariable("id") String id) {
-        Object res = appOrchestrateService.get(type, id);
+        Object res = orchestrateService.get(type, id);
         return ResponseEntity.ok().body(WebResult.success(res));
     }
 
@@ -92,9 +88,10 @@ public class AppOrchestrateController {
                                                         @RequestParam("env") String env,
                                                         @RequestParam("page") int page,
                                                         @RequestParam("size") int size) {
+        String env1 = AppEnv.valueOf(env).name();
         PageRequest pageRequest =
                 PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
-        Object res = appOrchestrateService.getByPage(type, env, pageRequest);
+        Object res = orchestrateService.getByPage(type, env1, pageRequest);
         return ResponseEntity.ok().body(WebResult.success(res));
     }
 
@@ -102,26 +99,28 @@ public class AppOrchestrateController {
     @PutMapping("/{type}")
     public ResponseEntity<String> modifyOrchestration(@PathVariable("type") int type, @RequestBody String json) {
         // TODO 修改仓库相关的字段时应该删除本地仓库
-        boolean res = appOrchestrateService.modify(type, json);
+        /*boolean res = orchestrateService.modify(type, json);
         if (res) {
             return ResponseEntity.ok().body(WebResult.success("ok"));
         } else {
             return ResponseEntity.ok().body(WebResult.fail("ok"));
-        }
+        }*/
+
+        return ResponseEntity.ok().body(WebResult.success("ok"));
     }
 
     @ApiOperation(value = "删除项目/应用编排")
     @DeleteMapping("/{type}/{appId}")
     public ResponseEntity<String> deleteOrchestration(@PathVariable("type") int type,
                                       @PathVariable("appId") String appId) {
-        appOrchestrateService.delete(type, appId);
+        orchestrateService.delete(type, appId);
         return ResponseEntity.ok().body(WebResult.success("ok"));
     }
 
     @ApiOperation(value = "获取编排应用时需要用到的配置")
     @GetMapping("/build")
     public ResponseEntity<String> buildConfigs() {
-        BuildConfig buildConfig = appOrchestrateService.buildConfig();
+        BuildConfig buildConfig = orchestrateService.buildConfig();
         return ResponseEntity.ok().body(WebResult.success(buildConfig));
     }
 }

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

@@ -25,8 +25,7 @@ public class BaseEntity implements Serializable {
     @GeneratedValue(strategy = GenerationType.TABLE)
     protected Long id;
     // 记录是否已删除
-    @Column(nullable = false)
-    private boolean isDelete;
+    private Boolean isDelete;
 
     @CreationTimestamp
     @Column(updatable = false)

+ 33 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/LocalFsDir.java

@@ -0,0 +1,33 @@
+package cn.reghao.autodop.dmaster.app.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+/**
+ * 应用构建时需要的本地文件系统目录
+ *
+ * @author reghao
+ * @date 2019-08-27 00:17:55
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Entity
+public class LocalFsDir extends BaseEntity {
+    // 本地仓库
+    private String localRepo;
+    // 编译目录
+    private String compileDir;
+    // 打包目录
+    private String packDir;
+
+    public LocalFsDir vo() {
+        this.setId(null);
+        this.setIsDelete(null);
+        this.setCreateTime(null);
+        this.setUpdateTime(null);
+        return this;
+    }
+}

+ 53 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/Notification.java

@@ -0,0 +1,53 @@
+package cn.reghao.autodop.dmaster.app.entity;
+
+import lombok.Data;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+/**
+ * @author reghao
+ * @date 2020-03-06 21:20:06
+ */
+@Data
+@Entity
+public class Notification extends BaseEntity {
+    private String notifierType;
+    @Column(nullable = false, unique = true)
+    private String notifierName;
+    private String url;
+    private String payload;
+
+    public Notification vo() {
+        this.setId(null);
+        this.setIsDelete(null);
+        this.setCreateTime(null);
+        this.setUpdateTime(null);
+        return this;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+
+        if (obj instanceof Notification) {
+            Notification n = (Notification) obj;
+            return n.notifierType.equals(this.notifierType) &&
+                    n.notifierName.equals(this.notifierName) &&
+                    n.url.equals(this.url);
+        }
+
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = 17;
+        result = result * 31 + notifierType.hashCode();
+        result = result * 31 + notifierName.hashCode();
+        result = result * 31 + url.hashCode();
+        return result;
+    }
+}

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

@@ -1,8 +1,5 @@
 package cn.reghao.autodop.dmaster.app.entity.build;
 
-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 lombok.Data;
 
 import javax.persistence.*;

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

@@ -1,6 +1,7 @@
-package cn.reghao.autodop.dmaster.app.entity.build.compile;
+package cn.reghao.autodop.dmaster.app.entity.build;
 
 import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
+import cn.reghao.autodop.dmaster.app.vo.ClassUtil;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -19,12 +20,11 @@ public class AppCompile extends BaseEntity {
     @Column(nullable = false, unique = true)
     private String compilerName;
     private String compilerHome;
-    private String script;
+    private String versionCmd;
+    private String compileCmd;
 
-    public AppCompile  vo() {
-        this.setId(null);
-        this.setCreateTime(null);
-        this.setUpdateTime(null);
+    public AppCompile vo() {
+        ClassUtil.setParentFieldNull(this);
         return this;
     }
 }

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

@@ -1,6 +1,7 @@
-package cn.reghao.autodop.dmaster.app.entity.build.pack;
+package cn.reghao.autodop.dmaster.app.entity.build;
 
 import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
+import cn.reghao.autodop.dmaster.app.vo.ClassUtil;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -23,9 +24,7 @@ public class AppPack extends BaseEntity {
     private String packerPath;
 
     public AppPack vo() {
-        this.setId(null);
-        this.setCreateTime(null);
-        this.setUpdateTime(null);
+        ClassUtil.setParentFieldNull(this);
         return this;
     }
 }

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

@@ -1,6 +1,7 @@
-package cn.reghao.autodop.dmaster.app.entity.build.update;
+package cn.reghao.autodop.dmaster.app.entity.build;
 
 import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
+import cn.reghao.autodop.dmaster.app.vo.ClassUtil;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -22,9 +23,7 @@ public class AppUpdate extends BaseEntity {
     private String password;
 
     public AppUpdate vo() {
-        this.setId(null);
-        this.setCreateTime(null);
-        this.setUpdateTime(null);
+        ClassUtil.setParentFieldNull(this);
         return this;
     }
 }

+ 0 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/BuildDeployEnv.java

@@ -1,11 +0,0 @@
-package cn.reghao.autodop.dmaster.app.entity.constant;
-
-/**
- * 应用构建部署时所处的环境
- *
- * @author reghao
- * @date 2019-10-18 14:31:29
- */
-public enum BuildDeployEnv {
-    dev, test, prod
-}

+ 0 - 12
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/BuildStage.java

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

+ 0 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/CompilerType.java

@@ -1,11 +0,0 @@
-package cn.reghao.autodop.dmaster.app.entity.constant;
-
-/**
- * 编译工具
- *
- * @author reghao
- * @date 2019-10-18 14:31:29
- */
-public enum CompilerType {
-    none, dotnet, maven, npm, gobuild, gpp;
-}

+ 0 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/NotifierType.java

@@ -1,11 +0,0 @@
-package cn.reghao.autodop.dmaster.app.entity.constant;
-
-/**
- * 通知工具
- *
- * @author reghao
- * @date 2020-03-01 17:18:53
- */
-public enum NotifierType {
-    ding, email, sms;
-}

+ 0 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/RepoType.java

@@ -1,11 +0,0 @@
-package cn.reghao.autodop.dmaster.app.entity.constant;
-
-/**
- * 版本管理工具
- *
- * @author reghao
- * @date 2019-11-15 22:41:04
- */
-public enum RepoType {
-    svn, git;
-}

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

@@ -21,5 +21,5 @@ public class AppLog {
     @NotNull
     private String logLevel;
     // 相对于 runningDir
-    private String logdirPath;
+    private String logDir;
 }

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

@@ -17,7 +17,7 @@ import javax.validation.constraints.NotNull;
 @Embeddable
 public class ConfigFile {
     @NotNull
-    private String filename;
+    private String name;
     @NotNull
-    private String filecontent;
+    private String content;
 }

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

@@ -8,7 +8,7 @@ import lombok.EqualsAndHashCode;
 import javax.persistence.*;
 
 /**
- * 已部署的应用(应用第一次部署时记录)
+ * 已部署的应用(应用第一次部署时添加一条记录,以后每次部署时更新记录)
  *
  * @author reghao
  * @date 2020-05-20 22:09:53

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

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.app.entity.orchestration;
 
 import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
+import cn.reghao.autodop.dmaster.app.entity.Notification;
 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.ConfigFile;
@@ -39,6 +40,7 @@ public class AppOrchestration extends BaseEntity implements Cloneable {
     private Set<ConfigFile> configFiles;
     @Column(nullable = false)
     private String appRepo;
+    private String branch;
     @Column(length = 1024)
     @ElementCollection(fetch = FetchType.EAGER)
     private Set<String> dependencyRepos;

+ 0 - 25
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/LocalFsConfig.java

@@ -1,25 +0,0 @@
-package cn.reghao.autodop.dmaster.app.entity.orchestration;
-
-import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-
-/**
- * 构建阶段的对本地文件系统的依赖
- *
- * @author reghao
- * @date 2019-08-27 00:17:55
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-@Entity
-public class LocalFsConfig extends BaseEntity {
-    @Column(nullable = false, unique = true)
-    private String env;
-    private String localRepo;
-    private String compileDir;
-    private String packDir;
-}

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

@@ -1,29 +0,0 @@
-package cn.reghao.autodop.dmaster.app.entity.orchestration;
-
-import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-
-/**
- * @author reghao
- * @date 2020-03-06 21:20:06
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-@Entity
-public class Notification extends BaseEntity {
-    private String notifierType;
-    @Column(nullable = false, unique = true)
-    private String notifierName;
-    private String webhook;
-
-    public Notification vo() {
-        this.setId(null);
-        this.setCreateTime(null);
-        this.setUpdateTime(null);
-        return this;
-    }
-}

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/ProjOrchestration.java

@@ -21,6 +21,7 @@ public class ProjOrchestration extends BaseEntity implements Cloneable {
     private String description;
     @Column(nullable = false)
     private String projRepo;
+    private String branch;
     // 同一个项目内所有应用的构建策略是相同的
     private AppBuild appBuild;
 

+ 0 - 26
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/Pagination.java

@@ -1,26 +0,0 @@
-package cn.reghao.autodop.dmaster.orchestrate.repository;
-
-import lombok.Data;
-
-/**
- * 分页
- *
- * @author reghao
- * @date 2020-03-02 10:14:16
- */
-@Data
-public class Pagination {
-    // 当前页码
-    private int page;
-    // 总页码
-    private int totalPages;
-    // 每页显示的数量
-    private int size;
-    // 总数量
-    private int totalSize;
-
-    public Pagination(int page, int size) {
-        this.page = page > 0 ? (page-1)*size : page*size;
-        this.size = size;
-    }
-}

+ 8 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/build/AppCompileRepository.java

@@ -1,7 +1,10 @@
 package cn.reghao.autodop.dmaster.app.repository.build;
 
-import cn.reghao.autodop.dmaster.app.entity.build.compile.AppCompile;
+import cn.reghao.autodop.dmaster.app.entity.build.AppCompile;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+
+import javax.transaction.Transactional;
 
 /**
  * @author reghao
@@ -9,4 +12,8 @@ import org.springframework.data.jpa.repository.JpaRepository;
  */
 public interface AppCompileRepository extends JpaRepository<AppCompile, Long> {
     AppCompile findByCompilerName(String compilerName);
+
+    @Modifying
+    @Transactional
+    void deleteByCompilerName(String compilerName);
 }

+ 8 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/build/AppPackRepository.java

@@ -1,7 +1,10 @@
 package cn.reghao.autodop.dmaster.app.repository.build;
 
-import cn.reghao.autodop.dmaster.app.entity.build.pack.AppPack;
+import cn.reghao.autodop.dmaster.app.entity.build.AppPack;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+
+import javax.transaction.Transactional;
 
 /**
  * @author reghao
@@ -9,4 +12,8 @@ import org.springframework.data.jpa.repository.JpaRepository;
  */
 public interface AppPackRepository extends JpaRepository<AppPack, Long> {
     AppPack findByPackerName(String packerName);
+
+    @Modifying
+    @Transactional
+    void deleteByPackerName(String packerName);
 }

+ 8 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/build/AppUpdateRepository.java

@@ -1,7 +1,10 @@
 package cn.reghao.autodop.dmaster.app.repository.build;
 
-import cn.reghao.autodop.dmaster.app.entity.build.update.AppUpdate;
+import cn.reghao.autodop.dmaster.app.entity.build.AppUpdate;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+
+import javax.transaction.Transactional;
 
 /**
  * @author reghao
@@ -9,4 +12,8 @@ import org.springframework.data.jpa.repository.JpaRepository;
  */
 public interface AppUpdateRepository extends JpaRepository<AppUpdate, Long> {
     AppUpdate findByRepoName(String repoName);
+
+    @Modifying
+    @Transactional
+    void deleteByRepoName(String repoName);
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/AppDAO.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/dao/AppDAO.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.app.repository.orchestration;
+package cn.reghao.autodop.dmaster.app.repository.dao;
 
 import org.hibernate.Session;
 import org.springframework.stereotype.Repository;

+ 68 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/dao/ConfigDAO.java

@@ -0,0 +1,68 @@
+package cn.reghao.autodop.dmaster.app.repository.dao;
+
+import org.hibernate.Session;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author reghao
+ * @date 2020-03-02 16:45:12
+ */
+@Repository
+public class ConfigDAO {
+    private EntityManager em;
+
+    public ConfigDAO(EntityManager em) {
+        this.em = em;
+    }
+
+    public Map<String, Map<String, String[]>> buildConfigs() {
+        Map<String, Map<String, String[]>> map = new HashMap<>();
+        try (Session session = (Session) em.getDelegate()) {
+            String sql1 = "select repo_type,group_concat(repo_name separator ',' ) as repo_names " +
+                    "from app_update " +
+                    "group by repo_type";
+            Query sqlQuery1 = session.createSQLQuery(sql1);
+            Map<String, String[]> map1 = new HashMap<>();
+            sqlQuery1.getResultList().forEach(res -> {
+                Object[] result = (Object[]) res;
+                String key = (String) result[0];
+                String[] value = ((String) result[1]).split(",");
+                map1.put(key, value);
+            });
+            map.put("repos", map1);
+
+            String sql2 = "select compiler_type,group_concat(compiler_name separator ',' ) as compiler_names " +
+                    "from app_compile " +
+                    "group by compiler_type";
+            Query sqlQuery2 = session.createSQLQuery(sql2);
+            Map<String, String[]> map2 = new HashMap<>();
+            sqlQuery2.getResultList().forEach(res -> {
+                Object[] result = (Object[]) res;
+                String key = (String) result[0];
+                String[] value = ((String) result[1]).split(",");
+                map2.put(key, value);
+            });
+            map.put("compilers", map2);
+
+            String sql3 = "select packer_type,group_concat(packer_name separator ',' ) as packer_names " +
+                    "from app_pack " +
+                    "group by packer_type";
+            Query sqlQuery3 = session.createSQLQuery(sql3);
+            Map<String, String[]> map3 = new HashMap<>();
+            sqlQuery3.getResultList().forEach(res -> {
+                Object[] result = (Object[]) res;
+                String key = (String) result[0];
+                String[] value = ((String) result[1]).split(",");
+                map3.put(key, value);
+            });
+            map.put("packers", map3);
+        }
+
+        return map;
+    }
+}

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/ProjDAO.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/dao/ProjDAO.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.app.repository.orchestration;
+package cn.reghao.autodop.dmaster.app.repository.dao;
 
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import org.hibernate.Session;

+ 8 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/LogRepository.java

@@ -6,6 +6,7 @@ import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.repository.deploy.DeployedAppRepository;
 import cn.reghao.autodop.dmaster.app.repository.orchestration.AppOrchestrationRepository;
+import cn.reghao.autodop.dmaster.app.service.tools.updater.CommitLog;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
@@ -39,8 +40,13 @@ public class LogRepository {
 
     @Transactional
     public void saveBuildLog(BuildLog buildLog) {
-        String repo = buildLog.getCommitLog().getRemoteRepoUrl();
-        String commitId = buildLog.getCommitLog().getCommitId();
+        CommitLog commitLog = buildLog.getCommitLog();
+        if (commitLog == null) {
+            return;
+        }
+
+        String repo = commitLog.getRemoteRepoUrl();
+        String commitId = commitLog.getCommitId();
         // 构建日志存在且状态正确时不保存
         BuildLog entity = buildLogRepository.findByCommitLogRemoteRepoUrlAndCommitLogCommitId(repo, commitId);
         if (entity != null) {

+ 25 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/AppRepository.java

@@ -1,9 +1,10 @@
 package cn.reghao.autodop.dmaster.app.repository.orchestration;
 
-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.orchestration.Notification;
+import cn.reghao.autodop.dmaster.app.entity.build.AppCompile;
+import cn.reghao.autodop.dmaster.app.entity.build.AppPack;
+import cn.reghao.autodop.dmaster.app.entity.build.AppUpdate;
+import cn.reghao.autodop.dmaster.app.entity.Notification;
+import cn.reghao.autodop.dmaster.app.entity.orchestration.ProjOrchestration;
 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;
@@ -24,13 +25,13 @@ public class AppRepository {
     private AppCompileRepository compileRepository;
     private AppPackRepository packRepository;
     private AppOrchestrationRepository orchestrationRepository;
-    private ProjectOrchestrationRepository projRepository;
+    private ProjOrchestrationRepository projRepository;
     private NotificationRepository notificationRepository;
 
     public AppRepository(AppUpdateRepository updateRepository,
                          AppCompileRepository compileRepository,
                          AppPackRepository packRepository,
-                         ProjectOrchestrationRepository projRepository,
+                         ProjOrchestrationRepository projRepository,
                          AppOrchestrationRepository orchestrationRepository,
                          NotificationRepository notificationRepository) {
         this.updateRepository = updateRepository;
@@ -47,6 +48,21 @@ public class AppRepository {
         List<AppPack> appPacks = packRepository.findAll();
         List<Notification> notifications = notificationRepository.findAll();
 
+        BuildConfig buildConfig = new BuildConfig();
+        buildConfig.setAppUpdates(appUpdates);
+        buildConfig.setAppCompiles(appCompiles);
+        buildConfig.setAppPacks(appPacks);
+        buildConfig.setNotifications(notifications);
+
+        return buildConfig;
+    }
+
+    /*public BuildConfig buildConfig() {
+        List<AppUpdate> appUpdates = updateRepository.findAll();
+        List<AppCompile> appCompiles = compileRepository.findAll();
+        List<AppPack> appPacks = packRepository.findAll();
+        List<Notification> notifications = notificationRepository.findAll();
+
         List<SelectOption> updateOptions = new ArrayList<>();
         convertToAppUpdates(appUpdates, updateOptions);
         List<SelectOption> compileOptions = new ArrayList<>();
@@ -63,7 +79,7 @@ public class AppRepository {
         buildConfig.setNotifications(notificationOptions);
 
         return buildConfig;
-    }
+    }*/
 
     private void convertToAppUpdates(List<AppUpdate> appUpdates, List<SelectOption> options) {
         Map<String, Integer> keys1 = new HashMap<>();
@@ -239,8 +255,8 @@ public class AppRepository {
     }
 
     public void projs(BuildConfig buildConfig) {
-        List<SelectOption> projs = projRepository.findAll().stream()
-                .map(proj -> new SelectOption(proj.getProjId(), proj.getDescription()))
+        List<String> projs = projRepository.findAll().stream()
+                .map(ProjOrchestration::getProjId)
                 .collect(Collectors.toList());
         buildConfig.setProjs(projs);
     }

+ 0 - 13
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/LocalFsConfigRepository.java

@@ -1,13 +0,0 @@
-package cn.reghao.autodop.dmaster.app.repository.orchestration;
-
-import cn.reghao.autodop.dmaster.app.entity.orchestration.LocalFsConfig;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-/**
- *
- * @author reghao
- * @date 2020-01-21 14:53:03
- */
-public interface LocalFsConfigRepository extends JpaRepository<LocalFsConfig, Long> {
-    LocalFsConfig findByEnv(String env);
-}

+ 12 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/LocalFsDirRepository.java

@@ -0,0 +1,12 @@
+package cn.reghao.autodop.dmaster.app.repository.orchestration;
+
+import cn.reghao.autodop.dmaster.app.entity.LocalFsDir;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+/**
+ *
+ * @author reghao
+ * @date 2020-01-21 14:53:03
+ */
+public interface LocalFsDirRepository extends JpaRepository<LocalFsDir, Long> {
+}

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

@@ -1,7 +1,10 @@
 package cn.reghao.autodop.dmaster.app.repository.orchestration;
 
-import cn.reghao.autodop.dmaster.app.entity.orchestration.Notification;
+import cn.reghao.autodop.dmaster.app.entity.Notification;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+
+import javax.transaction.Transactional;
 
 /**
  * @author reghao
@@ -9,4 +12,8 @@ import org.springframework.data.jpa.repository.JpaRepository;
  */
 public interface NotificationRepository extends JpaRepository<Notification, Long> {
     Notification findByNotifierName(String notifierName);
+
+    @Modifying
+    @Transactional
+    void deleteByNotifierName(String notifierName);
 }

+ 20 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/ProjOrchestrationRepository.java

@@ -0,0 +1,20 @@
+package cn.reghao.autodop.dmaster.app.repository.orchestration;
+
+import cn.reghao.autodop.dmaster.app.entity.orchestration.ProjOrchestration;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author reghao
+ * @date 2020-01-21 14:53:03
+ */
+public interface ProjOrchestrationRepository extends JpaRepository<ProjOrchestration, Long> {
+    ProjOrchestration findByProjId(String projId);
+
+    @Modifying
+    @Transactional
+    void deleteByProjId(String projId);
+}

+ 0 - 33
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/ProjectOrchestrationRepository.java

@@ -1,33 +0,0 @@
-package cn.reghao.autodop.dmaster.app.repository.orchestration;
-
-import cn.reghao.autodop.dmaster.app.entity.orchestration.ProjOrchestration;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-
-import javax.transaction.Transactional;
-
-/**
- *
- * @author reghao
- * @date 2020-01-21 14:53:03
- */
-public interface ProjectOrchestrationRepository extends JpaRepository<ProjOrchestration, Long> {
-    ProjOrchestration findByProjId(String projId);
-
-    @Modifying
-    @Transactional
-    void deleteByProjId(String projId);
-
-    // TODO 添加分页参数
-    /*@Query(value = "select proj.id as id,proj.proj_id as projId,proj.description as description,repo.repo_id as repoId,repo.username as username,repo.password as password,proj.repo as repo,compiler.compiler_id as compilerId,compiler.script as script,packer.packer_id as packerId,packer.app_root_path as appRootPath,group_concat(app.app_id separator ',') as apps,proj.create_time as createTime\n" +
-            "from project_orchestration proj\n" +
-            "inner join app_orchestration app on proj.proj_id = app.proj_id\n" +
-            "inner join repo_auth repo on proj.repo_auth_id = repo.id\n" +
-            "inner join compiler compiler on proj.compiler_id = compiler.id\n" +
-            "inner join packer packer on proj.packer_id = packer.id\n" +
-            "where proj.id > ?1" +
-            "group by proj.proj_id",
-            countQuery = "select count(*) from project_orchestration",
-            nativeQuery = true)
-    Page<ProjOrchestrationVO> findAllById(String id, Pageable pageable);*/
-}

+ 0 - 160
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppBuildConfigService.java

@@ -1,160 +0,0 @@
-package cn.reghao.autodop.dmaster.app.service;
-
-import cn.reghao.autodop.common.utils.JsonUtil;
-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.orchestration.LocalFsConfig;
-import cn.reghao.autodop.dmaster.app.entity.orchestration.Notification;
-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.LocalFsConfigRepository;
-import cn.reghao.autodop.dmaster.app.repository.orchestration.NotificationRepository;
-import cn.reghao.autodop.dmaster.app.vo.PageList;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDateTime;
-
-/**
- * @author reghao
- * @date 2020-02-28 17:10:37
- */
-@Service
-public class AppBuildConfigService {
-    private NotificationRepository notificationRepository;
-    private AppUpdateRepository updateRepository;
-    private AppCompileRepository compileRepository;
-    private AppPackRepository packRepository;
-    private LocalFsConfigRepository configRepository;
-
-    public AppBuildConfigService(NotificationRepository notificationRepository,
-                                 AppUpdateRepository updateRepository,
-                                 AppCompileRepository compileRepository,
-                                 AppPackRepository packRepository,
-                                 LocalFsConfigRepository configRepository) {
-        this.notificationRepository = notificationRepository;
-        this.updateRepository = updateRepository;
-        this.compileRepository = compileRepository;
-        this.packRepository = packRepository;
-        this.configRepository = configRepository;
-    }
-
-    public void saveOrUpdate(int type, String json) throws Exception {
-        switch (type) {
-            case 0:
-                Notification notification = (Notification) JsonUtil.jsonToObject(json, Notification.class);
-                Notification notificationEntity =
-                        notificationRepository.findByNotifierName(notification.getNotifierName());
-                if (notificationEntity != null) {
-                    notification.setId(notificationEntity.getId());
-                    notification.setCreateTime(notificationEntity.getCreateTime());
-                    notification.setUpdateTime(LocalDateTime.now());
-                }
-                notificationRepository.save(notification);
-                return;
-            case 1:
-                AppUpdate appUpdate = (AppUpdate) JsonUtil.jsonToObject(json, AppUpdate.class);
-                AppUpdate updateEntity = updateRepository.findByRepoName(appUpdate.getRepoName());
-                if (updateEntity != null) {
-                    appUpdate.setId(updateEntity.getId());
-                    appUpdate.setCreateTime(updateEntity.getCreateTime());
-                    appUpdate.setUpdateTime(LocalDateTime.now());
-                }
-                updateRepository.save(appUpdate);
-                return;
-            case 2:
-                AppCompile appCompile = (AppCompile) JsonUtil.jsonToObject(json, AppCompile.class);
-                AppCompile compileEntity = compileRepository.findByCompilerName(appCompile.getCompilerName());
-                if (compileEntity != null) {
-                    appCompile.setId(compileEntity.getId());
-                    appCompile.setCreateTime(compileEntity.getCreateTime());
-                    appCompile.setUpdateTime(LocalDateTime.now());
-                }
-                compileRepository.save(appCompile);
-                return;
-            case 3:
-                AppPack appPack = (AppPack) JsonUtil.jsonToObject(json, AppPack.class);
-                AppPack packEntity = packRepository.findByPackerName(appPack.getPackerName());
-                if (packEntity != null) {
-                    appPack.setId(packEntity.getId());
-                    appPack.setCreateTime(packEntity.getCreateTime());
-                    appPack.setUpdateTime(LocalDateTime.now());
-                }
-                packRepository.save(appPack);
-                return;
-            case 4:
-                // TODO 有且仅执行一次,在系统初始化时执行
-                LocalFsConfig localFsConfig = (LocalFsConfig) JsonUtil.jsonToObject(json, LocalFsConfig.class);
-                LocalFsConfig configEntity = configRepository.findByEnv(localFsConfig.getEnv());
-                if (configEntity != null) {
-                    localFsConfig.setId(configEntity.getId());
-                    localFsConfig.setCreateTime(configEntity.getCreateTime());
-                    localFsConfig.setUpdateTime(LocalDateTime.now());
-                }
-                configRepository.save(localFsConfig);
-                return;
-            default:
-                throw new Exception(type + " 类型不存在");
-        }
-    }
-
-    public PageList getByPage(int type, PageRequest pageRequest) {
-        switch (type) {
-            case 0:
-                Page<Notification> notifications = notificationRepository.findAll(pageRequest);
-                PageList<Notification> pageList = new PageList<>();
-                pageList.setList(notifications.getContent());
-                pageList.setTotalSize(notifications.getTotalElements());
-                pageList.setTotalPages(notifications.getTotalPages());
-                return pageList;
-            case 1:
-                Page<AppUpdate> appUpdates = updateRepository.findAll(pageRequest);
-                PageList<AppUpdate> pageList1 = new PageList<>();
-                pageList1.setList(appUpdates.getContent());
-                pageList1.setTotalSize(appUpdates.getTotalElements());
-                pageList1.setTotalPages(appUpdates.getTotalPages());
-                return pageList1;
-            case 2:
-                Page<AppCompile> appCompiles = compileRepository.findAll(pageRequest);
-                PageList<AppCompile> pageList2 = new PageList<>();
-                pageList2.setList(appCompiles.getContent());
-                pageList2.setTotalSize(appCompiles.getTotalElements());
-                pageList2.setTotalPages(appCompiles.getTotalPages());
-                return pageList2;
-            case 3:
-                Page<AppPack> appPacks = packRepository.findAll(pageRequest);
-                PageList<AppPack> pageList3 = new PageList<>();
-                pageList3.setList(appPacks.getContent());
-                pageList3.setTotalSize(appPacks.getTotalElements());
-                pageList3.setTotalPages(appPacks.getTotalPages());
-                return pageList3;
-            case 4:
-                Page<LocalFsConfig> localFsConfigs = configRepository.findAll(pageRequest);
-                PageList<LocalFsConfig> pageList4 = new PageList<>();
-                pageList4.setList(localFsConfigs.getContent());
-                pageList4.setTotalSize(localFsConfigs.getTotalElements());
-                pageList4.setTotalPages(localFsConfigs.getTotalPages());
-                return pageList4;
-            default:
-                return null;
-        }
-    }
-
-    public void delete(int type, String name) {
-        switch (type) {
-            case 0:
-                break;
-            case 1:
-                break;
-            case 2:
-                break;
-            case 3:
-                break;
-            default:
-                break;
-        }
-    }
-}

+ 6 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppBuildService.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildService.java

@@ -3,6 +3,7 @@ package cn.reghao.autodop.dmaster.app.service;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
 import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
+import cn.reghao.autodop.dmaster.app.repository.dao.AppDAO;
 import cn.reghao.autodop.dmaster.app.repository.log.BuildLogRepository;
 import cn.reghao.autodop.dmaster.app.repository.log.DeployLogRepository;
 import cn.reghao.autodop.dmaster.app.repository.orchestration.*;
@@ -26,16 +27,16 @@ import java.util.stream.Collectors;
  * @date 2020-02-28 17:10:37
  */
 @Service
-public class AppBuildService {
+public class BuildService {
     private BuildLogRepository buildLogRepository;
     private DeployLogRepository deployLogRepository;
     private AppOrchestrationRepository appRepository;
     private AppDAO appDAO;
 
-    public AppBuildService(BuildLogRepository buildLogRepository,
-                           DeployLogRepository deployLogRepository,
-                           AppOrchestrationRepository appRepository,
-                           AppDAO appDAO) {
+    public BuildService(BuildLogRepository buildLogRepository,
+                        DeployLogRepository deployLogRepository,
+                        AppOrchestrationRepository appRepository,
+                        AppDAO appDAO) {
         this.buildLogRepository = buildLogRepository;
         this.deployLogRepository = deployLogRepository;
         this.appRepository = appRepository;

+ 250 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/ConfigService.java

@@ -0,0 +1,250 @@
+package cn.reghao.autodop.dmaster.app.service;
+
+import cn.reghao.autodop.common.utils.JsonUtil;
+import cn.reghao.autodop.dmaster.app.constant.ConfigType;
+import cn.reghao.autodop.dmaster.app.constant.NotifierType;
+import cn.reghao.autodop.dmaster.app.entity.build.AppCompile;
+import cn.reghao.autodop.dmaster.app.entity.build.AppPack;
+import cn.reghao.autodop.dmaster.app.entity.build.AppUpdate;
+import cn.reghao.autodop.dmaster.app.entity.LocalFsDir;
+import cn.reghao.autodop.dmaster.app.entity.Notification;
+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.dao.ConfigDAO;
+import cn.reghao.autodop.dmaster.app.repository.orchestration.LocalFsDirRepository;
+import cn.reghao.autodop.dmaster.app.repository.orchestration.NotificationRepository;
+import cn.reghao.autodop.dmaster.app.vo.PageList;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2020-02-28 17:10:37
+ */
+@Service
+public class ConfigService {
+    private LocalFsDirRepository configRepository;
+    private NotificationRepository notifyRepository;
+    private AppUpdateRepository updateRepository;
+    private AppCompileRepository compileRepository;
+    private AppPackRepository packRepository;
+    private ConfigDAO configDAO;
+
+    public ConfigService(LocalFsDirRepository configRepository,
+                         NotificationRepository notifyRepository,
+                         AppUpdateRepository updateRepository,
+                         AppCompileRepository compileRepository,
+                         AppPackRepository packRepository,
+                         ConfigDAO configDAO) {
+        this.configRepository = configRepository;
+        this.notifyRepository = notifyRepository;
+        this.updateRepository = updateRepository;
+        this.compileRepository = compileRepository;
+        this.packRepository = packRepository;
+        this.configDAO = configDAO;
+    }
+
+    public void add(String configType, String json) throws Exception {
+        switch (ConfigType.valueOf(configType)) {
+            // 本地文件系统目录
+            case localDir:
+                LocalFsDir localFsDir = (LocalFsDir) JsonUtil.jsonToObject(json, LocalFsDir.class);
+                configRepository.save(localFsDir);
+
+                /*AppEnv configEntity = configRepository.findByEnv(appEnv.getEnv());
+                if (configEntity == null) {
+                    configRepository.save(appEnv);
+                }*/
+                break;
+            // 通知配置
+            case notifier:
+                Notification notification = (Notification) JsonUtil.jsonToObject(json, Notification.class);
+                // TODO 考虑 isDelete 为 true 的情况
+                Notification notifyEntity = notifyRepository.findByNotifierName(notification.getNotifierName());
+                if (notifyEntity == null) {
+                    notifyRepository.save(notification);
+                }
+                break;
+            // 仓库配置
+            case repo:
+                AppUpdate appUpdate = (AppUpdate) JsonUtil.jsonToObject(json, AppUpdate.class);
+                AppUpdate updateEntity = updateRepository.findByRepoName(appUpdate.getRepoName());
+                if (updateEntity == null) {
+                    updateRepository.save(appUpdate);
+                }
+                break;
+            // 编译器配置
+            case compiler:
+                AppCompile appCompile = (AppCompile) JsonUtil.jsonToObject(json, AppCompile.class);
+                AppCompile compileEntity = compileRepository.findByCompilerName(appCompile.getCompilerName());
+                if (compileEntity == null) {
+                    compileRepository.save(appCompile);
+                }
+                break;
+            // 打包工具配置
+            case packer:
+                AppPack appPack = (AppPack) JsonUtil.jsonToObject(json, AppPack.class);
+                AppPack packEntity = packRepository.findByPackerName(appPack.getPackerName());
+                if (packEntity == null) {
+                    packRepository.save(appPack);
+                }
+                break;
+            default:
+                throw new Exception(configType + " 类型不存在");
+        }
+    }
+
+    public PageList getByPage(String configType, PageRequest pageRequest) throws Exception {
+        switch (ConfigType.valueOf(configType)) {
+            case localDir:
+                Page<LocalFsDir> configs = configRepository.findAll(pageRequest);
+                PageList<LocalFsDir> pageList = new PageList<>();
+                pageList.setTotalSize(configs.getTotalElements());
+                pageList.setTotalPages(configs.getTotalPages());
+                pageList.setList(configs.getContent().stream().map(LocalFsDir::vo).collect(Collectors.toList()));
+                return pageList;
+            case notifier:
+                Page<Notification> notifiers = notifyRepository.findAll(pageRequest);
+                PageList<Notification> pageList1 = new PageList<>();
+                pageList1.setTotalSize(notifiers.getTotalElements());
+                pageList1.setTotalPages(notifiers.getTotalPages());
+                pageList1.setList(notifiers.getContent().stream().map(Notification::vo).collect(Collectors.toList()));
+                return pageList1;
+            case repo:
+                Page<AppUpdate> appUpdates = updateRepository.findAll(pageRequest);
+                PageList<AppUpdate> pageList2 = new PageList<>();
+                pageList2.setTotalSize(appUpdates.getTotalElements());
+                pageList2.setTotalPages(appUpdates.getTotalPages());
+                pageList2.setList(appUpdates.getContent().stream().map(AppUpdate::vo).collect(Collectors.toList()));
+                return pageList2;
+            case compiler:
+                Page<AppCompile> appCompiles = compileRepository.findAll(pageRequest);
+                PageList<AppCompile> pageList3 = new PageList<>();
+                pageList3.setTotalSize(appCompiles.getTotalElements());
+                pageList3.setTotalPages(appCompiles.getTotalPages());
+                pageList3.setList(appCompiles.getContent().stream().map(AppCompile::vo).collect(Collectors.toList()));
+                return pageList3;
+            case packer:
+                Page<AppPack> appPacks = packRepository.findAll(pageRequest);
+                PageList<AppPack> pageList4 = new PageList<>();
+                pageList4.setTotalSize(appPacks.getTotalElements());
+                pageList4.setTotalPages(appPacks.getTotalPages());
+                pageList4.setList(appPacks.getContent().stream().map(AppPack::vo).collect(Collectors.toList()));
+                return pageList4;
+            default:
+                throw new Exception(configType + " 类型不存在");
+        }
+    }
+
+    public void update(String configType, String json) throws Exception {
+        switch (ConfigType.valueOf(configType)) {
+            // 本地文件系统目录
+            case localDir:
+                LocalFsDir localFsDir = (LocalFsDir) JsonUtil.jsonToObject(json, LocalFsDir.class);
+                configRepository.save(localFsDir);
+                /*AppEnv configEntity = configRepository.findByEnv(appEnv.getEnv());
+                if (configEntity != null && !configEntity.equals(appEnv)) {
+                    appEnv.setId(configEntity.getId());
+                    appEnv.setIsDelete(configEntity.getIsDelete());
+                    appEnv.setCreateTime(configEntity.getCreateTime());
+                    appEnv.setUpdateTime(LocalDateTime.now());
+                    configRepository.save(appEnv);
+                } else if (configEntity == null) {
+                    configRepository.save(appEnv);
+                }*/
+                break;
+            // 通知配置
+            case notifier:
+                Notification notification = (Notification) JsonUtil.jsonToObject(json, Notification.class);
+                // TODO 考虑 isDelete 为 true 的情况
+                Notification notifyEntity = notifyRepository.findByNotifierName(notification.getNotifierName());
+                if (notifyEntity != null && !notifyEntity.equals(notification)) {
+                    notification.setId(notifyEntity.getId());
+                    notification.setIsDelete(notifyEntity.getIsDelete());
+                    notification.setCreateTime(notifyEntity.getCreateTime());
+                    notification.setUpdateTime(LocalDateTime.now());
+                    notifyRepository.save(notification);
+                } else if (notifyEntity == null) {
+                    notifyRepository.save(notification);
+                }
+                break;
+            // 仓库配置
+            case repo:
+                AppUpdate appUpdate = (AppUpdate) JsonUtil.jsonToObject(json, AppUpdate.class);
+                AppUpdate updateEntity = updateRepository.findByRepoName(appUpdate.getRepoName());
+                if (updateEntity != null && !updateEntity.equals(appUpdate)) {
+                    appUpdate.setId(updateEntity.getId());
+                    appUpdate.setIsDelete(false);
+                    appUpdate.setCreateTime(updateEntity.getCreateTime());
+                    appUpdate.setUpdateTime(LocalDateTime.now());
+                    updateRepository.save(appUpdate);
+                } else if (updateEntity == null) {
+                    updateRepository.save(appUpdate);
+                }
+                break;
+            // 编译器配置
+            case compiler:
+                AppCompile appCompile = (AppCompile) JsonUtil.jsonToObject(json, AppCompile.class);
+                AppCompile compileEntity = compileRepository.findByCompilerName(appCompile.getCompilerName());
+                if (compileEntity != null && !compileEntity.equals(appCompile)) {
+                    appCompile.setId(compileEntity.getId());
+                    appCompile.setIsDelete(false);
+                    appCompile.setCreateTime(compileEntity.getCreateTime());
+                    appCompile.setUpdateTime(LocalDateTime.now());
+                    compileRepository.save(appCompile);
+                } else if (compileEntity == null) {
+                    compileRepository.save(appCompile);
+                }
+                break;
+            // 打包工具配置
+            case packer:
+                AppPack appPack = (AppPack) JsonUtil.jsonToObject(json, AppPack.class);
+                AppPack packEntity = packRepository.findByPackerName(appPack.getPackerName());
+                if (packEntity != null && !packEntity.equals(appPack)) {
+                    appPack.setId(packEntity.getId());
+                    appPack.setIsDelete(false);
+                    appPack.setCreateTime(packEntity.getCreateTime());
+                    appPack.setUpdateTime(LocalDateTime.now());
+                    packRepository.save(appPack);
+                } else if (packEntity == null) {
+                    packRepository.save(appPack);
+                }
+                break;
+            default:
+                throw new Exception(configType + " 类型不存在");
+        }
+    }
+
+    public void delete(String configType, String name) throws Exception {
+        switch (ConfigType.valueOf(configType)) {
+            case localDir:
+                break;
+            case notifier:
+                notifyRepository.deleteByNotifierName(name);
+                break;
+            case repo:
+                updateRepository.deleteByRepoName(name);
+                break;
+            case compiler:
+                compileRepository.deleteByCompilerName(name);
+                break;
+            case packer:
+                packRepository.deleteByPackerName(name);
+                break;
+            default:
+                throw new Exception(configType + " 类型不存在");
+        }
+    }
+
+    public Map<String, Map<String, String[]>> buildConfigs() {
+        Map<String, Map<String, String[]>> map = configDAO.buildConfigs();
+        return map;
+    }
+}

+ 5 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppLogManager.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/LogManager.java

@@ -18,11 +18,11 @@ import java.util.*;
  * @date 2019-11-27 11:30:28
  */
 @Service
-public class AppLogManager {
+public class LogManager {
     private final int GRPC_PORT = 4001;
     private OrchestrationCache caching;
 
-    public AppLogManager(OrchestrationCache caching) {
+    public LogManager(OrchestrationCache caching) {
         this.caching = caching;
     }
 
@@ -42,8 +42,8 @@ public class AppLogManager {
             String logType = appLog.getLogType();
             String logLevel = appLog.getLogLevel();
             LogFile logFile = new LogFile(logType, logLevel);
-            String logdirPath = app.getAppDeploy().getRunningDir() + appLog.getLogdirPath();
-            List<String> files = logService.logFiles(appId, logType, logLevel, logdirPath);
+            String logDir = app.getAppDeploy().getRunningDir() + appLog.getLogDir();
+            List<String> files = logService.logFiles(appId, logType, logLevel, logDir);
             logFile.setFiles(files);
             logFiles.add(logFile);
         }
@@ -64,7 +64,7 @@ public class AppLogManager {
         for (AppLog appLog : appLogs) {
             if (appLog.getLogType().equals(logType) && appLog.getLogLevel().equals(logLevel)) {
                 // TODO 只有控制台日志的 logPath 才为 null
-                logfilePath = runningDir + appLog.getLogdirPath() + "/" + logName;
+                logfilePath = runningDir + appLog.getLogDir() + "/" + logName;
                 break;
             }
         }

+ 25 - 26
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppOrchestrateService.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/OrchestrateService.java

@@ -2,11 +2,11 @@ package cn.reghao.autodop.dmaster.app.service;
 
 import cn.reghao.autodop.common.utils.JsonUtil;
 import cn.reghao.autodop.dmaster.app.entity.build.AppBuild;
-import cn.reghao.autodop.dmaster.app.entity.build.compile.AppCompile;
-import cn.reghao.autodop.dmaster.app.entity.build.pack.AppPack;
-import cn.reghao.autodop.dmaster.app.entity.build.update.AppUpdate;
+import cn.reghao.autodop.dmaster.app.entity.build.AppCompile;
+import cn.reghao.autodop.dmaster.app.entity.build.AppPack;
+import cn.reghao.autodop.dmaster.app.entity.build.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.Notification;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.ProjOrchestration;
 import cn.reghao.autodop.dmaster.app.repository.build.AppCompileRepository;
 import cn.reghao.autodop.dmaster.app.repository.build.AppPackRepository;
@@ -14,21 +14,24 @@ import cn.reghao.autodop.dmaster.app.repository.build.AppUpdateRepository;
 import cn.reghao.autodop.dmaster.app.repository.orchestration.*;
 import cn.reghao.autodop.dmaster.app.vo.BuildConfig;
 import cn.reghao.autodop.dmaster.app.vo.PageList;
-import cn.reghao.autodop.dmaster.app.vo.ResultVO;
+import cn.reghao.autodop.dmaster.app.vo.OrchestrationVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao
  * @date 2020-02-28 17:10:37
  */
 @Service
-public class AppOrchestrateService {
-    private ProjectOrchestrationRepository projRepository;
+public class OrchestrateService {
+    private ProjOrchestrationRepository projRepository;
     private AppOrchestrationRepository appRepository;
     private AppUpdateRepository appUpdateRepository;
     private AppCompileRepository appCompileRepository;
@@ -36,13 +39,13 @@ public class AppOrchestrateService {
     private NotificationRepository notificationRepository;
     private AppRepository repository;
 
-    public AppOrchestrateService(ProjectOrchestrationRepository projRepository,
-                                 AppOrchestrationRepository appRepository,
-                                 AppUpdateRepository appUpdateRepository,
-                                 AppCompileRepository appCompileRepository,
-                                 AppPackRepository appPackRepository,
-                                 NotificationRepository notificationRepository,
-                                 AppRepository repository) {
+    public OrchestrateService(ProjOrchestrationRepository projRepository,
+                              AppOrchestrationRepository appRepository,
+                              AppUpdateRepository appUpdateRepository,
+                              AppCompileRepository appCompileRepository,
+                              AppPackRepository appPackRepository,
+                              NotificationRepository notificationRepository,
+                              AppRepository repository) {
         this.projRepository = projRepository;
         this.appRepository = appRepository;
         this.appUpdateRepository = appUpdateRepository;
@@ -52,14 +55,6 @@ public class AppOrchestrateService {
         this.repository = repository;
     }
 
-    public void addOrUpdateApp(AppOrchestration app) {
-
-    }
-
-    public void addOrUpdateProj(ProjOrchestration proj) {
-
-    }
-
     public void add(int type, String json) {
         AppBuild appBuild;
         switch (type) {
@@ -117,6 +112,7 @@ public class AppOrchestrateService {
                     projRepository.save(proj);
                     return true;
                 }
+                break;
             case 2:
                 AppOrchestration appEntity = appRepository.findByAppId(from);
                 AppOrchestration app = appRepository.findByAppId(to);
@@ -132,9 +128,12 @@ public class AppOrchestrateService {
                     saveApp(app);
                     return true;
                 }
+                break;
             default:
                 return false;
         }
+
+        return false;
     }
 
     /**
@@ -178,10 +177,10 @@ public class AppOrchestrateService {
         switch (type) {
             case 1:
                 ProjOrchestration proj = projRepository.findByProjId(id);
-                return ResultVO.projVO(proj);
+                return OrchestrationVO.projVO(proj);
             case 2:
                 AppOrchestration app = appRepository.findByAppId(id);
-                return ResultVO.appVO(app);
+                return OrchestrationVO.appVO(app);
             default:
                 return "编排类型错误";
         }
@@ -193,7 +192,7 @@ public class AppOrchestrateService {
                 Page<ProjOrchestration> projPages = projRepository.findAll(pageRequest);
                 List<ProjOrchestration> projVOs = new ArrayList<>();
                 projPages.forEach(proj -> {
-                    projVOs.add(ResultVO.projVO(proj));
+                    projVOs.add(OrchestrationVO.projVO(proj));
                 });
 
                 PageList<ProjOrchestration> projs = new PageList<>();
@@ -204,9 +203,9 @@ public class AppOrchestrateService {
             case 2:
                 Page<AppOrchestration> appPages = appRepository.findByEnv(env, pageRequest);
                 PageList<AppOrchestration> apps = new PageList<>();
-                apps.setList(appPages.getContent());
                 apps.setTotalSize(appPages.getTotalElements());
                 apps.setTotalPages(appPages.getTotalPages());
+                apps.setList(appPages.getContent().stream().map(OrchestrationVO::appVO).collect(Collectors.toList()));
                 return apps;
             default:
                 return "编排类型错误";

+ 2 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppStatusManager.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/StatusManager.java

@@ -8,7 +8,6 @@ import cn.reghao.autodop.dmaster.app.cache.OrchestrationCache;
 import cn.reghao.autodop.dmaster.app.entity.deploy.DeployedApp;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.repository.deploy.DeployedAppRepository;
-import cn.reghao.autodop.dmaster.app.repository.orchestration.AppDAO;
 import com.alibaba.fastjson.JSONObject;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
@@ -24,12 +23,12 @@ import java.util.List;
  * @date 2019-11-27 11:30:28
  */
 @Service
-public class AppStatusManager {
+public class StatusManager {
     private DeployedAppRepository deployedRepository;
     private final int GRPC_PORT = 4001;
     private OrchestrationCache caching;
 
-    public AppStatusManager(OrchestrationCache caching, DeployedAppRepository deployedRepository) {
+    public StatusManager(OrchestrationCache caching, DeployedAppRepository deployedRepository) {
         this.deployedRepository = deployedRepository;
         this.caching = caching;
     }

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

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.dmaster.app.service.build;
 
-import cn.reghao.autodop.dmaster.app.entity.constant.BuildStage;
-import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployLog;
+import cn.reghao.autodop.dmaster.app.constant.BuildStage;
+import cn.reghao.autodop.dmaster.app.vo.log.BuildDeployLog;
 
 import java.util.concurrent.Callable;
 

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

@@ -1,15 +1,15 @@
 package cn.reghao.autodop.dmaster.app.service.build;
 
 import cn.reghao.autodop.dmaster.app.entity.build.AppBuild;
-import cn.reghao.autodop.dmaster.app.entity.build.compile.AppCompile;
-import cn.reghao.autodop.dmaster.app.entity.build.pack.AppPack;
-import cn.reghao.autodop.dmaster.app.entity.build.update.AppUpdate;
-import cn.reghao.autodop.dmaster.app.entity.constant.BuildStage;
-import cn.reghao.autodop.dmaster.app.entity.constant.CompilerType;
+import cn.reghao.autodop.dmaster.app.entity.build.AppCompile;
+import cn.reghao.autodop.dmaster.app.entity.build.AppPack;
+import cn.reghao.autodop.dmaster.app.entity.build.AppUpdate;
+import cn.reghao.autodop.dmaster.app.constant.BuildStage;
+import cn.reghao.autodop.dmaster.app.constant.CompilerType;
 import cn.reghao.autodop.common.deploy.PackerType;
-import cn.reghao.autodop.dmaster.app.entity.constant.RepoType;
+import cn.reghao.autodop.dmaster.app.constant.RepoType;
 import cn.reghao.autodop.dmaster.app.entity.deploy.AppDeploy;
-import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployLog;
+import cn.reghao.autodop.dmaster.app.vo.log.BuildDeployLog;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
 import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
@@ -22,13 +22,15 @@ import cn.reghao.autodop.dmaster.app.service.tools.updater.CommitLog;
 import cn.reghao.autodop.dmaster.app.service.tools.updater.GitImpl;
 import cn.reghao.autodop.dmaster.app.service.tools.updater.SvnImpl;
 import cn.reghao.autodop.dmaster.common.config.SysConfig;
+import cn.reghao.autodop.dmaster.common.exception.ExceptionUtil;
 import lombok.extern.slf4j.Slf4j;
 
 import java.time.LocalDateTime;
-import java.util.List;
 import java.util.Set;
 
 /**
+ * TODO 统计构建各阶段耗时
+ *
  * 应用构建部署,根据 AppOrchestration 的值完成应用构建和部署的配置
  *
  * @author reghao
@@ -41,12 +43,10 @@ public class AppIntegrate {
     private String appPackDir;
 
     private AppOrchestration app;
-    private ProjOrchestration proj;
     // 远程仓库最近一次提交的信息
     private CommitLog lastCommitLog;
     private BuildLog buildLog;
     private DeployLog deployLog;
-    private BuildDeployLog buildDeployLog;
 
     private CodeUpdater codeUpdater;
     private PreCompile preCompile;
@@ -66,10 +66,14 @@ public class AppIntegrate {
         init();
     }
 
-    public AppIntegrate(AppOrchestration app, ProjOrchestration proj) {
-        this.app = app;
-        this.proj = proj;
-        app.setAppBuild(proj.getAppBuild());
+    /**
+     * 若 AppOrchestration 发生变化则重新初始化
+     *
+     * @param
+     * @return
+     * @date 2020-08-06 上午10:39
+     */
+    public void reInit() {
         init();
     }
 
@@ -91,13 +95,21 @@ public class AppIntegrate {
     }
 
     private void initBuildDeployConfig() {
-        AppBuild appBuild = app.getAppBuild();
+        AppBuild appBuild;
+        ProjOrchestration proj = app.getProj();
+        if (proj != null) {
+            appBuild = proj.getAppBuild();
+            app.setAppBuild(appBuild);
+        } else {
+            appBuild = app.getAppBuild();
+        }
+
         // 初始化更新配置
         AppUpdate appUpdate = appBuild.getAppUpdate();
         if (appUpdate.getRepoType().equals(RepoType.svn.name())) {
             codeUpdater = new SvnImpl(appUpdate.getUsername(), appUpdate.getPassword());
         } else if (appUpdate.getRepoType().equals(RepoType.git.name())) {
-            codeUpdater = new GitImpl("");
+            codeUpdater = new GitImpl("/home/reghao/id_rsa_codeup");
         }
 
         // 初始化编译配置
@@ -105,7 +117,7 @@ public class AppIntegrate {
         if (appCompile.getCompilerType().equals(CompilerType.dotnet.name())) {
             preCompile = new DotnetPreCompile();
             codeCompiler = new ShellCompiler(appCompile);
-        } else if (appCompile.getCompilerType().equals(CompilerType.maven.name())) {
+        } else if (appCompile.getCompilerType().equals(CompilerType.mvn.name())) {
             codeCompiler = new MavenCompiler("");
         } else if (appCompile.getCompilerType().equals(CompilerType.none.name())) {
             // 静态应用,不需要编译器
@@ -116,7 +128,7 @@ public class AppIntegrate {
         AppPack appPack = appBuild.getAppPack();
         if (appPack.getPackerType().equals(PackerType.docker.name())) {
             codePacker = new DockerPack(appPack.getPackerPath());
-        } else if (appPack.getPackerType().equals(PackerType.maven.name())) {
+        } else if (appPack.getPackerType().equals(PackerType.jar.name())) {
             codePacker = null;
         } else if (appPack.getPackerType().equals(PackerType.zip.name())) {
             codePacker = new ZipPack(appPackDir);
@@ -146,23 +158,32 @@ public class AppIntegrate {
         preCompile.preCompile(app, appEntryDir);
     }
 
+    /* 更新 -> 编译 -> 打包 -> 部署 */
     public boolean update() {
         try {
-            if (lastCommitLog == null) {
-                lastCommitLog = codeUpdater.lastCommitInfo(appLocalRepo + "/" + app.getDirname());
-            }
-
-            AppUpdateStatus updateStatus;
+            String remote;
+            String branch;
+            String local = SysConfig.localRepo + "/" + app.getAppId();;
+            ProjOrchestration proj = app.getProj();
             if (proj != null) {
-                updateStatus = updateProj();
+                remote = proj.getProjRepo();
+                branch = proj.getBranch();
             } else {
-                updateStatus = updateApp();
+                remote = app.getAppRepo();
+                branch = app.getBranch();
+            }
+
+            if (lastCommitLog == null) {
+                lastCommitLog = codeUpdater.lastCommitInfo(local, branch);
             }
+
+            AppUpdateStatus updateStatus = update0(remote, branch, local);
             lastCommitLog = updateStatus.getLastCommitLog();
+            lastCommitLog.setRemoteRepoUrl(app.getAppRepo());
             buildLog.setCommitLog(lastCommitLog);
 
             if (updateStatus.isUpdated()) {
-                BuilderUtil.copyToCompileDir(appLocalRepo, app);
+                BuilderUtil.copyToCompileDir(local, app);
                 return true;
             } else {
                 buildLog.setStage(BuildStage.update.name());
@@ -175,48 +196,30 @@ public class AppIntegrate {
             e.printStackTrace();
             buildLog.setStage(BuildStage.update.name());
             buildLog.setCode(1);
-            buildLog.setMsg(e.getMessage());
+            buildLog.setMsg(ExceptionUtil.errorMsg(e));
             buildLog.setBuildTime(LocalDateTime.now());
             return false;
         }
     }
 
-    /**
-     * TODO 拉取应用所在项目的所有代码,后期应该优化
-     *
-     * @param
-     * @return
-     * @date 2020-05-28 下午3:28
-     */
-    private AppUpdateStatus updateProj() throws Exception {
-        String remoteRepo = proj.getProjRepo();
-        codeUpdater.update(remoteRepo, appLocalRepo);
-        CommitLog current = codeUpdater.lastCommitInfo(appLocalRepo + "/" + app.getDirname());
+    private AppUpdateStatus update0(String remote, String branch, String local) throws Exception {
+        CommitLog current = codeUpdater.update(remote, branch, local);
         if (lastCommitLog == null ||
                 current.getCommitTime() > lastCommitLog.getCommitTime() ||
                 app.isAlwaysBuild()) {
-            return new AppUpdateStatus(app, current, true);
-        } else {
-            return new AppUpdateStatus(app, current, false);
-        }
-    }
 
-    private AppUpdateStatus updateApp() throws Exception {
-        String remoteRepo = app.getAppRepo();
-        String localRepo = appLocalRepo + "/" + app.getDirname();
-        CommitLog current = codeUpdater.update(remoteRepo, localRepo);
-        if (lastCommitLog == null ||
-                current.getCommitTime() > lastCommitLog.getCommitTime() ||
-                app.isAlwaysBuild()) {
-            // TODO 通常情况下独立应用才会有依赖,不过应该很少出现
-            Set<String> dep = app.getDependencyRepos();
-            if (dep != null && !dep.isEmpty()) {
-                for (String repo : dep) {
-                    if (!repo.isEmpty()) {
-                        codeUpdater.update(repo, appLocalRepo + app.getDirname());
+            if (app.getProj() == null) {
+                // TODO 拉取应用依赖的其他仓库
+                Set<String> deps = app.getDependencyRepos();
+                if (deps != null && !deps.isEmpty()) {
+                    for (String repo : deps) {
+                        if (!repo.isEmpty()) {
+                            codeUpdater.update(repo, app.getBranch(), appLocalRepo + app.getDirname());
+                        }
                     }
                 }
             }
+
             return new AppUpdateStatus(app, current, true);
         } else {
             return new AppUpdateStatus(app, current, false);
@@ -228,14 +231,14 @@ public class AppIntegrate {
             if (needPreCompile()) {
                 preCompile(appCompileDir + app.getCompileDir());
             }
-            // TODO 通过脚本调用编译器时会卡住
+            // TODO 通过脚本调用编译器时会卡住
             codeCompiler.compile(app.getDirname(), appCompileDir + app.getCompileDir());
             return true;
         } catch (Exception e) {
             e.printStackTrace();
             buildLog.setStage(BuildStage.compile.name());
             buildLog.setCode(1);
-            buildLog.setMsg(e.getMessage());
+            buildLog.setMsg(ExceptionUtil.errorMsg(e));
             buildLog.setBuildTime(LocalDateTime.now());
             return false;
         }
@@ -252,8 +255,7 @@ public class AppIntegrate {
             e.printStackTrace();
             buildLog.setStage(BuildStage.pack.name());
             buildLog.setCode(1);
-            // TODO 提取错误信息
-            buildLog.setMsg(e.getMessage());
+            buildLog.setMsg(ExceptionUtil.errorMsg(e));
             buildLog.setBuildTime(LocalDateTime.now());
             return false;
         }
@@ -271,7 +273,6 @@ public class AppIntegrate {
      * @date 2020-05-15 上午11:31
      */
     public BuildDeployLog log() {
-        buildDeployLog = new BuildDeployLog(buildLog, deployLog);
-        return buildDeployLog;
+        return new BuildDeployLog(buildLog, deployLog);
     }
 }

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

@@ -1,17 +1,17 @@
 package cn.reghao.autodop.dmaster.app.service.build;
 
 import cn.reghao.autodop.dmaster.app.cache.OrchestrationCache;
-import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployLog;
+import cn.reghao.autodop.dmaster.app.vo.log.BuildDeployLog;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
-import cn.reghao.autodop.dmaster.app.entity.orchestration.ProjOrchestration;
 import cn.reghao.autodop.dmaster.app.repository.log.LogRepository;
 import cn.reghao.autodop.dmaster.app.service.log.LogConsumer;
-import cn.reghao.autodop.dmaster.app.thread.ThreadPoolWrapper;
+import cn.reghao.autodop.dmaster.common.thread.ThreadPoolWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
 import java.util.concurrent.*;
+import java.util.stream.Collectors;
 
 /**
  * 应用构建分发
@@ -23,13 +23,13 @@ import java.util.concurrent.*;
 @Service
 public class BuildDispatcher {
     // TODO 多线程访问的集合
-    private Set<String> buildingApps;
+    private Set<String> onBuilding;
     private OrchestrationCache caching;
     private LogConsumer logConsumer;
     private ExecutorService threadPool;
 
     public BuildDispatcher(OrchestrationCache caching, LogRepository logDAO) {
-        this.buildingApps = new HashSet<>();
+        this.onBuilding = new HashSet<>();
         this.caching = caching;
         this.logConsumer = new LogConsumer(logDAO);
         this.threadPool = ThreadPoolWrapper.threadPool("app-build-deploy");
@@ -52,8 +52,8 @@ public class BuildDispatcher {
         } else {
             appIds.forEach(appId -> {
                 AppOrchestration app = caching.findByAppId(appId);
-                if (app != null && !buildingApps.contains(appId)) {
-                    buildingApps.add(appId);
+                if (app != null && !onBuilding.contains(appId)) {
+                    onBuilding.add(appId);
                     existApps.add(app);
                 } else {
                     // TODO 应用不存在或正在构建中
@@ -67,8 +67,10 @@ public class BuildDispatcher {
         }
 
         // TODO 缓存 appIntegrates,AppOrchestration 没有变化时 AppIntegrate 也应该不变
-        List<AppIntegrate> appIntegrates = appIntegrates(existApps);
-        //ExecutorService threadPool = ThreadPoolWrapper.threadPool("dispatcher");
+        List<AppIntegrate> appIntegrates = existApps.stream()
+                .map(AppIntegrate::new)
+                .collect(Collectors.toList());
+
         List<Future<BuildDeployLog>> appFutures = new ArrayList<>();
         appIntegrates.forEach(appIntegrate -> {
             appFutures.add(threadPool.submit(new AppBuildPipeline(appIntegrate, isDeploy)));
@@ -84,7 +86,8 @@ public class BuildDispatcher {
 
             BuildDeployLog buildDeployLog = future.get();
             results.add(buildDeployLog);
-            buildingApps.remove(buildDeployLog.getBuildLog().getApp().getAppId());
+            // TODO 抛出异常时无法删除集合中的 appId
+            onBuilding.remove(buildDeployLog.getBuildLog().getApp().getAppId());
             iterator1.remove();
         }
 
@@ -96,20 +99,6 @@ public class BuildDispatcher {
         return results;
     }
 
-    private List<AppIntegrate> appIntegrates(List<AppOrchestration> apps) {
-        List<AppIntegrate> list = new ArrayList<>();
-        for (AppOrchestration app : apps) {
-            ProjOrchestration proj = app.getProj();
-            if (proj != null) {
-                list.add(new AppIntegrate(app, proj));
-            } else {
-                list.add(new AppIntegrate(app));
-            }
-        }
-
-        return list;
-    }
-
     public void deploy(String appId, String commitId) {
         AppOrchestration app = caching.findByAppId(appId);
     }

+ 45 - 19
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/BuilderUtil.java

@@ -2,19 +2,14 @@ package cn.reghao.autodop.dmaster.app.service.build;
 
 import cn.reghao.autodop.common.utils.FileUtil;
 import cn.reghao.autodop.common.utils.text.ReplaceCharacter;
-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.RepoType;
+import cn.reghao.autodop.dmaster.app.constant.CompilerType;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
-import cn.reghao.autodop.dmaster.app.service.tools.updater.GitImpl;
-import cn.reghao.autodop.dmaster.app.service.tools.updater.SvnImpl;
-import cn.reghao.autodop.dmaster.app.service.tools.updater.CodeUpdater;
+import cn.reghao.autodop.dmaster.app.entity.orchestration.ProjOrchestration;
 import cn.reghao.autodop.dmaster.common.config.SysConfig;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.List;
 import java.util.Set;
 
 /**
@@ -31,7 +26,6 @@ public class BuilderUtil {
      */
     public static void copyToCompileDir(String appLocalRepo, AppOrchestration app) throws IOException {
         String appCompileDir = SysConfig.compileDir + "/" + app.getAppId();
-
         File compileDir = new File(appCompileDir);
         if (!compileDir.exists() && !FileUtil.mkdir(compileDir)) {
             throw new IOException(compileDir + "不存在");
@@ -39,29 +33,61 @@ public class BuilderUtil {
             FileUtil.eraseDir(compileDir);
         }
 
-        //
-        FileUtil.copyDirToDir(appLocalRepo + "/" + app.getDirname(), appCompileDir);
+        ProjOrchestration proj = app.getProj();
+        if (proj != null) {
+            appLocalRepo += dirname(proj.getProjRepo());
+            copy(appLocalRepo, appCompileDir, app);
+        } else {
+            copy(appLocalRepo, appCompileDir, app);
+        }
+
+        // Dotnet 应用需要额外的处理
+        if (app.getAppBuild().getAppCompile().getCompilerType().equals(CompilerType.dotnet.name())) {
+            // Dotnet 应用需要替换一些字符
+            BuilderUtil.replaceCharacter(appCompileDir);
+        }
+    }
+
+    private static void copy(String from, String to, AppOrchestration app) throws IOException {
+        FileUtil.copyDirToDir(from + "/" + app.getDirname(), to);
         Set<String> dep = app.getDependencyRepos();
         if (dep != null && !dep.isEmpty()) {
             for (String repo : dep) {
                 if (!repo.isEmpty()) {
-                    FileUtil.copyDirToDir(appLocalRepo + dirname(repo), appCompileDir);
+                    FileUtil.copyDirToDir(from + dirname(repo), to);
                 }
             }
         }
+    }
 
-        // Dotnet 应用需要额外的处理
-        if (app.getAppBuild().getAppCompile().getCompilerType().equals(CompilerType.dotnet.name())) {
-            // Dotnet 应用需要替换一些字符
-            BuilderUtil.replaceCharacter(appCompileDir);
+    /**
+     * 获取目录名字
+     *
+     * @param
+     * @return
+     * @date 2020-08-06 上午10:42
+     */
+    public static String dirname(String repoUrl) {
+        int lastIndex = repoUrl.lastIndexOf("/");
+        if (repoUrl.endsWith(".git")) {
+            return repoUrl.substring(lastIndex).split(".git")[0];
+        } else if (repoUrl.startsWith("svn://")) {
+            return repoUrl.substring(lastIndex);
+        } else if (repoUrl.startsWith("/")) {
+            // 文件系统地址,直接返回
+            return repoUrl;
         }
-    }
 
-    public static String dirname(String svnUrl) {
-        int index = svnUrl.lastIndexOf("/");
-        return svnUrl.substring(index);
+        return "";
     }
 
+    /**
+     * TODO 判断文件编码
+     *
+     * @param
+     * @return
+     * @date 2020-08-18 上午11:00
+     */
     public static void replaceCharacter(String appCompileDir) {
         FileUtil.traversal(appCompileDir, new ReplaceCharacter());
     }

+ 17 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/crud/CrudService.java

@@ -0,0 +1,17 @@
+package cn.reghao.autodop.dmaster.app.service.crud;
+
+import cn.reghao.autodop.dmaster.app.vo.PageList;
+
+/**
+ * CRUD 接口
+ *
+ * @author reghao
+ * @date 2020-06-25 01:34:27
+ */
+public interface CrudService<T> {
+    void add(T t);
+    T get(String uniqueKey);
+    PageList<T> getByPage(int page, int size);
+    void update(T t);
+    void delete(T t);
+}

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

@@ -3,15 +3,15 @@ package cn.reghao.autodop.dmaster.app.service.deploy;
 import cn.reghao.autodop.common.deploy.DeployConfig;
 import cn.reghao.autodop.common.notification.DingNotify;
 import cn.reghao.autodop.common.notification.Notify;
-import cn.reghao.autodop.dmaster.app.entity.build.pack.AppPack;
-import cn.reghao.autodop.dmaster.app.entity.constant.NotifierType;
+import cn.reghao.autodop.dmaster.app.entity.build.AppPack;
+import cn.reghao.autodop.dmaster.app.constant.NotifierType;
 import cn.reghao.autodop.dmaster.app.entity.deploy.AppDeploy;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
 import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 import cn.reghao.autodop.dmaster.app.entity.log.DeployResult;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
-import cn.reghao.autodop.dmaster.app.entity.orchestration.Notification;
-import cn.reghao.autodop.dmaster.app.thread.ThreadPoolWrapper;
+import cn.reghao.autodop.dmaster.app.entity.Notification;
+import cn.reghao.autodop.dmaster.common.thread.ThreadPoolWrapper;
 import lombok.Data;
 
 import java.util.*;
@@ -35,9 +35,9 @@ public class AppDeployer {
     public static DeployLog deploy(AppOrchestration app, BuildLog buildLog) {
         Notification notification = app.getNotification();
         String notifierType = notification.getNotifierType();
-        String dest = notification.getWebhook();
+        String dest = notification.getUrl();
         Notify notify = null;
-        if (notifierType.equals(NotifierType.ding.name())) {
+        if (notifierType.equals(NotifierType.webhook.name())) {
             notify = new DingNotify();
         }
 

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

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.service.log;
 
-import cn.reghao.autodop.dmaster.app.entity.log.BuildDeployLog;
+import cn.reghao.autodop.dmaster.app.vo.log.BuildDeployLog;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
 import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 import cn.reghao.autodop.dmaster.app.repository.log.LogRepository;

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/compiler/DotnetPreCompile.java

@@ -16,8 +16,8 @@ public class DotnetPreCompile implements PreCompile {
     @Override
     public void preCompile(AppOrchestration app, String appEntryDir) throws IOException {
         for (ConfigFile configFile : app.getConfigFiles()) {
-            String filepath = appEntryDir + "/" + configFile.getFilename();
-            String filecontent = configFile.getFilecontent();
+            String filepath = appEntryDir + "/" + configFile.getName();
+            String filecontent = configFile.getContent();
             FileUtil.newFile(filepath, filecontent);
             log.info("成功向 {}  文件写入内容", filepath);
         }

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/compiler/ShellCompiler.java

@@ -3,7 +3,7 @@ package cn.reghao.autodop.dmaster.app.service.tools.compiler;
 import cn.reghao.autodop.common.shell.ShellExecutor;
 import cn.reghao.autodop.common.shell.ShellResult;
 import cn.reghao.autodop.common.utils.JsonUtil;
-import cn.reghao.autodop.dmaster.app.entity.build.compile.AppCompile;
+import cn.reghao.autodop.dmaster.app.entity.build.AppCompile;
 
 import java.util.HashMap;
 import java.util.List;
@@ -20,7 +20,7 @@ public class ShellCompiler implements CodeCompiler {
     private ShellExecutor shell;
 
     public ShellCompiler(AppCompile appCompile) {
-        this.script = appCompile.getCompilerHome() + "/" + appCompile.getScript();
+        this.script = appCompile.getCompilerHome() + "/" + appCompile.getCompileCmd();
         this.shell = new ShellExecutor();
     }
 

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

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

+ 5 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/updater/CodeUpdater.java

@@ -11,14 +11,15 @@ public interface CodeUpdater {
      * 更新代码
      *
      * @param remote 远程代码仓库路径
-     * @param local 本地代码仓库路径
+     * @param branch 分支(仅用于 GIT)
+     * @param local 本地代码仓库目录
      * @return 当前代码仓库的版本
      * @date 2019-10-12 下午11:08
      */
-    CommitLog update(String remote, String local) throws Exception;
+    CommitLog update(String remote, String branch, String local) throws Exception;
 
     // TODO 拉取指定版本的代码
-    //CommitInfo update(String remote, String local, String commitId) throws Exception;
+    CommitLog update(String remote, String branch, String local, String commitId) throws Exception;
 
     /**
      * 本地代码仓库最近一次提交的信息
@@ -26,5 +27,5 @@ public interface CodeUpdater {
      * @param local 本地代码仓库路径
      * @date 2019-10-30 下午5:23
      */
-    CommitLog lastCommitInfo(String local) throws Exception;
+    CommitLog lastCommitInfo(String local, String branch) throws Exception;
 }

+ 80 - 29
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/updater/GitImpl.java

@@ -1,8 +1,12 @@
 package cn.reghao.autodop.dmaster.app.service.tools.updater;
 
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.Session;
 import org.eclipse.jgit.api.CloneCommand;
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.PullCommand;
+import org.eclipse.jgit.api.TransportConfigCallback;
 import org.eclipse.jgit.diff.DiffEntry;
 import org.eclipse.jgit.internal.storage.file.FileRepository;
 import org.eclipse.jgit.lib.ObjectId;
@@ -11,7 +15,9 @@ import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.*;
 import org.eclipse.jgit.treewalk.CanonicalTreeParser;
+import org.eclipse.jgit.util.FS;
 
 import java.io.File;
 import java.io.IOException;
@@ -25,12 +31,12 @@ import java.util.List;
  * @date 2019-10-12 22:22:00
  */
 public class GitImpl implements CodeUpdater {
-    private String branch;
+    private String privateKey;
 
     //private final UsernamePasswordCredentialsProvider credentials;
 
-    public GitImpl(String branch) {
-        this.branch = branch;
+    public GitImpl(String privateKey) {
+        this.privateKey = privateKey;
         //this.credentials = new UsernamePasswordCredentialsProvider(username, password);
     }
 
@@ -42,52 +48,77 @@ public class GitImpl implements CodeUpdater {
      * @date 2020-05-13 下午9:22
      */
     @Override
-    public CommitLog update(String remote, String local) throws Exception {
-        File localRepo = new File(local + "/.git");
+    public CommitLog update(String remote, String branch, String local) throws Exception {
+        String localRepoDir = local + dirname(remote);
+        File file = new File(localRepoDir);
+        if (!file.exists() && !file.mkdirs()) {
+            throw new Exception();
+        }
+
+        File localRepo = new File(localRepoDir + "/.git");
         CommitLog commitLog;
         if (!localRepo.exists()) {
-            commitLog = clone(remote, local);
+            commitLog = clone(remote, branch, localRepoDir);
             commitLog.setRemoteRepoUrl(remote);
         } else {
             try (Repository repo = new FileRepository(localRepo.getAbsolutePath())) {
                 PullCommand gitPull = new Git(repo).pull();
                 gitPull.call();
-                commitLog = commitInfo(repo);
+                commitLog = commitInfo(repo, branch);
                 commitLog.setRemoteRepoUrl(remote);
-                commitLog.setChangedFiles(changedFileList(repo));
+                commitLog.setChangedFiles(changedFileList(repo, branch));
             }
         }
         return commitLog;
     }
 
-    private CommitLog clone(String remote, String local) throws Exception {
+    private CommitLog clone(String remote, String branch, String local) throws Exception {
+        SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
+            @Override
+            protected void configure(OpenSshConfig.Host hc, Session session) {
+            }
+
+            @Override
+            protected JSch createDefaultJSch(FS fs) throws JSchException {
+                JSch defaultJSch = super.createDefaultJSch(fs);
+                defaultJSch.addIdentity(privateKey);
+                return defaultJSch;
+            }
+        };
+
         CloneCommand gitClone = Git.cloneRepository()
                 .setURI(remote)
                 .setBranch(branch)
-                .setDirectory(new File(local));
+                .setDirectory(new File(local))
+                .setTransportConfigCallback(new TransportConfigCallback() {
+                    @Override
+                    public void configure(Transport transport) {
+                        SshTransport sshTransport = (SshTransport) transport;
+                        sshTransport.setSshSessionFactory(sshSessionFactory);
+                    }
+                });
 
         try (Git git = gitClone.call()) {
             Repository repo = git.getRepository();
-            CommitLog commitLog = commitInfo(repo);
-            commitLog.setChangedFiles(changedFileList(repo));
+            CommitLog commitLog = commitInfo(repo, branch);
+            commitLog.setChangedFiles(changedFileList(repo, branch));
             return commitLog;
         }
     }
 
-    private CommitLog commitInfo(Repository repo) throws IOException {
-        Ref head = repo.findRef("refs/heads/master");
+    private CommitLog commitInfo(Repository repo, String branch) throws IOException {
+        Ref head = repo.findRef("refs/heads/" + branch);
         ObjectId objectId = head.getObjectId();
         try (RevWalk walk = new RevWalk(repo)) {
             // 最近一次提交的信息
             RevCommit lastCommit = walk.parseCommit(objectId);
-            int commitTime = lastCommit.getCommitTime();
+            long commitTime = lastCommit.getCommitTime();
             String commitAuthor = lastCommit.getAuthorIdent().getName();
             String commitMsg = lastCommit.getFullMessage();
 
             CommitLog commitLog = new CommitLog();
-            commitLog.setCommitId(objectId.name());
-            // TODO 转换为毫秒
-            commitLog.setCommitTime(commitTime);
+            commitLog.setCommitId(objectId.name().substring(0, 8));
+            commitLog.setCommitTime(commitTime*1000);
             commitLog.setCommitAuthor(commitAuthor);
             commitLog.setCommitMsg(commitMsg);
             commitLog.setBranch(repo.getBranch());
@@ -95,9 +126,9 @@ public class GitImpl implements CodeUpdater {
         }
     }
 
-    private List<ChangedFile> changedFileList(Repository repo) throws Exception {
+    private List<ChangedFile> changedFileList(Repository repo, String branch) throws Exception {
         // TODO 查找指定的 branch
-        Ref headMaster = repo.findRef("refs/heads/master");
+        Ref headMaster = repo.findRef("refs/heads/" + branch);
         ObjectId objectId = headMaster.getObjectId();
         try (RevWalk walk = new RevWalk(repo)) {
             // 最近一次提交
@@ -125,7 +156,6 @@ public class GitImpl implements CodeUpdater {
                     for (DiffEntry entry : diffs) {
                         ChangedFile changedFile = new ChangedFile();
                         changedFile.setChangeType(entry.getChangeType().name());
-                        //changedFile.setFilePath(entry.getNewPath());
                         changedFile.setOldFilePath(entry.getOldPath());
                         changedFile.setNewFilePath(entry.getNewPath());
                         changedFiles.add(changedFile);
@@ -138,18 +168,39 @@ public class GitImpl implements CodeUpdater {
     }
 
     @Override
-    public CommitLog lastCommitInfo(String local) throws Exception {
-        // TODO 待实现
-        /*File localRepo = new File(local + "/.git");
+    public CommitLog update(String remote, String branch, String local, String commitId) throws Exception {
+        return null;
+    }
+
+    @Override
+    public CommitLog lastCommitInfo(String local, String branch) throws Exception {
+        File localRepo = new File(local + "/.git");
         if (!localRepo.exists()) {
             return null;
         }
 
         try (Repository repo = new FileRepository(localRepo.getAbsolutePath())) {
-            Ref head = repo.findRef("refs/heads/master");
-            ObjectId objectId = head.getObjectId();
-            return objectId.name();
-        }*/
-        return null;
+            return commitInfo(repo, branch);
+        }
+    }
+
+    private String dirname(String gitUrl) {
+        int lastIndex = gitUrl.lastIndexOf("/");
+        return gitUrl.substring(lastIndex).split(".git")[0];
+    }
+
+    public static void main(String[] args) throws Exception {
+        String privateKey = "/home/reghao/id_rsa_codeup";
+        GitImpl git = new GitImpl(privateKey);
+        String iqbms = "git@codeup.aliyun.com:5f1f8daf6207a1a8b17f6742/FrontEnd/IQuizoo.BMS.git";
+        String iqService = "git@codeup.aliyun.com:5f1f8daf6207a1a8b17f6742/background/IQuizoo.Service.git";
+        String dnkt = "git@codeup.aliyun.com:5f1f8daf6207a1a8b17f6742/FrontEnd/IQuizoo.Game.git";
+        String user = "git@codeup.aliyun.com:5f1f8daf6207a1a8b17f6742/background/UserService.git";
+
+        String local = "/home/reghao/Downloads/codeup/dnkt";
+        String branch = "develop";
+        CommitLog commitLog = git.update(dnkt, branch, local);
+        //CommitLog commitLog = git.lastCommitInfo(local, branch);
+        System.out.println();
     }
 }

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

@@ -36,7 +36,7 @@ public class SvnImpl implements CodeUpdater {
     }
 
     @Override
-    public CommitLog update(String remote, String local) throws SVNException {
+    public CommitLog update(String remote, String branch, String local) throws SVNException {
         File localRepo = new File(local);
         if (!localRepo.exists()) {
             checkout(remote, localRepo);
@@ -45,7 +45,7 @@ public class SvnImpl implements CodeUpdater {
                     true, false);
         }
 
-        CommitLog commitLog = lastCommitInfo(local);
+        CommitLog commitLog = lastCommitInfo(local, branch);
         commitLog.setBranch("");
         return commitLog;
     }
@@ -76,7 +76,12 @@ public class SvnImpl implements CodeUpdater {
     }
 
     @Override
-    public CommitLog lastCommitInfo(String local) throws SVNException {
+    public CommitLog update(String remote, String branch, String local, String commitId) throws Exception {
+        return null;
+    }
+
+    @Override
+    public CommitLog lastCommitInfo(String local, String branch) throws SVNException {
         File localRepo = new File(local);
         if (!localRepo.exists()) {
             return null;

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

@@ -1,8 +1,8 @@
 package cn.reghao.autodop.dmaster.app.vo;
 
-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.build.AppCompile;
+import cn.reghao.autodop.dmaster.app.entity.build.AppPack;
+import cn.reghao.autodop.dmaster.app.entity.build.AppUpdate;
 import lombok.Data;
 
 import java.util.List;

+ 0 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/AppVO.java

@@ -1,9 +0,0 @@
-package cn.reghao.autodop.dmaster.app.vo;
-
-/**
- * @author reghao
- * @date 2020-06-09 17:18:14
- */
-public class AppVO {
-
-}

+ 9 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/BuildConfig.java

@@ -1,5 +1,9 @@
 package cn.reghao.autodop.dmaster.app.vo;
 
+import cn.reghao.autodop.dmaster.app.entity.Notification;
+import cn.reghao.autodop.dmaster.app.entity.build.AppCompile;
+import cn.reghao.autodop.dmaster.app.entity.build.AppPack;
+import cn.reghao.autodop.dmaster.app.entity.build.AppUpdate;
 import cn.reghao.autodop.dmaster.vue.SelectOption;
 import lombok.Data;
 
@@ -11,9 +15,9 @@ import java.util.List;
  */
 @Data
 public class BuildConfig {
-    private List<SelectOption> appUpdates;
-    private List<SelectOption> appCompiles;
-    private List<SelectOption> appPacks;
-    private List<SelectOption> notifications;
-    private List<SelectOption> projs;
+    private List<AppUpdate> appUpdates;
+    private List<AppCompile> appCompiles;
+    private List<AppPack> appPacks;
+    private List<Notification> notifications;
+    private List<String> projs;
 }

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

@@ -0,0 +1,34 @@
+package cn.reghao.autodop.dmaster.app.vo;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
+/**
+ * @author reghao
+ * @date 2020-06-25 18:32:57
+ */
+public class ClassUtil {
+    /**
+     * 将父类字段设置为 null
+     *
+     * @param
+     * @return
+     * @date 2020-06-25 下午6:34
+     */
+    public static void setParentFieldNull(Object object) {
+        Class appClass = object.getClass();
+        Class superClass = appClass.getSuperclass();
+        Field[] superFields = superClass.getDeclaredFields();
+        try {
+            for (Field field : superFields) {
+                // 不处理 static 字段
+                if (!Modifier.isStatic(field.getModifiers())) {
+                    field.setAccessible(true);
+                    field.set(object, null);
+                }
+            }
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 38 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/OrchestrationVO.java

@@ -0,0 +1,38 @@
+package cn.reghao.autodop.dmaster.app.vo;
+
+import cn.reghao.autodop.dmaster.app.entity.build.AppBuild;
+import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
+import cn.reghao.autodop.dmaster.app.entity.orchestration.ProjOrchestration;
+
+/**
+ * @author reghao
+ * @date 2020-02-29 17:22:19
+ */
+public class OrchestrationVO {
+    public static AppOrchestration appVO(AppOrchestration app) {
+        ClassUtil.setParentFieldNull(app);
+        ClassUtil.setParentFieldNull(app.getNotification());
+
+        ProjOrchestration proj = app.getProj();
+        if (proj == null) {
+            appBuildVO(app.getAppBuild());
+        } else {
+            ClassUtil.setParentFieldNull(proj);
+            appBuildVO(proj.getAppBuild());
+        }
+
+        return app;
+    }
+
+    public static ProjOrchestration projVO(ProjOrchestration proj) {
+        ClassUtil.setParentFieldNull(proj);
+        appBuildVO(proj.getAppBuild());
+        return proj;
+    }
+
+    private static void appBuildVO(AppBuild appBuild) {
+        ClassUtil.setParentFieldNull(appBuild.getAppUpdate());
+        ClassUtil.setParentFieldNull(appBuild.getAppCompile());
+        ClassUtil.setParentFieldNull(appBuild.getAppPack());
+    }
+}

+ 0 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/PageList.java

@@ -20,8 +20,6 @@ public class PageList<T> {
     public PageList<T> page(List<T> list) {
         PageList<T> pageList = new PageList<>();
         pageList.setList(list);
-
-
         return null;
     }
 }

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

@@ -1,53 +0,0 @@
-package cn.reghao.autodop.dmaster.app.vo;
-
-import cn.reghao.autodop.dmaster.app.entity.build.AppBuild;
-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;
-
-/**
- * @author reghao
- * @date 2020-02-29 17:22:19
- */
-public class ResultVO {
-    protected String appId;
-
-    public static ProjOrchestration projVO(ProjOrchestration proj) {
-        proj.setId(null);
-        proj.setCreateTime(null);
-        proj.setUpdateTime(null);
-        appBuildVO(proj.getAppBuild());
-        return proj;
-    }
-
-    public static AppOrchestration appVO(AppOrchestration app) {
-        app.setId(null);
-        app.setCreateTime(null);
-        app.setUpdateTime(null);
-
-        Notification notification = app.getNotification();
-        notification.setId(null);
-        notification.setCreateTime(null);
-        notification.setUpdateTime(null);
-
-        if (app.getProj() == null) {
-            appBuildVO(app.getAppBuild());
-        }
-
-        return app;
-    }
-
-    private static void appBuildVO(AppBuild appBuild) {
-        appBuild.getAppUpdate().setId(null);
-        appBuild.getAppUpdate().setCreateTime(null);
-        appBuild.getAppUpdate().setUpdateTime(null);
-
-        appBuild.getAppCompile().setId(null);
-        appBuild.getAppCompile().setCreateTime(null);
-        appBuild.getAppCompile().setUpdateTime(null);
-
-        appBuild.getAppPack().setId(null);
-        appBuild.getAppPack().setCreateTime(null);
-        appBuild.getAppPack().setUpdateTime(null);
-    }
-}

+ 3 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildDeployLog.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/log/BuildDeployLog.java

@@ -1,5 +1,7 @@
-package cn.reghao.autodop.dmaster.app.entity.log;
+package cn.reghao.autodop.dmaster.app.vo.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.vo.log.BuildLogVO;
 import cn.reghao.autodop.dmaster.app.vo.log.DeployLogVO;
 import lombok.Data;

+ 9 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/log/BuildLogVO.java

@@ -2,6 +2,7 @@ package cn.reghao.autodop.dmaster.app.vo.log;
 
 import cn.reghao.autodop.common.utils.DateTimeUtil;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
+import cn.reghao.autodop.dmaster.app.service.tools.updater.CommitLog;
 import lombok.Data;
 
 /**
@@ -24,9 +25,14 @@ public class BuildLogVO {
         BuildLogVO buildLogVO = new BuildLogVO();
         buildLogVO.setAppId(buildLog.getApp().getAppId());
         buildLogVO.setEnv(buildLog.getApp().getEnv());
-        buildLogVO.setRemoteRepoUrl(buildLog.getCommitLog().getRemoteRepoUrl());
-        buildLogVO.setBranch(buildLog.getCommitLog().getBranch());
-        buildLogVO.setCommitId(buildLog.getCommitLog().getCommitId());
+
+        CommitLog commitLog = buildLog.getCommitLog();
+        if (commitLog != null) {
+            buildLogVO.setRemoteRepoUrl(commitLog.getRemoteRepoUrl());
+            buildLogVO.setBranch(commitLog.getBranch());
+            buildLogVO.setCommitId(commitLog.getCommitId());
+        }
+
         buildLogVO.setAppPath(buildLog.getAppPath());
         buildLogVO.setBuildTime(DateTimeUtil.format(buildLog.getBuildTime()));
         buildLogVO.setCode(buildLog.getCode());

+ 3 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/UserController.java

@@ -1,6 +1,9 @@
 package cn.reghao.autodop.dmaster.auth.controller;
 
+import cn.reghao.autodop.dmaster.app.service.crud.CrudService;
 import cn.reghao.autodop.dmaster.app.vo.PageList;
+import cn.reghao.autodop.dmaster.auth.entity.Permission;
+import cn.reghao.autodop.dmaster.auth.entity.Role;
 import cn.reghao.autodop.dmaster.auth.service.UserService;
 import cn.reghao.autodop.dmaster.common.webresult.WebResult;
 import io.swagger.annotations.Api;

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/jwt/UsernamePasswordAuthFilter.java

@@ -91,6 +91,7 @@ public class UsernamePasswordAuthFilter extends AbstractAuthenticationProcessing
         pt.println(JsonUtil.objectToJson(result));
     }
 
+    // TODO 从 devops.reghao.cn 调用 api.reghao.cn 的接口登录,密码错误时返回跨域问题
     @Override
     protected void unsuccessfulAuthentication(HttpServletRequest request,
                                               HttpServletResponse response,

+ 0 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/service/UserService.java

@@ -14,12 +14,10 @@ import cn.reghao.autodop.dmaster.auth.repository.UserAuthRepository;
 import cn.reghao.autodop.dmaster.auth.vo.UserAuthVO;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
-import org.springframework.security.core.GrantedAuthority;
 import org.springframework.stereotype.Service;
 
 import java.security.NoSuchAlgorithmException;
 import java.time.LocalDateTime;
-import java.util.List;
 import java.util.stream.Collectors;
 
 /**

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

@@ -0,0 +1,13 @@
+package cn.reghao.autodop.dmaster.common.exception;
+
+/**
+ * @author reghao
+ * @date 2020-08-10 13:52:13
+ */
+public class ExceptionUtil {
+    public static String errorMsg(Exception e) {
+        return e.getMessage() +
+                System.lineSeparator() +
+                e.getCause().getMessage();
+    }
+}

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/interceptor/MethodTimeInterceptor.java

@@ -17,11 +17,11 @@ import org.springframework.util.StopWatch;
  * @date 2020-03-06 16:04:27
  */
 @Slf4j
-@Component
-@Aspect
+//@Component
+//@Aspect
 public class MethodTimeInterceptor {
     // 拦截 cn.reghao.autodop.dmaster.app.service.build 包中的所有方法
-    private final static String POINT = "execution (* cn.reghao.autodop.dmaster.app.service.build..*.*(..))";
+    private final static String POINT = "execution (* cn.reghao.autodop.dmaster.app.controller..*.*(..))";
 
     @Pointcut(POINT)
     public void timeConsumed(){

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/thread/ThreadPoolWrapper.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/common/thread/ThreadPoolWrapper.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.app.thread;
+package cn.reghao.autodop.dmaster.common.thread;
 
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
 

+ 68 - 18
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/utils/AfterAppStart.java

@@ -1,8 +1,12 @@
 package cn.reghao.autodop.dmaster.common.utils;
 
+import cn.reghao.autodop.common.shell.ShellExecutor;
+import cn.reghao.autodop.common.shell.ShellResult;
 import cn.reghao.autodop.common.utils.FileUtil;
-import cn.reghao.autodop.dmaster.app.entity.orchestration.LocalFsConfig;
-import cn.reghao.autodop.dmaster.app.repository.orchestration.LocalFsConfigRepository;
+import cn.reghao.autodop.dmaster.app.entity.LocalFsDir;
+import cn.reghao.autodop.dmaster.app.entity.build.AppCompile;
+import cn.reghao.autodop.dmaster.app.repository.build.AppCompileRepository;
+import cn.reghao.autodop.dmaster.app.repository.orchestration.LocalFsDirRepository;
 import cn.reghao.autodop.dmaster.common.config.SysConfig;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.ApplicationArguments;
@@ -10,9 +14,15 @@ import org.springframework.boot.ApplicationRunner;
 import org.springframework.stereotype.Component;
 
 import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
- * 应用启动完成后执行,此时所有的 bean 都已初始化
+ * 应用启动完成后进行系统预检查:
+ * 1.检查系统相关的本地目录
+ * 2.检查系统相关的编译器
  *
  * @author reghao
  * @date 2019-09-26 17:22:16
@@ -20,31 +30,38 @@ import java.io.File;
 @Slf4j
 @Component
 public class AfterAppStart implements ApplicationRunner {
-    private LocalFsConfigRepository configRepository;
+    private LocalFsDirRepository localDirRepository;
+    private AppCompileRepository compileRepository;
 
-    public AfterAppStart(LocalFsConfigRepository configRepository) {
-        this.configRepository = configRepository;
+    public AfterAppStart(LocalFsDirRepository localDirRepository, AppCompileRepository compileRepository) {
+        this.localDirRepository = localDirRepository;
+        this.compileRepository = compileRepository;
     }
 
     @Override
-    public void run(ApplicationArguments args) throws Exception {
-        // TODO 应用启动完成后初始化本地目录
-        String env = SpringBootUtil.getEnv();
-        LocalFsConfig config = configRepository.findByEnv(env);
-        if (config != null) {
-            initialize(config);
-            log.info("autodop-dmaster 系统初始化完成...");
+    public void run(ApplicationArguments args) {
+        List<LocalFsDir> list = localDirRepository.findAll();
+        LocalFsDir localDir;
+        if (list.size() != 0) {
+            localDir = list.get(0);
         } else {
-            throw new Exception("应用启动失败...");
+            String home = System.getenv("HOME");
+            localDir = new LocalFsDir();
+            localDir.setLocalRepo(home + "/opt/data/autodop/local-repo");
+            localDir.setCompileDir(home + "/opt/data/autodop/compile-dir");
+            localDir.setPackDir(home + "/opt/data/autodop/pack-dir");
+            localDirRepository.save(localDir);
         }
+        initialize(localDir);
     }
 
-    public void initialize(LocalFsConfig config) {
+    public void initialize(LocalFsDir localDir) {
         // TODO 放入缓存
-        SysConfig.localRepo = config.getLocalRepo();
-        SysConfig.compileDir = config.getCompileDir();
-        SysConfig.packDir = config.getPackDir();
+        SysConfig.localRepo = localDir.getLocalRepo();
+        SysConfig.compileDir = localDir.getCompileDir();
+        SysConfig.packDir = localDir.getPackDir();
         checkAndSetLocalDir();
+        //checkCompilerVersion();
     }
 
     /**
@@ -71,4 +88,37 @@ public class AfterAppStart implements ApplicationRunner {
             throw new IllegalArgumentException(packDir.getAbsolutePath() + " 不存在且创建失败...");
         }
     }
+
+    /**
+     * 检查编译器版本
+     *
+     * @param
+     * @return
+     * @date 2020-06-25 下午10:49
+     */
+    private void checkCompilerVersion() {
+        ShellExecutor shell = new ShellExecutor();
+        List<String> list = compileRepository.findAll().stream()
+                .filter(appCompile -> !"none".equalsIgnoreCase(appCompile.getCompilerType()))
+                .map(appCompile -> version(appCompile, shell))
+                .collect(Collectors.toList());
+
+        System.out.println();
+    }
+
+    private String version(AppCompile appCompile, ShellExecutor shell) {
+        String compilerHome = appCompile.getCompilerHome();
+        String versionCmd = appCompile.getVersionCmd();
+        ShellResult result = shell.execute(compilerHome + "/" + versionCmd, "");
+        if (result.hasError()) {
+            Map<String, List<String>> map = new HashMap<>();
+            map.put("stdout", result.getStdout());
+            map.put("stderr", result.getStderr());
+            return null;
+        } else {
+            StringBuilder sb = new StringBuilder();
+            result.getStdout().forEach(res -> sb.append(res).append(System.lineSeparator()));
+            return sb.toString();
+        }
+    }
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/utils/hibernate/HibernateSessionOps.java

@@ -7,7 +7,7 @@ import javax.persistence.EntityManager;
 import javax.persistence.Query;
 
 /**
- * 使用 Hibernate 的 Session 接口进行 CURD 操作
+ * 使用 Hibernate 的 Session 接口进行 CRUD 操作
  *
  * @author reghao
  * @date 2020-05-21 14:57:57

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/vue/SelectOption.java

@@ -14,13 +14,13 @@ import java.util.List;
 @NoArgsConstructor
 @Data
 public class SelectOption {
-    private String value;
     private String label;
+    private String value;
     List<SelectOption> children;
 
-    public SelectOption(String value, String label) {
-        this.value = value;
+    public SelectOption(String label, String value) {
         this.label = label;
+        this.value = value;
     }
 
     public void setValue(String value) {

+ 9 - 3
dmaster/src/main/resources/application-dev.yml

@@ -1,5 +1,11 @@
 spring:
   datasource:
-    url: jdbc:mysql://192.168.0.220:3306/autodop_tdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
-    username: azy_test
-    password: Test@123456
+    url: jdbc:mysql://localhost:3306/reghao_autodop_rdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
+    username: reghao
+    password: 12345678
+  rabbitmq:
+    host: localhost
+    port: 5672
+    virtual-host: /
+    username: reghao
+    password: 12345678

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

@@ -0,0 +1,11 @@
+spring:
+  datasource:
+    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
+  rabbitmq:
+    host: localhost
+    port: 5672
+    virtual-host: /
+    username: reghao
+    password: 12345678

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

@@ -2,4 +2,10 @@ spring:
   datasource:
     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
+    password: Test@123456
+  rabbitmq:
+    host: localhost
+    port: 5672
+    virtual-host: /
+    username: reghao
+    password: 12345678

+ 11 - 12
dmaster/src/test/java/cn/reghao/autodop/dmaster/app/entity/orchestration/AppOrchestrationTest.java

@@ -1,21 +1,20 @@
 package cn.reghao.autodop.dmaster.app.entity.orchestration;
 
 import cn.reghao.autodop.common.utils.JsonUtil;
+import cn.reghao.autodop.dmaster.app.entity.Notification;
 import cn.reghao.autodop.dmaster.app.entity.build.AppBuild;
-import cn.reghao.autodop.dmaster.app.entity.build.compile.AppCompile;
-import cn.reghao.autodop.dmaster.app.entity.build.pack.AppPack;
-import cn.reghao.autodop.dmaster.app.entity.build.update.AppUpdate;
-import cn.reghao.autodop.dmaster.app.entity.constant.CompilerType;
-import cn.reghao.autodop.dmaster.app.entity.constant.NotifierType;
+import cn.reghao.autodop.dmaster.app.entity.build.AppCompile;
+import cn.reghao.autodop.dmaster.app.entity.build.AppPack;
+import cn.reghao.autodop.dmaster.app.entity.build.AppUpdate;
+import cn.reghao.autodop.dmaster.app.constant.CompilerType;
+import cn.reghao.autodop.dmaster.app.constant.NotifierType;
 import cn.reghao.autodop.common.deploy.PackerType;
-import cn.reghao.autodop.dmaster.app.entity.constant.RepoType;
+import cn.reghao.autodop.dmaster.app.constant.RepoType;
 import cn.reghao.autodop.dmaster.app.entity.deploy.AppDeploy;
 import cn.reghao.autodop.dmaster.app.entity.deploy.AppLog;
 import org.junit.jupiter.api.Test;
 
-import java.util.ArrayList;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
 class AppOrchestrationTest {
@@ -30,7 +29,7 @@ class AppOrchestrationTest {
         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");
+        appCompile.setCompileCmd("dotnet publish");
 
         AppPack appPack = new AppPack();
         appPack.setPackerName("docker");
@@ -62,7 +61,7 @@ class AppOrchestrationTest {
         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");
+        appCompile.setCompileCmd("dotnet publish");
 
         AppPack appPack = new AppPack();
         appPack.setPackerName("docker");
@@ -89,8 +88,8 @@ class AppOrchestrationTest {
 
         Notification notification = new Notification();
         notification.setNotifierName("ding 通知");
-        notification.setNotifierType(NotifierType.ding.name());
-        notification.setWebhook("https://oapi.dingtalk.com/robot/send?access_token=ba9cf0d846cff8c471168e0d2f91ec0c44645a086cf5e4e421697c9b0c606bd2");
+        notification.setNotifierType(NotifierType.webhook.name());
+        notification.setUrl("https://oapi.dingtalk.com/robot/send?access_token=ba9cf0d846cff8c471168e0d2f91ec0c44645a086cf5e4e421697c9b0c606bd2");
 
         AppOrchestration app = new AppOrchestration();
         app.setAppId("content");

+ 6 - 6
dmaster/src/test/java/cn/reghao/autodop/dmaster/app/entity/orchestration/ProjOrchestrationTest.java

@@ -2,12 +2,12 @@ package cn.reghao.autodop.dmaster.app.entity.orchestration;
 
 import cn.reghao.autodop.common.utils.JsonUtil;
 import cn.reghao.autodop.dmaster.app.entity.build.AppBuild;
-import cn.reghao.autodop.dmaster.app.entity.build.compile.AppCompile;
-import cn.reghao.autodop.dmaster.app.entity.build.pack.AppPack;
-import cn.reghao.autodop.dmaster.app.entity.build.update.AppUpdate;
-import cn.reghao.autodop.dmaster.app.entity.constant.CompilerType;
+import cn.reghao.autodop.dmaster.app.entity.build.AppCompile;
+import cn.reghao.autodop.dmaster.app.entity.build.AppPack;
+import cn.reghao.autodop.dmaster.app.entity.build.AppUpdate;
+import cn.reghao.autodop.dmaster.app.constant.CompilerType;
 import cn.reghao.autodop.common.deploy.PackerType;
-import cn.reghao.autodop.dmaster.app.entity.constant.RepoType;
+import cn.reghao.autodop.dmaster.app.constant.RepoType;
 import org.junit.jupiter.api.Test;
 
 class ProjOrchestrationTest {
@@ -24,7 +24,7 @@ class ProjOrchestrationTest {
         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");
+        appCompile.setCompileCmd("dotnet publish");
 
         AppPack appPack = new AppPack();
         appPack.setPackerName("docker");

+ 3 - 3
dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/tools/updater/GitImplTest.java

@@ -7,10 +7,10 @@ class GitImplTest {
     @Test
     void main() throws Exception {
         String branch = "master";
-        GitImpl git = new GitImpl(branch);
+        GitImpl git = new GitImpl("");
         String remote = "http://git.reghao.cn/reghao/spiderlab.git";
         String local = "/home/reghao/tmp/autodop/opt/data/git/spiderlab";
-        CommitLog commitLog = git.update(remote, local);
+        CommitLog commitLog = git.update(remote, branch, local);
         //System.out.println(git.localVersion(local));
     }
-}
+}

+ 1 - 1
dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/tools/updater/SvnImplTest.java

@@ -10,7 +10,7 @@ class SvnImplTest {
         String remote = "svn://192.168.0.214/azy/CodeRepositories/IQuizoo.Web.BMS/branches/20200205/IQuizoo_FrontEnd";
         String local = "/home/reghao/tmp/autodop/opt/data/svn/IQuizoo_FrontEnd";
         SvnImpl svn = new SvnImpl("gjs", "gjs1234");
-        CommitLog commitLog = svn.lastCommitInfo("/home/reghao/tmp/autodop/opt/data/local-repo/dev-branch-20200509");
+        CommitLog commitLog = svn.lastCommitInfo("/home/reghao/tmp/autodop/opt/data/local-repo/dev-branch-20200509", "");
         //System.out.println(svn.localVersion(local));
     }
 }

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff