Parcourir la source

走通应用构建流程

reghao il y a 5 ans
Parent
commit
c85e381a8c
35 fichiers modifiés avec 453 ajouts et 305 suppressions
  1. 9 0
      common/src/main/java/cn/reghao/autodop/common/shell/ShellExecutor.java
  2. 10 10
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildController.java
  3. 12 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/constant/AppStage.java
  4. 11 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildLog.java
  5. 25 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildResult.java
  6. 0 17
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/DeployLog.java
  7. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/AppOrchestration.java
  8. 11 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/CommitInfoRepository.java
  9. 34 96
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppBuildPipeline.java
  10. 121 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppIntegrate.java
  11. 31 39
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/BuildDispatcher.java
  12. 16 12
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/BuilderUtil.java
  13. 34 29
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/ProjectUpdateTask.java
  14. 2 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/compiler/MavenCompiler.java
  15. 3 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/compiler/ShellCompiler.java
  16. 4 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/packer/CodePacker.java
  17. 4 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/packer/DnktMgrZipPack.java
  18. 2 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/packer/DockerPack.java
  19. 2 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/packer/DotnetPack.java
  20. 4 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/packer/ZipPack.java
  21. 3 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/packer/ZipRemotePack.java
  22. 13 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/updater/ChangedFile.java
  23. 2 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/updater/CodeUpdater.java
  24. 10 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/updater/CommitInfo.java
  25. 8 14
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/updater/GitImpl.java
  26. 32 37
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/updater/SvnImpl.java
  27. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/SysConfig.java
  28. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/SysConfigProperties.java
  29. 2 8
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/interceptor/MethodTimeInterceptor.java
  30. 5 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/utils/SysInitializer.java
  31. 1 1
      dmaster/src/main/resources/application-dev.yml
  32. 1 1
      dmaster/src/main/resources/application-prod.yml
  33. 1 1
      dmaster/src/main/resources/application-test.yml
  34. 18 0
      dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/tools/updater/GitImplTest.java
  35. 18 0
      dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/tools/updater/SvnImplTest.java

+ 9 - 0
common/src/main/java/cn/reghao/autodop/common/shell/ShellExecutor.java

@@ -7,6 +7,7 @@ import java.io.IOException;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * TODO: 改造 shell 执行器,提升执行效率
@@ -69,6 +70,14 @@ public class ShellExecutor {
         return result;
     }
 
+    // TODO 修改环境变量以执行一些特定的命令
+    private void modifyPathEnv(Map<String, String> env, String compilerHome1) {
+        String compilerHome = "/home/reghao/opt/env/dotnet/dotnet-sdk-2.2.101";
+        String path = env.get("PATH");
+        path += path + ":" + compilerHome;
+        env.put("PATH", path);
+    }
+
     static class ShellOutput extends Thread {
         private BufferedReader in;
         private List<String> output = new ArrayList<>();

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

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
-import cn.reghao.autodop.common.config.BuildDeployResult;
+import cn.reghao.autodop.dmaster.app.entity.log.BuildResult;
 import cn.reghao.autodop.dmaster.app.service.AppManager;
 import cn.reghao.autodop.dmaster.app.service.OssService;
 import cn.reghao.autodop.dmaster.common.result.WebResult;
@@ -45,12 +45,12 @@ public class BuildController {
     @PostMapping("/build/{appId}")
     public String build(@PathVariable("appId") String appId) throws Exception {
         Set<String> apps = checkArgs(appId);
-        List<BuildDeployResult> results;
+        List<BuildResult> buildbuildResults;
         if (apps.size() == 0) {
             return new WebResult<String>().jsonResult("ok");
         } else {
-            results = buildDispatcher.dispatch(apps, false);
-            return new WebResult<List>().jsonResult(results);
+            buildbuildResults = buildDispatcher.dispatch(apps, false);
+            return new WebResult<List>().jsonResult(buildbuildResults);
         }
     }
 
@@ -62,12 +62,12 @@ public class BuildController {
     @PostMapping("/deploy/{appId}")
     public String deploy(@PathVariable("appId") String appId) throws Exception {
         Set<String> apps = checkArgs(appId);
-        List<BuildDeployResult> results;
+        List<BuildResult> buildResults;
         if (apps.size() == 0) {
             return new WebResult<String>().jsonResult("ok");
         } else {
-            results = buildDispatcher.dispatch(apps, true);
-            return new WebResult<List>().jsonResult(results);
+            buildResults = buildDispatcher.dispatch(apps, true);
+            return new WebResult<List>().jsonResult(buildResults);
         }
     }
 
@@ -79,12 +79,12 @@ public class BuildController {
     @PostMapping("/pipeline/{appId}")
     public String buildAndDeploy(@PathVariable("appId") String appId) throws Exception {
         Set<String> apps = checkArgs(appId);
-        List<BuildDeployResult> results;
+        List<BuildResult> buildResults;
         if (apps.size() == 0) {
             return new WebResult<String>().jsonResult("ok");
         } else {
-            results = buildDispatcher.dispatch(apps, true);
-            return new WebResult<List>().jsonResult(results);
+            buildResults = buildDispatcher.dispatch(apps, true);
+            return new WebResult<List>().jsonResult(buildResults);
         }
     }
 

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

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

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

@@ -1,17 +1,24 @@
 package cn.reghao.autodop.dmaster.app.entity.log;
 
-import lombok.AllArgsConstructor;
+import cn.reghao.autodop.dmaster.app.service.tools.updater.CommitInfo;
+import lombok.Data;
 
 /**
- * 构建日志
+ * 应用构建部署日志
  *
  * @author reghao
  * @date 2020-03-12 14:56:05
  */
-@AllArgsConstructor
+@Data
 public class BuildLog {
     private String appId;
     private String description;
-    private String version;
     private String env;
+
+    private String stage;
+    private int code;
+    private String msg;
+
+    private CommitInfo commitInfo;
+    private String appPath;
 }

+ 25 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildResult.java

@@ -0,0 +1,25 @@
+package cn.reghao.autodop.dmaster.app.entity.log;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 构建结果
+ *
+ * @author reghao
+ * @date 2020-03-10 11:22:05
+ */
+@NoArgsConstructor
+@Data
+public class BuildResult {
+    private String appId;
+    private String description;
+    private String env;
+
+    private String stage;
+    private int code;
+    private String msg;
+
+    private String commitId;
+    private String appPath;
+}

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

@@ -1,17 +0,0 @@
-package cn.reghao.autodop.dmaster.app.entity.log;
-
-import lombok.AllArgsConstructor;
-
-/**
- * 部署日志
- *
- * @author reghao
- * @date 2020-03-12 14:56:05
- */
-@AllArgsConstructor
-public class DeployLog {
-    private String appId;
-    private String description;
-    private String version;
-    private String env;
-}

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

@@ -23,6 +23,7 @@ public class AppOrchestration extends BaseEntity {
     private String dirname;
     private String description;
     private String env;
+    private boolean alwaysBuild;
     // 编译 app 时所处的目录,以仓库目录为起点
     private String entryDir;
     // 配置文件

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

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

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

@@ -1,8 +1,8 @@
 package cn.reghao.autodop.dmaster.app.service.build;
 
-import cn.reghao.autodop.common.config.BuildDeployResult;
-import cn.reghao.autodop.common.utils.JsonUtil;
-import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
+import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
+import cn.reghao.autodop.dmaster.app.entity.log.BuildResult;
+import cn.reghao.autodop.dmaster.app.service.tools.updater.CommitInfo;
 import lombok.extern.slf4j.Slf4j;
 
 import java.util.concurrent.Callable;
@@ -15,26 +15,16 @@ import java.util.concurrent.Callable;
  * @date 2019-11-16 21:39:53
  */
 @Slf4j
-public class AppBuildPipeline implements Callable<String> {
-    private AppOrchestration app;
-    private String version;
-    private boolean isDeploy;
+public class AppBuildPipeline implements Callable<BuildResult> {
     private AppIntegrate appIntegrate;
+    private boolean isDeploy;
 
-    private String appLocalRepo;
-    private String appCompileDir;
-
-    public AppBuildPipeline(AppOrchestration app, String version, boolean isDeploy) {
-        this.app = app;
-        this.version = version;
+    public AppBuildPipeline(AppIntegrate appIntegrate, boolean isDeploy) {
+        this.appIntegrate = appIntegrate;
         this.isDeploy = isDeploy;
-        this.appIntegrate = new AppIntegrate(app);
         // TODO 暂时不使用动态代理
         /*this.appIntegrate = ProxyUtils.createProxyObject(AppIntegrate.class);
         this.appIntegrate.setApp(app);*/
-
-        /*this.appLocalRepo = SysConfig.localRepos + "/" + app.getAppId();
-        this.appCompileDir = SysConfig.compileDir + "/" + app.getAppId();*/
     }
 
     /**
@@ -45,96 +35,44 @@ public class AppBuildPipeline implements Callable<String> {
      * @date 2019-11-07 下午10:14
      */
     @Override
-    public String call() {
-        BuildDeployResult result = new BuildDeployResult();
-        result.setAppId(app.getAppId());
-
-        if (version == null ) {
-            appIntegrate.update();
-        }
-
-        appIntegrate.compile();
-        appIntegrate.pack();
-        if (isDeploy) {
-            appIntegrate.deploy();
+    public BuildResult call() {
+        if (!appIntegrate.update()) {
+            return buildResult(appIntegrate.buildLog());
         }
 
-        /* 更新阶段 *//*
-        if (version == null ) {
-            try {
-                version = updateApp();
-                BuilderUtil.copyToCompileDir(appLocalRepo, app);
-            } catch (Exception e) {
-                e.printStackTrace();
-                result.setStage("更新");
-                result.setMsg(e.getMessage());
-                return JsonUtil.objectToJson(result);
-            }
+        if (!appIntegrate.compile()) {
+            return buildResult(appIntegrate.buildLog());
         }
-        result.setVersion(version);
-        log.info("{} -> 代码更新完成", app.getAppId());
 
-        String appEntryDir;
-        if (app.getProjBuild() != null) {
-            appEntryDir = appCompileDir +  app.getEntryDir();
-        } else {
-            appEntryDir = appCompileDir + app.getEntryDir();
+        if (!appIntegrate.pack()) {
+            return buildResult(appIntegrate.buildLog());
         }
 
-        try {
-            *//* 编译阶段 *//*
-            if (appIntegrate.needPreCompile()) {
-                //appIntegrate.preCompile(appEntryDir);
-            }
-            // TODO 在通过脚本调用编译器时会卡住
-            //appIntegrate.compile(app.getDirname(), appEntryDir);
-        } catch (Exception e) {
-            e.printStackTrace();
-            result.setStage("编译");
-            result.setMsg(e.getMessage());
-            return JsonUtil.objectToJson(result);
+        if (isDeploy && !appIntegrate.deploy()) {
+            return buildResult(appIntegrate.buildLog());
         }
-        log.info("{} -> 编译完成", app.getIdentifier());
 
-        *//* 打包阶段 *//*
-        try {
-            //appIntegrate.pack(app.getIdentifier(), String.valueOf(version), appEntryDir);
-        } catch (Exception e) {
-            e.printStackTrace();
-            result.setStage("打包");
-            result.setMsg(e.getMessage());
-            return JsonUtil.objectToJson(result);
-        }
-        log.info("{} -> 打包完成", app.getIdentifier());
-
-        *//* 部署阶段 *//*
-        if (isDeploy) {
-            List<BuildDeployResult> results = null;
-            try {
-                results = AppDeploy.deploy(app, version);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
+        return buildResult(appIntegrate.buildLog());
+    }
 
-            log.info("{} -> 部署完成", app.getIdentifier());
-            return JsonUtil.objectToJson(results);
-        }*/
+    private BuildResult buildResult(BuildLog buildLog) {
+        // TODO 使用一个单独的线程来持久化构建过程产生的日志
 
-        return JsonUtil.objectToJson(result);
-    }
+        BuildResult buildResult = new BuildResult();
+        buildResult.setAppId(buildLog.getAppId());
+        buildResult.setDescription(buildLog.getDescription());
+        buildResult.setEnv(buildLog.getEnv());
 
-    /*private String updateApp() throws Exception {
-        String remoteRepo = app.getBuild().getCodeRepos().getReposUrl();
-        CodeUpdater vc = BuilderUtil.versionControl(app.getBuild().getCodeRepos().getReposAuth());
-        String version = vc.update(remoteRepo, appLocalRepo + BuilderUtil.dirname(remoteRepo));
+        buildResult.setStage(buildLog.getStage());
+        buildResult.setCode(buildLog.getCode());
+        buildResult.setMsg(buildLog.getMsg());
 
-        String dep = app.getBuild().getCodeRepos().getDependencyUrls();
-        if (dep != null) {
-            String[] dependencyRepos = dep.split(",");
-            for (String repo : dependencyRepos) {
-                vc.update(repo, appLocalRepo + BuilderUtil.dirname(repo));
-            }
+        CommitInfo commitInfo = buildLog.getCommitInfo();
+        if (commitInfo != null) {
+            buildResult.setCommitId(commitInfo.getCommitId());
         }
-        return version;
-    }*/
+        buildResult.setAppPath(buildLog.getAppPath());
+
+        return buildResult;
+    }
 }

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

@@ -3,13 +3,21 @@ 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.AppStage;
 import cn.reghao.autodop.dmaster.app.entity.constant.CompilerType;
 import cn.reghao.autodop.dmaster.app.entity.constant.PackerType;
+import cn.reghao.autodop.dmaster.app.entity.constant.RepoType;
 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.orchestration.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.service.tools.compiler.*;
 import cn.reghao.autodop.dmaster.app.service.tools.packer.*;
 import cn.reghao.autodop.dmaster.app.service.tools.updater.CodeUpdater;
+import cn.reghao.autodop.dmaster.app.service.tools.updater.CommitInfo;
+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 lombok.extern.slf4j.Slf4j;
 
 /**
@@ -20,33 +28,65 @@ import lombok.extern.slf4j.Slf4j;
  */
 @Slf4j
 public class AppIntegrate {
-    private String packDir;
+    private String appLocalRepo;
+    private String appCompileDir;
+    private String appPackDir;
+
     private AppOrchestration app;
+    private CommitInfo commitInfo;
+    private BuildLog buildLog;
+
     private CodeUpdater codeUpdater;
     private PreCompile preCompile;
     private CodeCompiler codeCompiler;
     private CodePacker codePacker;
 
-    public AppIntegrate() {
+    /*public AppIntegrate() {
     }
 
     public void setApp(AppOrchestration app) {
         this.app = app;
         init();
-    }
+    }*/
 
     public AppIntegrate(AppOrchestration app) {
         this.app = app;
         init();
     }
 
+    public AppIntegrate(AppOrchestration app, CommitInfo commitInfo) {
+        this.app = app;
+        this.commitInfo = commitInfo;
+        init();
+    }
+
     private void init() {
+        buildLog = new BuildLog();
+        buildLog.setAppId(app.getAppId());
+        buildLog.setDescription(app.getDescription());
+        buildLog.setEnv(app.getEnv());
+        if (commitInfo != null) {
+            buildLog.setCommitInfo(commitInfo);
+        }
+
+        appLocalRepo = SysConfig.localRepo + "/" + app.getAppId();
+        appCompileDir = SysConfig.compileDir + "/" + app.getAppId();
+        appPackDir = SysConfig.packDir + "/" + app.getAppId();
+
         AppBuild 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("");
+        }
+
         // 初始化编译配置
         AppCompile appCompile = appBuild.getAppCompile();
         if (appCompile.getCompilerType().equals(CompilerType.dotnet.name())) {
             preCompile = new DotnetPreCompile();
-            codeCompiler = new ShellCompiler(appCompile.getScript());
+            codeCompiler = new ShellCompiler(appCompile);
         } else if (appCompile.getCompilerType().equals(CompilerType.maven.name())) {
             codeCompiler = new MavenCompiler("");
         } else if (appCompile.getCompilerType().equals(CompilerType.none.name())) {
@@ -61,7 +101,7 @@ public class AppIntegrate {
         } else if (appPack.getPackerType().equals(PackerType.maven.name())) {
             codePacker = null;
         } else if (appPack.getPackerType().equals(PackerType.zip.name())) {
-            codePacker = new ZipPack(packDir);
+            codePacker = new ZipPack(appPackDir);
         } else if (appPack.getPackerType().equals(PackerType.dotnetBinary.name())) {
             codePacker = null;
         }
@@ -89,16 +129,88 @@ public class AppIntegrate {
         preCompile.preCompile(app, appEntryDir);
     }
 
-    public void update() {
+    /**
+     * 构建日志
+     *
+     * @param
+     * @return
+     * @date 2020-05-15 上午11:31
+     */
+    public BuildLog buildLog() {
+        return this.buildLog;
+    }
+
+    public boolean update() {
+        if (commitInfo != null) {
+            return true;
+        }
 
+        try {
+            // TODO 检查本地仓库更新前和更新后的版本是否一致
+            commitInfo = updateApp();
+            BuilderUtil.copyToCompileDir(appLocalRepo, app);
+            buildLog.setCommitInfo(commitInfo);
+            return true;
+        } catch (Exception e) {
+            buildLog.setStage(AppStage.update.name());
+            buildLog.setCode(1);
+            buildLog.setMsg(e.getMessage());
+            return false;
+        }
+    }
+
+    private CommitInfo updateApp() throws Exception {
+        String remoteRepo = app.getAppRepo();
+        String localRepo = appLocalRepo + BuilderUtil.dirname(remoteRepo);
+        CommitInfo current = codeUpdater.lastCommitInfo(localRepo);
+        CommitInfo commitInfo = codeUpdater.update(remoteRepo, localRepo);
+        //
+        if (current == null || commitInfo.getCommitTime() > current.getCommitTime() || app.isAlwaysBuild()) {
+            String dep = app.getDependencyRepos();
+            if (dep != null) {
+                String[] dependencyRepos = dep.split(",");
+                for (String repo : dependencyRepos) {
+                    codeUpdater.update(repo, appLocalRepo + BuilderUtil.dirname(repo));
+                }
+            }
+
+            return commitInfo;
+        } else {
+            return null;
+        }
     }
 
-    public void compile() {
+    public boolean compile() {
+        try {
+            if (needPreCompile()) {
+                preCompile(app.getEntryDir());
+            }
+            // TODO 在通过脚本调用编译器时会卡住
+            codeCompiler.compile(app.getDirname(), appCompileDir + app.getEntryDir());
+            return true;
+        } catch (Exception e) {
+            buildLog.setStage(AppStage.compile.name());
+            buildLog.setCode(1);
+            buildLog.setMsg(e.getMessage());
+            return false;
+        }
     }
 
-    public void pack() {
+    public boolean pack() {
+        try {
+            String appPath = codePacker.pack(app.getAppId(), commitInfo.getCommitId(),
+                    appCompileDir + app.getEntryDir());
+            buildLog.setAppPath(appPath);
+            return true;
+        } catch (Exception e) {
+            buildLog.setStage(AppStage.pack.name());
+            buildLog.setCode(1);
+            buildLog.setMsg(e.getMessage());
+            return false;
+        }
     }
 
-    public void deploy() {
+    public boolean deploy() {
+        return false;
     }
 }

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

@@ -1,18 +1,17 @@
 package cn.reghao.autodop.dmaster.app.service.build;
 
-import cn.reghao.autodop.common.config.BuildDeployResult;
-import cn.reghao.autodop.common.utils.JsonUtil;
 import cn.reghao.autodop.dmaster.app.caching.OrchestrationCaching;
 import cn.reghao.autodop.dmaster.app.entity.build.AppBuild;
+import cn.reghao.autodop.dmaster.app.entity.log.BuildResult;
 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.CommitInfoRepository;
 import cn.reghao.autodop.dmaster.app.thread.ThreadPoolWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
 import java.util.concurrent.*;
-import java.util.stream.Collectors;
 
 /**
  * 应用构建分发
@@ -25,9 +24,11 @@ import java.util.stream.Collectors;
 public class BuildDispatcher {
     private final String STANDALONE_APP = "standaloneApp";
     private OrchestrationCaching caching;
+    private CommitInfoRepository commitInfoRepository;
 
-    public BuildDispatcher(OrchestrationCaching caching) {
+    public BuildDispatcher(OrchestrationCaching caching, CommitInfoRepository commitInfoRepository) {
         this.caching = caching;
+        this.commitInfoRepository = commitInfoRepository;
     }
 
     /**
@@ -37,8 +38,8 @@ public class BuildDispatcher {
      * @return
      * @date 2019-11-12 上午9:48
      */
-    public List<BuildDeployResult> dispatch(Set<String> appIds, boolean isDeploy) throws Exception {
-        List<BuildDeployResult> results = new ArrayList<>();
+    public List<BuildResult> dispatch(Set<String> appIds, boolean isDeploy) throws Exception {
+        List<BuildResult> results = new ArrayList<>();
         List<AppOrchestration> existApps = new ArrayList<>();
         // 分离出存在的应用和不存在的应用
         if (appIds.remove("all")) {
@@ -49,15 +50,19 @@ public class BuildDispatcher {
                 if (app != null) {
                     existApps.add(app);
                 } else {
-                    results.add(new BuildDeployResult(appId, "初始化", 0, "应用不存在"));
+                    BuildResult buildResult = new BuildResult();
+                    buildResult.setAppId(appId);
+                    buildResult.setCode(1);
+                    buildResult.setMsg("应用不存在");
+                    results.add(buildResult);
                 }
             });
         }
 
         // TODO 若应用当前正在进行构建,则忽略
         Map<String, List<AppOrchestration>> appsByProj = filterByProj(existApps);
-        List<Future<List<ProjectUpdateTask.AppVersion>>> projFutures = new ArrayList<>();
-        List<Future<String>> appFutures = new ArrayList<>();
+        List<Future<List<ProjectUpdateTask.AppStatus>>> projFutures = new ArrayList<>();
+        List<Future<BuildResult>> appFutures = new ArrayList<>();
         ExecutorService threadPool = ThreadPoolWrapper.threadPool("dispatcher");
         for (Map.Entry<String, List<AppOrchestration>> entry : appsByProj.entrySet()) {
             String key = entry.getKey();
@@ -69,15 +74,16 @@ public class BuildDispatcher {
             } else {
                 // 更新,编译,打包独立的应用
                 apps.forEach(app -> {
-                    appFutures.add(threadPool.submit(new AppBuildPipeline(app, null, isDeploy)));
+                    AppIntegrate appIntegrate = new AppIntegrate(app);
+                    appFutures.add(threadPool.submit(new AppBuildPipeline(appIntegrate, isDeploy)));
                 });
             }
         }
 
         // 构建项目中的应用
-        Iterator<Future<List<ProjectUpdateTask.AppVersion>>> iterator = projFutures.iterator();
+        Iterator<Future<List<ProjectUpdateTask.AppStatus>>> iterator = projFutures.iterator();
         while (iterator.hasNext()) {
-            Future<List<ProjectUpdateTask.AppVersion>> future = iterator.next();
+            Future<List<ProjectUpdateTask.AppStatus>> future = iterator.next();
             while (!future.isDone() && !future.isCancelled()) {
                 Thread.sleep(500);
             }
@@ -85,17 +91,17 @@ public class BuildDispatcher {
             if (future.isCancelled()) {
                 log.info("future is cannelled");
             } else {
-                List<ProjectUpdateTask.AppVersion> appVersions = future.get();
-                appVersions.forEach(appVersion -> {
-                    if (appVersion.isUpdated()) {
-                        appFutures.add(threadPool.submit(
-                                new AppBuildPipeline(appVersion.getApp(), appVersion.getVersion(), isDeploy)));
+                List<ProjectUpdateTask.AppStatus> appStatusList = future.get();
+                appStatusList.forEach(appStatus -> {
+                    if (appStatus.isUpdated()) {
+                        AppIntegrate appIntegrate = new AppIntegrate(appStatus.getApp(), appStatus.getLastCommitInfo());
+                        appFutures.add(threadPool.submit(new AppBuildPipeline(appIntegrate, isDeploy)));
                     } else {
-                        BuildDeployResult buildDeployResult = new BuildDeployResult();
-                        buildDeployResult.setAppId(appVersion.getApp().getAppId());
-                        buildDeployResult.setVersion(appVersion.getVersion());
-                        buildDeployResult.setMsg("应用不需要更新");
-                        results.add(buildDeployResult);
+                        BuildResult buildResult = new BuildResult();
+                        buildResult.setAppId(appStatus.getApp().getAppId());
+                        buildResult.setCommitId(appStatus.getLastCommitInfo().getCommitId());
+                        buildResult.setMsg("应用不需要更新");
+                        results.add(buildResult);
                     }
                 });
             }
@@ -103,16 +109,14 @@ public class BuildDispatcher {
         }
 
         // 等待所有正在构建的应用
-        Iterator<Future<String>> iterator1 = appFutures.iterator();
+        Iterator<Future<BuildResult>> iterator1 = appFutures.iterator();
         while (iterator1.hasNext()) {
-            Future<String> future = iterator1.next();
+            Future<BuildResult> future = iterator1.next();
             while (!future.isDone() && !future.isCancelled()) {
                 Thread.sleep(1_000);
             }
 
-            JsonUtil.arrayToList(future.get(), BuildDeployResult.class).forEach(obj -> {
-                results.add((BuildDeployResult) obj);
-            });
+            results.add(future.get());
             iterator1.remove();
         }
 
@@ -160,19 +164,7 @@ public class BuildDispatcher {
      * @date 2020-03-09 下午4:39
      */
     private void fillAppBuild(ProjOrchestration proj, AppOrchestration app) {
-        String projRepo = proj.getProjRepo();
         AppBuild appBuild = proj.getAppBuild();
-
-        String appRepo = app.getAppRepo();
-        app.setAppRepo(projRepo + appRepo);
-        StringBuilder sb = new StringBuilder();
-        List<String> repos = Arrays.stream(app.getDependencyRepos().split(","))
-                .map(repo -> projRepo + repo)
-                .collect(Collectors.toList());
-        repos.forEach(repo -> {
-            sb.append(repo).append(",");
-        });
-        app.setDependencyRepos(sb.toString());
         app.setAppBuild(appBuild);
     }
 }

+ 16 - 12
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/BuilderUtil.java

@@ -3,12 +3,16 @@ 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.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.common.config.SysConfig;
 import lombok.extern.slf4j.Slf4j;
 
+import java.io.File;
 import java.io.IOException;
 
 /**
@@ -24,7 +28,7 @@ public class BuilderUtil {
      * @date 2019-12-03 上午9:55
      */
     public static void copyToCompileDir(String appLocalRepo, AppOrchestration app) throws IOException {
-        /*String appCompileDir = SysConfig.compileDir + "/" + app.getIdentifier();
+        String appCompileDir = SysConfig.compileDir + "/" + app.getAppId();
 
         File compileDir = new File(appCompileDir);
         if (!compileDir.exists() && !FileUtil.mkdir(compileDir)) {
@@ -33,22 +37,21 @@ public class BuilderUtil {
             FileUtil.eraseDir(compileDir);
         }
 
-        CodeRepos codeRepos = app.getBuild().getCodeRepos();
-        String remoteRepo = codeRepos.getReposUrl();
+        String remoteRepo = app.getAppRepo();
         FileUtil.copyDirToDir(appLocalRepo + dirname(remoteRepo), appCompileDir);
-        String dep = codeRepos.getDependencyUrls();
-        if (dep != null) {
-            String[] dependencyRepos = codeRepos.getDependencyUrls().split(",");
+        String deps = app.getDependencyRepos();
+        if (deps != null) {
+            String[] dependencyRepos = deps.split(",");
             for (String repo : dependencyRepos) {
                 FileUtil.copyDirToDir(appLocalRepo + dirname(repo), appCompileDir);
             }
         }
 
         // Dotnet 应用需要额外的处理
-        if ("dotnet".equals(app.getBuild().getCodeCompiler().getCompilerType())) {
+        if (app.getAppBuild().getAppCompile().getCompilerType().equals(CompilerType.dotnet.name())) {
             // Dotnet 应用需要替换一些字符
             BuilderUtil.replaceCharacter(appCompileDir);
-        }*/
+        }
     }
 
     public static String dirname(String svnUrl) {
@@ -60,10 +63,11 @@ public class BuilderUtil {
         FileUtil.traversal(appCompileDir, new ReplaceCharacter());
     }
 
-    public static CodeUpdater versionControl(AppUpdate reposAuth) {
-        if ("svn".equals(reposAuth.getRepoType())) {
-            return new SvnImpl(reposAuth.getUsername(), reposAuth.getPassword());
-        } else if ("git".equals(reposAuth.getRepoType())) {
+    public static CodeUpdater versionControl(AppUpdate appUpdate) {
+        String repoType = appUpdate.getRepoType();
+        if (repoType.equals(RepoType.svn.name())) {
+            return new SvnImpl(appUpdate.getUsername(), appUpdate.getPassword());
+        } else if (repoType.equals(RepoType.git.name())) {
             return new GitImpl("");
         } else {
             return null;

+ 34 - 29
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/ProjectUpdateTask.java

@@ -3,6 +3,8 @@ package cn.reghao.autodop.dmaster.app.service.build;
 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.tools.updater.CodeUpdater;
+import cn.reghao.autodop.dmaster.app.service.tools.updater.CommitInfo;
+import cn.reghao.autodop.dmaster.common.config.SysConfig;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
@@ -16,30 +18,31 @@ import java.util.concurrent.Callable;
 
 /**
  * 更新项目中的所有应用
+ * TODO 一个仓库在同一时间只能有一个线程对其进行更新
  *
  * @author reghao
  * @date 2019-11-16 21:32:56
  */
 @Slf4j
-public class ProjectUpdateTask implements Callable<List<ProjectUpdateTask.AppVersion>> {
+public class ProjectUpdateTask implements Callable<List<ProjectUpdateTask.AppStatus>> {
     private ProjOrchestration proj;
     private List<AppOrchestration> apps;
-    private String localRepos;
-    private CodeUpdater vc;
+    private String localRepo;
+    private CodeUpdater codeUpdater;
 
     public ProjectUpdateTask(ProjOrchestration proj, List<AppOrchestration> apps) {
         this.proj = proj;
         this.apps = apps;
-        /*this.localRepos = SysConfig.localRepos;
-        this.vc = BuilderUtil.versionControl(proj.getBuild().getCodeRepos().getReposAuth());*/
+        this.localRepo = SysConfig.localRepo;
+        this.codeUpdater = BuilderUtil.versionControl(proj.getAppBuild().getAppUpdate());
     }
 
     @Override
-    public List<AppVersion> call() {
+    public List<AppStatus> call() {
         try {
-            Map<AppOrchestration, String> current = checkAppVersion();
+            Map<AppOrchestration, CommitInfo> current = checkAppVersion();
             updateProject();
-            Map<AppOrchestration, String> updated = checkAppVersion();
+            Map<AppOrchestration, CommitInfo> updated = checkAppVersion();
             return compareAppVersion(current, updated);
         } catch (Exception e) {
             e.printStackTrace();
@@ -53,10 +56,9 @@ public class ProjectUpdateTask implements Callable<List<ProjectUpdateTask.AppVer
      * @date 2019-11-08 上午9:57
      */
     private void updateProject() throws Exception {
-        /*CodeRepos codeRepos = proj.getBuild().getCodeRepos();
-        String remote = codeRepos.getReposUrl();
-        String local = localRepos + "/" + proj.getIdentifier();
-        vc.update(remote, local);*/
+        String remote = proj.getProjRepo();
+        String local = localRepo + "/" + proj.getProjId();
+        codeUpdater.update(remote, local);
     }
 
     /**
@@ -66,27 +68,29 @@ public class ProjectUpdateTask implements Callable<List<ProjectUpdateTask.AppVer
      * @return map 中只有两个元素,update 对应需要更新的应用及其版本,notUpdate 对应不需要更新的应用及其版本
      * @date 2020-01-20 下午10:06
      */
-    private Map<AppOrchestration, String> checkAppVersion() throws Exception {
-        Map<AppOrchestration, String> map = new HashMap<>();
+    private Map<AppOrchestration, CommitInfo> checkAppVersion() throws Exception {
+        Map<AppOrchestration, CommitInfo> map = new HashMap<>();
         for (AppOrchestration app : apps) {
-            /*String appLocalRepos = localRepos + "/" + proj.getIdentifier() + app.getProjBuild().getAppReposUrl();
-            String version = vc.localVersion(appLocalRepos);
-            map.put(app, version);*/
+            String appLocalRepo = localRepo + "/" + proj.getProjId() + app.getAppRepo();
+            CommitInfo lastCommitInfo = codeUpdater.lastCommitInfo(appLocalRepo);
+            map.put(app, lastCommitInfo);
         }
 
         return map;
     }
 
-    private List<AppVersion> compareAppVersion(Map<AppOrchestration, String> current,
-                                               Map<AppOrchestration, String> updated) {
-        List<AppVersion> list = new ArrayList<>();
-        current.forEach((app, version) -> {
-            String version1 = updated.get(app);
-            // 第一次 checkout 时 version 是 null
+    private List<AppStatus> compareAppVersion(Map<AppOrchestration, CommitInfo> current,
+                                               Map<AppOrchestration, CommitInfo> updated) {
+        List<AppStatus> list = new ArrayList<>();
+        current.forEach((app, lastCommitInfo) -> {
+            CommitInfo lastCommitInfo1 = updated.get(app);
+            // 第一次 checkout 时 lastCommitInfo 是 null
             // 无论代码是否更新,都要构建
-            if (version == null || Long.parseLong(version1) >= Long.parseLong(version)) {
-                list.add(new AppVersion(app, version, true));
-                String appLocalRepos = localRepos + "/" + proj.getProjId();
+            if (lastCommitInfo == null ||
+                    lastCommitInfo1.getCommitTime() > lastCommitInfo.getCommitTime() ||
+                    app.isAlwaysBuild()) {
+                list.add(new AppStatus(app, lastCommitInfo1, true));
+                String appLocalRepos = localRepo + "/" + proj.getProjId();
                 // TODO 抛出异常
                 try {
                     BuilderUtil.copyToCompileDir(appLocalRepos, app);
@@ -94,7 +98,8 @@ public class ProjectUpdateTask implements Callable<List<ProjectUpdateTask.AppVer
                     e.printStackTrace();
                 }
             } else {
-                list.add(new AppVersion(app, version, false));
+                // 应用代码没有更新时不构建部署
+                list.add(new AppStatus(app, lastCommitInfo1, true));
             }
         });
 
@@ -103,9 +108,9 @@ public class ProjectUpdateTask implements Callable<List<ProjectUpdateTask.AppVer
 
     @Data
     @AllArgsConstructor
-    static class AppVersion {
+    static class AppStatus {
         private AppOrchestration app;
-        private String version;
+        private CommitInfo lastCommitInfo;
         private boolean isUpdated;
     }
 }

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

@@ -65,7 +65,8 @@ public class MavenCompiler implements CodeCompiler, CodePacker {
     }
 
     @Override
-    public void pack(String appId, String version, String appEntryDir) throws Exception {
+    public String pack(String appId, String version, String appEntryDir) throws Exception {
+        return null;
     }
 
     public static void main(String[] args) throws Exception {

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

@@ -2,6 +2,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.dmaster.app.entity.build.compile.AppCompile;
 
 import java.util.HashMap;
 import java.util.List;
@@ -17,8 +18,8 @@ public class ShellCompiler implements CodeCompiler {
     private String script;
     private ShellExecutor shell;
 
-    public ShellCompiler(String script) {
-        this.script = script;
+    public ShellCompiler(AppCompile appCompile) {
+        this.script = appCompile.getCompilerHome() + "/" + appCompile.getScript();
         this.shell = new ShellExecutor();
     }
 

+ 4 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/packer/CodePacker.java

@@ -11,8 +11,10 @@ public interface CodePacker {
     /**
      * 打包方式确定运行方式
      *
-     * @param version 应用版本
+     * @param commitId 应用版本
+     * @return 返回 appPath
+     *
      * @date 2020-01-21 下午4:19
      */
-    void pack(String appId, String version, String appEntryDir) throws Exception;
+    String pack(String appId, String commitId, String appEntryDir) throws Exception;
 }

+ 4 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/packer/DnktMgrZipPack.java

@@ -21,11 +21,11 @@ public class DnktMgrZipPack implements CodePacker {
     }
 
     @Override
-    public void pack(String appId, String version, String appEntryDir) throws Exception {
+    public String pack(String appId, String version, String appEntryDir) throws Exception {
         String tag = appId + "_" + version + ".zip";
         String dst = appRootPath + "/" + tag;
         if (new File(dst).exists()) {
-            return;
+            return null;
         }
 
         String src = appEntryDir + "/src";
@@ -36,5 +36,7 @@ public class DnktMgrZipPack implements CodePacker {
         FileUtil.mvDir(start, app);
 
         ZipUtil.zip(new File(app), dst);
+
+        return null;
     }
 }

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

@@ -16,7 +16,7 @@ public class DockerPack implements CodePacker {
     }
 
     @Override
-    public void pack(String appId, String version, String appEntryDir) throws Exception {
+    public String pack(String appId, String version, String appEntryDir) throws Exception {
         DockerClient docker = new DockerClient();
         String repo = appRootPath + "/" + appId;
         String image = repo + ":" + version;
@@ -24,5 +24,6 @@ public class DockerPack implements CodePacker {
         docker.build(image, appEntryDir);
         docker.push(image);
         docker.close();
+        return image;
     }
 }

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

@@ -8,6 +8,7 @@ package cn.reghao.autodop.dmaster.app.service.tools.packer;
  */
 public class DotnetPack implements CodePacker {
     @Override
-    public void pack(String appId, String version, String appEntryDir) throws Exception {
+    public String pack(String appId, String version, String appEntryDir) throws Exception {
+        return null;
     }
 }

+ 4 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/packer/ZipPack.java

@@ -19,12 +19,14 @@ public class ZipPack implements CodePacker {
     }
 
     @Override
-    public void pack(String appId, String version, String appEntryDir) throws Exception {
+    public String pack(String appId, String version, String appEntryDir) throws Exception {
         String tag = appId + "_" + version + SUFFIX;
         String dst = packDir + "/" + tag;
         if (new File(dst).exists()) {
-            return;
+            return null;
         }
         ZipUtil.zip(new File(appEntryDir), dst);
+
+        return null;
     }
 }

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

@@ -19,14 +19,15 @@ public class ZipRemotePack implements CodePacker {
     }
 
     @Override
-    public void pack(String appId, String version, String appEntryDir) throws Exception {
+    public String pack(String appId, String version, String appEntryDir) throws Exception {
         String tag = appId + "_" + version + SUFFIX;
         String dst = packDir + "/" + tag;
         if (new File(dst).exists()) {
-            return;
+            return null;
         }
         ZipUtil.zip(new File(appEntryDir), dst);
 
         // TODO 将应用包上传到远程服务器
+        return null;
     }
 }

+ 13 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/updater/ChangedFile.java

@@ -1,13 +1,25 @@
 package cn.reghao.autodop.dmaster.app.service.tools.updater;
 
+import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
 
 /**
  * @author reghao
  * @date 2020-05-14 10:49:49
  */
 @Data
-public class ChangedFile {
+@EqualsAndHashCode(callSuper = false)
+@Entity
+public class ChangedFile extends BaseEntity {
+    @ManyToOne(cascade = CascadeType.ALL)
+    @JoinColumn(name="commit_id")
+    private CommitInfo commitInfo;
     private String changeType;
     private String oldFilePath;
     private String newFilePath;

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

@@ -18,11 +18,10 @@ public interface CodeUpdater {
     CommitInfo update(String remote, String local) throws Exception;
 
     /**
-     * 本地代码版本
+     * 本地代码仓库最近一次提交的信息
      *
      * @param local 本地代码仓库路径
-     * @return 本地代码仓库版本
      * @date 2019-10-30 下午5:23
      */
-    String localVersion(String local) throws Exception;
+    CommitInfo lastCommitInfo(String local) throws Exception;
 }

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

@@ -1,7 +1,10 @@
 package cn.reghao.autodop.dmaster.app.service.tools.updater;
 
+import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+import javax.persistence.*;
 import java.util.List;
 
 /**
@@ -11,13 +14,17 @@ import java.util.List;
  * @date 2020-05-13 22:50:38
  */
 @Data
-public class CommitInfo {
-    private String repoUrl;
-    private String branch;
+@EqualsAndHashCode(callSuper = false)
+@Entity
+public class CommitInfo extends BaseEntity {
+    @Column(nullable = false, unique = true)
     private String commitId;
     private String commitAuthor;
+    private String remoteRepoUrl;
+    private String branch;
     // 毫秒级时间戳
     private long commitTime;
     private String commitMsg;
+    @OneToMany(mappedBy="commitInfo", cascade = CascadeType.ALL)
     private List<ChangedFile> changedFiles;
 }

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

@@ -52,13 +52,13 @@ public class GitImpl implements CodeUpdater {
         CommitInfo commitInfo;
         if (!localRepo.exists()) {
             commitInfo = clone(remote, local);
-            commitInfo.setRepoUrl(remote);
+            commitInfo.setRemoteRepoUrl(remote);
         } else {
             try (Repository repo = new FileRepository(localRepo.getAbsolutePath())) {
                 PullCommand gitPull = new Git(repo).pull();
                 gitPull.call();
                 commitInfo = commitInfo(repo);
-                commitInfo.setRepoUrl(remote);
+                commitInfo.setRemoteRepoUrl(remote);
                 commitInfo.setChangedFiles(changedFileList(repo));
             }
         }
@@ -101,6 +101,7 @@ public class GitImpl implements CodeUpdater {
     }
 
     private List<ChangedFile> changedFileList(Repository repo) throws Exception {
+        // TODO 查找指定的 branch
         Ref headMaster = repo.findRef("refs/heads/master");
         ObjectId objectId = headMaster.getObjectId();
         try (RevWalk walk = new RevWalk(repo)) {
@@ -142,8 +143,9 @@ public class GitImpl implements CodeUpdater {
     }
 
     @Override
-    public String localVersion(String local) throws Exception {
-        File localRepo = new File(local + "/.git");
+    public CommitInfo lastCommitInfo(String local) throws Exception {
+        // TODO 待实现
+        /*File localRepo = new File(local + "/.git");
         if (!localRepo.exists()) {
             return null;
         }
@@ -152,15 +154,7 @@ public class GitImpl implements CodeUpdater {
             Ref head = repo.findRef("refs/heads/master");
             ObjectId objectId = head.getObjectId();
             return objectId.name();
-        }
-    }
-
-    public static void main(String[] args) throws Exception {
-        String branch = "master";
-        GitImpl git = new GitImpl(branch);
-        String remote = "http://git.reghao.cn/reghao/spiderlab.git";
-        String local = "/home/reghao/tmp/autodop/opt/data/git/spiderlab";
-        CommitInfo commitInfo = git.update(remote, local);
-        System.out.println(git.localVersion(local));
+        }*/
+        return null;
     }
 }

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

@@ -45,36 +45,11 @@ public class SvnImpl implements CodeUpdater {
                     true, false);
         }
 
-        CommitInfo commitInfo = commitInfo(localRepo, Long.parseLong(localVersion(local)));
-        commitInfo.setRepoUrl(remote);
+        CommitInfo commitInfo = lastCommitInfo(local);
         commitInfo.setBranch("");
         return commitInfo;
     }
 
-    private CommitInfo commitInfo(File localRepo, long version) throws SVNException {
-        File[] paths = { localRepo };
-        SVNRevision start = SVNRevision.create(version);
-        SVNRevision end = SVNRevision.create(version);
-        long limit = 9999L;
-        CommitInfo commitInfo = new CommitInfo();
-        logClient.doLog(paths, start, end, false, true, limit, logEntry -> {
-            String commitAuthor = logEntry.getAuthor();
-            String commitMsg = logEntry.getMessage();
-            long commitTime = logEntry.getDate().toInstant().toEpochMilli();
-            String commitId = String.valueOf(logEntry.getRevision());
-            Map<String, SVNLogEntryPath> changedPaths = logEntry.getChangedPaths();
-
-            //commitInfo.setRepoUrl(remote);
-            commitInfo.setCommitId(commitId);
-            commitInfo.setCommitMsg(commitMsg);
-            commitInfo.setCommitAuthor(commitAuthor);
-            commitInfo.setCommitTime(commitTime);
-            commitInfo.setChangedFiles(changedFileList(changedPaths));
-        });
-
-        return commitInfo;
-    }
-
     private List<ChangedFile> changedFileList(Map<String, SVNLogEntryPath> changedPaths) {
         List<ChangedFile> changedFiles = new ArrayList<>();
         changedPaths.forEach((k, v) -> {
@@ -101,21 +76,41 @@ public class SvnImpl implements CodeUpdater {
     }
 
     @Override
-    public String localVersion(String local) throws SVNException {
-        File file = new File(local);
-        if (!file.exists()) {
+    public CommitInfo lastCommitInfo(String local) throws SVNException {
+        File localRepo = new File(local);
+        if (!localRepo.exists()) {
             return null;
         }
 
-        SVNStatus status = statusClient.doStatus(file, false);
-        return status != null ? String.valueOf(status.getCommittedRevision().getNumber()) : null;
+        SVNStatus status = statusClient.doStatus(localRepo, false);
+        long version = status.getCommittedRevision().getNumber();
+        CommitInfo commitInfo = commitInfo(localRepo, version);
+        commitInfo.setRemoteRepoUrl(status.getRemoteURL().toString());
+
+        return commitInfo;
     }
 
-    public static void main(String[] args) throws SVNException {
-        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");
-        CommitInfo commitInfo = svn.update(remote, local);
-        System.out.println(svn.localVersion(local));
+    private CommitInfo commitInfo(File localRepo, long version) throws SVNException {
+        File[] paths = { localRepo };
+        SVNRevision start = SVNRevision.create(version);
+        SVNRevision end = SVNRevision.create(version);
+        long limit = 9999L;
+        CommitInfo commitInfo = new CommitInfo();
+        logClient.doLog(paths, start, end, false, true, limit, logEntry -> {
+            String commitAuthor = logEntry.getAuthor();
+            String commitMsg = logEntry.getMessage();
+            long commitTime = logEntry.getDate().toInstant().toEpochMilli();
+            String commitId = String.valueOf(logEntry.getRevision());
+            Map<String, SVNLogEntryPath> changedPaths = logEntry.getChangedPaths();
+
+            //commitInfo.setRepoUrl(remote);
+            commitInfo.setCommitId(commitId);
+            commitInfo.setCommitMsg(commitMsg);
+            commitInfo.setCommitAuthor(commitAuthor);
+            commitInfo.setCommitTime(commitTime);
+            commitInfo.setChangedFiles(changedFileList(changedPaths));
+        });
+
+        return commitInfo;
     }
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/SysConfig.java

@@ -6,7 +6,7 @@ package cn.reghao.autodop.dmaster.common.config;
  */
 public class SysConfig {
     // 本地仓库
-    public static String localRepos;
+    public static String localRepo;
     // 编译目录
     public static String compileDir;
     // 应用打包后存放的目录

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/SysConfigProperties.java

@@ -13,8 +13,8 @@ import org.springframework.stereotype.Component;
 @Component
 @ConfigurationProperties(prefix = "sysconfig")
 public class SysConfigProperties {
-    @Value("${sysconfig.localRepos}")
-    private String localRepos;
+    @Value("${sysconfig.localRepo}")
+    private String localRepo;
     @Value("${sysconfig.compileDir}")
     private String compileDir;
     @Value("${sysconfig.packDir}")

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

@@ -20,20 +20,14 @@ import org.springframework.util.StopWatch;
 @Component
 @Aspect
 public class MethodTimeInterceptor {
-    // 拦截 cn.reghao.autodop.dmaster.orchestrate.controller 包中的所有方法
-    private final static String POINT = "execution (* cn.reghao.autodop.dmaster.orchestrate.controller..*.*(..))";
     // 拦截 cn.reghao.autodop.dmaster.app.service.build 包中的所有方法
-    private final static String POINT1 = "execution (* cn.reghao.autodop.dmaster.app.service.build..*.*(..))";
+    private final static String POINT = "execution (* cn.reghao.autodop.dmaster.app.service.build..*.*(..))";
 
     @Pointcut(POINT)
     public void timeConsumed(){
     }
 
-    @Pointcut(POINT1)
-    public void timeConsumed1(){
-    }
-
-    @Around("timeConsumed1()")
+    @Around("timeConsumed()")
     public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
         StopWatch stopWatch = new StopWatch();
         stopWatch.start();

+ 5 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/utils/SysInitializer.java

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.common.utils;
 
 import cn.reghao.autodop.common.utils.FileUtil;
+import cn.reghao.autodop.dmaster.common.config.SysConfig;
 import cn.reghao.autodop.dmaster.common.config.SysConfigProperties;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.ApplicationArguments;
@@ -30,9 +31,9 @@ public class SysInitializer implements ApplicationRunner {
     }
 
     public void initialize() {
-        /*SysConfig.localRepos = sysConfigProperties.getLocalRepos();
+        SysConfig.localRepo = sysConfigProperties.getLocalRepo();
         SysConfig.compileDir = sysConfigProperties.getCompileDir();
-        SysConfig.packDir = sysConfigProperties.getPackDir();*/
+        SysConfig.packDir = sysConfigProperties.getPackDir();
 
         checkAndSet();
         log.info("autodop 系统初始化完成...");
@@ -44,7 +45,7 @@ public class SysInitializer implements ApplicationRunner {
      * @date 2019-11-17 上午11:38
      */
     private void checkAndSet() {
-        /*File localRepo = new File(SysConfig.localRepos);
+        File localRepo = new File(SysConfig.localRepo);
         if (!localRepo.exists() && !FileUtil.mkdir(localRepo)) {
             log.error("{} 不存在且创建失败...", localRepo.getAbsolutePath());
             throw new IllegalArgumentException(localRepo.getAbsolutePath() + " 不存在且创建失败...");
@@ -60,6 +61,6 @@ public class SysInitializer implements ApplicationRunner {
         if (!packDir.exists() && !FileUtil.mkdir(packDir)) {
             log.error("{} 不存在且创建失败...", packDir.getAbsolutePath());
             throw new IllegalArgumentException(packDir.getAbsolutePath() + " 不存在且创建失败...");
-        }*/
+        }
     }
 }

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

@@ -4,6 +4,6 @@ spring:
     username: reghao
     password: 12345678
 sysconfig:
-  localRepos: /home/reghao/tmp/autodop/opt/data/local-repos
+  localRepo: /home/reghao/tmp/autodop/opt/data/local-repo
   compileDir: /home/reghao/tmp/autodop/opt/data/compile-dir
   packDir: /home/reghao/tmp/autodop/opt/data/pack-dir

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

@@ -4,6 +4,6 @@ spring:
     username: iquizoo
     password: db62083886
 sysconfig:
-  localRepos: /opt/data/local-repos
+  localRepo: /opt/data/local-repo
   compileDir: /opt/data/compile-dir
   packDir: /opt/data/pack-dir

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

@@ -4,6 +4,6 @@ spring:
     username: azy_test
     password: Test@123456
 sysconfig:
-  localRepos: /opt/data/local-repos
+  localRepo: /opt/data/local-repo
   compileDir: /opt/data/compile-dir
   packDir: /opt/data/pack-dir

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

@@ -0,0 +1,18 @@
+package cn.reghao.autodop.dmaster.app.service.tools.updater;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class GitImplTest {
+
+    @Test
+    void main() throws Exception {
+        String branch = "master";
+        GitImpl git = new GitImpl(branch);
+        String remote = "http://git.reghao.cn/reghao/spiderlab.git";
+        String local = "/home/reghao/tmp/autodop/opt/data/git/spiderlab";
+        CommitInfo commitInfo = git.update(remote, local);
+        //System.out.println(git.localVersion(local));
+    }
+}

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

@@ -0,0 +1,18 @@
+package cn.reghao.autodop.dmaster.app.service.tools.updater;
+
+import org.junit.jupiter.api.Test;
+import org.tmatesoft.svn.core.SVNException;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class SvnImplTest {
+
+    @Test
+    void main() throws SVNException {
+        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");
+        CommitInfo commitInfo = svn.lastCommitInfo("/home/reghao/tmp/autodop/opt/data/local-repo/dev-branch-20200509");
+        //System.out.println(svn.localVersion(local));
+    }
+}