Ver código fonte

调整执行 shell 脚本的接口

reghao 4 anos atrás
pai
commit
75d55d77ac
54 arquivos alterados com 1143 adições e 533 exclusões
  1. 21 0
      common/src/main/java/cn/reghao/autodop/common/mqtt/MqttPub.java
  2. 19 0
      common/src/main/java/cn/reghao/autodop/common/mqtt/MqttSub.java
  3. 71 0
      common/src/main/java/cn/reghao/autodop/common/mqtt/Mqttc.java
  4. 3 3
      common/src/main/java/cn/reghao/autodop/common/result/ResultCode.java
  5. 43 94
      common/src/main/java/cn/reghao/autodop/common/shell/ShellExecutor.java
  6. 19 16
      common/src/main/java/cn/reghao/autodop/common/shell/ShellResult.java
  7. 22 0
      common/src/main/java/cn/reghao/autodop/common/utils/MachineId.java
  8. 39 0
      common/src/main/java/cn/reghao/autodop/common/utils/file/FileFingerprint.java
  9. 11 0
      common/src/main/java/cn/reghao/autodop/common/utils/file/FileHandler.java
  10. 95 0
      common/src/main/java/cn/reghao/autodop/common/utils/file/FileOps.java
  11. 1 1
      dagent/src/main/java/cn/reghao/autodop/dagent/utils/amqp/DagentConsumer.java
  12. 1 1
      dagent/src/main/java/cn/reghao/autodop/dagent/utils/amqp/DagentConsumerConfig.java
  13. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/BuildStage.java
  14. 93 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppPageController.java
  15. 7 57
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildDeployController.java
  16. 0 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/config/AppOrchestrationCrudService.java
  17. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/log/BuildLogCrudService.java
  18. 40 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/AppBuilding.java
  19. 18 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/AppDeploying.java
  20. 13 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/BuildResult.java
  21. 18 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/BuildTime.java
  22. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/CompilerConfig.java
  23. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/PackerConfig.java
  24. 17 38
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildLog.java
  25. 4 15
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/CommitLog.java
  26. 2 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/DeployLog.java
  27. 1 114
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/status/BuildDeployApp.java
  28. 7 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/config/AppOrchestrationRepository.java
  29. 21 96
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildDeployDispatcher.java
  30. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildService.java
  31. 58 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildSupplier.java
  32. 0 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/RefreshService.java
  33. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppDeployer.java
  34. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/DeployNotifyMsg.java
  35. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/tools/compiler/ShellCompiler.java
  36. 0 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/log/BuildDeployLogConsumer.java
  37. 6 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/scheduler/ScriptBakJob.java
  38. 9 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/db/PageList.java
  39. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/WebBody.java
  40. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/AppPagesController.java
  41. 44 34
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/service/ResourceService.java
  42. 21 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/utility/PageUtil.java
  43. 3 3
      dmaster/src/main/resources/application-test.yml
  44. 1 0
      dmaster/src/main/resources/static/js/main.js
  45. 86 0
      dmaster/src/main/resources/templates/app/build.html
  46. 100 0
      dmaster/src/main/resources/templates/app/config/app/add.html
  47. 79 0
      dmaster/src/main/resources/templates/app/config/app/detail.html
  48. 4 3
      dmaster/src/main/resources/templates/app/config/app/index.html
  49. 56 0
      dmaster/src/main/resources/templates/app/deploy.html
  50. 16 0
      dmaster/src/main/resources/templates/app/log.html
  51. 16 0
      dmaster/src/main/resources/templates/app/status.html
  52. 1 1
      dmaster/src/main/resources/templates/common/fragment.html
  53. 24 11
      dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/RefreshServiceTest.java
  54. 14 1
      pom.xml

+ 21 - 0
common/src/main/java/cn/reghao/autodop/common/mqtt/MqttPub.java

@@ -0,0 +1,21 @@
+package cn.reghao.autodop.common.mqtt;
+
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.*;
+
+/**
+ * @author reghao
+ * @date 2021-05-21 07:15:27
+ */
+@Slf4j
+public class MqttPub {
+    private static String topic = "test";
+
+    public static void main(String[] args) throws MqttException {
+        try (Mqttc mqttc = new Mqttc()) {
+            String payload = "hello from dmaster...";
+            mqttc.pub(topic, payload);
+            log.info("消息已发送...");
+        }
+    }
+}

+ 19 - 0
common/src/main/java/cn/reghao/autodop/common/mqtt/MqttSub.java

@@ -0,0 +1,19 @@
+package cn.reghao.autodop.common.mqtt;
+
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.*;
+
+/**
+ * @author reghao
+ * @date 2021-05-21 07:15:27
+ */
+@Slf4j
+public class MqttSub {
+    private static String topic = "test";
+
+    public static void main(String[] args) throws MqttException, InterruptedException {
+        Mqttc mqttc = new Mqttc();
+        mqttc.sub(topic);
+        log.info("已订阅来自 {} 的消息...", topic);
+    }
+}

+ 71 - 0
common/src/main/java/cn/reghao/autodop/common/mqtt/Mqttc.java

@@ -0,0 +1,71 @@
+package cn.reghao.autodop.common.mqtt;
+
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.*;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+
+/**
+ * @author reghao
+ * @date 2021-05-21 08:27:41
+ */
+@Slf4j
+public class Mqttc implements AutoCloseable {
+    private String broker = "tcp://localhost:1883";
+    private String username = "dev";
+    private String password = "Dev@123456";
+    private String clientId = "pub-client";
+    private MqttClient client;
+
+    public Mqttc() throws MqttException {
+        this.client = new MqttClient(broker, clientId, new MemoryPersistence());
+    }
+
+    private MqttConnectOptions connectOptions() {
+        MqttConnectOptions options = new MqttConnectOptions();
+        options.setCleanSession(true);
+        options.setUserName(username);
+        options.setPassword(password.toCharArray());
+        options.setConnectionTimeout(10);
+        options.setKeepAliveInterval(20);
+        return options;
+    }
+
+    @Override
+    public void close() throws MqttException {
+        client.close();
+    }
+
+    public void pub(String topic, String payload) throws MqttException {
+        client.connect(connectOptions());
+        MqttTopic mqttTopic = client.getTopic(topic);
+        MqttMessage message = new MqttMessage();
+        message.setQos(1);
+        message.setRetained(false);
+        message.setPayload(payload.getBytes());
+        MqttDeliveryToken token = mqttTopic.publish(message);
+        token.waitForCompletion();
+        client.disconnect();
+    }
+
+    public void sub(String topic) throws MqttException {
+        client.connect(connectOptions());
+        client.subscribe(topic);
+        client.setCallback(new MqttCallback() {
+            @Override
+            public void connectionLost(Throwable cause) {
+                log.error("conn lost {}", cause.getMessage());
+            }
+
+            @Override
+            public void messageArrived(String topic, MqttMessage message) {
+                log.info("thread {} - topic {}", Thread.currentThread().getName(), topic);
+                log.info("msg -> {}", message.toString());
+            }
+
+            @Override
+            public void deliveryComplete(IMqttDeliveryToken token) {
+                log.info("token -> {}", token);
+            }
+        });
+    }
+}

+ 3 - 3
common/src/main/java/cn/reghao/autodop/common/result/ResultCode.java

@@ -7,9 +7,9 @@ package cn.reghao.autodop.common.result;
  * @date 2019-10-17 16:18:25
  */
 public enum ResultCode {
-    SUCCESS(0, "操作成功"),
-    FAIL(1, "操作失败"),
-    ERROR(-1, "操作错误");
+    SUCCESS(0, "成功"),
+    FAIL(1, "失败"),
+    ERROR(-1, "错误");
 
     private int code;
     private String msg;

+ 43 - 94
common/src/main/java/cn/reghao/autodop/common/shell/ShellExecutor.java

@@ -1,14 +1,6 @@
 package cn.reghao.autodop.common.shell;
 
-import cn.reghao.autodop.common.utils.text.TextFile;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import java.io.*;
 import java.util.UUID;
 
 /**
@@ -16,116 +8,73 @@ import java.util.UUID;
  * @date 2019-08-20 23:45:06
  */
 public class ShellExecutor {
-    private final String PATH;
-    private final String SHELL;
-    private TextFile textFile;
+    private ProcessBuilder pb;
 
     public ShellExecutor() {
-        this.PATH = System.getenv("PATH");
-        this.SHELL = System.getenv("SHELL");
-        this.textFile = new TextFile();
+        this.pb = new ProcessBuilder();
     }
 
     /**
-     * 执行 shell 命令
-     * TODO 执行命令前设置 PATH 环境变量
+     * 执行 shell 命令/脚本
      *
-     * @param dir 执行命令所处的目录
-     * @param cmd shell 命令
-     * @param longLog shell 命令是否会输出长日志(长日志会重定向到一个临时文件)
+     * @param cmd shell 命令或脚本
+     * @param dir 工作目录
      * @return
      * @date 2020-11-09 下午11:22
      */
-    public ShellResult execCommand(String dir, String cmd, boolean longLog) throws Exception {
-        if (dir == null) {
-            dir = System.getProperty("user.home");
-        }
-
-        List<String> list = new ArrayList<>();
-        list.add("cd " + dir);
-        String logfile = "";
-        if (longLog) {
-            logfile = System.getProperty("java.io.tmpdir") + "/" + UUID.randomUUID().toString() + ".log";
-            list.add(cmd + " > " + logfile + " 2>&1");
-        } else {
-            list.add(cmd);
-        }
-        String scriptPath = System.getProperty("java.io.tmpdir") + "/" + UUID.randomUUID().toString() + ".sh";
-        textFile.write(scriptPath, list);
-
-        ProcessBuilder pb = new ProcessBuilder("sh", scriptPath);
-        ShellResult shellResult = exec(pb);
-        if (longLog) {
-            if (shellResult.hasError()) {
-                shellResult.setStderr(textFile.readFile(logfile));
-            } else {
-                shellResult.setStdout(textFile.readFile(logfile));
-            }
+    public ShellResult exec(String cmd, String dir) throws IOException, InterruptedException {
+        String[] cmdarray = cmd.split("\\s+");
+        String output = System.getProperty("java.io.tmpdir") + "/" + UUID.randomUUID().toString() + ".out";
+        File ofile = new File(output);
+        ofile.createNewFile();
+
+        pb.command(cmdarray)
+                // 将标准错误合并到标准输出
+                .redirectErrorStream(true)
+                // 将所有输出重定向到文件
+                .redirectOutput(ofile);
+        if (dir != null) {
+            pb.directory(new File(dir));
         }
 
+        ShellResult shellResult = exec(pb, ofile);
+        ofile.delete();
         return shellResult;
     }
 
-    /**
-     * 执行 shell 脚本
-     *
-     * @param scriptPath shell 脚本绝对路径
-     * @param args 日志文件以 .log 为后缀,且必须为数组的第一个元素(若存在日志文件)
-     * @return
-     * @date 2020-11-09 下午7:22
-     */
-    public ShellResult execScript(String scriptPath, String... args) throws Exception {
-        String logfile = System.getProperty("java.io.tmpdir") + "/" + UUID.randomUUID().toString() + ".log";
-        List<String> commands = new ArrayList<>();
-        commands.add("sh");
-        commands.add(scriptPath);
-        commands.add(logfile);
-        commands.addAll(Arrays.asList(args));
-
-        ProcessBuilder pb = new ProcessBuilder(commands);
-        ShellResult shellResult = exec(pb);
-        // 读取日志文件的内容
-        if (shellResult.hasError()) {
-            shellResult.setStderr(textFile.readFile(logfile));
-        } else {
-            shellResult.setStdout(textFile.readFile(logfile));
-        }
-
-        return shellResult;
-    }
+    private ShellResult exec(ProcessBuilder pb, File ofile) throws IOException, InterruptedException {
+        Process newProcess = pb.start();
+        ProcessHandle handle = newProcess.toHandle();
+        long pid = handle.pid();
+        System.out.println(pid);
 
-    private ShellResult exec(ProcessBuilder pb) throws Exception {
-        Process p = pb.start();
-        // 等待子进程结束
-        int exitCode = p.waitFor();
-        ShellResult shellResult = new ShellResult();
+        // 父进程等待子进程结束
+        int exitCode = newProcess.waitFor();
+        ShellResult shellResult = new ShellResult(exitCode);
         shellResult.setExitCode(exitCode);
-        if (exitCode == 0) {
-            shellResult.setStdout(output(p.getInputStream()));
-        } else {
-            shellResult.setStderr(output(p.getErrorStream()));
-        }
+        shellResult.setOutput(output(ofile));
         return shellResult;
     }
 
-    private String output(InputStream in) throws IOException {
-        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
-        StringBuilder out = new StringBuilder();
+    private String output(File ofile) throws IOException {
+        StringBuilder sb = new StringBuilder();
+        BufferedReader in =  new BufferedReader(new InputStreamReader(new FileInputStream(ofile)));
         String line;
-        while ((line = reader.readLine()) != null) {
-            out.append(line).append(System.lineSeparator());
+        while ((line = in.readLine()) != null) {
+            sb.append(line).append(System.lineSeparator());
         }
-        reader.close();
-
-        return out.toString();
+        in.close();
+        return sb.toString();
     }
 
     public static void main(String[] args) throws Exception {
-        String env = "/home/reghao/dev/env/dotnet/dotnet-sdk-5.0.100-linux-x64";
-        String dir = "/home/reghao/autodop/local-repo/content/ContentService/IQuizoo.ContentService";
-        String cmd = "dotnet publish";
+        String execBin = "/home/reghao/dev/env/dotnet/dotnet-sdk-5.0.100-linux-x64/dotnet";
+        String cmd = execBin + " publish";
+        String dir = "/home/reghao/autodop/compile-dir/content/IQuizoo.ContentService";
 
+        //cmd = "sleep 10";
         ShellExecutor shellExecutor = new ShellExecutor();
-        shellExecutor.execCommand(dir, cmd, true);
+        ShellResult shellResult = shellExecutor.exec(cmd, dir);
+        System.out.println();
     }
 }

+ 19 - 16
common/src/main/java/cn/reghao/autodop/common/shell/ShellResult.java

@@ -5,31 +5,34 @@ package cn.reghao.autodop.common.shell;
  * @date 2019-08-24 14:47:57
  */
 public class ShellResult {
-    private String stdout;
-    private String stderr;
     private int exitCode;
+    // 包含 stdout 和/或 stderr
+    private String output;
 
-    public String getStdout() {
-        return stdout;
-    }
-
-    public void setStdout(String stdout) {
-        this.stdout = stdout;
-    }
-
-    public String getStderr() {
-        return stderr;
+    public ShellResult(int exitCode) {
+        this.exitCode = exitCode;
     }
 
-    public void setStderr(String stderr) {
-        this.stderr = stderr;
+    /**
+     * 是否成功执行
+     *
+     * @param
+     * @return
+     * @date 2021-05-22 上午11:11
+     */
+    public boolean isSuccess() {
+        return exitCode == 0;
     }
 
     public void setExitCode(int exitCode) {
         this.exitCode = exitCode;
     }
 
-    public boolean hasError() {
-        return exitCode != 0;
+    public String getOutput() {
+        return output;
+    }
+
+    public void setOutput(String output) {
+        this.output = output;
     }
 }

+ 22 - 0
common/src/main/java/cn/reghao/autodop/common/utils/MachineId.java

@@ -0,0 +1,22 @@
+package cn.reghao.autodop.common.utils;
+
+import java.io.*;
+
+/**
+ * @author reghao
+ * @date 2021-05-20 15:45:28
+ */
+public class MachineId {
+    public static String id() {
+        File file = new File("/etc/machine-id");
+        try {
+            BufferedReader in =  new BufferedReader(new InputStreamReader(new FileInputStream(file)));
+            String line = in.readLine();
+            in.close();
+            return line;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 39 - 0
common/src/main/java/cn/reghao/autodop/common/utils/file/FileFingerprint.java

@@ -0,0 +1,39 @@
+package cn.reghao.autodop.common.utils.file;
+
+import org.apache.commons.codec.digest.DigestUtils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 文件指纹
+ *
+ * @author reghao
+ * @date 2021-01-14 21:07:17
+ */
+public class FileFingerprint implements FileHandler {
+    private Map<String, String> map = new HashMap<>();
+
+    @Override
+    public void handleFile(String filePath) throws IOException {
+        String sum = sha256sum(filePath);
+        if (map.containsKey(sum)) {
+            new File(filePath).delete();
+        } else {
+            map.putIfAbsent(sum, filePath);
+        }
+    }
+
+    public Map<String, String> map() {
+        return map;
+    }
+
+    public String sha256sum(String filepath) throws IOException {
+        File file = new File(filepath);
+        FileInputStream fileInputStream = new FileInputStream(file);
+        return DigestUtils.sha256Hex(fileInputStream);
+    }
+}

+ 11 - 0
common/src/main/java/cn/reghao/autodop/common/utils/file/FileHandler.java

@@ -0,0 +1,11 @@
+package cn.reghao.autodop.common.utils.file;
+
+import java.io.IOException;
+
+/**
+ * @author reghao
+ * @date 2021-03-11 10:01:42
+ */
+public interface FileHandler {
+    void handleFile(String filePath) throws IOException;
+}

+ 95 - 0
common/src/main/java/cn/reghao/autodop/common/utils/file/FileOps.java

@@ -0,0 +1,95 @@
+package cn.reghao.autodop.common.utils.file;
+
+import cn.reghao.autodop.common.shell.ShellExecutor;
+import cn.reghao.autodop.common.shell.ShellResult;
+
+import java.io.IOException;
+import java.nio.file.*;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 文件相关操作
+ *
+ * @author reghao
+ * @date 2021-01-15 00:43:41
+ */
+public class FileOps {
+    private String cmd = "ffprobe -select_streams v -show_entries format=duration,size,bit_rate,filename -show_streams -v quiet -of csv=\"p=0\" -of json -i ";
+    private ShellExecutor shellExecutor = new ShellExecutor();
+    private List<ShellResult> list = new ArrayList<>();
+    private Map<String, ShellResult> map = new HashMap<>();
+    private FileFingerprint fileFingerprint = new FileFingerprint();
+
+    void walkDir(Path path) throws IOException {
+        final String BLANK = "";
+        if (path.toString().equals(BLANK)) {
+            throw new IOException("CAN NOT specify a BLANK path");
+        }
+
+        Files.walkFileTree(path, new FileVisitor<>() {
+            @Override
+            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+                return FileVisitResult.CONTINUE;
+            }
+
+            @Override
+            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+                String filePath = file.toString();
+                //fileFingerprint.handleFile(filePath);
+                try {
+                    /*ShellResult shellResult = shellExecutor.exec(cmd + filePath);
+                    map.put(filePath, shellResult);*/
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+                return FileVisitResult.CONTINUE;
+            }
+
+            @Override
+            public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
+                return FileVisitResult.CONTINUE;
+            }
+
+            @Override
+            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+                return FileVisitResult.CONTINUE;
+            }
+        });
+    }
+
+    public Map<String, ShellResult> map() {
+        return this.map;
+    }
+
+    public String full2Half(String str) {
+        char[] chars = str.toCharArray();
+        for (int i = 0; i < chars.length; i++) {
+            if (chars[i] == 12288) {
+                chars[i] = ' ';
+            } else if (chars[i] >= ' ' && chars[i] <= 65372) {
+                chars[i] = (char) (chars[i] - 65248);
+            }
+        }
+
+        return String.valueOf(chars);
+    }
+
+    public static void main(String[] args) throws IOException {
+        String dir = "/home/reghao/data/videos/aaa";
+        FileOps fileOps = new FileOps();
+        Path path = Paths.get(dir);
+        fileOps.walkDir(path);
+        Map<String, ShellResult> map = fileOps.map();
+        Map<String, ShellResult> tmp = new HashMap<>();
+        map.forEach((k, v) -> {
+            if (!v.isSuccess()) {
+                tmp.put(k, v);
+            }
+        });
+        System.out.println();
+    }
+}

+ 1 - 1
dagent/src/main/java/cn/reghao/autodop/dagent/utils/amqp/DagentConsumer.java

@@ -22,7 +22,7 @@ import java.lang.management.ManagementFactory;
  * @date 2020-09-04 11:00:22
  */
 @Slf4j
-@Component
+//@Component
 public class DagentConsumer implements ChannelAwareMessageListener {
     private RabbitTemplate rabbitTemplate;
     private MachineDispatcher machineDispatcher;

+ 1 - 1
dagent/src/main/java/cn/reghao/autodop/dagent/utils/amqp/DagentConsumerConfig.java

@@ -19,7 +19,7 @@ import java.util.Map;
  * @author reghao
  * @date 2020-09-04 10:57:56
  */
-@Configuration
+//@Configuration
 public class DagentConsumerConfig {
     private DagentConsumer dagentConsumer;
 

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

@@ -6,6 +6,7 @@ package cn.reghao.autodop.dmaster.app.constant;
  * @author reghao
  * @date 2021-02-05 23:56:58
  */
+@Deprecated
 public enum BuildStage {
     update, compile, pack, done
 }

+ 93 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppPageController.java

@@ -0,0 +1,93 @@
+package cn.reghao.autodop.dmaster.app.controller;
+
+import cn.reghao.autodop.dmaster.app.constant.AppType;
+import cn.reghao.autodop.dmaster.app.constant.EnvType;
+import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
+import cn.reghao.autodop.dmaster.app.repository.config.AppOrchestrationRepository;
+import cn.reghao.autodop.dmaster.app.entity.AppBuilding;
+import cn.reghao.autodop.dmaster.app.entity.AppDeploying;
+import cn.reghao.autodop.dmaster.common.db.PageList;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2019-08-30 18:49:15
+ */
+@Slf4j
+@Api(tags = "应用页面接口")
+@Controller
+@RequestMapping("/app")
+public class AppPageController {
+    private AppOrchestrationRepository appRepository;
+
+    public AppPageController(AppOrchestrationRepository appRepository) {
+        this.appRepository = appRepository;
+    }
+
+    @ApiOperation(value = "构建页面")
+    @GetMapping("/build")
+    public String buildPage(Model model) {
+        String env = EnvType.test.name();
+        String appType = AppType.dotnetCore.name();
+        int page = 1;
+        int size = 10;
+        PageRequest pageRequest =
+                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
+
+        Page<AppOrchestration> appPage = appRepository.findByEnableTrueAndEnvAndAppType(env, appType, pageRequest);
+        List<AppBuilding> apps = appPage.getContent().stream()
+                .map(app -> new AppBuilding(app.getAppId(), app.getEnv(), app.getBranch()))
+                .collect(Collectors.toList());
+
+        PageList<AppBuilding> pageList = PageList.emptyPageList(appPage);
+        pageList.setList(apps);
+        model.addAttribute("list", pageList.getList());
+        model.addAttribute("page", appPage);
+        return "/app/build";
+    }
+
+    @ApiOperation(value = "部署页面")
+    @GetMapping("/deploy/{appId}")
+    public String deployPage(@PathVariable("appId") String appId, Model model) {
+        AppOrchestration app = appRepository.findByAppId(appId);
+        List<AppDeploying> list = new ArrayList<>();
+        /*PageList<AppBuilding> pageList = PageList.emptyPageList(appPage);
+        pageList.setList(apps);
+        model.addAttribute("list", pageList.getList());
+        model.addAttribute("page", pageList);*/
+
+        return "/app/deploy";
+    }
+
+    @ApiOperation(value = "构建部署日志页面")
+    @GetMapping("/log")
+    public String logPage(Model model) {
+        return "/app/log";
+    }
+
+    @ApiOperation(value = "运行状态页面")
+    @GetMapping("/status")
+    public String statusPage(Model model) {
+        return "/app/status";
+    }
+
+    @ApiOperation(value = "应用配置详情页面")
+    @GetMapping("/config/app/detail/{appId}")
+    public String appConfigPage(@PathVariable("appId") String appId, Model model) {
+        AppOrchestration app = appRepository.findByAppId(appId);
+        model.addAttribute("app", app);
+        return "/app/config/app/detail";
+    }
+}

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

@@ -1,12 +1,5 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
-import cn.reghao.autodop.dmaster.app.constant.EnvType;
-import cn.reghao.autodop.dmaster.app.entity.status.BuildDeployApp;
-import cn.reghao.autodop.dmaster.app.service.RefreshService;
-import cn.reghao.autodop.dmaster.app.vo.CurrentRunningCommit;
-import cn.reghao.autodop.dmaster.app.vo.SuccessfullyBuildVO;
-import cn.reghao.autodop.dmaster.app.service.BuildService;
-import cn.reghao.autodop.dmaster.common.db.PageList;
 import cn.reghao.autodop.dmaster.app.service.BuildDeployDispatcher;
 import cn.reghao.autodop.dmaster.utils.WebBody;
 import io.swagger.annotations.Api;
@@ -14,9 +7,6 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
-import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -28,47 +18,26 @@ import org.springframework.web.bind.annotation.*;
 @RestController
 @RequestMapping("/api/app/bd")
 public class BuildDeployController {
-    private BuildService buildService;
     private BuildDeployDispatcher buildDeployDispatcher;
-    private RefreshService refreshService;
 
-    public BuildDeployController(BuildService buildService,
-                                 BuildDeployDispatcher buildDeployDispatcher,
-                                 RefreshService refreshService) {
-        this.buildService = buildService;
+    public BuildDeployController(BuildDeployDispatcher buildDeployDispatcher) {
         this.buildDeployDispatcher = buildDeployDispatcher;
-        this.refreshService = refreshService;
-    }
-
-    @ApiOperation(value = "某个环境需要构建部署的应用列表")
-    @GetMapping("/list")
-    public ResponseEntity<String> buildList(@RequestParam("page") int page, @RequestParam("size") int size,
-                                            @RequestParam("env") String env) {
-        PageList<BuildDeployApp> pageList = buildService.buildList(page, size, EnvType.valueOf(env).name());
-        return ResponseEntity.ok().body(WebBody.success(pageList));
-    }
-
-    @ApiOperation(value = "刷新某个环境需要构建部署的应用列表")
-    @PostMapping("/list/refresh/{env}")
-    public ResponseEntity<String> refreshBuildList(@PathVariable("env") String env) {
-        refreshService.refreshBuildList(EnvType.valueOf(env).name());
-        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "构建部署应用")
     @ApiImplicitParams(@ApiImplicitParam(name="appId", value="应用 ID", paramType="query", dataType = "String"))
     @PostMapping("/update")
     public String buildAndDeploy(@RequestParam("appId") String appId) throws Exception {
-        BuildDeployApp buildDeployApp = buildDeployDispatcher.buildAndDeploy(appId, true);
-        return WebBody.success(buildDeployApp.vo());
+        buildDeployDispatcher.buildAndDeploy(appId, true);
+        return WebBody.success();
     }
 
     @ApiOperation(value = "构建应用")
     @ApiImplicitParams(@ApiImplicitParam(name="appId", value="应用 ID", paramType="query", dataType = "String"))
     @PostMapping("/build")
     public String build(@RequestParam("appId") String appId) throws Exception {
-        BuildDeployApp buildDeployApp = buildDeployDispatcher.buildAndDeploy(appId, false);
-        return WebBody.success(buildDeployApp.vo());
+        buildDeployDispatcher.buildAndDeploy(appId, false);
+        return WebBody.success();
     }
 
     @ApiOperation(value = "部署应用")
@@ -78,26 +47,7 @@ public class BuildDeployController {
     })
     @PostMapping("/deploy")
     public String deploy(@RequestParam("appId") String appId, @RequestParam("commitId") String commitId) {
-        BuildDeployApp buildDeployApp = buildDeployDispatcher.deploy(appId, commitId);
-        return WebBody.success(buildDeployApp.vo());
-    }
-
-    @GetMapping("/deployed_app")
-    public ResponseEntity<String> deployedApp(@RequestParam("appId") String appId,
-                                              @RequestParam("page") int page, @RequestParam("size") int size) {
-
-        PageList<CurrentRunningCommit> latestDeployedApps = buildService.deployedApp(appId, page, size);
-        return ResponseEntity.ok().body(WebBody.success(latestDeployedApps));
-    }
-
-    @ApiOperation(value = "某个应用成功的构建列表")
-    @GetMapping("/list/successfully")
-    public ResponseEntity<String> successfullyBuilds(@RequestParam("appId") String appId,
-                                            @RequestParam("page") int page,
-                                            @RequestParam("size") int size) {
-        PageRequest pageRequest =
-                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "createTime"));
-        PageList<SuccessfullyBuildVO> pageList = buildService.successfullyBuilds(appId, pageRequest);
-        return ResponseEntity.ok().body(WebBody.success(pageList));
+        buildDeployDispatcher.deploy(appId, commitId);
+        return WebBody.success();
     }
 }

+ 0 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/config/AppOrchestrationCrudService.java

@@ -53,7 +53,6 @@ public class AppOrchestrationCrudService implements CrudOps<AppOrchestration> {
         }
         app.setIsDelete(false);
         appRepository.save(app);
-        //buildDeployAppCrudService.insert(BuildDeployApp.of(app));
     }
 
     public void copy(String from, String to) throws Exception {
@@ -67,7 +66,6 @@ public class AppOrchestrationCrudService implements CrudOps<AppOrchestration> {
             toApp = (AppOrchestration) fromApp.clone();
             copyToDifferentBranch(toApp, to);
             appRepository.save(toApp);
-            //buildDeployAppCrudService.insert(BuildDeployApp.of(toApp));
         }
     }
 
@@ -105,7 +103,6 @@ public class AppOrchestrationCrudService implements CrudOps<AppOrchestration> {
             app.setUpdateTime(LocalDateTime.now());
             app.setIsDelete(false);
             appRepository.save(app);
-            //buildDeployAppCrudService.update(BuildDeployApp.of(app));
         }
     }
 

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/log/BuildLogCrudService.java

@@ -25,13 +25,13 @@ public class BuildLogCrudService implements CrudOps<BuildLog> {
 
     @Override
     public void insert(BuildLog buildLog) {
-        BuildLog entity =
+        /*BuildLog entity =
                 buildLogRepository.findByAppIdAndRepoAndCompilerAndPackerAndPackScriptAndCommitIdAndStatusCode(
                 buildLog.getAppId(), buildLog.getRepo(), buildLog.getCompiler(), buildLog.getPacker(),
                 buildLog.getPackScript(), buildLog.getCommitId(), buildLog.getStatusCode());
         if (entity == null) {
             buildLogRepository.save(buildLog);
-        }
+        }*/
     }
 
     @Override
@@ -43,7 +43,7 @@ public class BuildLogCrudService implements CrudOps<BuildLog> {
         PageList<BuildLog> pageList = new PageList<>();
         pageList.setTotalSize(page1.getTotalElements());
         pageList.setTotalPages(page1.getTotalPages());
-        pageList.setList(page1.getContent().stream().map(BuildLog::vo).collect(Collectors.toList()));
+        //pageList.setList(page1.getContent().stream().map(BuildLog::vo).collect(Collectors.toList()));
         return pageList;
     }
 }

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

@@ -0,0 +1,40 @@
+package cn.reghao.autodop.dmaster.app.entity;
+
+import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import java.time.LocalDateTime;
+
+/**
+ * @author reghao
+ * @date 2021-05-21 09:57:35
+ */
+@NoArgsConstructor
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Entity
+public class AppBuilding extends BaseEntity<Integer> {
+    private String appId;
+    private String env;
+    private String branch;
+    private String commitId;
+    private LocalDateTime commitTime;
+    private String buildResult;
+    private LocalDateTime buildTime;
+    private String buildBy;
+
+    public AppBuilding(String appId, String env, String branch) {
+        this.appId = appId;
+        this.env = env;
+        this.branch = branch;
+    }
+
+    public AppBuilding from(BuildLog buildLog) {
+        AppBuilding appBuilding = new AppBuilding();
+        return appBuilding;
+    }
+}

+ 18 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/AppDeploying.java

@@ -0,0 +1,18 @@
+package cn.reghao.autodop.dmaster.app.entity;
+
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.Entity;
+
+/**
+ * @author reghao
+ * @date 2021-05-21 09:57:35
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Entity
+public class AppDeploying extends BaseEntity<Integer> {
+    private String appBuildingId;
+}

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

@@ -0,0 +1,13 @@
+package cn.reghao.autodop.dmaster.app.entity;
+
+import lombok.Data;
+
+/**
+ * @author reghao
+ * @date 2021-05-21 16:25:02
+ */
+@Data
+public class BuildResult {
+    private int code;
+    private String msg;
+}

+ 18 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/BuildTime.java

@@ -0,0 +1,18 @@
+package cn.reghao.autodop.dmaster.app.entity;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author reghao
+ * @date 2021-05-21 16:42:38
+ */
+@Data
+public class BuildTime {
+    // ms 时间戳
+    private Long updateTotalTime;
+    private Long compileTotalTime;
+    private Long packTotalTime;
+    private LocalDateTime buildTime;
+}

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/CompilerConfig.java

@@ -19,6 +19,7 @@ import javax.persistence.Entity;
 @EqualsAndHashCode(callSuper = false)
 @Entity
 public class CompilerConfig extends BaseEntity<Integer> {
+    private String machineId;
     @Column(nullable = false)
     private String type;
     @Column(nullable = false, unique = true)

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/PackerConfig.java

@@ -19,6 +19,7 @@ import javax.persistence.Entity;
 @EqualsAndHashCode(callSuper = false)
 @Entity
 public class PackerConfig extends BaseEntity<Integer> {
+    private String machineId;
     @Column(nullable = false)
     private String type;
     @Column(nullable = false, unique = true)

+ 17 - 38
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildLog.java

@@ -1,15 +1,14 @@
 package cn.reghao.autodop.dmaster.app.entity.log;
 
+import cn.reghao.autodop.dmaster.app.entity.BuildResult;
+import cn.reghao.autodop.dmaster.app.entity.BuildTime;
 import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
+import cn.reghao.autodop.dmaster.app.service.bd.tools.repo.CommitInfo;
 import cn.reghao.autodop.dmaster.common.orm.BaseDocument;
-import cn.reghao.autodop.dmaster.app.constant.BuildStage;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springframework.data.mongodb.core.mapping.Document;
 
-import javax.persistence.Column;
-import java.time.LocalDateTime;
-
 /**
  * 应用构建日志
  *
@@ -20,51 +19,31 @@ import java.time.LocalDateTime;
 @EqualsAndHashCode(callSuper = false)
 @Document("BuildLog")
 public class BuildLog extends BaseDocument {
-    @Column(nullable = false, unique = true)
     private String appId;
-    @Column(nullable = false)
     private String appType;
-    @Column(nullable = false)
     private String env;
-    @Column(nullable = false)
     private String repo;
-    @Column(nullable = false)
     private String compiler;
-    @Column(nullable = false)
     private String packer;
-    @Column(nullable = false)
     private String packScript;
-
-    private BuildStage stage;
-    private String commitId;
-    private LocalDateTime commitTime;
     private String packagePath;
-    // ms 时间戳
-    private Long updateTotalTime;
-    private Long compileTotalTime;
-    private Long packTotalTime;
-    private LocalDateTime buildTime;
-    // 0 - 成功 1 - 失败
-    private Integer statusCode;
-    private String result;
 
-    public BuildLog vo() {
-        this.setId(null);
-        this.setIsDelete(null);
-        this.setCreateTime(null);
-        this.setUpdateTime(null);
-        return this;
-    }
+    private CommitInfo commitInfo;
+    private BuildTime buildTime;
+    private BuildResult buildResult;
 
-    public static BuildLog of(AppOrchestration appOrchestration) {
+    public static BuildLog from(AppOrchestration app) {
         BuildLog buildLog = new BuildLog();
-        buildLog.setAppId(appOrchestration.getAppId());
-        buildLog.setAppType(appOrchestration.getAppType());
-        buildLog.setEnv(appOrchestration.getEnv());
-        buildLog.setRepo(appOrchestration.getBuildConfig().getRepoAuthConfig().getName());
-        buildLog.setCompiler(appOrchestration.getBuildConfig().getCompilerConfig().getName());
-        buildLog.setPacker(appOrchestration.getBuildConfig().getPackerConfig().getName());
-        buildLog.setPackScript(appOrchestration.getPackScript());
+        buildLog.setAppId(app.getAppId());
+        buildLog.setAppType(app.getAppType());
+        buildLog.setEnv(app.getEnv());
+        buildLog.setRepo(app.getBuildConfig().getRepoAuthConfig().getName());
+        buildLog.setCompiler(app.getBuildConfig().getCompilerConfig().getName());
+        buildLog.setPacker(app.getBuildConfig().getPackerConfig().getName());
+        buildLog.setPackScript(app.getPackScript());
+
+        buildLog.setBuildTime(new BuildTime());
+        buildLog.setBuildResult(new BuildResult());
         return buildLog;
     }
 }

+ 4 - 15
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/CommitLog.java

@@ -2,13 +2,9 @@ package cn.reghao.autodop.dmaster.app.entity.log;
 
 import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.service.bd.tools.repo.CommitInfo;
-import cn.reghao.autodop.dmaster.common.orm.BaseDocument;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import org.springframework.data.mongodb.core.mapping.Document;
 
-import javax.persistence.Column;
-import javax.persistence.Transient;
 import java.util.List;
 
 /**
@@ -19,19 +15,15 @@ import java.util.List;
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
-@Document("CommitLog")
-public class CommitLog extends BaseDocument {
-    @Column(nullable = false, unique = true)
+@Deprecated
+public class CommitLog {
     private String appId;
-    @Column(nullable = false, unique = true)
     private String env;
-    @Column(nullable = false, unique = true)
     private String repo;
     private String remote;
     private String branch;
     private String local;
     // 代码是否更新
-    @Transient
     private boolean isUpdate;
     private String commitId;
     private String commitAuthor;
@@ -40,15 +32,12 @@ public class CommitLog extends BaseDocument {
     private Long msCommitTime;
     private List<ChangedFile> changedFiles;
 
+    @Deprecated
     public CommitLog vo() {
-        this.setId(null);
-        this.setIsDelete(null);
-        this.setCreateTime(null);
-        this.setUpdateTime(null);
         return this;
     }
 
-    public static CommitLog of (AppOrchestration app, CommitInfo commitInfo) {
+    public static CommitLog from(AppOrchestration app, CommitInfo commitInfo) {
         CommitLog commitLog = new CommitLog();
         commitLog.setAppId(app.getAppId());
         commitLog.setEnv(app.getEnv());

+ 2 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/DeployLog.java

@@ -1,6 +1,5 @@
 package cn.reghao.autodop.dmaster.app.entity.log;
 
-import cn.reghao.autodop.common.dagent.app.api.data.DeployedAppStatus;
 import cn.reghao.autodop.dmaster.common.orm.BaseDocument;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -27,6 +26,7 @@ public class DeployLog extends BaseDocument {
     private Integer statusCode;
     private String result;
 
+    @Deprecated
     public DeployLog vo() {
         this.setId(null);
         this.setIsDelete(null);
@@ -35,18 +35,9 @@ public class DeployLog extends BaseDocument {
         return this;
     }
 
-    public static DeployLog of(BuildLog buildLog) {
+    public static DeployLog from(BuildLog buildLog) {
         DeployLog deployLog = new DeployLog();
         deployLog.setBuildLog(buildLog);
         return deployLog;
     }
-
-    public DeployedAppStatus toDeployedAppStatus(DeployLog deployLog) {
-        DeployedAppStatus deployedAppStatus = new DeployedAppStatus();
-        deployedAppStatus.setMachineId(deployLog.getMachineId());
-        deployedAppStatus.setAppId(deployLog.getBuildLog().getAppId());
-        deployedAppStatus.setEnv(deployLog.getBuildLog().getEnv());
-        deployedAppStatus.setCommitId(deployLog.getBuildLog().getCommitId());
-        return deployedAppStatus;
-    }
 }

+ 1 - 114
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/status/BuildDeployApp.java

@@ -1,18 +1,11 @@
 package cn.reghao.autodop.dmaster.app.entity.status;
 
-import cn.reghao.autodop.dmaster.app.constant.BuildDeployResult;
-import cn.reghao.autodop.dmaster.app.constant.BuildDeployType;
-import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
-import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
-import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import javax.persistence.*;
 import java.time.LocalDateTime;
-import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * 需要构建部署的应用,是 AppOrchestration 的一个镜像,跟随 AppOrchestration 的变化而改变
@@ -23,6 +16,7 @@ import java.util.stream.Collectors;
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Entity
+@Deprecated
 public class BuildDeployApp extends BaseEntity<Integer> {
     @Column(nullable = false, unique = true)
     private String appId;
@@ -47,111 +41,4 @@ public class BuildDeployApp extends BaseEntity<Integer> {
         this.setUpdateTime(null);
         return this;
     }
-
-    public static BuildDeployApp of(AppOrchestration app) {
-        BuildDeployApp buildDeployApp = new BuildDeployApp();
-        buildDeployApp.setAppId(app.getAppId());
-        buildDeployApp.setAppType(app.getAppType());
-        buildDeployApp.setEnv(app.getEnv());
-        buildDeployApp.setEnable(app.getEnable());
-        return buildDeployApp;
-    }
-
-    public static BuildDeployApp deployResult(BuildLog buildLog, int statusCode, String result) {
-        BuildDeployApp buildDeployApp = new BuildDeployApp();
-        buildDeployApp.setAppId(buildLog.getAppId());
-        buildDeployApp.setAppType(buildLog.getAppType());
-        buildDeployApp.setEnv(buildLog.getEnv());
-        buildDeployApp.setEnable(true);
-        buildDeployApp.setCommitId(buildLog.getCommitId());
-        buildDeployApp.setCommitTime(buildLog.getCommitTime());
-        buildDeployApp.setBdType(BuildDeployType.deploy.getName());
-        buildDeployApp.setBdTime(buildLog.getBuildTime());
-        buildDeployApp.setStatusCode(statusCode);
-        buildDeployApp.setResult(result);
-        return buildDeployApp;
-    }
-
-    public static BuildDeployApp result(String appId, BuildDeployType bdType, int statusCode, String result) {
-        BuildDeployApp buildDeployApp = new BuildDeployApp();
-        buildDeployApp.setAppId(appId);
-        buildDeployApp.setBdType(bdType.getName());
-        buildDeployApp.setStatusCode(statusCode);
-        buildDeployApp.setResult(result);
-        return buildDeployApp;
-    }
-
-    public static BuildDeployApp onBuilding(String appId) {
-        BuildDeployApp buildDeployApp = new BuildDeployApp();
-        buildDeployApp.setAppId(appId);
-        buildDeployApp.setBdType(BuildDeployType.build.getName());
-        buildDeployApp.setStatusCode(0);
-        buildDeployApp.setResult(BuildDeployResult.onBuilding.getName());
-        return buildDeployApp;
-    }
-
-    public static BuildDeployApp onDeploying(String appId) {
-        BuildDeployApp buildDeployApp = new BuildDeployApp();
-        buildDeployApp.setAppId(appId);
-        buildDeployApp.setBdType(BuildDeployType.deploy.getName());
-        buildDeployApp.setStatusCode(0);
-        buildDeployApp.setResult(BuildDeployResult.onDeploying.getName());
-        return buildDeployApp;
-    }
-
-    public static BuildDeployApp of(BuildLog buildLog) {
-        BuildDeployApp buildDeployApp = new BuildDeployApp();
-        buildDeployApp.setAppId(buildLog.getAppId());
-        buildDeployApp.setAppType(buildLog.getAppType());
-        buildDeployApp.setEnv(buildLog.getEnv());
-        buildDeployApp.setEnable(true);
-        buildDeployApp.setCommitId(buildLog.getCommitId());
-        buildDeployApp.setCommitTime(buildLog.getCommitTime());
-        buildDeployApp.setBdType(BuildDeployType.build.getName());
-        buildDeployApp.setBdTime(buildLog.getBuildTime());
-
-        buildDeployApp.setStatusCode(buildLog.getStatusCode());
-        if (buildLog.getStatusCode() != 0) {
-            String errDetail = buildLog.getResult();
-            if (errDetail.length() > 100) {
-                buildDeployApp.setResult(errDetail.substring(0, 100));
-            } else {
-                buildDeployApp.setResult(errDetail);
-            }
-        } else {
-            buildDeployApp.setResult(buildLog.getResult());
-        }
-
-        return buildDeployApp;
-    }
-
-    public static BuildDeployApp of(List<DeployLog> deployLogs) {
-        // TODO deployLogs 不为空
-        DeployLog deployLog = deployLogs.get(0);
-        BuildLog buildLog = deployLog.getBuildLog();
-
-        BuildDeployApp buildDeployApp = new BuildDeployApp();
-        buildDeployApp.setAppId(buildLog.getAppId());
-        buildDeployApp.setAppType(buildLog.getAppType());
-        buildDeployApp.setEnv(buildLog.getEnv());
-        buildDeployApp.setEnable(true);
-        buildDeployApp.setCommitId(buildLog.getCommitId());
-        buildDeployApp.setCommitTime(buildLog.getCommitTime());
-        buildDeployApp.setBdType(BuildDeployType.deploy.getName());
-        buildDeployApp.setBdTime(deployLog.getDeployTime());
-
-        List<String> deployFailure = deployLogs.stream()
-                .filter(log -> log.getStatusCode() != 0)
-                .map(DeployLog::getResult)
-                .collect(Collectors.toList());
-        if (!deployFailure.isEmpty()) {
-            buildDeployApp.setStatusCode(1);
-            buildDeployApp.setResult(deployFailure.toString());
-        } else {
-            buildDeployApp.setStatusCode(0);
-            buildDeployApp.setResult(BuildDeployResult.deployDone.getName());
-        }
-
-        return buildDeployApp;
-    }
 }

+ 7 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/config/AppOrchestrationRepository.java

@@ -16,6 +16,13 @@ import java.util.List;
  * @date 2020-01-21 14:53:03
  */
 public interface AppOrchestrationRepository extends JpaRepository<AppOrchestration, Long>, JpaSpecificationExecutor<AppOrchestration> {
+    List<AppOrchestration> findByEnableTrueAndEnv(String env);
+    Page<AppOrchestration> findByEnableTrueAndEnv(String env, Pageable pageable);
+    List<AppOrchestration> findByEnableTrueAndEnvAndAppType(String env, String appType);
+    Page<AppOrchestration> findByEnableTrueAndEnvAndAppType(String env, String appType, Pageable pageable);
+
+    AppOrchestration findByAppId(String appId);
+
     List<AppOrchestration> findAllByIsDeleteFalseAndEnableTrueAndEnv(String env);
     List<AppOrchestration> findAllByIsDeleteFalseAndEnableTrueAndAppType(String appType);
     Page<AppOrchestration> findByIsDeleteFalse(Pageable pageable);

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

@@ -1,25 +1,18 @@
 package cn.reghao.autodop.dmaster.app.service;
 
-import cn.reghao.autodop.common.utils.DateTimeConverter;
 import cn.reghao.autodop.dmaster.app.cache.BuildDeployCache;
-import cn.reghao.autodop.dmaster.app.constant.BuildDeployResult;
-import cn.reghao.autodop.dmaster.app.constant.BuildStage;
 import cn.reghao.autodop.dmaster.app.entity.config.deploy.DeployConfig;
 import cn.reghao.autodop.dmaster.app.entity.log.*;
-import cn.reghao.autodop.dmaster.app.entity.status.BuildDeployApp;
 import cn.reghao.autodop.dmaster.app.interceptor.AppIntegrateReinitInterceptor;
+import cn.reghao.autodop.dmaster.app.repository.log.BuildLogRepository;
 import cn.reghao.autodop.dmaster.app.service.bd.AppIntegrate;
-import cn.reghao.autodop.dmaster.app.service.bd.tools.repo.CommitInfo;
 import cn.reghao.autodop.dmaster.app.service.bd.AppDeployer;
 import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
-import cn.reghao.autodop.dmaster.app.service.log.BuildDeployLogConsumer;
-import cn.reghao.autodop.common.utils.ExceptionUtil;
 import cn.reghao.autodop.dmaster.utils.notifier.NotifyService;
 import cn.reghao.autodop.dmaster.common.thread.ThreadPoolWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.*;
 
@@ -33,26 +26,25 @@ import java.util.concurrent.*;
 @Slf4j
 @Service
 public class BuildDeployDispatcher {
+    private BuildLogRepository buildLogRepository;
     private AppIntegrateReinitInterceptor reinitInterceptor;
     // TODO 多线程访问的集合
     private Set<String> onBuilding = new ConcurrentSkipListSet<>();
     private Set<String> onDeploying = new ConcurrentSkipListSet<>();
     private Map<String, AppIntegrate> integrateMap = new ConcurrentHashMap<>();
     private BuildDeployCache cache;
-    private BuildDeployLogConsumer logConsumer;
-    private NotifyService notifyService;
+    private ExecutorService threadPool;
     private AppDeployer appDeployer;
+    private NotifyService notifyService;
 
     public BuildDeployDispatcher(AppIntegrateReinitInterceptor reinitInterceptor, BuildDeployCache cache,
-                                 BuildDeployLogConsumer log, NotifyService notify, AppDeployer appDeployer) {
+                                 BuildLogRepository buildLogRepository, NotifyService notify, AppDeployer appDeployer) {
         this.reinitInterceptor = reinitInterceptor;
         this.cache = cache;
-        this.logConsumer = log;
+        this.buildLogRepository = buildLogRepository;
         this.notifyService = notify;
         this.appDeployer = appDeployer;
-
-        ExecutorService threadPool = ThreadPoolWrapper.threadPool("build-deploy");
-        threadPool.execute(log);
+        this.threadPool = ThreadPoolWrapper.threadPool("build-deploy");
     }
 
     /**
@@ -62,9 +54,9 @@ public class BuildDeployDispatcher {
      * @return
      * @date 2021-02-06 上午1:46
      */
-    public BuildDeployApp buildAndDeploy(String appId, boolean isDeploy) throws Exception {
+    public void buildAndDeploy(String appId, boolean isDeploy) throws Exception {
         if (!onBuilding.add(appId)) {
-            return BuildDeployApp.onBuilding(appId);
+            //
         }
 
         AppIntegrate appIntegrate = integrateMap.get(appId);
@@ -83,74 +75,16 @@ public class BuildDeployDispatcher {
             integrateMap.put(appId, appIntegrate);
         }
 
-        // TODO 抛出异常时从 onBuilding 和 onDeploying 中移除当前应用
-        BuildLog buildLog = buildPipeline(appIntegrate);
-        logConsumer.addBuildLog(buildLog);
-        onBuilding.remove(appId);
-        BuildDeployApp buildDeployApp;
-        if (buildLog.getStatusCode() == 0 && isDeploy) {
-            buildDeployApp = deployApp(buildLog);
-        } else {
-            buildDeployApp = BuildDeployApp.of(buildLog);
-        }
-        logConsumer.addBuildDeployApp(buildDeployApp);
-        return buildDeployApp;
-    }
-
-    /**
-     * 更新 -> 编译 -> 打包 -> 构建流水线
-     * TODO 检测超时,避免阻塞
-     *
-     * @date 2019-11-07 下午10:14
-     */
-    private BuildLog buildPipeline(AppIntegrate appIntegrate) {
-        BuildLog buildLog = BuildLog.of(appIntegrate.app());
-        long start = System.currentTimeMillis();
-        // TODO 只使用一个 try-catch
-        try {
-            CommitInfo commitInfo = appIntegrate.update();
-            buildLog.setCommitId(commitInfo.getCommitId());
-            buildLog.setCommitTime(DateTimeConverter.localDateTime(commitInfo.getMsCommitTime()));
-            buildLog.setUpdateTotalTime(System.currentTimeMillis()-start);
-
-            CommitLog commitLog = CommitLog.of(appIntegrate.app(), commitInfo);
-            logConsumer.addCommitLog(commitLog);
-        } catch (Exception e) {
-            buildException(buildLog, BuildStage.update, e);
-            return buildLog;
-        }
-
-        try {
-            start = System.currentTimeMillis();
-            appIntegrate.compile();
-            buildLog.setCompileTotalTime(System.currentTimeMillis()-start);
-        } catch (Exception e) {
-            buildException(buildLog, BuildStage.compile, e);
-            return buildLog;
-        }
-
-        try {
-            start = System.currentTimeMillis();
-            String packagePath = appIntegrate.pack();
-            buildLog.setPackagePath(packagePath);
-            buildLog.setPackTotalTime(System.currentTimeMillis()-start);
-        } catch (Exception e) {
-            buildException(buildLog, BuildStage.pack, e);
-            return buildLog;
-        }
-
-        buildLog.setStage(BuildStage.done);
-        buildLog.setStatusCode(0);
-        buildLog.setResult(BuildDeployResult.buildDone.getName());
-        buildLog.setBuildTime(LocalDateTime.now());
-        return buildLog;
-    }
-
-    private void buildException(BuildLog buildLog, BuildStage stage, Exception e) {
-        buildLog.setStage(stage);
-        buildLog.setStatusCode(1);
-        buildLog.setResult(ExceptionUtil.errorMsg(e));
-        buildLog.setBuildTime(LocalDateTime.now());
+        BuildSupplier supplier = new BuildSupplier(appIntegrate);
+        CompletableFuture.supplyAsync(supplier, threadPool)
+                .thenApply(buildLog -> {
+                    buildLogRepository.save(buildLog);
+                    onBuilding.remove(appId);
+                    if (isDeploy) {
+                    }
+                    return true;
+                })
+                .complete(true);
     }
 
     /**
@@ -160,27 +94,22 @@ public class BuildDeployDispatcher {
      * @return
      * @date 2021-02-06 上午2:02
      */
-    private BuildDeployApp deployApp(BuildLog buildLog) {
+    private void deployApp(BuildLog buildLog) {
         String appId = buildLog.getAppId();
         if (!onDeploying.add(appId)) {
-            return BuildDeployApp.onDeploying(appId);
         }
 
         List<DeployConfig> deployConfigs = cache.findByAppId(buildLog.getAppId()).getDeployConfigs();
         if (deployConfigs.isEmpty()) {
-            return BuildDeployApp.deployResult(buildLog, 0, BuildDeployResult.noDeployConfig.getName());
         }
 
         List<DeployLog> deployLogs = appDeployer.deploy(buildLog, deployConfigs);
         onDeploying.remove(buildLog.getAppId());
-        deployLogs.forEach(deployLog -> logConsumer.addDeployLog(deployLog));
 
         // TODO 部署完成后发出通知
         /*NotifyReceiver notifyReceiver = cache.findByAppId(buildLog.getAppId()).getNotifyReceiver();
         DeployNotifyMsg deployNotifyMsg = DeployNotifyMsg.deployNotifyMsg(deployLogs);
         notifyService.notify(notifyReceiver, deployNotifyMsg);*/
-
-        return BuildDeployApp.of(deployLogs);
     }
 
     /**
@@ -190,10 +119,6 @@ public class BuildDeployDispatcher {
      * @return
      * @date 2021-02-25 下午10:35
      */
-    public BuildDeployApp deploy(String appId, String commitId) {
-        BuildLog buildLog = cache.findByAppIdAndCommitId(appId, commitId);
-        BuildDeployApp buildDeployApp = deployApp(buildLog);
-        logConsumer.addBuildDeployApp(buildDeployApp);
-        return buildDeployApp;
+    public void deploy(String appId, String commitId) {
     }
 }

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

@@ -118,7 +118,7 @@ public class BuildService {
         pageList.setTotalPages(buildLogs.getTotalPages());
         pageList.setTotalSize(buildLogs.getTotalElements());
         pageList.setHasNext(buildLogs.hasNext());
-        pageList.setList(buildLogs.stream().map(BuildLog::vo).collect(Collectors.toList()));
+        //pageList.setList(buildLogs.stream().map(BuildLog::vo).collect(Collectors.toList()));
         return pageList;
     }
 
@@ -131,7 +131,7 @@ public class BuildService {
         pageList.setTotalPages(buildLogs.getTotalPages());
         pageList.setTotalSize(buildLogs.getTotalElements());
         pageList.setHasNext(buildLogs.hasNext());
-        pageList.setList(buildLogs.stream().map(BuildLog::vo).collect(Collectors.toList()));
+        //pageList.setList(buildLogs.stream().map(BuildLog::vo).collect(Collectors.toList()));
         return pageList;
     }
 

+ 58 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildSupplier.java

@@ -0,0 +1,58 @@
+package cn.reghao.autodop.dmaster.app.service;
+
+import cn.reghao.autodop.common.result.ResultCode;
+import cn.reghao.autodop.common.utils.ExceptionUtil;
+import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
+import cn.reghao.autodop.dmaster.app.service.bd.AppIntegrate;
+import cn.reghao.autodop.dmaster.app.service.bd.tools.repo.CommitInfo;
+
+import java.time.LocalDateTime;
+import java.util.function.Supplier;
+
+/**
+ * 更新 -> 编译 -> 打包 -> 构建流水线
+ *
+ * @author reghao
+ * @date 2021-05-22 13:28:31
+ */
+public class BuildSupplier implements Supplier<BuildLog> {
+    private AppIntegrate appIntegrate;
+
+    public BuildSupplier(AppIntegrate appIntegrate) {
+        this.appIntegrate = appIntegrate;
+    }
+
+    @Override
+    public BuildLog get() {
+        BuildLog buildLog = BuildLog.from(appIntegrate.app());
+        long start = System.currentTimeMillis();
+        try {
+            CommitInfo commitInfo = appIntegrate.update();
+            buildLog.setCommitInfo(commitInfo);
+            buildLog.getBuildTime().setUpdateTotalTime(System.currentTimeMillis()-start);
+
+            start = System.currentTimeMillis();
+            appIntegrate.compile();
+            buildLog.getBuildTime().setCompileTotalTime(System.currentTimeMillis()-start);
+
+            start = System.currentTimeMillis();
+            String packagePath = appIntegrate.pack();
+            buildLog.setPackagePath(packagePath);
+            buildLog.getBuildTime().setPackTotalTime(System.currentTimeMillis()-start);
+        } catch (Exception e) {
+            buildException(buildLog, e);
+            return buildLog;
+        }
+
+        buildLog.getBuildResult().setCode(ResultCode.SUCCESS.getCode());
+        buildLog.getBuildResult().setMsg(ResultCode.SUCCESS.getMsg());
+        buildLog.getBuildTime().setBuildTime(LocalDateTime.now());
+        return buildLog;
+    }
+
+    private void buildException(BuildLog buildLog, Exception e) {
+        buildLog.getBuildResult().setCode(ResultCode.FAIL.getCode());
+        buildLog.getBuildResult().setMsg(ExceptionUtil.errorMsg(e));
+        buildLog.getBuildTime().setBuildTime(LocalDateTime.now());
+    }
+}

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

@@ -80,10 +80,6 @@ public class RefreshService {
      * @date 2021-03-04 下午2:08
      */
     private void refresh(List<AppOrchestration> appOrchestrations) {
-        List<BuildDeployApp> list = appOrchestrations.stream().map(BuildDeployApp::of).collect(Collectors.toList());
-        if (!list.isEmpty()) {
-            buildDeployAppCrudService.batchInsert(list);
-        }
     }
 
     /**

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

@@ -77,7 +77,7 @@ public class AppDeployer {
         LocalDateTime deployTime = LocalDateTime.now();
         List<DeployLog> deployLogs = new ArrayList<>();
         rpcResultMap.forEach((machineId, rpcResult) -> {
-            DeployLog deployLog = DeployLog.of(buildLog);
+            DeployLog deployLog = DeployLog.from(buildLog);
             deployLog.setMachineId(machineId);
             String machineIpv4 = machineIpv4(machineId);
             deployLog.setMachineIpv4(machineIpv4);
@@ -89,7 +89,7 @@ public class AppDeployer {
                         JsonConverter.jsonToObject(rpcResult.getResult(), DeployedAppStatus.class);
                 deployedAppStatus.setAppType(buildLog.getAppType());
                 deployedAppStatus.setEnv(buildLog.getEnv());
-                deployedAppStatus.setCommitId(buildLog.getCommitId());
+                deployedAppStatus.setCommitId(buildLog.getCommitInfo().getCommitId());
                 deployedAppStatus.setMachineIpv4(machineIpv4);
 
                 logConsumer.addAppStatus(deployedAppStatus);

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/DeployNotifyMsg.java

@@ -34,8 +34,8 @@ public class DeployNotifyMsg {
         sb.append("应用更新").append(System.lineSeparator());
         sb.append("# 应用: ").append(buildLog.getAppId()).append(System.lineSeparator());
         sb.append("# 环境: ").append(buildLog.getEnv()).append(System.lineSeparator());
-        sb.append("# 版本: ").append(buildLog.getCommitId()).append(System.lineSeparator());
-        sb.append("# 版本时间: ").append(DateTimeConverter.format(buildLog.getCommitTime()))
+        sb.append("# 版本: ").append(buildLog.getCommitInfo().getCommitId()).append(System.lineSeparator());
+        sb.append("# 版本时间: ").append(DateTimeConverter.format(buildLog.getCommitInfo().getMsCommitTime()))
                 .append(System.lineSeparator());
         sb.append("# 部署时间: ").append(DateTimeConverter.format(deployLog.getDeployTime()))
                 .append(System.lineSeparator());

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

@@ -22,9 +22,9 @@ public class ShellCompiler implements CodeCompiler {
 
     @Override
     public void compile(String appName, String appCompileHome) throws Exception {
-        ShellResult result = shell.execCommand(appCompileHome, compileCmd, true);
-        if (result.hasError()) {
-            throw new Exception(JsonConverter.objectToJson(result.getStderr()));
+        ShellResult result = shell.exec(compileCmd, appCompileHome);
+        if (!result.isSuccess()) {
+            throw new Exception(JsonConverter.objectToJson(result.getOutput()));
         }
     }
 }

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

@@ -25,10 +25,6 @@ public class BuildDeployLogConsumer implements Runnable {
         this.logService = logService;
     }
 
-    public void addCommitLog(CommitLog commitLog) {
-        logQueue.add(commitLog);
-    }
-
     public void addBuildLog(BuildLog buildLog) {
         logQueue.add(buildLog);
     }

+ 6 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/scheduler/ScriptBakJob.java

@@ -39,19 +39,19 @@ public class ScriptBakJob implements Job {
         app3BakLog.setApp3name(jobKey.getName());
         app3BakLog.setBakTime(DateTimeConverter.now());
         log.info("执行 {} 定时任务...", jobKey.getName());
-        try {
-            ShellResult shellResult = executor.execScript(script);
-            if (!shellResult.hasError()) {
+        /*try {
+            ShellResult shellResult = executor.exec(script);
+            if (shellResult.isSuccess()) {
                 app3BakLog.setSuccess(true);
-                app3BakLog.setResult(shellResult.getStdout());
+                app3BakLog.setResult(shellResult.getOutput());
             } else {
                 app3BakLog.setSuccess(false);
-                app3BakLog.setResult(shellResult.getStderr());
+                app3BakLog.setResult(shellResult.getOutput());
             }
             mongoCrud.insert(app3BakLog);
         } catch (Exception e) {
             app3BakLog.setSuccess(false);
             app3BakLog.setResult(e.getMessage());
-        }
+        }*/
     }
 }

+ 9 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/db/PageList.java

@@ -32,4 +32,13 @@ public class PageList<T> {
         pageList.setList(page.getContent());
         return pageList;
     }
+
+    public static <T> PageList<T> emptyPageList(Page page) {
+        PageList<T> pageList = new PageList<>();
+        pageList.setPageSize(page.getSize());
+        pageList.setTotalSize(page.getTotalElements());
+        pageList.setTotalPages(page.getTotalPages());
+        pageList.setHasNext(page.hasNext());
+        return pageList;
+    }
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/WebBody.java

@@ -34,7 +34,7 @@ public class WebBody {
         objectMapper.registerModule(javaTimeModule);
     }
 
-    private Integer code;
+    private int code;
     private String msg;
     private String timestamp;
     private Object data;

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/AppPageController.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/AppPagesController.java

@@ -16,10 +16,10 @@ import org.springframework.web.bind.annotation.*;
 @Api(tags = "应用页面")
 @RequestMapping("/app")
 @Controller
-public class AppPageController {
+public class AppPagesController {
     private final UserService userService;
 
-    public AppPageController(UserService userService) {
+    public AppPagesController(UserService userService) {
         this.userService = userService;
     }
 
@@ -31,6 +31,6 @@ public class AppPageController {
         PageList<User> pageList = userService.findByPage(page, size);
         model.addAttribute("list", pageList.getList());
         model.addAttribute("page", pageList);
-        return "/app/bd";
+        return "build";
     }
 }

+ 44 - 34
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/service/ResourceService.java

@@ -32,7 +32,7 @@ public class ResourceService {
     }
 
     /**
-     * 某个 menu 的位置调整后,调整同一组内其他 menu 的相对位置
+     * TODO 某个 menu 的位置调整后,调整同一组内其他 menu 的相对位置
      *
      * @param pid 组 ID
      * @param pos 当前 menu 的最新位置
@@ -85,60 +85,70 @@ public class ResourceService {
 
         Menu menuEntity = optionalMenu.get();
         int oldPos = menuEntity.getPos();
-        int newPos = menu.getPos()+1;
+        int newPos = menu.getPos();
         // menu 位置发生改变
-        if (oldPos != newPos) {
-            adjustPosition1(menu.getPid(), oldPos, newPos);
+        if (oldPos != newPos+1) {
+            Map<Integer, Menu> map = menuRepository.findByPid(menu.getPid()).stream()
+                    .collect(Collectors.toMap(Menu::getPos, menu1 -> menu1));
+            int size = map.size();
+
+            // 元素移动到最后一位
+            if (newPos == size) {
+                List<Menu> tmpList = new ArrayList<>();
+                for (int i = oldPos+1; i <= newPos; i++) {
+                    Menu tmp = map.get(i);
+                    tmp.setPos(tmp.getPos()-1);
+                    tmpList.add(tmp);
+                }
+                menuRepository.saveAll(tmpList);
+                menu.setUpdateTime(LocalDateTime.now());
+                menuRepository.save(menu);
+                return true;
+            } else if (newPos < size) {
+                adjustPosition1(map, oldPos, newPos+1);
+            } else {
+                return false;
+            }
         }
 
-        menu.setPos(newPos);
+        menu.setPos(newPos+1);
         menu.setUpdateTime(LocalDateTime.now());
-        //menuRepository.save(menu);
+        menuRepository.save(menu);
         return true;
     }
 
     /**
-     * 调整组内 menu 的顺序
+     * TODO 调整组内 menu 的顺序
      *
      * @param
      * @return
      * @date 2021-05-19 下午2:15
      */
-    private void adjustPosition1(int pid, int oldPos, int newPos) {
-        Map<Integer, Menu> map = menuRepository.findByPid(pid).stream()
-                .collect(Collectors.toMap(Menu::getPos, menu1 -> menu1));
-        int start = Math.min(oldPos, newPos);
-        int end = Math.max(oldPos, newPos);
-        System.out.println();
-        /*if (newPos == 0) {
-            // menu 移到第一位
-            List<Menu> tmpList = new ArrayList<>();
-            // menu 原位置之前的元素位置均向后移一位,之后的元素位置保持不变
-            for (int i = 1; i < oldPos; i++) {
-                Menu tmp = map.get(i);
-                tmp.setPos(tmp.getPos()+1);
-                tmpList.add(tmp);
-            }
-            menuRepository.saveAll(tmpList);
-        } else if (newPos == map.size()) {
-            // menu 移到最后一位
-            List<Menu> tmpList = new ArrayList<>();
-            // menu 原位置之前的元素位置保持不变,之后的元素位置向前移一位
-            for (int i = oldPos+1; i <= map.size(); i++) {
+    private void adjustPosition1(Map<Integer, Menu> map, int oldPos, int newPos) {
+        List<Menu> tmpList = new ArrayList<>();
+        if (oldPos < newPos) {
+            // 元素向后移动
+            // oldPos 前面的元素保持不变
+            // newPos 后面的元素保持不变
+            // (oldPos, newPos] 之间的元素向前移动一位
+
+            for (int i = oldPos+1; i <= newPos; i++) {
                 Menu tmp = map.get(i);
                 tmp.setPos(tmp.getPos()-1);
                 tmpList.add(tmp);
             }
-            menuRepository.saveAll(tmpList);
         } else {
-            List<Menu> tmpList = new ArrayList<>();
-            for (int i = oldPos+1; i <= newPos; i++) {
+            // 元素向前移动
+            // newPos 前面的元素保持不变
+            // oldPos 后面的元素保持不变
+            // [newPos, oldPos) 之间的元素向后移动一位
+            for (int i = newPos; i < oldPos; i++) {
                 Menu tmp = map.get(i);
-                tmp.setPos(tmp.getPos()-1);
+                tmp.setPos(tmp.getPos()+1);
                 tmpList.add(tmp);
             }
-            menuRepository.saveAll(tmpList);
-        }*/
+        }
+        menuRepository.saveAll(tmpList);
     }
 
     public void deleteResource(Menu menu) {

+ 21 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/utility/PageUtil.java

@@ -16,7 +16,7 @@ import java.util.List;
 public class PageUtil {
     private String paramHref;
 
-    public boolean pageInit(PageList pageList, HttpServletRequest request){
+    public boolean pageInit1(PageList pageList, HttpServletRequest request){
         if (pageList.getTotalSize() > pageList.getPageSize() && pageList.getList().size() != 0){
 
             // 获取分页参数地址
@@ -36,6 +36,26 @@ public class PageUtil {
         return false;
     }
 
+    public boolean pageInit(Page page, HttpServletRequest request){
+        if (page.getTotalElements() > page.getSize() && page.getNumberOfElements() != 0){
+
+            // 获取分页参数地址
+            String servletPath = request.getServletPath();
+            StringBuffer param = new StringBuffer(servletPath + "?");
+            Enumeration em = request.getParameterNames();
+            while (em.hasMoreElements()) {
+                String name = (String) em.nextElement();
+                if(!"page".equals(name)){
+                    String value = request.getParameter(name);
+                    param.append(name + "=" + value + "&");
+                }
+            }
+            this.paramHref = param.toString();
+            return true;
+        }
+        return false;
+    }
+
     public List<String> pageCode(Page page){
         int number = page.getNumber()+1;
         int totalPages = page.getTotalPages();

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

@@ -7,8 +7,8 @@ spring:
     mongodb:
       uri: mongodb://192.168.0.220/devops_tdb
   rabbitmq:
-    host: mq.srv.iquizoo.com
+    host: 192.168.0.70
     port: 5672
-    username: iquizoo-mq1
-    password: z2pT1PXR
+    username: azy
+    password: 12345678
     virtual-host: /

+ 1 - 0
dmaster/src/main/resources/static/js/main.js

@@ -1,3 +1,4 @@
+// layui 配置
 layui.use(['element', 'form', 'layer', 'upload'], function () {
     var $ = layui.jquery;
     var element = layui.element; //加载element模块

+ 86 - 0
dmaster/src/main/resources/templates/app/build.html

@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:mo="https://gitee.com/aun/Timo">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})"></head>
+<body class="timo-layout-page">
+<div class="layui-card">
+    <div class="layui-card-header timo-card-header">
+        <span><i class="fa fa-bars"></i> 构建部署</span>
+        <i class="layui-icon layui-icon-refresh refresh-btn"></i>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-row timo-card-screen put-row">
+            <div class="pull-left layui-form-pane timo-search-box">
+                <div class="layui-inline">
+                    <label class="layui-form-label">环境</label>
+                    <div class="layui-input-block timo-search-status">
+                        <select class="timo-search-select" name="status" mo:dict="SEARCH_STATUS"
+                                mo-selected="${param.env}"></select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">应用</label>
+                    <div class="layui-input-block">
+                        <input type="text" name="appId" th:value="${param.appId}" placeholder="请输入应用"
+                               autocomplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <button class="layui-btn timo-search-btn">
+                        <i class="fa fa-search"></i>
+                    </button>
+                </div>
+            </div>
+        </div>
+        <div class="timo-table-wrap">
+            <table class="layui-table timo-table">
+                <thead>
+                <tr>
+                    <th class="timo-table-checkbox">
+                        <label class="timo-checkbox"><input type="checkbox">
+                            <i class="layui-icon layui-icon-ok"></i></label>
+                    </th>
+                    <th class="sortable" data-field="appId">应用</th>
+                    <th class="sortable" data-field="branch">分支</th>
+                    <th class="sortable" data-field="commitId">版本</th>
+                    <th class="sortable" data-field="commitTime">提交时间</th>
+                    <th class="sortable" data-field="buildResult">构建结果</th>
+                    <th class="sortable" data-field="buildTime">构建时间</th>
+                    <th class="sortable" data-field="buildBy">构建用户</th>
+                    <th>操作</th>
+                </tr>
+                </thead>
+                <tbody>
+                <tr th:each="item:${list}">
+                    <td><label class="timo-checkbox"><input type="checkbox" th:value="${item.appId}">
+                        <i class="layui-icon layui-icon-ok"></i></label></td>
+                    <td>
+                        <a class="open-popup" data-title="应用配置详情" data-size="1200,600" href="#"
+                           th:text="${item.appId}" th:attr="data-url=@{'/app/config/app/detail/'+${item.appId}}"></a>
+                    </td>
+                    <td th:text="${item.branch}">分支</td>
+                    <td th:text="${item.commitId}">版本</td>
+                    <td th:text="${item.commitTime}">提交时间</td>
+                    <td th:text="${item.buildResult}">构建结果</td>
+                    <td th:text="${item.buildTime}">构建时间</td>
+                    <td th:text="${item.buildBy}">构建用户</td>
+                    <td>
+                        <a class="open-popup" data-title="更新" th:attr="data-url=@{'/system/user/edit/'+${item.appId}}"
+                           data-size="600,570" href="#">更新</a>
+                        <a class="open-popup" data-title="构建" th:attr="data-url=@{'/system/user/detail/'+${item.appId}}"
+                           data-size="800,600" href="#">构建</a>
+                        <a class="open-popup" data-title="应用部署详情" th:attr="data-url=@{'/app/deploy/' + ${item.appId}}"
+                           data-size="800,600" href="#">部署</a>
+                    </td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+        <div th:replace="/common/fragment :: page"></div>
+    </div>
+</div>
+<script th:replace="/common/template :: script"></script>
+<script type="text/javascript">
+</script>
+</body>
+</html>

+ 100 - 0
dmaster/src/main/resources/templates/app/config/app/add.html

@@ -0,0 +1,100 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:mo="https://gitee.com/aun/Timo">
+
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
+    <link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
+</head>
+<body>
+<div class="layui-form timo-compile">
+    <form th:action="@{/system/user/save}">
+        <input type="hidden" name="id" th:if="${user}" th:value="${user.id}"/>
+        <div class="layui-form-item" th:if="!${user}">
+            <label class="layui-form-label required">用户名</label>
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="username"  placeholder="请输入用户名">
+            </div>
+        </div>
+        <div class="layui-form-item" th:if="${user}">
+            <label class="layui-form-label required">用户名</label>
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="username"  placeholder="请输入用户名" disabled="disabled" th:value="${user.username}">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label required">用户昵称</label>
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="nickname" placeholder="请输入用户昵称" th:value="${user?.nickname}">
+            </div>
+        </div>
+        <div class="layui-form-item" th:if="!${user}">
+            <label class="layui-form-label required">用户密码</label>
+            <div class="layui-input-inline">
+                <input class="layui-input" type="password" name="password" placeholder="请输入用户密码">
+                <!--<img id="img" src="/imgs/icons/icon-visible.png" onclick="hideOrShow()">-->
+            </div>
+        </div>
+        <div class="layui-form-item" th:if="!${user}">
+            <label class="layui-form-label required">确认密码</label>
+            <div class="layui-input-inline">
+                <input class="layui-input" type="password" name="confirm" placeholder="再一次输入密码">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">电话号码</label>
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="phone" placeholder="请输入电话号码" th:value="${user?.phone}">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">邮箱</label>
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="email" placeholder="请输入邮箱" th:value="${user?.email}">
+            </div>
+        </div>
+
+        <div class="layui-form-item">
+            <label class="layui-form-label">选择性别</label>
+            <div class="layui-input-inline">
+                <input type="radio" name="gender" value="1" title="男" checked><div class="layui-unselect layui-form-radio layui-form-radioed"><i class="layui-anim layui-icon"></i><div>男</div></div>
+                <input type="radio" name="gender" value="2" title="女" th:checked="${user?.gender} eq 2"><div class="layui-unselect layui-form-radio"><i class="layui-anim layui-icon"></i><div>女</div></div>
+            </div>
+        </div>
+        <div class="layui-form-item layui-form-text">
+            <label class="layui-form-label">备注</label>
+            <div class="layui-input-block">
+                <textarea placeholder="请输入内容" class="layui-textarea" name="remark">[[${user?.remark}]]</textarea>
+            </div>
+        </div>
+        <div class="layui-form-item timo-finally">
+            <button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
+            <button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
+        </div>
+    </form>
+</div>
+<script th:replace="/common/template :: script"></script>
+<script type="text/javascript" th:src="@{/js/plugins/jquery-2.2.4.min.js}"></script>
+<script type="text/javascript" th:src="@{/lib/zTree_v3/js/jquery.ztree.core.min.js}"></script>
+<script type="text/javascript" th:src="@{/js/timoTree.js}"></script>
+<script type="text/javascript">
+    // 树形菜单
+    $.fn.selectTree();
+</script>
+<script type="text/javascript">
+    var img = document.getElementById("img");
+    var passwd = document.getElementById("LAY-user-login-password");
+
+    function hideOrShow() {
+        if (passwd.type == "password") {
+            passwd.type = "text";
+             // 闭眼图片
+            img.src = "../layui/images/icon-invisible.png";
+        } else {
+            passwd.type = "password";
+             // 睁眼图片
+            img.src = "../layui/images/icon-visible.png";
+        }
+    }
+</script>
+</body>
+</html>

+ 79 - 0
dmaster/src/main/resources/templates/app/config/app/detail.html

@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})"></head>
+<body>
+    <div class="timo-detail-page">
+        <div class="timo-detail-title">基本信息</div>
+        <table class="layui-table timo-detail-table">
+            <tbody>
+            <tr>
+                <th>应用</th>
+                <td th:text="${app.appId}"></td>
+                <th>描述</th>
+                <td th:text="${app.description}"></td>
+                <th>类型</th>
+                <td th:text="${app.appType}"></td>
+            </tr>
+            <tr>
+                <th>仓库</th>
+                <td th:text="${app.appRepo}"></td>
+                <th>分支</th>
+                <td th:text="${app.branch}"></td>
+                <th>环境</th>
+                <td th:text="${app.env}"></td>
+            </tr>
+            </tbody>
+        </table>
+        <div class="timo-detail-title">构建配置</div>
+        <table class="layui-table timo-detail-table">
+            <tbody>
+            <tr>
+                <th>仓库类型</th>
+                <td th:text="${app.buildConfig.repoAuthConfig.type}"></td>
+                <th>仓库名字</th>
+                <td th:text="${app.buildConfig.repoAuthConfig.name}"></td>
+                <th>认证类型</th>
+                <td th:text="${app.buildConfig.repoAuthConfig.authType}"></td>
+            </tr>
+            <tr>
+                <th>编译器类型</th>
+                <td th:text="${app.buildConfig.compilerConfig.type}"></td>
+                <th>编译器名字</th>
+                <td th:text="${app.buildConfig.compilerConfig.name}"></td>
+                <th>编译脚本</th>
+                <td th:text="${app.buildConfig.compilerConfig.compileCmd}"></td>
+            </tr>
+            <tr>
+                <th>打包类型</th>
+                <td th:text="${app.buildConfig.packerConfig.type}"></td>
+                <th>打包名字</th>
+                <td th:text="${app.buildConfig.packerConfig.name}"></td>
+                <th>打包路径</th>
+                <td th:text="${app.buildConfig.packerConfig.targetPath}"></td>
+            </tr>
+            </tbody>
+        </table>
+        <div class="timo-detail-title">部署配置</div>
+        <table class="layui-table timo-detail-table">
+            <tbody>
+            <tr>
+                <th>仓库</th>
+                <td th:text="${app.appRepo}"></td>
+            </tr>
+            </tbody>
+        </table>
+        <div class="timo-detail-title">运行配置</div>
+        <table class="layui-table timo-detail-table">
+            <tbody>
+            <tr>
+                <th>HTTP 端口</th>
+                <td th:text="${app.runningConfig.httpPort}"></td>
+                <th>健康检查</th>
+                <td th:text="${app.runningConfig.healthCheck}"></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+<script th:replace="/common/template :: script"></script>
+</body>
+</html>

+ 4 - 3
dmaster/src/main/resources/templates/app/bd.html → dmaster/src/main/resources/templates/app/config/app/index.html

@@ -1,6 +1,7 @@
 <!DOCTYPE html>
 <html xmlns:th="http://www.thymeleaf.org"
-      xmlns:mo="https://gitee.com/aun/Timo">
+      xmlns:mo="https://gitee.com/aun/Timo"
+      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
 <head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
     <link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
 </head>
@@ -37,7 +38,7 @@
             <div class="pull-right screen-btn-group">
                 <div class="btn-group-left">
                     <button class="layui-btn open-popup-param" data-title="修改密码" th:attr="data-url=@{/system/user/pwd}"
-                            data-size="456,242">
+                             data-size="456,242">
                         <i class="fa fa-refresh"></i> 修改密码
                     </button>
                     <button class="layui-btn open-popup-param" data-type="radio" data-title="角色分配"
@@ -48,7 +49,7 @@
                 </div>
                 <div class="btn-group-right">
                     <button class="layui-btn open-popup" data-title="添加用户" th:attr="data-url=@{/system/user/add}"
-                            data-size="auto">
+                             data-size="auto">
                         <i class="fa fa-plus"></i> 添加
                     </button>
                     <div class="btn-group">

+ 56 - 0
dmaster/src/main/resources/templates/app/deploy.html

@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})"></head>
+<body class="timo-layout-page">
+<div class="layui-card">
+    <div class="layui-card-body">
+        <div class="timo-table-wrap">
+            <table class="layui-table timo-table">
+                <thead>
+                <tr>
+                    <th class="timo-table-checkbox">
+                        <label class="timo-checkbox"><input type="checkbox">
+                            <i class="layui-icon layui-icon-ok"></i></label>
+                    </th>
+                    <th class="sortable" data-field="appId">应用</th>
+                    <th class="sortable" data-field="branch">分支</th>
+                    <th class="sortable" data-field="commitId">版本</th>
+                    <th class="sortable" data-field="commitTime">提交时间</th>
+                    <th class="sortable" data-field="buildResult">构建结果</th>
+                    <th class="sortable" data-field="buildTime">构建时间</th>
+                    <th class="sortable" data-field="buildBy">构建用户</th>
+                    <th>操作</th>
+                </tr>
+                </thead>
+                <tbody>
+                <tr th:each="item:${list}">
+                    <td><label class="timo-checkbox"><input type="checkbox" th:value="${item.appId}">
+                        <i class="layui-icon layui-icon-ok"></i></label></td>
+                    <td>
+                        <a class="open-popup" data-title="应用配置详情" data-size="1200,600" href="#"
+                           th:text="${item.appId}" th:attr="data-url=@{'/app/config/app/detail/'+${item.appId}}"></a>
+                    </td>
+                    <td th:text="${item.branch}">分支</td>
+                    <td th:text="${item.commitId}">版本</td>
+                    <td th:text="${item.commitTime}">提交时间</td>
+                    <td th:text="${item.buildResult}">构建结果</td>
+                    <td th:text="${item.buildTime}">构建时间</td>
+                    <td th:text="${item.buildBy}">构建用户</td>
+                    <td>
+                        <a class="open-popup" data-title="更新" th:attr="data-url=@{'/system/user/edit/'+${item.appId}}"
+                           data-size="600,570" href="#">更新</a>
+                        <a class="open-popup" data-title="构建" th:attr="data-url=@{'/system/user/detail/'+${item.appId}}"
+                           data-size="800,600" href="#">构建</a>
+                        <a class="open-popup" data-title="应用部署详情" th:attr="data-url=@{'/app/deploy/' + ${item.appId}}"
+                           data-size="800,600" href="#">部署</a>
+                    </td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+        <!--<div th:replace="/common/fragment :: page"></div>-->
+    </div>
+</div>
+<script th:replace="/common/template :: script"></script>
+</body>
+</html>

+ 16 - 0
dmaster/src/main/resources/templates/app/log.html

@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:mo="https://gitee.com/aun/Timo">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
+    <link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
+</head>
+<body class="timo-layout-page">
+<div class="layui-card">
+    <div class="layui-card-header timo-card-header">
+        <span><i class="fa fa-bars"></i> 构建部署日志</span>
+        <i class="layui-icon layui-icon-refresh refresh-btn"></i>
+    </div>
+</div>
+<script th:replace="/common/template :: script"></script>
+</body>
+</html>

+ 16 - 0
dmaster/src/main/resources/templates/app/status.html

@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:mo="https://gitee.com/aun/Timo">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
+    <link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
+</head>
+<body class="timo-layout-page">
+<div class="layui-card">
+    <div class="layui-card-header timo-card-header">
+        <span><i class="fa fa-bars"></i> 应用状态</span>
+        <i class="layui-icon layui-icon-refresh refresh-btn"></i>
+    </div>
+</div>
+<script th:replace="/common/template :: script"></script>
+</body>
+</html>

+ 1 - 1
dmaster/src/main/resources/templates/common/fragment.html

@@ -2,7 +2,7 @@
 <html xmlns:th="http://www.thymeleaf.org">
 <!-- 分页模块 -->
 <th:block th:fragment="page">
-    <div class="layui-row" th:if="${#pageUtil.pageInit(page,#request)}">
+    <div class="layui-row" th:if="${#pageUtil.pageInit(page, #request)}">
         <div class="layui-col-sm6">
             <div class="page-info">
                 <span>显示 [[${(page.number*page.size)+1}]]/[[${(page.number*page.size)+page.numberOfElements}]] 条,共 [[${page.totalElements}]] 条记录</span>

+ 24 - 11
dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/RefreshServiceTest.java

@@ -1,13 +1,11 @@
 package cn.reghao.autodop.dmaster.app.service;
 
-import cn.reghao.autodop.common.http.DefaultWebRequest;
-import cn.reghao.autodop.common.http.WebRequest;
-import cn.reghao.autodop.common.http.WebResponse;
 import cn.reghao.autodop.dmaster.DmasterApplication;
+import cn.reghao.autodop.dmaster.app.constant.AppType;
 import cn.reghao.autodop.dmaster.app.constant.EnvType;
-import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
-import cn.reghao.autodop.dmaster.app.entity.config.deploy.RunningConfig;
 import cn.reghao.autodop.dmaster.app.db.config.AppOrchestrationCrudService;
+import cn.reghao.autodop.dmaster.app.repository.config.AppOrchestrationRepository;
+import cn.reghao.autodop.dmaster.app.entity.AppBuilding;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
@@ -18,8 +16,8 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Slf4j
 @ActiveProfiles("dev")
@@ -30,12 +28,28 @@ class RefreshServiceTest {
     private RefreshService refreshService;
     @Autowired
     private AppOrchestrationCrudService appOrchestrationCrudService;
+    @Autowired
+    private AppOrchestrationRepository appRepository;
 
     @Test
-    void refreshBuildList() {
-        WebRequest webRequest = new DefaultWebRequest();
+    void buildList() {
+        String env = EnvType.test.name();
+        String appType = AppType.dotnetCore.name();
+
+        List<AppBuilding> apps = appRepository.findByEnableTrueAndEnv(env).stream()
+                .map(app -> new AppBuilding(app.getAppId(), app.getEnv(), app.getBranch()))
+                .collect(Collectors.toList());
+
+        List<AppBuilding> apps1 = appRepository.findByEnableTrueAndEnvAndAppType(env, appType).stream()
+                .map(app -> new AppBuilding(app.getAppId(), app.getEnv(), app.getBranch()))
+                .collect(Collectors.toList());
+        log.info("");
+    }
 
-        //refreshService.refreshBuildList("test");
+    @Test
+    void refreshBuildList() {
+        /*WebRequest webRequest = new DefaultWebRequest();
+        refreshService.refreshBuildList("test");
         List<AppOrchestration> list = appOrchestrationCrudService.find(EnvType.prod.name());
         List<HealthCheck> healthChecks = new ArrayList<>();
         list.forEach(appConfig -> {
@@ -48,8 +62,7 @@ class RefreshServiceTest {
             if (webResponse == null || webResponse.getStatusCode() != 200) {
                 log.error("{} 服务不可用,发出通知且尝试重新启动...", healthCheck.getApp());
             }
-        });
-
+        });*/
     }
 
     @AllArgsConstructor

+ 14 - 1
pom.xml

@@ -27,7 +27,7 @@
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <java.version>1.8</java.version>
+        <java.version>11</java.version>
     </properties>
 
     <repositories>
@@ -51,6 +51,19 @@
             <version>1.2.0</version>
         </dependency>
 
+        <!--<dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-integration</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.integration</groupId>
+            <artifactId>spring-integration-stream</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.integration</groupId>
+            <artifactId>spring-integration-mqtt</artifactId>
+        </dependency>-->
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-amqp</artifactId>