Просмотр исходного кода

应用日志接口走通,完成构建部署脚本

reghao 5 лет назад
Родитель
Сommit
23ad991943
29 измененных файлов с 404 добавлено и 146 удалено
  1. 11 0
      common/src/main/java/cn/reghao/autodop/common/deploy/LogLevel.java
  2. 11 0
      common/src/main/java/cn/reghao/autodop/common/deploy/LogType.java
  3. 14 6
      common/src/main/java/cn/reghao/autodop/common/dockerc/ContainerOps.java
  4. 52 28
      common/src/main/java/cn/reghao/autodop/common/dockerc/DockerClient.java
  5. 10 6
      common/src/main/java/cn/reghao/autodop/common/dockerc/HostConfig.java
  6. 15 0
      common/src/main/java/cn/reghao/autodop/common/dockerc/RestartPolicy.java
  7. 22 2
      common/src/main/java/cn/reghao/autodop/common/grpc/facade/AppService.java
  8. 1 0
      common/src/main/proto/common.proto
  9. 22 5
      dagent/src/main/java/cn/reghao/autodop/dagent/service/DockerAppServiceImpl.java
  10. 2 2
      dmaster/pom.xml
  11. 55 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppLogController.java
  12. 11 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppStatusController.java
  13. 0 39
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/LogController.java
  14. 5 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/AppDeploy.java
  15. 24 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/AppLog.java
  16. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/AppOrchestration.java
  17. 42 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppManager.java
  18. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppIntegrate.java
  19. 3 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/tools/updater/CodeUpdater.java
  20. 14 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/MonitorController.java
  21. 4 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/node/MachineController.java
  22. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/node/SysStatService.java
  23. 1 1
      dmaster/src/main/resources/application-test.yml
  24. 11 0
      dmaster/src/test/java/cn/reghao/autodop/dmaster/app/entity/orchestration/AppOrchestrationTest.java
  25. 13 0
      scripts/build-and-deploy.sh
  26. 22 13
      scripts/build.sh
  27. 0 27
      scripts/copy_to_remote.sh
  28. 27 0
      scripts/deploy.sh
  29. 8 7
      scripts/runner.sh

+ 11 - 0
common/src/main/java/cn/reghao/autodop/common/deploy/LogLevel.java

@@ -0,0 +1,11 @@
+package cn.reghao.autodop.common.deploy;
+
+/**
+ * 应用日志等级
+ *
+ * @author reghao
+ * @date 2019-10-18 14:31:29
+ */
+public enum LogLevel {
+    info, error;
+}

+ 11 - 0
common/src/main/java/cn/reghao/autodop/common/deploy/LogType.java

@@ -0,0 +1,11 @@
+package cn.reghao.autodop.common.deploy;
+
+/**
+ * 应用日志类型
+ *
+ * @author reghao
+ * @date 2019-10-18 14:31:29
+ */
+public enum LogType {
+    console, file;
+}

+ 14 - 6
common/src/main/java/cn/reghao/autodop/common/dockerc/ContainerOps.java

@@ -32,14 +32,22 @@ public interface ContainerOps {
     List<Container> ps(boolean isAll) throws DockerException;
 
     /**
-     * 容器日志
+     * 控制台日志
      *
-     * @param containerId 容器 ID
-     * @param type 日志类型 0 - 控制台日志 1 - info 2 - error
-     * @return 容器日志
-     * @date 2020-01-19 下午1:39
+     * @param
+     * @return
+     * @date 2020-05-19 上午10:57
+     */
+    List<String> consoleLog(String containerId, String logLevel);
+
+    /**
+     * 文件日志
+     *
+     * @param
+     * @return
+     * @date 2020-05-19 上午10:58
      */
-    List<String> logs(String containerId, int type) throws IOException;
+    List<String> fileLog(String containerId, String logLevel, String logPath) throws IOException;
 
     /**
      * 查看容器的详细信息

+ 52 - 28
common/src/main/java/cn/reghao/autodop/common/dockerc/DockerClient.java

@@ -1,12 +1,12 @@
 package cn.reghao.autodop.common.dockerc;
 
+import cn.reghao.autodop.common.deploy.LogLevel;
 import cn.reghao.autodop.common.dockerc.httpclient.UnixSocketClient;
 import cn.reghao.autodop.common.dockerc.httpclient.HttpClient;
 import cn.reghao.autodop.common.utils.JsonUtil;
 import cn.reghao.autodop.common.utils.security.Base64Util;
 import cn.reghao.autodop.common.utils.compression.TarUtil;
 import cn.reghao.autodop.common.utils.security.Md5Util;
-import cn.reghao.autodop.common.utils.text.TextFile;
 import com.google.gson.JsonObject;
 import io.netty.handler.codec.http.FullHttpResponse;
 import org.slf4j.Logger;
@@ -15,10 +15,10 @@ import org.slf4j.LoggerFactory;
 import java.io.*;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * Docker 客户端
- * TODO 执行完成后需要清理资源,关闭连接
  *
  * @author reghao
  * @date 2020-01-13 14:16:38
@@ -145,7 +145,11 @@ public class DockerClient implements ImageOps, ContainerOps, AutoCloseable {
     private String create(String name, String image) throws DockerException {
         String uri = DockerApi.createPost + "?name=" + name;
 
-        HostConfig hostConfig = HostConfig.builder().networkMode("host").build();
+        HostConfig hostConfig = HostConfig.builder()
+                .networkMode("host")
+                .restartPolicy()
+                .build();
+
         /*Map<String, String> volumes = new HashMap<>();
         volumes.put("/home/reghao/tmp/autodop/opt/logs", "/app/Logs");*/
         // TODO 挂载日志目录到宿主机
@@ -246,13 +250,20 @@ public class DockerClient implements ImageOps, ContainerOps, AutoCloseable {
         }
     }
 
+    /**
+     * 控制台日志
+     *
+     * @param
+     * @return
+     * @date 2020-05-19 上午10:26
+     */
     @Override
-    public List<String> logs(String containerId, int type) throws IOException {
+    public List<String> consoleLog(String containerId, String logLevel) {
+        LogLevel level = LogLevel.valueOf(logLevel);
         String uri = DockerApi.logsGet.replace("{}", containerId);
         FullHttpResponse response;
-        switch (type) {
-            case 0:
-                // TODO stdout 和 stderr 输出的编码问题,详见 https://docs.docker.com/engine/api/v1.40/#operation/ContainerAttach
+        switch (level) {
+            case info:
                 // stdout
                 String params = "?stdout=true&tail=500";
                 response = client.get(uri + params, null);
@@ -260,38 +271,51 @@ public class DockerClient implements ImageOps, ContainerOps, AutoCloseable {
                     String stdout = response.content().toString(StandardCharsets.UTF_8);
                     return Arrays.asList(stdout.split(System.lineSeparator()));
                 }
-                break;
-            case 1:
+            case error:
                 // stderr
-                params = "?stdout=true&tail=500";
+                params = "?stderr=true&tail=500";
                 response = client.get(uri + params, null);
                 if (response != null) {
                     String stderr = response.content().toString(StandardCharsets.UTF_8);
                     return Arrays.asList(stderr.split(System.lineSeparator()));
                 }
-                break;
-            case 2:
-                // info 日志
-                // TODO 通过 AppConfig 获取应用的日志路径
-                String logDir = "/app/Logs/Info";
-                String logFile = "/2020-01-19.log";
-                String relativePath = logDir + logFile;
-                return appLog(containerId, relativePath);
-            case 3:
-                // error 日志
-                logDir = "/app/Logs/Info";
-                logFile = "/2020-01-19.log";
-                relativePath = logDir + logFile;
-                return appLog(containerId, relativePath);
+            default:
+                return null;
         }
+    }
 
-        return null;
+    /**
+     * 文件日志
+     *
+     * @param
+     * @return
+     * @date 2020-05-19 上午10:26
+     */
+    @Override
+    public List<String> fileLog(String containerId, String logLevel, String logPath) throws IOException {
+        LogLevel level = LogLevel.valueOf(logLevel);
+        switch (level) {
+            case info:
+                // info 日志目录
+                return appLog(containerId, logPath);
+            case error:
+                // error 日志目录
+                return appLog(containerId, logPath);
+            default:
+                return null;
+        }
     }
 
     List<String> appLog(String containerId, String filePath) throws IOException {
-        String rootfs = rootfs(containerId);
-        ///rootfs = "/home/reghao/Downloads";
-        return new TextFile().tailRead(rootfs + filePath, 500);
+        String logDir = rootfs(containerId) + filePath;
+        File dir = new File(logDir);
+        if (!dir.exists()) {
+            return null;
+        } else {
+            return Arrays.stream(Objects.requireNonNull(dir.listFiles()))
+                    .map(File::getName)
+                    .collect(Collectors.toList());
+        }
     }
 
     @Override

+ 10 - 6
common/src/main/java/cn/reghao/autodop/common/dockerc/HostConfig.java

@@ -6,30 +6,34 @@ package cn.reghao.autodop.common.dockerc;
  */
 public class HostConfig {
     private String networkMode;
+    private RestartPolicy restartPolicy;
 
-    public HostConfig(Builder builder) {
+    private HostConfig(Builder builder) {
         this.networkMode = builder.networkMode;
+        this.restartPolicy = builder.restartPolicy;
     }
 
     public static Builder builder() {
         return new Builder();
     }
 
-    public static class Builder {
+    public static final class Builder {
         private String networkMode;
+        private RestartPolicy restartPolicy;
 
         public Builder() {
         }
 
-        private Builder(final HostConfig hostConfig) {
-            this.networkMode = hostConfig.networkMode;
-        }
-
         public Builder networkMode(final String networkMode) {
             this.networkMode = networkMode;
             return this;
         }
 
+        public Builder restartPolicy() {
+            this.restartPolicy = new RestartPolicy("on-failure", 5);
+            return this;
+        }
+
         public HostConfig build() {
             return new HostConfig(this);
         }

+ 15 - 0
common/src/main/java/cn/reghao/autodop/common/dockerc/RestartPolicy.java

@@ -0,0 +1,15 @@
+package cn.reghao.autodop.common.dockerc;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author reghao
+ * @date 2020-05-19 15:00:50
+ */
+@AllArgsConstructor
+@Data
+public class RestartPolicy {
+    private String name;
+    private int maximumRetryCount;
+}

+ 22 - 2
common/src/main/java/cn/reghao/autodop/common/grpc/facade/AppService.java

@@ -4,7 +4,6 @@ import cn.reghao.autodop.common.dockerc.DockerException;
 import cn.reghao.autodop.common.grpc.common.annotation.GrpcService;
 import cn.reghao.autodop.common.grpc.common.serializer.SerializerType;
 
-import java.io.IOException;
 import java.util.List;
 
 /**
@@ -17,5 +16,26 @@ public interface AppService {
     void start(String appId) throws DockerException;
     void stop(String appId) throws DockerException;
     void restart(String appId) throws DockerException;
-    List<String> log(String appId) throws DockerException, IOException;
+
+    /**
+     * 应用日志
+     * TODO 实现双向流
+     *
+     * @param appId 应用 ID
+     * @param logType 日志类型
+     * @param logLevel 日志等级
+     * @param logPath 日志文件在应用内的相对路径(仅适用于文件日志)
+     * @return
+     * @date 2020-05-19 上午10:37
+     */
+    List<String> log(String appId, String logType, String logLevel, String logPath) throws Exception;
+
+    /**
+     * 应用日志内容
+     *
+     * @param
+     * @return
+     * @date 2020-05-19 下午2:18
+     */
+    List<String> logcontent(String appId, String logType, String logLevel, String logfilePath) throws Exception;
 }

+ 1 - 0
common/src/main/proto/common.proto

@@ -4,6 +4,7 @@ option java_package = "cn.reghao.autodop.common.rpc";
 option java_outer_classname = "CommonGrpcService";
 option java_multiple_files = false;
 
+// 定义通用的请求/响应
 service Common {
     rpc handle (CommonRequest) returns (CommonResponse) {}
 }

+ 22 - 5
dagent/src/main/java/cn/reghao/autodop/dagent/service/DockerAppServiceImpl.java

@@ -1,12 +1,13 @@
 package cn.reghao.autodop.dagent.service;
 
+import cn.reghao.autodop.common.deploy.LogType;
 import cn.reghao.autodop.common.dockerc.DockerClient;
 import cn.reghao.autodop.common.dockerc.DockerException;
 import cn.reghao.autodop.common.grpc.facade.AppService;
+import cn.reghao.autodop.common.utils.text.TextFile;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.io.IOException;
 import java.util.List;
 
 /**
@@ -48,10 +49,27 @@ public class DockerAppServiceImpl implements AppService {
     }
 
     @Override
-    public List<String> log(String app) throws DockerException, IOException {
+    public List<String> log(String appId, String logType, String logLevel, String logPath) throws Exception {
         try (DockerClient docker = new DockerClient()) {
-            String containerId = docker.getIdByName(app);
-            return docker.logs(containerId, 0);
+            String containerId = docker.getIdByName(appId);
+            LogType type = LogType.valueOf(logType);
+            switch (type) {
+                case console:
+                    return docker.consoleLog(containerId, logLevel);
+                case file:
+                    return docker.fileLog(containerId, logLevel, logPath);
+                default:
+                    throw new Exception(type + " 日志类型不存在");
+            }
+        }
+    }
+
+    @Override
+    public List<String> logcontent(String appId, String logType, String logLevel, String logfilePath) throws Exception {
+        try (DockerClient docker = new DockerClient()) {
+            String containerId = docker.getIdByName(appId);
+            String rootfs = docker.rootfs(containerId);
+            return new TextFile().tailRead(rootfs + logfilePath, 500);
         }
     }
 
@@ -63,6 +81,5 @@ public class DockerAppServiceImpl implements AppService {
      * @date 2020-05-18 下午11:41
      */
     public void runningTime() {
-
     }
 }

+ 2 - 2
dmaster/pom.xml

@@ -155,7 +155,7 @@
         </extensions>
 
         <resources>
-            <resource>
+            <!--<resource>
                 <directory>src/main/resources</directory>
                 <filtering>true</filtering>
                 <excludes>
@@ -170,7 +170,7 @@
                     <include>static/layuix/font/**</include>
                     <include>static/layui/font/**</include>
                 </includes>
-            </resource>
+            </resource>-->
             <resource>
                 <directory>src/main/resources</directory>
                 <filtering>true</filtering>

+ 55 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppLogController.java

@@ -0,0 +1,55 @@
+package cn.reghao.autodop.dmaster.app.controller;
+
+import cn.reghao.autodop.dmaster.app.service.AppManager;
+import cn.reghao.autodop.dmaster.common.webresult.WebResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2020-02-28 11:33:23
+ */
+@Slf4j
+@Api(tags = "应用日志接口")
+@RestController
+@RequestMapping("/api/app")
+public class AppLogController {
+    private AppManager appManager;
+
+    public AppLogController(AppManager appManager) {
+        this.appManager = appManager;
+    }
+
+    @ApiOperation(value = "获取应用所有日志")
+    @ApiImplicitParams(
+            @ApiImplicitParam(name="appId", value="应用 ID", paramType="path", dataType = "String")
+    )
+    @GetMapping("/logs/{appId}")
+    public ResponseEntity<String> appLogs(@PathVariable("appId") String appId,
+                                          @RequestParam("logType") String logType,
+                                          @RequestParam("logLevel") String logLevel) throws Exception {
+        List<String> logs = appManager.log(appId, logType, logLevel);
+
+        return ResponseEntity.ok().body(WebResult.success(logs));
+    }
+
+    @ApiOperation(value = "获取应用日志内容")
+    @ApiImplicitParams(
+            @ApiImplicitParam(name="appId", value="应用 ID", paramType="path", dataType = "String")
+    )
+    @GetMapping("/logs/content/{appId}")
+    public ResponseEntity<String> appLog(@PathVariable("appId") String appId,
+                                         @RequestParam("logType") String logType,
+                                         @RequestParam("logLevel") String logLevel,
+                                         @RequestParam("logName") String logName) throws Exception {
+        List<String> logs = appManager.logcontent(appId, logType, logLevel, logName);
+        return ResponseEntity.ok().body(WebResult.success(logs));
+    }
+}

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

@@ -24,7 +24,17 @@ public class AppStatusController {
     public AppStatusController(AppManager appManager) {
         this.appManager = appManager;
     }
-    
+
+    @ApiOperation(value = "获取所有已注册应用的运行状态")
+    @ApiImplicitParams(
+            @ApiImplicitParam(name="appId", value="一个或多个应用(多个应用间使用 , 分隔)",
+                    paramType="path", dataType = "String")
+    )
+    @GetMapping("/status")
+    public ResponseEntity<String> status() {
+        return ResponseEntity.ok().body("ok");
+    }
+
     @ApiOperation(value = "启动应用")
     @ApiImplicitParams(
             @ApiImplicitParam(name="appId", value="一个或多个应用(多个应用间使用 , 分隔)",

+ 0 - 39
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/LogController.java

@@ -1,39 +0,0 @@
-package cn.reghao.autodop.dmaster.app.controller;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * @author reghao
- * @date 2020-02-28 11:33:23
- */
-@Slf4j
-@Api(tags = "应用日志接口")
-@RestController
-@RequestMapping("/api/app")
-public class LogController {
-    @ApiOperation(value = "获取应用所有日志")
-    @ApiImplicitParams(
-            @ApiImplicitParam(name="appId", value="应用 ID", paramType="path", dataType = "String")
-    )
-    @GetMapping("/logs/{appId}")
-    public String appLogs() {
-        return null;
-    }
-
-    @ApiOperation(value = "获取应用日志")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name="appId", value="应用 ID", paramType="path", dataType = "String"),
-            @ApiImplicitParam(name="logId", value="日志 ID", paramType="path", dataType = "String")
-    })
-    @GetMapping("/logs/{appId}/{logId}")
-    public String appLog() {
-        return null;
-    }
-}

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

@@ -2,7 +2,10 @@ package cn.reghao.autodop.dmaster.app.entity.deploy;
 
 import lombok.Data;
 
+import javax.persistence.CascadeType;
 import javax.persistence.Embeddable;
+import javax.persistence.OneToMany;
+import java.util.List;
 
 /**
  * @author reghao
@@ -16,5 +19,6 @@ public class AppDeploy {
     private int httpPort;
     private String healthCheck;
     private String runningDir;
-    //private AppLog log;
+    @OneToMany(cascade = CascadeType.PERSIST)
+    private List<AppLog> logs;
 }

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

@@ -0,0 +1,24 @@
+package cn.reghao.autodop.dmaster.app.entity.deploy;
+
+import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+
+/**
+ * @author reghao
+ * @date 2020-05-19 09:24:41
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@Entity
+public class AppLog extends BaseEntity {
+    private String logType;
+    private String logLevel;
+    private String logdirPath;
+}

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

@@ -27,6 +27,7 @@ public class AppOrchestration extends BaseEntity {
     // 编译 app 时所处的目录,以仓库目录为起点
     private String entryDir;
     // TODO 添加定时构建部署选项
+    // TODO 接入到项目管理系统
     // 配置文件
     @ElementCollection(fetch = FetchType.EAGER)
     private Map<String, String> configFiles;

+ 42 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppManager.java

@@ -4,10 +4,11 @@ import cn.reghao.autodop.common.dockerc.DockerException;
 import cn.reghao.autodop.common.grpc.client.GrpcClientProxy;
 import cn.reghao.autodop.common.grpc.facade.AppService;
 import cn.reghao.autodop.dmaster.app.caching.OrchestrationCaching;
+import cn.reghao.autodop.dmaster.app.entity.deploy.AppDeploy;
+import cn.reghao.autodop.dmaster.app.entity.deploy.AppLog;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import org.springframework.stereotype.Service;
 
-import java.io.IOException;
 import java.util.List;
 
 /**
@@ -62,14 +63,52 @@ public class AppManager {
         }
     }
 
-    public List<String> log(String appId) throws DockerException, IOException {
+    public List<String> log(String appId, String logType, String logLevel) throws Exception {
         AppOrchestration app = caching.findByAppId(appId);
+        AppDeploy appDeploy = app.getAppDeploy();
+        List<AppLog> appLogs = appDeploy.getLogs();
+        String logdirPath = null;
+        for (AppLog appLog : appLogs) {
+            if (appLog.getLogType().equals(logType) && appLog.getLogLevel().equals(logLevel)) {
+                // TODO 只有控制台日志的 logPath 才为 null
+                logdirPath = appLog.getLogdirPath();
+                break;
+            }
+        }
+
+        String[] hosts = app.getAppDeploy().getHosts().split(",");
+        for (String host : hosts) {
+            AppService appService = (AppService) new GrpcClientProxy<AppService>()
+                    .getProxy(host, GRPC_PORT, AppService.class);
+
+            // TODO logs 为 null 表示没有日志
+            List<String> logs = appService.log(appId, logType, logLevel, logdirPath);
+            return logs;
+        }
+
+        return null;
+    }
+
+    public List<String> logcontent(String appId, String logType, String logLevel, String logName) throws Exception {
+        AppOrchestration app = caching.findByAppId(appId);
+        AppDeploy appDeploy = app.getAppDeploy();
+        List<AppLog> appLogs = appDeploy.getLogs();
+        String logfilePath = null;
+        for (AppLog appLog : appLogs) {
+            if (appLog.getLogType().equals(logType) && appLog.getLogLevel().equals(logLevel)) {
+                // TODO 只有控制台日志的 logPath 才为 null
+                logfilePath = appLog.getLogdirPath() + "/" + logName;
+                break;
+            }
+        }
+
         String[] hosts = app.getAppDeploy().getHosts().split(",");
         for (String host : hosts) {
             AppService appService = (AppService) new GrpcClientProxy<AppService>()
                     .getProxy(host, GRPC_PORT, AppService.class);
 
-            List<String> logs = appService.log(appId);
+            List<String> logs = appService.logcontent(appId, logType, logLevel, logfilePath);
+            return logs;
         }
 
         return null;

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

@@ -233,6 +233,7 @@ public class AppIntegrate {
             buildLog.setAppPath(appPath);
             return true;
         } catch (Exception e) {
+            e.printStackTrace();
             buildLog.setStage(AppStage.pack.name());
             buildLog.setCode(1);
             buildLog.setMsg(e.getMessage());
@@ -245,6 +246,7 @@ public class AppIntegrate {
             Deployer.deploy(app, buildLog);
             return true;
         } catch (Exception e) {
+            e.printStackTrace();
             buildLog.setStage(AppStage.deploy.name());
             buildLog.setCode(1);
             buildLog.setMsg(e.getMessage());

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

@@ -17,6 +17,9 @@ public interface CodeUpdater {
      */
     CommitInfo update(String remote, String local) throws Exception;
 
+    // TODO 拉取指定版本的代码
+    //CommitInfo update(String remote, String local, String commitId) throws Exception;
+
     /**
      * 本地代码仓库最近一次提交的信息
      *

+ 14 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/MonitorController.java

@@ -0,0 +1,14 @@
+package cn.reghao.autodop.dmaster.monitor;
+
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author reghao
+ * @date 2019-11-15 08:44:50
+ */
+@Api(tags = "监控接口")
+@RestController
+@RequestMapping("/api/monitor")
+public class MonitorController {
+}

+ 4 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/MachineController.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/node/MachineController.java

@@ -1,17 +1,17 @@
-package cn.reghao.autodop.dmaster.machine;
+package cn.reghao.autodop.dmaster.node;
 
 import cn.reghao.autodop.dmaster.common.webresult.WebResult;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
 /**
  * @author reghao
  * @date 2019-11-15 08:44:50
  */
-@Slf4j
+@Api(tags = "机器节点接口")
 @RestController
-@RequestMapping("/api/machine")
+@RequestMapping("/api/node")
 public class MachineController {
     private SysStatService sysStatService;
 

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/SysStatService.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/node/SysStatService.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.machine;
+package cn.reghao.autodop.dmaster.node;
 
 import cn.reghao.autodop.common.machine.pojo.SysStat;
 import cn.reghao.autodop.common.utils.JsonUtil;

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

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

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

@@ -10,8 +10,12 @@ import cn.reghao.autodop.dmaster.app.entity.constant.NotifyType;
 import cn.reghao.autodop.common.deploy.PackerType;
 import cn.reghao.autodop.dmaster.app.entity.constant.RepoType;
 import cn.reghao.autodop.dmaster.app.entity.deploy.AppDeploy;
+import cn.reghao.autodop.dmaster.app.entity.deploy.AppLog;
 import org.junit.jupiter.api.Test;
 
+import java.util.ArrayList;
+import java.util.List;
+
 class AppOrchestrationTest {
 
     @Test
@@ -38,11 +42,18 @@ class AppOrchestrationTest {
         appBuild.setAppCompile(appCompile);
         appBuild.setAppPack(appPack);
 
+        List<AppLog> appLogs = new ArrayList<>();
+        appLogs.add(new AppLog("console", "info", null));
+        appLogs.add(new AppLog("console", "error", null));
+        appLogs.add(new AppLog("file", "info", "/Logs/Info/2020-05-19.log"));
+        appLogs.add(new AppLog("file", "error", "/Logs/Error/2020-05-19.log"));
+
         AppDeploy appDeploy = new AppDeploy();
         appDeploy.setHosts("localhost");
         appDeploy.setHttpPort(8002);
         appDeploy.setHealthCheck("/health");
         appDeploy.setRunningDir("");
+        appDeploy.setLogs(appLogs);
 
         Notification notification = new Notification();
         notification.setNotifyName("ding 通知");

+ 13 - 0
scripts/build-and-deploy.sh

@@ -0,0 +1,13 @@
+###
+# 构建部署脚本
+###
+#!/bin/sh
+
+#sh build.sh test dmaster
+sh deploy.sh autodop-dmaster 192.168.0.50 gjs
+
+#sh build.sh test dagent
+#sh deploy.sh autodop-dagent 192.168.0.171 gjs &
+#sh deploy.sh autodop-dagent 192.168.0.172 guanjingsong &
+#sh deploy.sh autodop-dagent 192.168.0.173 guanjingsong &
+#sh deploy.sh autodop-dagent 192.168.0.174 guanjingsong &

+ 22 - 13
scripts/build.sh

@@ -3,21 +3,30 @@
 ###
 #!/bin/sh
 
-app=$1
-env="test"
-proj="autodop"
-proj_home="/home/reghao/code/aha/${proj}"
-jar_home="/home/reghao/tmp/autodop/app"
-if [ -d ${jar_home}/${proj}-${app} ]; then
-  rm -rf ${jar_home}/${proj}-${app}/*
-else
-  mkdir -p ${jar_home}/${proj}-${app}
+env=$1
+app=$2
+if [ -z ${env} ] || [ -z ${app} ]; then
+  echo 'error: sh build.sh env app'
+  exit -1
 fi
 
+# 项目根目录
+proj_home="/home/reghao/code/aha/autodop"
+proj=`basename ${proj_home}`
+app_name=${proj}-${app}
 cd ${proj_home}
-mvn clean package -pl ${app} -am
-cp ${app}/target/${proj}-${app}.jar ${jar_home}/${proj}-${app}
-cp scripts/runner.sh ${jar_home}/${proj}-${app}
+mvn clean package -pl ${app} -am -Dmaven.test.skip=true -P${env}
+
+# 存放应用的根目录
+jar_home="/home/reghao/tmp/autodop/app"
+if [ -d ${jar_home}/${app_name} ]; then
+  rm -rf ${jar_home}/${app_name}/*
+else
+  mkdir -p ${jar_home}/${app_name}
+fi
+cp ${app}/target/${app_name}.jar ${jar_home}/${app_name}
+cp scripts/runner.sh ${jar_home}/${app_name}
 
 cd ${jar_home}
-tar cvf ${proj}-${app}.tar ${proj}-${app}
+sed -i "s/placeholder/${app_name}/" ${app_name}/runner.sh
+tar cvf ${app_name}.tar ${app_name}

+ 0 - 27
scripts/copy_to_remote.sh

@@ -1,27 +0,0 @@
-############
-# 拷贝应用到远程主机
-############
-#!/bin/sh
-
-set -e
-
-APP=$1
-TIMESTAMP=$2
-REMOTE_HOST=$3
-PASSWORD=$4
-
-if [ -z ${APP} ] || [ -z ${TIMESTAMP} ] || [ -z ${REMOTE_HOST} ] || [ -z ${PASSWORD} ]; then
-  echo 'error: sh build.sh ENV APP REMOTE_HOST PASSWORD'
-  exit -1
-fi
-
-cd /home/reghao/tmp/autodop/app
-
-# 拷贝运行脚本到远程主机
-sshpass -p ${PASSWORD} scp runner.sh root@${REMOTE_HOST}:/opt/servers/jars/autodop
-# 拷贝应用到远程主机
-sshpass -p ${PASSWORD} scp ${APP}-1.0.0_${TIMESTAMP}.jar root@${REMOTE_HOST}:/opt/servers/jars/autodop/app
-# 运行远程主机上的应用
-sshpass -p ${PASSWORD} ssh root@${REMOTE_HOST} "source /etc/profile && sh /opt/servers/jars/autodop/run-jar.sh ${APP} ${TIMESTAMP}"
-
-#sshpass -p qUkTdHNv6_HC ssh root@s12.iquizoo.com -t 'cd /root; bash --login'

+ 27 - 0
scripts/deploy.sh

@@ -0,0 +1,27 @@
+############
+# 部署脚本
+############
+#!/bin/sh
+
+set -e
+
+app_name=$1
+remote_host=$2
+password=$3
+
+if [ -z ${app_name} ] || [ -z ${remote_host} ] || [ -z ${password} ]; then
+  echo 'error: sh deploy.sh app remote_host password'
+  exit -1
+fi
+
+# 存放应用的根目录
+remote_jar_home="/opt/servers/jars/autodop/app"
+local_jar_home="/home/reghao/tmp/autodop/app"
+cd ${local_jar_home}/${app_name}
+
+# 拷贝 runner.sh 到远程主机
+sshpass -p ${password} scp runner.sh root@${remote_host}:${remote_jar_home}
+# 拷贝应用到远程主机
+sshpass -p ${password} scp ${app_name}.jar root@${remote_host}:${remote_jar_home}
+# 运行远程主机上的应用
+sshpass -p ${password} ssh root@${remote_host} "source /etc/profile && cd ${remote_jar_home} && sh runner.sh restart"

+ 8 - 7
scripts/runner.sh

@@ -3,13 +3,13 @@
 ###
 #!/bin/sh
 
-app_name="spiderlab-crawler"
-log_file="${app_name}.log"
-jar_name="${app_name}.jar"
-jar_file=`pwd`/${jar_name}
+app_name="placeholder"
+console_log="${app_name}.log"
+jar_file="${app_name}.jar"
 
 stop() {
-  pid=`jps | grep ${jar_name} | awk '{print $1}'`
+  #pid=`cat ${app_name}.pid`
+  pid=`jps | grep ${app_name} | awk '{print $1}'`
   if [ ! -z ${pid} ]
   then
     kill -15 ${pid}
@@ -18,8 +18,9 @@ stop() {
 }
 
 start() {
-  nohup java -jar ${jar_file} ./spiderlab-crawler-test.json > ${log_file} 2>&1 &
-  pid=`jps | grep ${jar_name} | awk '{print $1}'`
+  #nohup java -jar ${jar_file} ./spiderlab-crawler-test.json > ${console_log} 2>&1 &
+  nohup ./${jar_file} > ${console_log} 2>&1 &
+  pid=`jps | grep ${app_name} | awk '{print $1}'`
   echo ${pid} > ${app_name}.pid
 }