reghao 4 лет назад
Родитель
Сommit
437131f335
100 измененных файлов с 1043 добавлено и 1550 удалено
  1. 0 7
      agent/Dockerfile
  2. 0 5
      agent/bin/mqtt.json
  3. 5 0
      agent/bin/redis-dev.json
  4. 6 0
      agent/pom.xml
  5. 38 32
      agent/src/main/java/cn/reghao/devops/agent/AgentApp.java
  6. 52 0
      agent/src/main/java/cn/reghao/devops/agent/RedisAppender.java
  7. 2 2
      agent/src/main/java/cn/reghao/devops/agent/app/AppService.java
  8. 3 3
      agent/src/main/java/cn/reghao/devops/agent/app/DockerAppServiceImpl.java
  9. 2 2
      agent/src/main/java/cn/reghao/devops/agent/app/ZipAppServiceImpl.java
  10. 21 27
      agent/src/main/java/cn/reghao/devops/agent/machine/MachineEvent.java
  11. 0 52
      agent/src/main/java/cn/reghao/devops/agent/mqttsub/AgentConnActionListener.java
  12. 0 66
      agent/src/main/java/cn/reghao/devops/agent/mqttsub/AgentTopicListener.java
  13. 0 64
      agent/src/main/java/cn/reghao/devops/agent/mqttsub/impl/AppRpcClazzDispatcher.java
  14. 0 121
      agent/src/main/java/cn/reghao/devops/agent/mqttsub/impl/AppRpcClazzImpl.java
  15. 52 0
      agent/src/main/java/cn/reghao/devops/agent/redis/ObjectSerializeCodec.java
  16. 29 0
      agent/src/main/java/cn/reghao/devops/agent/redis/RedisConfig.java
  17. 70 0
      agent/src/main/java/cn/reghao/devops/agent/redis/RedisManager.java
  18. 23 0
      agent/src/main/java/cn/reghao/devops/agent/redis/ds/RedisList.java
  19. 49 0
      agent/src/main/java/cn/reghao/devops/agent/redis/ds/RedisSet.java
  20. 29 0
      agent/src/main/java/cn/reghao/devops/agent/redis/pubsub/RedisPubSub.java
  21. 74 0
      agent/src/main/java/cn/reghao/devops/agent/sub/AgentTopicListener.java
  22. 122 0
      agent/src/main/java/cn/reghao/devops/agent/sub/AppServices.java
  23. 30 0
      agent/src/main/java/cn/reghao/devops/agent/sub/handler/EvtAppDeployHandler.java
  24. 27 0
      agent/src/main/java/cn/reghao/devops/agent/sub/handler/EvtAppOpsHandler.java
  25. 0 6
      agent/src/main/resources/banner.txt
  26. 8 0
      common/src/main/java/cn/reghao/devops/common/event/AbstractMessage.java
  27. 9 0
      common/src/main/java/cn/reghao/devops/common/event/Channel.java
  28. 10 0
      common/src/main/java/cn/reghao/devops/common/event/DynamicRouter.java
  29. 14 0
      common/src/main/java/cn/reghao/devops/common/event/Event.java
  30. 22 0
      common/src/main/java/cn/reghao/devops/common/event/EventDispatcher.java
  31. 11 0
      common/src/main/java/cn/reghao/devops/common/event/Handler.java
  32. 11 0
      common/src/main/java/cn/reghao/devops/common/event/Message.java
  33. 3 18
      common/src/main/java/cn/reghao/devops/common/log/AppenderImpl.java
  34. 5 6
      common/src/main/java/cn/reghao/devops/common/log/Appenders.java
  35. 0 38
      common/src/main/java/cn/reghao/devops/common/log/LogCache.java
  36. 5 1
      common/src/main/java/cn/reghao/devops/common/log/LoggerConfig.java
  37. 1 1
      common/src/main/java/cn/reghao/devops/common/machine/Machine.java
  38. 0 189
      common/src/main/java/cn/reghao/devops/common/mqtt/AsyncMqttClient.java
  39. 0 156
      common/src/main/java/cn/reghao/devops/common/mqtt/DefaultMqttClient.java
  40. 0 15
      common/src/main/java/cn/reghao/devops/common/mqtt/MqttProperties.java
  41. 0 9
      common/src/main/java/cn/reghao/devops/common/msg/ClazzDispatcher.java
  42. 33 0
      common/src/main/java/cn/reghao/devops/common/msg/EventMessage.java
  43. 0 54
      common/src/main/java/cn/reghao/devops/common/msg/Message.java
  44. 3 7
      common/src/main/java/cn/reghao/devops/common/msg/MsgQueue.java
  45. 0 9
      common/src/main/java/cn/reghao/devops/common/msg/MsgType.java
  46. 1 1
      common/src/main/java/cn/reghao/devops/common/msg/constant/AppId.java
  47. 2 2
      common/src/main/java/cn/reghao/devops/common/msg/constant/AppOps.java
  48. 1 1
      common/src/main/java/cn/reghao/devops/common/msg/constant/NodeStatus.java
  49. 1 1
      common/src/main/java/cn/reghao/devops/common/msg/dto/app/DeployParam.java
  50. 2 1
      common/src/main/java/cn/reghao/devops/common/msg/dto/app/DeployResult.java
  51. 1 1
      common/src/main/java/cn/reghao/devops/common/msg/dto/app/PackType.java
  52. 2 1
      common/src/main/java/cn/reghao/devops/common/msg/dto/app/StatusParam.java
  53. 3 1
      common/src/main/java/cn/reghao/devops/common/msg/dto/app/StatusResult.java
  54. 2 1
      common/src/main/java/cn/reghao/devops/common/msg/dto/node/NodeLogDTO.java
  55. 20 0
      common/src/main/java/cn/reghao/devops/common/msg/event/EvtAgentLog.java
  56. 15 0
      common/src/main/java/cn/reghao/devops/common/msg/event/EvtAppDeploy.java
  57. 15 0
      common/src/main/java/cn/reghao/devops/common/msg/event/EvtAppDeployResult.java
  58. 15 0
      common/src/main/java/cn/reghao/devops/common/msg/event/EvtAppOps.java
  59. 15 0
      common/src/main/java/cn/reghao/devops/common/msg/event/EvtAppOpsResult.java
  60. 15 0
      common/src/main/java/cn/reghao/devops/common/msg/event/EvtMachineHeartbeat.java
  61. 15 0
      common/src/main/java/cn/reghao/devops/common/msg/event/EvtMachineHeartbeatResult.java
  62. 15 0
      common/src/main/java/cn/reghao/devops/common/msg/event/EvtMachineShutdown.java
  63. 15 0
      common/src/main/java/cn/reghao/devops/common/msg/event/EvtMachineStart.java
  64. 0 26
      common/src/main/java/cn/reghao/devops/common/msg/pub/PubMsg.java
  65. 0 18
      common/src/main/java/cn/reghao/devops/common/msg/pub/clazz/INodeEventPubClazz.java
  66. 0 9
      common/src/main/java/cn/reghao/devops/common/msg/pub/constant/NodeEventPubClazz.java
  67. 0 9
      common/src/main/java/cn/reghao/devops/common/msg/pub/constant/PubClazz.java
  68. 0 64
      common/src/main/java/cn/reghao/devops/common/msg/rpc/RpcMsg.java
  69. 0 19
      common/src/main/java/cn/reghao/devops/common/msg/rpc/clazz/IAppRpcClazz.java
  70. 0 9
      common/src/main/java/cn/reghao/devops/common/msg/rpc/constant/RpcClazz.java
  71. 0 7
      manager/Dockerfile
  72. 13 19
      manager/pom.xml
  73. 8 13
      manager/src/main/java/cn/reghao/devops/manager/app/controller/AppStatusController.java
  74. 7 7
      manager/src/main/java/cn/reghao/devops/manager/app/controller/BuildDeployController.java
  75. 6 6
      manager/src/main/java/cn/reghao/devops/manager/app/controller/page/BuildDeployLogPageController.java
  76. 2 3
      manager/src/main/java/cn/reghao/devops/manager/app/controller/page/BuildDeployPageController.java
  77. 1 1
      manager/src/main/java/cn/reghao/devops/manager/app/controller/page/config/AppConfigPageController.java
  78. 1 1
      manager/src/main/java/cn/reghao/devops/manager/app/controller/page/config/PackerPageController.java
  79. 1 1
      manager/src/main/java/cn/reghao/devops/manager/app/db/query/log/BuildLogQuery.java
  80. 12 16
      manager/src/main/java/cn/reghao/devops/manager/app/db/query/log/BuildLogQueryImpl.java
  81. 3 2
      manager/src/main/java/cn/reghao/devops/manager/app/db/repository/log/BuildLogRepository.java
  82. 2 2
      manager/src/main/java/cn/reghao/devops/manager/app/db/repository/log/DeployLogRepository.java
  83. 4 3
      manager/src/main/java/cn/reghao/devops/manager/app/interceptor/AppConfigInterceptor.java
  84. 0 15
      manager/src/main/java/cn/reghao/devops/manager/app/model/constant/StatusOps.java
  85. 1 1
      manager/src/main/java/cn/reghao/devops/manager/app/model/constant/build/RepoAuthType.java
  86. 5 5
      manager/src/main/java/cn/reghao/devops/manager/app/model/po/AppBuilding.java
  87. 6 6
      manager/src/main/java/cn/reghao/devops/manager/app/model/po/AppDeploying.java
  88. 1 1
      manager/src/main/java/cn/reghao/devops/manager/app/model/po/AppRunning.java
  89. 1 0
      manager/src/main/java/cn/reghao/devops/manager/app/model/po/config/AppConfig.java
  90. 1 1
      manager/src/main/java/cn/reghao/devops/manager/app/model/po/config/AppDeployConfig.java
  91. 1 1
      manager/src/main/java/cn/reghao/devops/manager/app/model/po/config/build/PackerConfig.java
  92. 20 21
      manager/src/main/java/cn/reghao/devops/manager/app/model/po/log/BuildLog.java
  93. 14 5
      manager/src/main/java/cn/reghao/devops/manager/app/model/po/log/DeployLog.java
  94. 1 1
      manager/src/main/java/cn/reghao/devops/manager/app/model/vo/AppBuildingVO.java
  95. 4 4
      manager/src/main/java/cn/reghao/devops/manager/app/model/vo/BuildLogVO.java
  96. 2 2
      manager/src/main/java/cn/reghao/devops/manager/app/model/vo/CommitInfoVO.java
  97. 0 63
      manager/src/main/java/cn/reghao/devops/manager/app/service/AppBuildSupplier.java
  98. 0 198
      manager/src/main/java/cn/reghao/devops/manager/app/service/AppBuilder.java
  99. 0 89
      manager/src/main/java/cn/reghao/devops/manager/app/service/AppDeployer.java
  100. 2 2
      manager/src/main/java/cn/reghao/devops/manager/app/service/AppStatusService.java

+ 0 - 7
agent/Dockerfile

@@ -1,7 +0,0 @@
-FROM debian10/openjdk11
-
-WORKDIR /app
-RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
-COPY target/devops-agent.jar /app/devops-agent.jar
-
-ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/devops-agent.jar"]

+ 0 - 5
agent/bin/mqtt.json

@@ -1,5 +0,0 @@
-{
-  "broker": "tcp://localhost:1883",
-  "username": "dev",
-  "password": "Dev@123456"
-}

+ 5 - 0
agent/bin/redis-dev.json

@@ -0,0 +1,5 @@
+{
+  "host": "localhost",
+  "password": "Dev@123456",
+  "db": "0"
+}

+ 6 - 0
agent/pom.xml

@@ -21,6 +21,12 @@
             <artifactId>common</artifactId>
             <version>1.0.0</version>
         </dependency>
+
+        <dependency>
+            <groupId>io.lettuce</groupId>
+            <artifactId>lettuce-core</artifactId>
+            <version>5.3.6.RELEASE</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 38 - 32
agent/src/main/java/cn/reghao/devops/agent/AgentApp.java

@@ -1,36 +1,35 @@
 package cn.reghao.devops.agent;
 
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.Appender;
+import cn.reghao.devops.agent.redis.RedisConfig;
+import cn.reghao.devops.agent.redis.RedisManager;
+import cn.reghao.devops.agent.redis.pubsub.RedisPubSub;
+import cn.reghao.devops.agent.sub.AgentTopicListener;
 import cn.reghao.devops.common.log.Appenders;
 import cn.reghao.devops.common.log.LoggerConfig;
 import cn.reghao.devops.common.machine.Machine;
-import cn.reghao.devops.common.mqtt.AsyncMqttClient;
-import cn.reghao.devops.common.mqtt.MqttProperties;
 import cn.reghao.devops.common.msg.MsgQueue;
-import cn.reghao.devops.common.msg.pub.dto.node.constant.AppId;
-import cn.reghao.devops.common.msg.rpc.clazz.IAppRpcClazz;
-import cn.reghao.devops.agent.machine.NodeEventClazzPubImpl;
-import cn.reghao.devops.agent.mqttsub.AgentConnActionListener;
-import cn.reghao.devops.agent.mqttsub.AgentTopicListener;
-import cn.reghao.devops.agent.mqttsub.impl.AppRpcClazzDispatcher;
-import cn.reghao.devops.agent.mqttsub.impl.AppRpcClazzImpl;
+import cn.reghao.devops.agent.machine.MachineEvent;
 import cn.reghao.jutil.jdk.http.WebClient;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import cn.reghao.jutil.jdk.text.TextFile;
+import cn.reghao.jutil.jdk.util.SingleInstance;
 import lombok.extern.slf4j.Slf4j;
+import org.slf4j.LoggerFactory;
 import oshi.SystemInfo;
 
+import java.io.File;
 import java.util.List;
 
 @Slf4j
 public class AgentApp {
-	static AsyncMqttClient mqttClient;
-	static AgentTopicListener agentTopicListener;
-	static NodeEventClazzPubImpl nodeEventClazzPub;
+	static LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
+	static MachineEvent machineEvent;
 
-	static void pubagentShutdown() {
-		nodeEventClazzPub.nodeShutdown();
+	static void shutdownEvent() {
+		machineEvent.nodeShutdown();
 		log.info("agent 停止");
 	}
 
@@ -47,34 +46,41 @@ public class AgentApp {
 	}
 
 	static void stop() {
-		pubagentShutdown();
+		shutdownEvent();
 		log.info("资源清理完成,结束 devops-agent...");
 	}
 
-	public static void main(String[] args) throws Exception {
+	static Appender<ILoggingEvent> redisAppender(RedisPubSub redisPubSub) {
+		PatternLayoutEncoder layoutEncoder = new PatternLayoutEncoder();
+		layoutEncoder.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n");
+		layoutEncoder.setContext(loggerContext);
+		layoutEncoder.start();
+
+		RedisAppender redisAppender = new RedisAppender(redisPubSub);
+		redisAppender.setContext(loggerContext);
+		redisAppender.start();
+		return redisAppender;
+	}
+
+	public static void main(String[] args) {
 		if (args.length != 1) {
 			log.error("必须指定配置文件...");
 			return;
 		}
 		String configFilePath = ConfigFile.configFilePath(args[0], AgentApp.class);
-		String json = new TextFile().readFile(configFilePath);
-		MqttProperties mqttProperties = JsonConverter.jsonToObject(json, MqttProperties.class);
-		mqttProperties.setClientId(AppId.agent.name());
-		mqttClient = new AsyncMqttClient(mqttProperties);
+		RedisConfig redisConfig = JsonConverter.jsonFileToObject(new File(configFilePath), RedisConfig.class);
+		RedisManager redisManager = new RedisManager(redisConfig);
+		RedisPubSub redisPubSub = redisManager.redisPubSub();
+		redisPubSub.subscribe(MsgQueue.agentTopic(Machine.ID), new AgentTopicListener(redisPubSub));
 
-		IAppRpcClazz appRpcClazz = new AppRpcClazzImpl();
-		AppRpcClazzDispatcher appRpcClazzDispatcher = new AppRpcClazzDispatcher(appRpcClazz);
-		agentTopicListener = new AgentTopicListener(mqttClient, appRpcClazzDispatcher);
-		mqttClient.add(MsgQueue.agentTopic(Machine.ID), agentTopicListener);
+		//Appender<ILoggingEvent> appender = Appenders.fileAppender();
+		Appender<ILoggingEvent> appender = redisAppender(redisPubSub);
+		LoggerConfig.initLogger(List.of(appender));
 
 		Machine machine = new Machine(new WebClient(), new SystemInfo());
-		nodeEventClazzPub = new NodeEventClazzPubImpl(mqttClient, machine);
-		AgentConnActionListener connActionListener = new AgentConnActionListener(mqttClient, nodeEventClazzPub);
-
-		mqttClient.connect(connActionListener);
+		machineEvent = new MachineEvent(machine, redisPubSub);
+		machineEvent.nodeStart();
 		shutdownGracefully();
-
-		//Appender<ILoggingEvent> appender = Appenders.fileAppender();
-		//LoggerConfig.initLogger(List.of(appender));
+		SingleInstance.onlyOne(60001);
 	}
 }

+ 52 - 0
agent/src/main/java/cn/reghao/devops/agent/RedisAppender.java

@@ -0,0 +1,52 @@
+package cn.reghao.devops.agent;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.UnsynchronizedAppenderBase;
+import cn.reghao.devops.agent.redis.pubsub.RedisPubSub;
+import cn.reghao.devops.common.machine.Machine;
+import cn.reghao.devops.common.msg.EventMessage;
+import cn.reghao.devops.common.msg.MsgQueue;
+import cn.reghao.devops.common.msg.event.EvtAgentLog;
+
+/**
+ * 日志写到 Redis
+ *
+ * @author reghao
+ * @date 2021-06-08 19:37:21
+ */
+public class RedisAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
+    private final RedisPubSub redisPubSub;
+
+    public RedisAppender(RedisPubSub redisPubSub) {
+        this.redisPubSub = redisPubSub;
+    }
+
+    @Override
+    public void start() {
+        super.start();
+    }
+
+    @Override
+    public void stop() {
+        super.stop();
+    }
+
+    @Override
+    protected void append(ILoggingEvent event) {
+        EvtAgentLog evtAgentLog = evtAgentLog(event);
+        EventMessage eventMessage = EventMessage.eventMessage(evtAgentLog);
+        redisPubSub.publish(MsgQueue.managerTopic(), eventMessage);
+    }
+
+    private EvtAgentLog evtAgentLog(ILoggingEvent event) {
+        EvtAgentLog evtAgentLog = new EvtAgentLog();
+        evtAgentLog.setMachineId(Machine.ID);
+        evtAgentLog.setTimestamp(event.getTimeStamp());
+        evtAgentLog.setLevel(event.getLevel().toString());
+        evtAgentLog.setThreadName(event.getThreadName());
+        evtAgentLog.setLoggerName(event.getLoggerName());
+        evtAgentLog.setMessage(event.getFormattedMessage());
+
+        return evtAgentLog;
+    }
+}

+ 2 - 2
agent/src/main/java/cn/reghao/devops/agent/app/AppService.java

@@ -1,7 +1,7 @@
 package cn.reghao.devops.agent.app;
 
-import cn.reghao.devops.common.msg.rpc.dto.app.StatusResult;
-import cn.reghao.devops.common.msg.rpc.dto.app.DeployParam;
+import cn.reghao.devops.common.msg.dto.app.StatusResult;
+import cn.reghao.devops.common.msg.dto.app.DeployParam;
 import cn.reghao.devops.common.docker.DockerException;
 
 /**

+ 3 - 3
agent/src/main/java/cn/reghao/devops/agent/app/DockerAppServiceImpl.java

@@ -2,9 +2,9 @@ package cn.reghao.devops.agent.app;
 
 import cn.reghao.devops.common.docker.DockerImpl;
 import cn.reghao.devops.common.machine.Machine;
-import cn.reghao.devops.common.msg.pub.dto.node.constant.NodeStatus;
-import cn.reghao.devops.common.msg.rpc.dto.app.StatusResult;
-import cn.reghao.devops.common.msg.rpc.dto.app.DeployParam;
+import cn.reghao.devops.common.msg.constant.NodeStatus;
+import cn.reghao.devops.common.msg.dto.app.StatusResult;
+import cn.reghao.devops.common.msg.dto.app.DeployParam;
 import cn.reghao.devops.common.docker.Docker;
 import cn.reghao.devops.common.docker.DockerException;
 import cn.reghao.devops.common.docker.po.Config;

+ 2 - 2
agent/src/main/java/cn/reghao/devops/agent/app/ZipAppServiceImpl.java

@@ -1,7 +1,7 @@
 package cn.reghao.devops.agent.app;
 
-import cn.reghao.devops.common.msg.rpc.dto.app.StatusResult;
-import cn.reghao.devops.common.msg.rpc.dto.app.DeployParam;
+import cn.reghao.devops.common.msg.dto.app.StatusResult;
+import cn.reghao.devops.common.msg.dto.app.DeployParam;
 import lombok.extern.slf4j.Slf4j;
 
 /**

+ 21 - 27
agent/src/main/java/cn/reghao/devops/agent/machine/NodeEventClazzPubImpl.java → agent/src/main/java/cn/reghao/devops/agent/machine/MachineEvent.java

@@ -1,17 +1,17 @@
 package cn.reghao.devops.agent.machine;
 
+import cn.reghao.devops.agent.redis.pubsub.RedisPubSub;
 import cn.reghao.devops.common.machine.Machine;
-import cn.reghao.devops.common.mqtt.AsyncMqttClient;
-import cn.reghao.devops.common.msg.Message;
+import cn.reghao.devops.common.msg.EventMessage;
 import cn.reghao.devops.common.msg.MsgQueue;
-import cn.reghao.devops.common.msg.pub.PubMsg;
-import cn.reghao.devops.common.msg.pub.constant.NodeEventPubClazz;
+import cn.reghao.devops.common.msg.event.EvtMachineHeartbeat;
+import cn.reghao.devops.common.msg.event.EvtMachineShutdown;
+import cn.reghao.devops.common.msg.event.EvtMachineStart;
 import cn.reghao.devops.common.util.thread.ThreadPoolWrapper;
 import cn.reghao.jutil.jdk.machine.data.detail.MachineDetail;
 import cn.reghao.jutil.jdk.machine.data.stat.MachineStat;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
 import lombok.extern.slf4j.Slf4j;
-import org.eclipse.paho.client.mqttv3.MqttException;
 
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -21,50 +21,44 @@ import java.util.concurrent.TimeUnit;
  * @date 2021-09-03 09:22:42
  */
 @Slf4j
-public class NodeEventClazzPubImpl {
+public class MachineEvent {
     private final ScheduledExecutorService scheduler;
-    private final AsyncMqttClient mqttClient;
     private final Machine machine;
-    private final String pubClazz;
+    private final RedisPubSub redisPubSub;
     
-    public NodeEventClazzPubImpl(AsyncMqttClient mqttClient, Machine machine) {
+    public MachineEvent(Machine machine, RedisPubSub redisPubSub) {
         this.scheduler = ThreadPoolWrapper.scheduledThreadPool("heartbeat", 1);
-        this.mqttClient = mqttClient;
         this.machine = machine;
-        this.pubClazz = NodeEventPubClazz.class.getSimpleName();
+        this.redisPubSub = redisPubSub;
     }
     
     public void nodeStart() {
         MachineDetail machineDetail = machine.detail();
         String jsonPayload = JsonConverter.objectToJson(machineDetail);
-        PubMsg pubMsg = PubMsg.pubMsg(pubClazz, NodeEventPubClazz.start.name(), jsonPayload);
-        pub(pubMsg);
+        EventMessage eventMessage = EventMessage.eventMessage(new EvtMachineStart(jsonPayload));
+        pub(eventMessage);
+        nodeHeartbeat();
     }
 
     public void nodeShutdown() {
         ThreadPoolWrapper.shutdownScheduler(scheduler);
         MachineStat machineStat = machine.stat();
         String jsonPayload = JsonConverter.objectToJson(machineStat);
-        PubMsg pubMsg = PubMsg.pubMsg(pubClazz, NodeEventPubClazz.shutdown.name(), jsonPayload);
-        pub(pubMsg);
+        EventMessage eventMessage = EventMessage.eventMessage(new EvtMachineShutdown(jsonPayload));
+        pub(eventMessage);
     }
 
     public void nodeHeartbeat() {
-        scheduler.scheduleAtFixedRate(new Heartbeat(), 3, 3, TimeUnit.SECONDS);
+        scheduler.scheduleAtFixedRate(new Heartbeat(), 10, 10, TimeUnit.SECONDS);
     }
 
     public void nodeLog() {
         // 使用 MqttAppender 发送日志
     }
-    
-    private void pub(PubMsg pubMsg) {
-        Message message = Message.pubMsg(pubMsg);
-        try {
-            String topic = MsgQueue.managerTopic();
-            mqttClient.pub(topic, 1, JsonConverter.objectToJson(message));
-        } catch (MqttException e) {
-            log.error("{}", e.getMessage());
-        }
+
+    private void pub(EventMessage eventMessage) {
+        String topic = MsgQueue.managerTopic();
+        redisPubSub.publish(topic, eventMessage);
     }
 
     class Heartbeat implements Runnable {
@@ -72,8 +66,8 @@ public class NodeEventClazzPubImpl {
         public void run() {
             MachineStat machineStat = machine.stat();
             String jsonPayload = JsonConverter.objectToJson(machineStat);
-            PubMsg pubMsg = PubMsg.pubMsg(pubClazz, NodeEventPubClazz.heartbeat.name(), jsonPayload);
-            pub(pubMsg);
+            EventMessage eventMessage = EventMessage.eventMessage(new EvtMachineHeartbeat(jsonPayload));
+            pub(eventMessage);
         }
     }
 }

+ 0 - 52
agent/src/main/java/cn/reghao/devops/agent/mqttsub/AgentConnActionListener.java

@@ -1,52 +0,0 @@
-package cn.reghao.devops.agent.mqttsub;
-
-import cn.reghao.devops.common.mqtt.AsyncMqttClient;
-import cn.reghao.devops.common.util.ExceptionUtil;
-import cn.reghao.devops.agent.machine.NodeEventClazzPubImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.paho.client.mqttv3.IMqttActionListener;
-import org.eclipse.paho.client.mqttv3.IMqttToken;
-import org.eclipse.paho.client.mqttv3.MqttException;
-
-/**
- * MQTT 建立连接时的状态监听器
- *
- * @author reghao
- * @date 2021-10-29 16:36:49
- */
-@Slf4j
-public class AgentConnActionListener implements IMqttActionListener {
-    private final AsyncMqttClient mqttClient;
-    private final NodeEventClazzPubImpl nodeEventClazzPub;
-
-    public AgentConnActionListener(AsyncMqttClient mqttClient, NodeEventClazzPubImpl nodeEventClazzPub) {
-        this.mqttClient = mqttClient;
-        this.nodeEventClazzPub = nodeEventClazzPub;
-    }
-
-    @Override
-    public void onSuccess(IMqttToken asyncActionToken) {
-        /*Appender<ILoggingEvent> appender = Appenders.mqttAppender1(AppId.agent.name(), mqttClient);
-        LoggerConfig.initLogger(List.of(appender));*/
-        nodeEventClazzPub.nodeStart();
-        nodeEventClazzPub.nodeHeartbeat();
-
-        log.info("MQTT 连接建立成功,开始订阅 topic");
-        mqttClient.getMsgListeners().forEach((topic, msgListener) -> {
-            try {
-                // 确保能订阅到离线消息的设置:
-                // - qos=1
-                // - clientId 确定且唯一,不能使用随机的 UUID
-                // - CleanSession=false
-                mqttClient.sub(topic, msgListener);
-            } catch (MqttException e) {
-                log.error("topic {} 订阅失败, 原因 {}", topic, ExceptionUtil.errorMsg(e));
-            }
-        });
-    }
-
-    @Override
-    public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
-        log.error("MQTT 连接建立失败,原因 {}", exception.getMessage());
-    }
-}

+ 0 - 66
agent/src/main/java/cn/reghao/devops/agent/mqttsub/AgentTopicListener.java

@@ -1,66 +0,0 @@
-package cn.reghao.devops.agent.mqttsub;
-
-import cn.reghao.devops.common.mqtt.AsyncMqttClient;
-import cn.reghao.devops.common.msg.Message;
-import cn.reghao.devops.common.msg.MsgQueue;
-import cn.reghao.devops.common.msg.rpc.RpcMsg;
-import cn.reghao.devops.common.msg.rpc.constant.RpcClazz;
-import cn.reghao.devops.agent.mqttsub.impl.AppRpcClazzDispatcher;
-import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.paho.client.mqttv3.*;
-
-import java.lang.management.ManagementFactory;
-
-/**
- * 处理 sub.{nodeId}.agent topic 中的消息
- *
- * @author reghao
- * @date 2021-05-24 09:24:03
- */
-@Slf4j
-public class AgentTopicListener implements IMqttMessageListener {
-    private final long startTime;
-    private final AsyncMqttClient mqttClient;
-    private final AppRpcClazzDispatcher appRpcClazzDispatcher;
-
-    public AgentTopicListener(AsyncMqttClient mqttClient, AppRpcClazzDispatcher appRpcClazzDispatcher) {
-        this.startTime = ManagementFactory.getRuntimeMXBean().getStartTime();
-        this.mqttClient = mqttClient;
-        this.appRpcClazzDispatcher = appRpcClazzDispatcher;
-    }
-
-    @Override
-    public void messageArrived(String topic, MqttMessage message) {
-        try {
-            Message msg = JsonConverter.jsonToObject(message.toString(), Message.class);
-            String msgId = msg.getMsgId();
-            long sendTime = msg.getSendTime();
-            if (sendTime < startTime) {
-                log.info("忽略 devops-agent 启动前发布的消息");
-                return;
-            }
-
-            RpcMsg rpcMsg = msg.getRpcMsg();
-            String clazz = rpcMsg.getClazz();
-            switch (RpcClazz.valueOf(clazz)) {
-                case AppRpcClazz:
-                    rpcMsg = appRpcClazzDispatcher.dispatch(rpcMsg);
-                    break;
-                default:
-                    String err = String.format("找不到 %s 类型", clazz);
-                    rpcMsg.error(err);
-            }
-
-            Message message1 = Message.rpcResultMsg(msgId, rpcMsg);
-            rpcReply(message1);
-        } catch (Exception e) {
-            log.error("MQTT message exception -> {}", e.getMessage());
-        }
-    }
-
-    private void rpcReply(Message message) throws MqttException {
-        String topic = MsgQueue.managerTopic();
-        mqttClient.pub(topic, 1, JsonConverter.objectToJson(message));
-    }
-}

+ 0 - 64
agent/src/main/java/cn/reghao/devops/agent/mqttsub/impl/AppRpcClazzDispatcher.java

@@ -1,64 +0,0 @@
-package cn.reghao.devops.agent.mqttsub.impl;
-
-import cn.reghao.devops.common.msg.ClazzDispatcher;
-import cn.reghao.devops.common.msg.rpc.clazz.IAppRpcClazz;
-import cn.reghao.devops.common.msg.rpc.constant.AppRpcClazz;
-import cn.reghao.devops.common.msg.rpc.RpcMsg;
-import cn.reghao.devops.common.msg.rpc.dto.app.DeployParam;
-import cn.reghao.devops.common.msg.rpc.dto.app.DeployResult;
-import cn.reghao.devops.common.msg.rpc.dto.app.StatusParam;
-import cn.reghao.devops.common.msg.rpc.dto.app.StatusResult;
-import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * @author reghao
- * @date 2020-12-30 10:26:47
- */
-@Slf4j
-public class AppRpcClazzDispatcher implements ClazzDispatcher<RpcMsg, RpcMsg> {
-    private final IAppRpcClazz appRpcClazz;
-
-    public AppRpcClazzDispatcher(IAppRpcClazz appRpcClazz) {
-        this.appRpcClazz = appRpcClazz;
-    }
-
-    @Override
-    public RpcMsg dispatch(RpcMsg rpcMsg) {
-        String method = rpcMsg.getMethod();
-        String jsonParam = rpcMsg.getJsonParam();
-        StatusParam statusParam;
-        StatusResult statusResult;
-        try {
-            switch (AppRpcClazz.valueOf(method)) {
-                case deploy:
-                    DeployParam deployParam = JsonConverter.jsonToObject(jsonParam, DeployParam.class);
-                    DeployResult deployResult = appRpcClazz.deploy(deployParam);
-                    return rpcMsg.success(JsonConverter.objectToJson(deployResult));
-                case status:
-                    statusParam = JsonConverter.jsonToObject(jsonParam, StatusParam.class);
-                    statusResult = appRpcClazz.status(statusParam);
-                    return rpcMsg.success(JsonConverter.objectToJson(statusResult));
-                case restart:
-                    statusParam = JsonConverter.jsonToObject(jsonParam, StatusParam.class);
-                    statusResult = appRpcClazz.restart(statusParam);
-                    return rpcMsg.success(JsonConverter.objectToJson(statusResult));
-                case stop:
-                    statusParam = JsonConverter.jsonToObject(jsonParam, StatusParam.class);
-                    statusResult = appRpcClazz.stop(statusParam);
-                    return rpcMsg.success(JsonConverter.objectToJson(statusResult));
-                case start:
-                    statusParam = JsonConverter.jsonToObject(jsonParam, StatusParam.class);
-                    statusResult = appRpcClazz.start(statusParam);
-                    return rpcMsg.success(JsonConverter.objectToJson(statusResult));
-                case log:
-                    // TODO 待实现
-                default:
-                    String err = String.format("AppRpcClazz 中找不到 %s 方法", method);
-                    return rpcMsg.error(err);
-            }
-        } catch (Exception e) {
-            return rpcMsg.error(e.getMessage());
-        }
-    }
-}

+ 0 - 121
agent/src/main/java/cn/reghao/devops/agent/mqttsub/impl/AppRpcClazzImpl.java

@@ -1,121 +0,0 @@
-package cn.reghao.devops.agent.mqttsub.impl;
-
-import cn.reghao.devops.common.machine.Machine;
-import cn.reghao.devops.common.msg.rpc.clazz.IAppRpcClazz;
-import cn.reghao.devops.common.msg.rpc.constant.AppRpcClazz;
-import cn.reghao.devops.common.msg.rpc.dto.app.*;
-import cn.reghao.devops.common.util.ExceptionUtil;
-import cn.reghao.devops.agent.app.AppService;
-import cn.reghao.devops.agent.app.DockerAppServiceImpl;
-import cn.reghao.devops.agent.app.ZipAppServiceImpl;
-import cn.reghao.jutil.jdk.result.Result;
-import cn.reghao.jutil.jdk.result.ResultStatus;
-import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * @author reghao
- * @date 2020-12-30 10:26:47
- */
-@Slf4j
-public class AppRpcClazzImpl implements IAppRpcClazz {
-    private final AppService dockerAppServiceImpl;
-    private final AppService zipAppServiceImpl;
-
-    public AppRpcClazzImpl() {
-        this.dockerAppServiceImpl = new DockerAppServiceImpl();
-        this.zipAppServiceImpl = new ZipAppServiceImpl();
-    }
-
-    @Override
-    public DeployResult deploy(DeployParam deployParam) {
-        String buildLogId = deployParam.getBuildLogId();
-        String packType = deployParam.getPackType();
-
-        StatusResult appStatus;
-        DeployResult deployResult = new DeployResult(buildLogId, Machine.ID);
-        try {
-            switch (PackType.valueOf(packType)) {
-                case docker:
-                    appStatus = dockerAppServiceImpl.deploy(deployParam);
-                    deployResult.setResult(Result.result(ResultStatus.SUCCESS, JsonConverter.objectToJson(appStatus)));
-                    break;
-                case zip:
-                    appStatus = zipAppServiceImpl.deploy(deployParam);
-                    deployResult.setResult(Result.result(ResultStatus.SUCCESS, JsonConverter.objectToJson(appStatus)));
-                    break;
-                default:
-                    String msg = String.format("应用包类型 %s 不存在", deployParam.getPackType());
-                    deployResult.setResult(Result.result(ResultStatus.ERROR, msg));
-            }
-        } catch (Exception e) {
-            deployResult.setResult(Result.result(ResultStatus.FAIL, ExceptionUtil.errorMsg(e)));
-        }
-        return deployResult;
-    }
-
-    @Override
-    public StatusResult restart(StatusParam statusParam) throws Exception {
-        String appId = statusParam.getAppId();
-        String packType = statusParam.getPackType();
-        return appOps(appId, AppRpcClazz.restart.name(), packType);
-    }
-
-    @Override
-    public StatusResult stop(StatusParam statusParam) throws Exception {
-        String appId = statusParam.getAppId();
-        String packType = statusParam.getPackType();
-        return appOps(appId, AppRpcClazz.stop.name(), packType);
-    }
-
-    @Override
-    public StatusResult start(StatusParam statusParam) throws Exception {
-        String appId = statusParam.getAppId();
-        String packType = statusParam.getPackType();
-        return appOps(appId, AppRpcClazz.start.name(), packType);
-    }
-
-    @Override
-    public StatusResult status(StatusParam statusParam) throws Exception {
-        String appId = statusParam.getAppId();
-        String packType = statusParam.getPackType();
-        return appOps(appId, AppRpcClazz.status.name(), packType);
-    }
-
-    private StatusResult appOps(String appId, String ops, String packType) throws Exception {
-        switch (AppRpcClazz.valueOf(ops)) {
-            case restart:
-                if (packType.equals(PackType.docker.name())) {
-                    return dockerAppServiceImpl.restart(appId);
-                } else {
-                    return zipAppServiceImpl.restart(appId);
-                }
-            case stop:
-                if (packType.equals(PackType.docker.name())) {
-                    return dockerAppServiceImpl.stop(appId);
-                } else {
-                    return zipAppServiceImpl.stop(appId);
-                }
-            case start:
-                if (packType.equals(PackType.docker.name())) {
-                    return dockerAppServiceImpl.start(appId);
-                } else {
-                    return zipAppServiceImpl.start(appId);
-                }
-            case status:
-                if (packType.equals(PackType.docker.name())) {
-                    return dockerAppServiceImpl.status(appId);
-                } else {
-                    return zipAppServiceImpl.status(appId);
-                }
-            default:
-                String msg = String.format("应用状态操作类型 %s 不存在", ops);
-                throw new Exception(msg);
-        }
-    }
-
-    @Override
-    public void log() {
-        // TODO 应用日志待实现
-    }
-}

+ 52 - 0
agent/src/main/java/cn/reghao/devops/agent/redis/ObjectSerializeCodec.java

@@ -0,0 +1,52 @@
+package cn.reghao.devops.agent.redis;
+
+import io.lettuce.core.codec.RedisCodec;
+
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 存储对象到 Redis 时使用的序列化编码器
+ *
+ * @author reghao
+ * @date 2021-03-05 00:33:20
+ */
+public class ObjectSerializeCodec<T> implements RedisCodec<String, T> {
+    private final Charset charset = StandardCharsets.UTF_8;
+
+    @Override
+    public String decodeKey(ByteBuffer bytes) {
+        return charset.decode(bytes).toString();
+    }
+
+    @Override
+    public T decodeValue(ByteBuffer bytes) {
+        try {
+            byte[] array = new byte[bytes.remaining()];
+            bytes.get(array);
+            ObjectInputStream is = new ObjectInputStream(new ByteArrayInputStream(array));
+            return (T)is.readObject();
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    @Override
+    public ByteBuffer encodeKey(String key) { // str -> bytes -> byteBuffer
+        return ByteBuffer.wrap(key.getBytes(charset));
+    }
+
+    @Override
+    public ByteBuffer encodeValue(T value) {
+        try {
+            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+            ObjectOutputStream os = new ObjectOutputStream(bytes);
+            os.writeObject(value);
+            return ByteBuffer.wrap(bytes.toByteArray());
+        } catch (IOException e) {
+            return null;
+        }
+    }
+}

+ 29 - 0
agent/src/main/java/cn/reghao/devops/agent/redis/RedisConfig.java

@@ -0,0 +1,29 @@
+package cn.reghao.devops.agent.redis;
+
+/**
+ * @author reghao
+ * @date 2020-03-23 15:33:04
+ */
+public class RedisConfig {
+    private final String host;
+    private final String password;
+    private final int db;
+
+    public RedisConfig(String host, String password, int db) {
+        this.host = host;
+        this.password = password;
+        this.db = db;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public int getDb() {
+        return db;
+    }
+}

+ 70 - 0
agent/src/main/java/cn/reghao/devops/agent/redis/RedisManager.java

@@ -0,0 +1,70 @@
+package cn.reghao.devops.agent.redis;
+
+import cn.reghao.devops.agent.redis.ds.RedisList;
+import cn.reghao.devops.agent.redis.ds.RedisSet;
+import cn.reghao.devops.agent.redis.pubsub.RedisPubSub;
+import io.lettuce.core.RedisClient;
+import io.lettuce.core.RedisURI;
+import io.lettuce.core.api.StatefulRedisConnection;
+import io.lettuce.core.api.sync.RedisCommands;
+import io.lettuce.core.api.sync.RedisListCommands;
+import io.lettuce.core.api.sync.RedisSetCommands;
+import io.lettuce.core.codec.RedisCodec;
+import io.lettuce.core.codec.StringCodec;
+import io.lettuce.core.pubsub.StatefulRedisPubSubConnection;
+
+import java.time.Duration;
+
+/**
+ * Redis 客户端
+ *
+ * @author reghao
+ * @date 2019-08-04 04:02:10
+ */
+public class RedisManager {
+    private final RedisClient redisClient;
+    private RedisCodec<String, String> redisCodec;
+    private final ObjectSerializeCodec<Object> objectSerializeCodec;
+    private RedisSet redisSet;
+    private RedisList redisList;
+    private RedisPubSub redisPubSub;
+
+    public RedisManager(RedisConfig config) {
+        RedisURI uri = RedisURI.Builder
+                .redis(config.getHost())
+                .withPassword(config.getPassword().toCharArray())
+                .withDatabase(config.getDb())
+                .withTimeout(Duration.ofSeconds(60))
+                .build();
+        this.redisClient = RedisClient.create(uri);
+        this.redisCodec = StringCodec.UTF8;
+        this.objectSerializeCodec = new ObjectSerializeCodec<>();
+    }
+
+    public RedisSet redisSet() {
+        if (redisSet == null) {
+            StatefulRedisConnection<String, Object> conn = redisClient.connect(objectSerializeCodec);
+            RedisSetCommands<String, Object> setCommands = conn.sync();
+            this.redisSet = new RedisSet(setCommands);
+        }
+        return redisSet;
+    }
+
+    public RedisList redisList() {
+        if (redisList == null) {
+            StatefulRedisConnection<String, Object> conn = redisClient.connect(objectSerializeCodec);
+            RedisListCommands<String, Object> listCommands = conn.sync();
+            this.redisList = new RedisList(listCommands);
+        }
+        return redisList;
+    }
+
+    public RedisPubSub redisPubSub() {
+        if (redisPubSub == null) {
+            StatefulRedisPubSubConnection<String, Object> conn = redisClient.connectPubSub(objectSerializeCodec);
+            RedisCommands<String, Object> redisCommands = redisClient.connect(objectSerializeCodec).sync();
+            this.redisPubSub = new RedisPubSub(conn, redisCommands);
+        }
+        return redisPubSub;
+    }
+}

+ 23 - 0
agent/src/main/java/cn/reghao/devops/agent/redis/ds/RedisList.java

@@ -0,0 +1,23 @@
+package cn.reghao.devops.agent.redis.ds;
+
+import io.lettuce.core.api.sync.RedisListCommands;
+
+/**
+ * @author reghao
+ * @date 2022-02-25 17:49:51
+ */
+public class RedisList {
+    private final RedisListCommands<String, Object> listCommands;
+
+    public RedisList(RedisListCommands<String, Object> listCommands) {
+        this.listCommands = listCommands;
+    }
+
+    public void lpush(String key, Object value) {
+        listCommands.lpush(key, value);
+    }
+
+    public Object lpop(String key) {
+        return listCommands.lpop(key);
+    }
+}

+ 49 - 0
agent/src/main/java/cn/reghao/devops/agent/redis/ds/RedisSet.java

@@ -0,0 +1,49 @@
+package cn.reghao.devops.agent.redis.ds;
+
+import io.lettuce.core.api.sync.RedisSetCommands;
+
+import java.util.Set;
+
+/**
+ * @author reghao
+ * @date 2021-04-01 22:37:02
+ */
+public class RedisSet {
+    private final RedisSetCommands<String, Object> setCommands;
+
+    public RedisSet(RedisSetCommands<String, Object> setCommands) {
+        this.setCommands = setCommands;
+    }
+
+    public void sadd(String key, Object value) {
+        setCommands.sadd(key, value);
+    }
+
+    public void smove(String srcKey, String destKey, Object value) {
+        setCommands.smove(srcKey, destKey, value);
+    }
+
+    public void sadd(String key, Object... values) {
+        setCommands.sadd(key, values);
+    }
+
+    public Object spop(String key) {
+        return setCommands.spop(key);
+    }
+
+    public Set<Object> spop(String key, long count) {
+        return setCommands.spop(key, count);
+    }
+
+    public Set<Object> smembers(String key) {
+        return setCommands.smembers(key);
+    }
+
+    public boolean sismember(String key, Object value) {
+        return setCommands.sismember(key, value);
+    }
+
+    public long scard(String key) {
+        return setCommands.scard(key);
+    }
+}

+ 29 - 0
agent/src/main/java/cn/reghao/devops/agent/redis/pubsub/RedisPubSub.java

@@ -0,0 +1,29 @@
+package cn.reghao.devops.agent.redis.pubsub;
+
+import io.lettuce.core.api.sync.RedisCommands;
+import io.lettuce.core.pubsub.RedisPubSubListener;
+import io.lettuce.core.pubsub.StatefulRedisPubSubConnection;
+
+/**
+ * @author reghao
+ * @date 2022-02-26 10:19:27
+ */
+public class RedisPubSub {
+    private final StatefulRedisPubSubConnection<String, Object> statefulConn;
+    private final RedisCommands<String, Object> commands;
+
+    public RedisPubSub(StatefulRedisPubSubConnection<String, Object> statefulConn,
+                       RedisCommands<String, Object> commands) {
+        this.statefulConn = statefulConn;
+        this.commands = commands;
+    }
+
+    public void publish(String channel, Object message) {
+        commands.publish(channel, message);
+    }
+
+    public void subscribe(String channel, RedisPubSubListener<String, Object> listener) {
+        statefulConn.addListener(listener);
+        statefulConn.async().subscribe(channel);
+    }
+}

+ 74 - 0
agent/src/main/java/cn/reghao/devops/agent/sub/AgentTopicListener.java

@@ -0,0 +1,74 @@
+package cn.reghao.devops.agent.sub;
+
+import cn.reghao.devops.agent.AgentApp;
+import cn.reghao.devops.agent.redis.pubsub.RedisPubSub;
+import cn.reghao.devops.agent.sub.handler.EvtAppDeployHandler;
+import cn.reghao.devops.agent.sub.handler.EvtAppOpsHandler;
+import cn.reghao.devops.common.event.Event;
+import cn.reghao.devops.common.event.EventDispatcher;
+import cn.reghao.devops.common.msg.EventMessage;
+import cn.reghao.devops.common.msg.event.EvtAppDeploy;
+import cn.reghao.devops.common.msg.event.EvtAppOps;
+import io.lettuce.core.pubsub.RedisPubSubListener;
+import lombok.extern.slf4j.Slf4j;
+
+import java.lang.management.ManagementFactory;
+import java.util.logging.Logger;
+
+/**
+ * @author reghao
+ * @date 2021-04-02 14:56:27
+ */
+@Slf4j
+public class AgentTopicListener implements RedisPubSubListener<String, Object> {
+    //private static final Logger log = Logger.getLogger(AgentApp.class.getName());
+    private final long startTime;
+    private final EventDispatcher dispatcher;
+
+    public AgentTopicListener(RedisPubSub redisPubSub) {
+        this.startTime = ManagementFactory.getRuntimeMXBean().getStartTime();
+        this.dispatcher = new EventDispatcher();
+        initDispatcher(new AppServices(redisPubSub));
+    }
+
+    private void initDispatcher(AppServices appServices) {
+        dispatcher.registerChannel(EvtAppDeploy.class, new EvtAppDeployHandler(appServices));
+        dispatcher.registerChannel(EvtAppOps.class, new EvtAppOpsHandler(appServices));
+    }
+
+    @Override
+    public void message(String channel, Object message) {
+        if (message instanceof EventMessage) {
+            log.info("收到 manager 发送的事件...");
+            EventMessage eventMessage = (EventMessage) message;
+            long sendTime = eventMessage.getSendTime();
+            if (sendTime < startTime) {
+                log.info("忽略 agent 启动前 manager 发送的事件...");
+                return;
+            }
+
+            Event event = eventMessage.getEvent();
+            dispatcher.dispatch(event);
+        }
+    }
+
+    @Override
+    public void message(String pattern, String channel, Object message) {
+    }
+
+    @Override
+    public void subscribed(String channel, long count) {
+    }
+
+    @Override
+    public void psubscribed(String pattern, long count) {
+    }
+
+    @Override
+    public void unsubscribed(String channel, long count) {
+    }
+
+    @Override
+    public void punsubscribed(String pattern, long count) {
+    }
+}

+ 122 - 0
agent/src/main/java/cn/reghao/devops/agent/sub/AppServices.java

@@ -0,0 +1,122 @@
+package cn.reghao.devops.agent.sub;
+
+import cn.reghao.devops.agent.redis.pubsub.RedisPubSub;
+import cn.reghao.devops.common.machine.Machine;
+import cn.reghao.devops.common.msg.EventMessage;
+import cn.reghao.devops.common.msg.MsgQueue;
+import cn.reghao.devops.common.msg.constant.AppOps;
+import cn.reghao.devops.common.msg.dto.app.*;
+import cn.reghao.devops.common.msg.event.EvtAppDeployResult;
+import cn.reghao.devops.common.msg.event.EvtAppOps;
+import cn.reghao.devops.common.msg.event.EvtAppOpsResult;
+import cn.reghao.devops.common.util.ExceptionUtil;
+import cn.reghao.devops.agent.app.AppService;
+import cn.reghao.devops.agent.app.DockerAppServiceImpl;
+import cn.reghao.devops.agent.app.ZipAppServiceImpl;
+import cn.reghao.jutil.jdk.result.Result;
+import cn.reghao.jutil.jdk.result.ResultStatus;
+import cn.reghao.jutil.jdk.serializer.JsonConverter;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @author reghao
+ * @date 2020-12-30 10:26:47
+ */
+@Slf4j
+public class AppServices {
+    private final RedisPubSub redisPubSub;
+    private final AppService dockerAppServiceImpl;
+    private final AppService zipAppServiceImpl;
+
+    public AppServices(RedisPubSub redisPubSub) {
+        this.redisPubSub = redisPubSub;
+        this.dockerAppServiceImpl = new DockerAppServiceImpl();
+        this.zipAppServiceImpl = new ZipAppServiceImpl();
+    }
+
+    public void deploy(DeployParam deployParam) {
+        String buildLogId = deployParam.getBuildLogId();
+        String packType = deployParam.getPackType();
+
+        StatusResult appStatus;
+        DeployResult deployResult = new DeployResult(buildLogId, Machine.ID);
+        try {
+            switch (PackType.valueOf(packType)) {
+                case docker:
+                    appStatus = dockerAppServiceImpl.deploy(deployParam);
+                    deployResult.setStatusResult(appStatus);
+                    deployResult.setResult(Result.result(ResultStatus.SUCCESS));
+                    break;
+                case zip:
+                    appStatus = zipAppServiceImpl.deploy(deployParam);
+                    deployResult.setStatusResult(appStatus);
+                    deployResult.setResult(Result.result(ResultStatus.SUCCESS));
+                    break;
+                default:
+                    String msg = String.format("应用包类型 %s 不存在", deployParam.getPackType());
+                    deployResult.setResult(Result.result(ResultStatus.ERROR, msg));
+            }
+        } catch (Exception e) {
+            deployResult.setResult(Result.result(ResultStatus.FAIL, ExceptionUtil.errorMsg(e)));
+        }
+
+        String jsonPayload = JsonConverter.objectToJson(deployResult);
+        EventMessage evtMsg = EventMessage.eventMessage(new EvtAppDeployResult(jsonPayload));
+        redisPubSub.publish(MsgQueue.managerTopic(), evtMsg);
+    }
+
+    public void appOps(StatusParam statusParam) {
+        String appId = statusParam.getAppId();
+        String packType = statusParam.getPackType();
+        String ops = statusParam.getOps();
+
+        StatusResult statusResult;
+        try {
+            switch (AppOps.valueOf(ops)) {
+                case restart:
+                    if (packType.equals(PackType.docker.name())) {
+                        statusResult = dockerAppServiceImpl.restart(appId);
+                    } else {
+                        statusResult = zipAppServiceImpl.restart(appId);
+                    }
+                    statusResult.setResult(Result.result(ResultStatus.SUCCESS));
+                    break;
+                case stop:
+                    if (packType.equals(PackType.docker.name())) {
+                        statusResult = dockerAppServiceImpl.stop(appId);
+                    } else {
+                        statusResult = zipAppServiceImpl.stop(appId);
+                    }
+                    statusResult.setResult(Result.result(ResultStatus.SUCCESS));
+                    break;
+                case start:
+                    if (packType.equals(PackType.docker.name())) {
+                        statusResult = dockerAppServiceImpl.start(appId);
+                    } else {
+                        statusResult = zipAppServiceImpl.start(appId);
+                    }
+                    statusResult.setResult(Result.result(ResultStatus.SUCCESS));
+                    break;
+                case status:
+                    if (packType.equals(PackType.docker.name())) {
+                        statusResult = dockerAppServiceImpl.status(appId);
+                    } else {
+                        statusResult = zipAppServiceImpl.status(appId);
+                    }
+                    statusResult.setResult(Result.result(ResultStatus.SUCCESS));
+                    break;
+                default:
+                    statusResult = new StatusResult();
+                    String msg = String.format("应用状态操作类型 %s 不存在", ops);
+                    statusResult.setResult(Result.result(ResultStatus.ERROR, msg));
+            }
+        } catch (Exception e) {
+            statusResult = new StatusResult();
+            statusResult.setResult(Result.result(ResultStatus.FAIL, ExceptionUtil.errorMsg(e)));
+        }
+
+        String jsonPayload = JsonConverter.objectToJson(statusResult);
+        EventMessage evtMsg = EventMessage.eventMessage(new EvtAppOpsResult(jsonPayload));
+        redisPubSub.publish(MsgQueue.managerTopic(), evtMsg);
+    }
+}

+ 30 - 0
agent/src/main/java/cn/reghao/devops/agent/sub/handler/EvtAppDeployHandler.java

@@ -0,0 +1,30 @@
+package cn.reghao.devops.agent.sub.handler;
+
+import cn.reghao.devops.agent.sub.AppServices;
+import cn.reghao.devops.common.event.Event;
+import cn.reghao.devops.common.event.Handler;
+import cn.reghao.devops.common.msg.event.EvtAppDeploy;
+import cn.reghao.devops.common.msg.dto.app.DeployParam;
+import cn.reghao.jutil.jdk.serializer.JsonConverter;
+
+import java.util.Set;
+import java.util.concurrent.ConcurrentSkipListSet;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 11:52:04
+ */
+public class EvtAppDeployHandler extends Handler {
+    private final AppServices appServices;
+
+    public EvtAppDeployHandler(AppServices appServices) {
+        this.appServices = appServices;
+    }
+
+    @Override
+    public void dispatch(Event evt) {
+        EvtAppDeploy evtAppDeploy = (EvtAppDeploy) evt;
+        DeployParam deployParam = JsonConverter.jsonToObject(evtAppDeploy.getJsonPayload(), DeployParam.class);
+        appServices.deploy(deployParam);
+    }
+}

+ 27 - 0
agent/src/main/java/cn/reghao/devops/agent/sub/handler/EvtAppOpsHandler.java

@@ -0,0 +1,27 @@
+package cn.reghao.devops.agent.sub.handler;
+
+import cn.reghao.devops.agent.sub.AppServices;
+import cn.reghao.devops.common.event.Event;
+import cn.reghao.devops.common.event.Handler;
+import cn.reghao.devops.common.msg.event.EvtAppOps;
+import cn.reghao.devops.common.msg.dto.app.StatusParam;
+import cn.reghao.jutil.jdk.serializer.JsonConverter;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 14:07:45
+ */
+public class EvtAppOpsHandler extends Handler {
+    private final AppServices appServices;
+
+    public EvtAppOpsHandler(AppServices appServices) {
+        this.appServices = appServices;
+    }
+
+    @Override
+    public void dispatch(Event evt) {
+        EvtAppOps evtAppDeploy = (EvtAppOps) evt;
+        StatusParam statusParam = JsonConverter.jsonToObject(evtAppDeploy.getJsonPayload(), StatusParam.class);
+        appServices.appOps(statusParam);
+    }
+}

+ 0 - 6
agent/src/main/resources/banner.txt

@@ -1,6 +0,0 @@
-     _                        _
-  __| | __ _  __ _  ___ _ __ | |_
- / _` |/ _` |/ _` |/ _ \ '_ \| __|
-| (_| | (_| | (_| |  __/ | | | |_
- \__,_|\__,_|\__, |\___|_| |_|\__|
-             |___/

+ 8 - 0
common/src/main/java/cn/reghao/devops/common/event/AbstractMessage.java

@@ -0,0 +1,8 @@
+package cn.reghao.devops.common.event;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 09:51:15
+ */
+public abstract class AbstractMessage implements Message {
+}

+ 9 - 0
common/src/main/java/cn/reghao/devops/common/event/Channel.java

@@ -0,0 +1,9 @@
+package cn.reghao.devops.common.event;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 09:51:45
+ */
+public interface Channel<E extends Message> {
+    void dispatch(E message);
+}

+ 10 - 0
common/src/main/java/cn/reghao/devops/common/event/DynamicRouter.java

@@ -0,0 +1,10 @@
+package cn.reghao.devops.common.event;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 09:52:19
+ */
+public interface DynamicRouter<E extends Message> {
+    void registerChannel(Class<? extends E> contentType, Channel<? extends E> channel);
+    void dispatch(E content);
+}

+ 14 - 0
common/src/main/java/cn/reghao/devops/common/event/Event.java

@@ -0,0 +1,14 @@
+package cn.reghao.devops.common.event;
+
+/**
+ * @author reghao
+ * @date 2022-05-04 17:44:42
+ */
+public class Event implements Message {
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public Class<? extends Message> getType() {
+        return getClass();
+    }
+}

+ 22 - 0
common/src/main/java/cn/reghao/devops/common/event/EventDispatcher.java

@@ -0,0 +1,22 @@
+package cn.reghao.devops.common.event;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 09:55:18
+ */
+public class EventDispatcher implements DynamicRouter<Event> {
+    private final Map<Class<? extends Event>, Handler> handlers = new HashMap<>();
+
+    @Override
+    public void registerChannel(Class<? extends Event> contentType, Channel<? extends Event> channel) {
+        handlers.put(contentType, (Handler) channel);
+    }
+
+    @Override
+    public void dispatch(Event content) {
+        handlers.get(content.getClass()).dispatch(content);
+    }
+}

+ 11 - 0
common/src/main/java/cn/reghao/devops/common/event/Handler.java

@@ -0,0 +1,11 @@
+package cn.reghao.devops.common.event;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 09:54:21
+ */
+public class Handler implements Channel<Event> {
+    @Override
+    public void dispatch(Event message) {
+    }
+}

+ 11 - 0
common/src/main/java/cn/reghao/devops/common/event/Message.java

@@ -0,0 +1,11 @@
+package cn.reghao.devops.common.event;
+
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 09:51:15
+ */
+public interface Message extends Serializable {
+    Class<? extends Message> getType();
+}

+ 3 - 18
common/src/main/java/cn/reghao/devops/common/log/MqttAppender.java → common/src/main/java/cn/reghao/devops/common/log/AppenderImpl.java

@@ -3,14 +3,9 @@ package cn.reghao.devops.common.log;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.UnsynchronizedAppenderBase;
 import cn.reghao.devops.common.machine.Machine;
-import cn.reghao.devops.common.mqtt.AsyncMqttClient;
-import cn.reghao.devops.common.msg.Message;
 import cn.reghao.devops.common.msg.MsgQueue;
-import cn.reghao.devops.common.msg.pub.PubMsg;
-import cn.reghao.devops.common.msg.pub.constant.NodeEventPubClazz;
-import cn.reghao.devops.common.msg.pub.dto.node.NodeLogDTO;
+import cn.reghao.devops.common.msg.dto.node.NodeLogDTO;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import org.eclipse.paho.client.mqttv3.MqttException;
 
 /**
  * 日志写到 MQTT broker
@@ -18,15 +13,13 @@ import org.eclipse.paho.client.mqttv3.MqttException;
  * @author reghao
  * @date 2021-06-08 19:37:21
  */
-public class MqttAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
+public class AppenderImpl extends UnsynchronizedAppenderBase<ILoggingEvent> {
     private final String appId;
     private final String topic;
-    private final AsyncMqttClient mqttClient;
 
-    public MqttAppender(String appId, AsyncMqttClient mqttClient) {
+    public AppenderImpl(String appId) {
         this.appId = appId;
         this.topic = MsgQueue.managerTopic();
-        this.mqttClient = mqttClient;
     }
 
     @Override
@@ -43,14 +36,6 @@ public class MqttAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
     protected void append(ILoggingEvent event) {
         NodeLogDTO nodeLogDTO = nodeLogDTO(event);
         String jsonPayload = JsonConverter.objectToJson(nodeLogDTO);
-        PubMsg pubMsg = PubMsg.pubMsg(NodeEventPubClazz.class.getSimpleName(), NodeEventPubClazz.log.name(), jsonPayload);
-        Message message = Message.pubMsg(pubMsg);
-        try {
-            mqttClient.pub(topic, 1, JsonConverter.objectToJson(message));
-        } catch (MqttException e) {
-            e.printStackTrace();
-            LogCache.put(message);
-        }
     }
 
     private NodeLogDTO nodeLogDTO(ILoggingEvent event) {

+ 5 - 6
common/src/main/java/cn/reghao/devops/common/log/Appenders.java

@@ -6,7 +6,6 @@ import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.Appender;
 import ch.qos.logback.core.ConsoleAppender;
 import ch.qos.logback.core.FileAppender;
-import cn.reghao.devops.common.mqtt.AsyncMqttClient;
 import org.slf4j.LoggerFactory;
 
 /**
@@ -16,16 +15,16 @@ import org.slf4j.LoggerFactory;
 public class Appenders {
     private static final LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
 
-    public static Appender<ILoggingEvent> mqttAppender1(String appId, AsyncMqttClient mqttClient) {
+    public static Appender<ILoggingEvent> redisAppender(String appId) {
         PatternLayoutEncoder layoutEncoder = new PatternLayoutEncoder();
         layoutEncoder.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n");
         layoutEncoder.setContext(loggerContext);
         layoutEncoder.start();
 
-        MqttAppender mqttAppender = new MqttAppender(appId, mqttClient);
-        mqttAppender.setContext(loggerContext);
-        mqttAppender.start();
-        return mqttAppender;
+        AppenderImpl appenderImpl = new AppenderImpl(appId);
+        appenderImpl.setContext(loggerContext);
+        appenderImpl.start();
+        return appenderImpl;
     }
 
     public static Appender<ILoggingEvent> fileAppender() {

+ 0 - 38
common/src/main/java/cn/reghao/devops/common/log/LogCache.java

@@ -1,38 +0,0 @@
-package cn.reghao.devops.common.log;
-
-import cn.reghao.devops.common.msg.Message;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * MQTT 连接断开时, MqttAppender 不可用, 此时将日志消息缓存起来, 等连接可用时全部发送出去
- *
- * logs 作为共享变量, 会出现多个线程同时访问, 应避免出现数据冲突
- *
- * @author reghao
- * @date 2021-10-29 14:23:59
- */
-public class LogCache {
-    private static final Object lock = new Object();
-    private static Map<Long, Message> logs = new HashMap<>();
-
-    public static void put(Message message) {
-        synchronized (lock) {
-            logs.put(System.currentTimeMillis(), message);
-        }
-    }
-
-    public static Map<Long, Message> getAll() {
-        synchronized (lock) {
-            // TODO 需要按时间对日志进行排序
-            return logs;
-        }
-    }
-
-    public static void clear() {
-        synchronized (lock) {
-            logs.clear();
-        }
-    }
-}

+ 5 - 1
common/src/main/java/cn/reghao/devops/common/log/LoggerConfig.java

@@ -10,7 +10,7 @@ import org.slf4j.LoggerFactory;
 import java.util.List;
 
 /**
- * 编程方式配置 logback,相当于 logback-spring-bak.xml 配置
+ * 编程方式配置 logback,相当于 logback-spring.xml 配置
  *
  * @author reghao
  * @date 2021-02-23 23:53:35
@@ -25,8 +25,12 @@ public class LoggerConfig {
         }
 
         Logger rootLogger = loggerContext.getLogger("ROOT");
+        // 停用当前的所有 appender
+        rootLogger.detachAndStopAllAppenders();
+
         rootLogger.setAdditive(false);
         rootLogger.setLevel(Level.INFO);
+        // 使用 RedisAppender 作为 logger 的唯一 appender
         appenders.forEach(rootLogger::addAppender);
     }
 }

+ 1 - 1
common/src/main/java/cn/reghao/devops/common/machine/Machine.java

@@ -48,7 +48,7 @@ public class Machine {
 
         List<NetworkDetail> list = network.detail().stream()
                 .peek(networkDetail -> {
-                    WebResponse webResponse = webRequest.get("http://ip.iquizoo.com");
+                    WebResponse webResponse = webRequest.get("http://ip.reghao.cn");
                     if (webResponse.getStatusCode() == 200) {
                         networkDetail.setPubicIpv4(webResponse.getBody());
                     }

+ 0 - 189
common/src/main/java/cn/reghao/devops/common/mqtt/AsyncMqttClient.java

@@ -1,189 +0,0 @@
-package cn.reghao.devops.common.mqtt;
-
-import cn.reghao.devops.common.log.LogCache;
-import cn.reghao.devops.common.machine.Machine;
-import cn.reghao.devops.common.msg.Message;
-import cn.reghao.devops.common.msg.MsgQueue;
-import cn.reghao.devops.common.msg.pub.PubMsg;
-import cn.reghao.devops.common.msg.pub.constant.NodeEventPubClazz;
-import cn.reghao.devops.common.msg.rpc.RpcMsg;
-import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.paho.client.mqttv3.*;
-import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
-
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * TODO 采用 Builder 模式初始化参数
- *
- * @author reghao
- * @date 2021-10-28 20:52:17
- */
-@Slf4j
-public class AsyncMqttClient {
-    private final MqttProperties properties;
-    private final MqttAsyncClient mqttClient;
-    private final Map<String, IMqttMessageListener> msgListeners = new HashMap<>();
-    private final Map<String, RpcMsg> rpcRecorder = new ConcurrentHashMap<>();
-
-    public AsyncMqttClient(MqttProperties properties) throws MqttException {
-        this.properties = properties;
-        String clientId = properties.getClientId() + Machine.ID;
-        mqttClient = new MqttAsyncClient(properties.getBroker(), clientId, new MemoryPersistence());
-    }
-
-    private MqttConnectOptions connectOptions() {
-        MqttConnectOptions options = new MqttConnectOptions();
-        options.setUserName(properties.getUsername());
-        options.setPassword(properties.getPassword().toCharArray());
-        // 在服务端保存状态
-        options.setCleanSession(false);
-        // 自动重连
-        options.setAutomaticReconnect(true);
-        // 避免 Timed out as no activity, keepAlive=60,000 lastOutboundActivity=1,635,408,462,211 错误
-        options.setConnectionTimeout(0);
-        // 设置 last will message
-        options.setWill(MsgQueue.managerTopic(), lastWillMessage(), 1, false);
-        return options;
-    }
-
-    /**
-     * LWT 消息
-     *
-     * @param
-     * @return
-     * @date 2021-11-04 下午3:57
-     */
-    private byte[] lastWillMessage() {
-        String jsonPayload = String.format("{\"machineId\":\"%s\"}", Machine.ID);
-        PubMsg pubMsg = PubMsg.pubMsg(NodeEventPubClazz.class.getSimpleName(),
-                NodeEventPubClazz.unavail.name(), jsonPayload);
-        Message message = Message.pubMsg(pubMsg);
-        return JsonConverter.objectToJson(message).getBytes(StandardCharsets.UTF_8);
-    }
-
-    public void add(String topic, IMqttMessageListener messageListener) {
-        msgListeners.putIfAbsent(topic, messageListener);
-    }
-
-    public Map<String, IMqttMessageListener> getMsgListeners() {
-        return msgListeners;
-    }
-
-    public RpcMsg getAndRemoveRecord(String msgId) {
-        return rpcRecorder.remove(msgId);
-    }
-
-    /**
-     * 没有返回结果的 RPC 调用
-     *
-     * @param
-     * @return
-     * @date 2021-11-04 上午11:33
-     */
-    public Map<String, RpcMsg> unreturnedRpc() {
-        return rpcRecorder;
-    }
-
-    public void connect(IMqttActionListener actionListener) throws MqttException {
-        mqttClient.setCallback(new ConnectionCallback());
-        mqttClient.connect(connectOptions(), null, actionListener);
-    }
-
-    public boolean isConnected() {
-        return mqttClient.isConnected();
-    }
-
-    /**
-     * qos=0 的消息不能离线
-     *
-     * @param
-     * @return
-     * @date 2021-06-16 下午8:40
-     */
-    public void pub(String topic, int qos, String payload) throws MqttException {
-        MqttMessage message = new MqttMessage();
-        message.setQos(qos);
-        //message.setRetained(true);
-        message.setPayload(payload.getBytes());
-        mqttClient.publish(topic, message);
-    }
-
-    /**
-     * pub 消息后,等 sub 端处理后在 pub 结果
-     *
-     * @param
-     * @return
-     * @date 2021-06-30 上午11:22
-     */
-    public void pubWithResult(String topic, int qos, Message message) throws MqttException {
-        MqttMessage mqttMessage = new MqttMessage();
-        mqttMessage.setQos(qos);
-        mqttMessage.setPayload(JsonConverter.objectToJson(message).getBytes());
-
-        mqttClient.publish(topic, mqttMessage);
-        rpcRecorder.put(message.getMsgId(), message.getRpcMsg());
-    }
-
-    public void sub(String topic, IMqttMessageListener messageListener) throws MqttException {
-        mqttClient.subscribe(topic, 2, messageListener);
-    }
-
-    /**
-     * MQTT 连接回调
-     *
-     * @param
-     * @return
-     * @date 2021-10-28 下午8:31
-     */
-    class ConnectionCallback implements MqttCallbackExtended {
-        @Override
-        public void connectComplete(boolean reconnect, String serverUri) {
-            if (reconnect) {
-                log.info("MQTT 重新连接成功");
-                log.info("发布之前未发送成功的日志");
-                LogCache.getAll().forEach((timestamp, message) -> {
-                    try {
-                        pub(MsgQueue.managerTopic(), 1, JsonConverter.objectToJson(message));
-                    } catch (MqttException e) {
-                        e.printStackTrace();
-                        LogCache.put(message);
-                    }
-                });
-
-                log.info("重新订阅 topic");
-                // 重连完成后自动订阅 topic
-                msgListeners.forEach((topic, listener) -> {
-                    try {
-                        sub(topic, listener);
-                    } catch (MqttException e) {
-                        log.error("重新订阅 {} 失败,原因: {}", topic, e.getMessage());
-                    }
-                });
-            }
-        }
-
-        @Override
-        public void connectionLost(Throwable cause) {
-            log.error("MQTT 连接断开, 准备重新连接 {}", cause.getMessage());
-            try {
-                mqttClient.reconnect();
-            } catch (MqttException e) {
-                e.printStackTrace();
-                log.error("MQTT 重连失败 {}", cause.getMessage());
-            }
-        }
-
-        @Override
-        public void messageArrived(String topic, MqttMessage message) {
-        }
-
-        @Override
-        public void deliveryComplete(IMqttDeliveryToken token) {
-        }
-    }
-}

+ 0 - 156
common/src/main/java/cn/reghao/devops/common/mqtt/DefaultMqttClient.java

@@ -1,156 +0,0 @@
-package cn.reghao.devops.common.mqtt;
-
-import cn.reghao.devops.common.machine.Machine;
-import cn.reghao.devops.common.msg.Message;
-import cn.reghao.devops.common.msg.rpc.RpcMsg;
-import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.paho.client.mqttv3.*;
-import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author reghao
- * @date 2021-05-21 08:27:41
- */
-@Deprecated
-@Slf4j
-public class DefaultMqttClient implements AutoCloseable {
-    private final MqttProperties properties;
-    private final MqttClient client;
-    // 记录 RPC 调用, size 为 0 时表示所有 pub 消息的结果都已 sub
-    private final Map<String, RpcMsg> rpcRecorder = new HashMap<>();
-    private final Map<String, IMqttMessageListener> subMap = new HashMap<>();
-    private final MqttCallback connCallback = new ConnectionCallback();
-
-    public DefaultMqttClient(MqttProperties properties) throws MqttException {
-        this.properties = properties;
-        String clientId = properties.getClientId() + Machine.ID;
-        this.client = new MqttClient(properties.getBroker(), clientId, new MemoryPersistence());
-    }
-
-    private MqttConnectOptions connectOptions() {
-        MqttConnectOptions options = new MqttConnectOptions();
-        options.setUserName(properties.getUsername());
-        options.setPassword(properties.getPassword().toCharArray());
-        // 在服务端保存状态
-        options.setCleanSession(false);
-        // 自动重连
-        options.setAutomaticReconnect(true);
-        return options;
-    }
-
-    @Override
-    public void close() throws MqttException {
-        if (client.isConnected()) {
-            client.disconnect();
-        }
-        client.close();
-    }
-
-    public void putRecord(String msgId, RpcMsg rpcMsg) {
-        rpcRecorder.put(msgId, rpcMsg);
-    }
-
-    public RpcMsg getRecord(String msgId) {
-        return rpcRecorder.get(msgId);
-    }
-
-    public void removeRecord(String msgId) {
-        rpcRecorder.remove(msgId);
-    }
-
-    public boolean isConnected() {
-        return client.isConnected();
-    }
-
-    // TODO 处理系统启动时没有成功连接的情况
-    private void connect() throws MqttException {
-        if (!client.isConnected()) {
-            client.setCallback(connCallback);
-            client.connect(connectOptions());
-        }
-    }
-
-    /**
-     * 确保能订阅到离线消息的设置:
-     * - qos=1
-     * - clientId 确定且唯一,不能使用随机的 UUID
-     * - CleanSession=false
-     *
-     * @param
-     * @return
-     * @date 2021-06-16 下午8:39
-     */
-    public void sub(String topic, IMqttMessageListener messageListener) throws MqttException {
-        connect();
-        client.subscribe(topic, 1, messageListener);
-    }
-
-    private void resub(String topic, IMqttMessageListener messageListener) throws MqttException {
-        client.subscribe(topic, 1, messageListener);
-        log.info("重新订阅 {} 成功", topic);
-    }
-
-    /**
-     * qos=0 的消息不能离线
-     *
-     * @param
-     * @return
-     * @date 2021-06-16 下午8:40
-     */
-    public void pub(String topic, int qos, String payload) throws MqttException {
-        MqttMessage message = new MqttMessage();
-        message.setQos(qos);
-        message.setPayload(payload.getBytes());
-
-        connect();
-        client.publish(topic, message);
-    }
-
-    /**
-     * pub 消息后,等 sub 端处理后在 pub 结果
-     *
-     * @param
-     * @return
-     * @date 2021-06-30 上午11:22
-     */
-    public void pubWithResult(String topic, int qos, Message message) throws MqttException {
-        MqttMessage mqttMessage = new MqttMessage();
-        mqttMessage.setQos(qos);
-        mqttMessage.setPayload(JsonConverter.objectToJson(message).getBytes());
-
-        connect();
-        client.publish(topic, mqttMessage);
-        rpcRecorder.put(message.getMsgId(), message.getRpcMsg());
-    }
-
-    class ConnectionCallback implements MqttCallbackExtended {
-        @Override
-        public void connectComplete(boolean reconnect, String serverUri) {
-            // 重连完成后自动订阅 topic
-            subMap.forEach((topic, listener) -> {
-                try {
-                    resub(topic, listener);
-                } catch (MqttException e) {
-                    log.error("重新订阅 {} 失败,原因: {}", topic, e.getMessage());
-                }
-            });
-        }
-
-        @Override
-        public void connectionLost(Throwable cause) {
-            log.error("MQTT connection lost {}", cause.getMessage());
-        }
-
-        @Override
-        public void messageArrived(String topic, MqttMessage message) throws Exception {
-        }
-
-        @Override
-        public void deliveryComplete(IMqttDeliveryToken token) {
-        }
-    }
-}

+ 0 - 15
common/src/main/java/cn/reghao/devops/common/mqtt/MqttProperties.java

@@ -1,15 +0,0 @@
-package cn.reghao.devops.common.mqtt;
-
-import lombok.Data;
-
-/**
- * @author reghao
- * @date 2019-08-27 00:17:55
- */
-@Data
-public class MqttProperties {
-    private String broker;
-    private String username;
-    private String password;
-    private String clientId;
-}

+ 0 - 9
common/src/main/java/cn/reghao/devops/common/msg/ClazzDispatcher.java

@@ -1,9 +0,0 @@
-package cn.reghao.devops.common.msg;
-
-/**
- * @author reghao
- * @date 2021-10-19 16:00:12
- */
-public interface ClazzDispatcher<K, V> {
-    V dispatch(K k);
-}

+ 33 - 0
common/src/main/java/cn/reghao/devops/common/msg/EventMessage.java

@@ -0,0 +1,33 @@
+package cn.reghao.devops.common.msg;
+
+import cn.reghao.devops.common.event.Event;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+/**
+ * @author reghao
+ * @date 2021-08-25 17:19:41
+ */
+@Getter
+@Setter
+public class EventMessage implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String msgId;
+    private long sendTime;
+    private Event event;
+
+    private EventMessage() {
+        this.msgId = UUID.randomUUID().toString();
+        this.sendTime = System.currentTimeMillis();
+    }
+
+    public static EventMessage eventMessage(Event event) {
+        EventMessage evtMsg = new EventMessage();
+        evtMsg.setEvent(event);
+        return evtMsg;
+    }
+}

+ 0 - 54
common/src/main/java/cn/reghao/devops/common/msg/Message.java

@@ -1,54 +0,0 @@
-package cn.reghao.devops.common.msg;
-
-import cn.reghao.devops.common.msg.pub.PubMsg;
-import cn.reghao.devops.common.msg.rpc.RpcMsg;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.UUID;
-
-/**
- * @author reghao
- * @date 2021-08-25 17:19:41
- */
-@Data
-public class Message implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private String msgId;
-    private long sendTime;
-    private String msgType;
-    private PubMsg pubMsg;
-    private RpcMsg rpcMsg;
-
-    private Message() {
-        this.msgId = UUID.randomUUID().toString();
-        this.sendTime = System.currentTimeMillis();
-    }
-
-    private Message(String msgId) {
-        this.msgId = msgId;
-        this.sendTime = System.currentTimeMillis();
-    }
-
-    public static Message pubMsg(PubMsg pubMsg) {
-        Message message = new Message();
-        message.setMsgType(MsgType.pub.name());
-        message.setPubMsg(pubMsg);
-        return message;
-    }
-
-    public static Message rpcParamMsg(RpcMsg rpcMsg) {
-        Message message = new Message();
-        message.setMsgType(MsgType.rpcParam.name());
-        message.setRpcMsg(rpcMsg);
-        return message;
-    }
-
-    public static Message rpcResultMsg(String msgId, RpcMsg rpcMsg) {
-        Message message = new Message(msgId);
-        message.setMsgType(MsgType.rpcResult.name());
-        message.setRpcMsg(rpcMsg);
-        return message;
-    }
-}

+ 3 - 7
common/src/main/java/cn/reghao/devops/common/msg/MsgQueue.java

@@ -1,6 +1,6 @@
 package cn.reghao.devops.common.msg;
 
-import cn.reghao.devops.common.msg.pub.dto.node.constant.AppId;
+import cn.reghao.devops.common.msg.constant.AppId;
 
 /**
  * @author reghao
@@ -8,14 +8,10 @@ import cn.reghao.devops.common.msg.pub.dto.node.constant.AppId;
  */
 public class MsgQueue {
     public static String managerTopic() {
-        return AppId.manager.name();
+        return String.format("devops:%s", AppId.manager.name());
     }
 
     public static String agentTopic(String nodeId) {
-        return String.format("%s/%s", AppId.agent.name(), nodeId);
-    }
-
-    public static String sysTopic() {
-        return "SYS/broker/clients/#";
+        return String.format("devops:%s:%s", AppId.agent.name(), nodeId);
     }
 }

+ 0 - 9
common/src/main/java/cn/reghao/devops/common/msg/MsgType.java

@@ -1,9 +0,0 @@
-package cn.reghao.devops.common.msg;
-
-/**
- * @author reghao
- * @date 2021-09-15 09:01:17
- */
-public enum MsgType {
-    pub, rpcParam, rpcResult
-}

+ 1 - 1
common/src/main/java/cn/reghao/devops/common/msg/pub/dto/node/constant/AppId.java → common/src/main/java/cn/reghao/devops/common/msg/constant/AppId.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.common.msg.pub.dto.node.constant;
+package cn.reghao.devops.common.msg.constant;
 
 /**
  * @author reghao

+ 2 - 2
common/src/main/java/cn/reghao/devops/common/msg/rpc/constant/AppRpcClazz.java → common/src/main/java/cn/reghao/devops/common/msg/constant/AppOps.java

@@ -1,9 +1,9 @@
-package cn.reghao.devops.common.msg.rpc.constant;
+package cn.reghao.devops.common.msg.constant;
 
 /**
  * @author reghao
  * @date 2020-12-25 19:15:00
  */
-public enum AppRpcClazz {
+public enum AppOps {
     deploy, restart, stop, start, status, log,
 }

+ 1 - 1
common/src/main/java/cn/reghao/devops/common/msg/pub/dto/node/constant/NodeStatus.java → common/src/main/java/cn/reghao/devops/common/msg/constant/NodeStatus.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.common.msg.pub.dto.node.constant;
+package cn.reghao.devops.common.msg.constant;
 
 /**
  * @author reghao

+ 1 - 1
common/src/main/java/cn/reghao/devops/common/msg/rpc/dto/app/DeployParam.java → common/src/main/java/cn/reghao/devops/common/msg/dto/app/DeployParam.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.common.msg.rpc.dto.app;
+package cn.reghao.devops.common.msg.dto.app;
 
 import lombok.Data;
 

+ 2 - 1
common/src/main/java/cn/reghao/devops/common/msg/rpc/dto/app/DeployResult.java → common/src/main/java/cn/reghao/devops/common/msg/dto/app/DeployResult.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.common.msg.rpc.dto.app;
+package cn.reghao.devops.common.msg.dto.app;
 
 import cn.reghao.jutil.jdk.result.Result;
 import lombok.Data;
@@ -17,6 +17,7 @@ public class DeployResult implements Serializable {
     private String buildLogId;
     private String machineId;
     private LocalDateTime deployTime;
+    private StatusResult statusResult;
     private Result result;
 
     public DeployResult(String buildLogId, String machineId) {

+ 1 - 1
common/src/main/java/cn/reghao/devops/common/msg/rpc/dto/app/PackType.java → common/src/main/java/cn/reghao/devops/common/msg/dto/app/PackType.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.common.msg.rpc.dto.app;
+package cn.reghao.devops.common.msg.dto.app;
 
 /**
  * 打包方式类型

+ 2 - 1
common/src/main/java/cn/reghao/devops/common/msg/rpc/dto/app/StatusParam.java → common/src/main/java/cn/reghao/devops/common/msg/dto/app/StatusParam.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.common.msg.rpc.dto.app;
+package cn.reghao.devops.common.msg.dto.app;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -18,4 +18,5 @@ public class StatusParam implements Serializable {
 
     private String packType;
     private String appId;
+    private String ops;
 }

+ 3 - 1
common/src/main/java/cn/reghao/devops/common/msg/rpc/dto/app/StatusResult.java → common/src/main/java/cn/reghao/devops/common/msg/dto/app/StatusResult.java

@@ -1,5 +1,6 @@
-package cn.reghao.devops.common.msg.rpc.dto.app;
+package cn.reghao.devops.common.msg.dto.app;
 
+import cn.reghao.jutil.jdk.result.Result;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -21,4 +22,5 @@ public class StatusResult implements Serializable {
     private String status;
     private LocalDateTime startTime;
     private Integer pid;
+    private Result result;
 }

+ 2 - 1
common/src/main/java/cn/reghao/devops/common/msg/pub/dto/node/NodeLogDTO.java → common/src/main/java/cn/reghao/devops/common/msg/dto/node/NodeLogDTO.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.common.msg.pub.dto.node;
+package cn.reghao.devops.common.msg.dto.node;
 
 import lombok.Data;
 
@@ -9,6 +9,7 @@ import java.io.Serializable;
  * @date 2021-06-11 09:48:14
  */
 @Data
+@Deprecated
 public class NodeLogDTO implements Serializable {
     private static final long serialVersionUID = 1L;
 

+ 20 - 0
common/src/main/java/cn/reghao/devops/common/msg/event/EvtAgentLog.java

@@ -0,0 +1,20 @@
+package cn.reghao.devops.common.msg.event;
+
+import cn.reghao.devops.common.event.Event;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 13:56:22
+ */
+@Getter
+@Setter
+public class EvtAgentLog extends Event {
+    private String machineId;
+    private long timestamp;
+    private String level;
+    private String threadName;
+    private String loggerName;
+    private String message;
+}

+ 15 - 0
common/src/main/java/cn/reghao/devops/common/msg/event/EvtAppDeploy.java

@@ -0,0 +1,15 @@
+package cn.reghao.devops.common.msg.event;
+
+import cn.reghao.devops.common.event.Event;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 13:56:22
+ */
+@AllArgsConstructor
+@Getter
+public class EvtAppDeploy extends Event {
+    private String jsonPayload;
+}

+ 15 - 0
common/src/main/java/cn/reghao/devops/common/msg/event/EvtAppDeployResult.java

@@ -0,0 +1,15 @@
+package cn.reghao.devops.common.msg.event;
+
+import cn.reghao.devops.common.event.Event;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 13:56:22
+ */
+@AllArgsConstructor
+@Getter
+public class EvtAppDeployResult extends Event {
+    private String jsonPayload;
+}

+ 15 - 0
common/src/main/java/cn/reghao/devops/common/msg/event/EvtAppOps.java

@@ -0,0 +1,15 @@
+package cn.reghao.devops.common.msg.event;
+
+import cn.reghao.devops.common.event.Event;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 14:10:54
+ */
+@AllArgsConstructor
+@Getter
+public class EvtAppOps extends Event {
+    private String jsonPayload;
+}

+ 15 - 0
common/src/main/java/cn/reghao/devops/common/msg/event/EvtAppOpsResult.java

@@ -0,0 +1,15 @@
+package cn.reghao.devops.common.msg.event;
+
+import cn.reghao.devops.common.event.Event;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 14:10:54
+ */
+@AllArgsConstructor
+@Getter
+public class EvtAppOpsResult extends Event {
+    private String jsonPayload;
+}

+ 15 - 0
common/src/main/java/cn/reghao/devops/common/msg/event/EvtMachineHeartbeat.java

@@ -0,0 +1,15 @@
+package cn.reghao.devops.common.msg.event;
+
+import cn.reghao.devops.common.event.Event;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 13:59:15
+ */
+@AllArgsConstructor
+@Getter
+public class EvtMachineHeartbeat extends Event {
+    private String jsonPayload;
+}

+ 15 - 0
common/src/main/java/cn/reghao/devops/common/msg/event/EvtMachineHeartbeatResult.java

@@ -0,0 +1,15 @@
+package cn.reghao.devops.common.msg.event;
+
+import cn.reghao.devops.common.event.Event;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 13:59:15
+ */
+@AllArgsConstructor
+@Getter
+public class EvtMachineHeartbeatResult extends Event {
+    private String jsonPayload;
+}

+ 15 - 0
common/src/main/java/cn/reghao/devops/common/msg/event/EvtMachineShutdown.java

@@ -0,0 +1,15 @@
+package cn.reghao.devops.common.msg.event;
+
+import cn.reghao.devops.common.event.Event;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 13:59:15
+ */
+@AllArgsConstructor
+@Getter
+public class EvtMachineShutdown extends Event {
+    private String jsonPayload;
+}

+ 15 - 0
common/src/main/java/cn/reghao/devops/common/msg/event/EvtMachineStart.java

@@ -0,0 +1,15 @@
+package cn.reghao.devops.common.msg.event;
+
+import cn.reghao.devops.common.event.Event;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author reghao
+ * @date 2022-05-05 13:59:15
+ */
+@AllArgsConstructor
+@Getter
+public class EvtMachineStart extends Event {
+    private String jsonPayload;
+}

+ 0 - 26
common/src/main/java/cn/reghao/devops/common/msg/pub/PubMsg.java

@@ -1,26 +0,0 @@
-package cn.reghao.devops.common.msg.pub;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author reghao
- * @date 2021-09-15 08:57:55
- */
-@Data
-public class PubMsg implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private String clazz;
-    private String method;
-    private String jsonPayload;
-
-    public static PubMsg pubMsg(String clazz, String method, String jsonPayload) {
-        PubMsg pubMsg = new PubMsg();
-        pubMsg.setClazz(clazz);
-        pubMsg.setMethod(method);
-        pubMsg.setJsonPayload(jsonPayload);
-        return pubMsg;
-    }
-}

+ 0 - 18
common/src/main/java/cn/reghao/devops/common/msg/pub/clazz/INodeEventPubClazz.java

@@ -1,18 +0,0 @@
-package cn.reghao.devops.common.msg.pub.clazz;
-
-import cn.reghao.devops.common.msg.pub.dto.node.NodeLogDTO;
-import cn.reghao.jutil.jdk.machine.data.detail.MachineDetail;
-import cn.reghao.jutil.jdk.machine.data.stat.MachineStat;
-
-/**
- * 节点事件
- *
- * @author reghao
- * @date 2021-09-15 09:19:14
- */
-public interface INodeEventPubClazz {
-    void start(MachineDetail machineDetail);
-    void heartbeat(MachineStat machineStat);
-    void shutdown(MachineStat machineStat);
-    void log(NodeLogDTO nodeLogDTO);
-}

+ 0 - 9
common/src/main/java/cn/reghao/devops/common/msg/pub/constant/NodeEventPubClazz.java

@@ -1,9 +0,0 @@
-package cn.reghao.devops.common.msg.pub.constant;
-
-/**
- * @author reghao
- * @date 2021-09-15 09:19:14
- */
-public enum NodeEventPubClazz {
-    start, heartbeat, shutdown, unavail, log
-}

+ 0 - 9
common/src/main/java/cn/reghao/devops/common/msg/pub/constant/PubClazz.java

@@ -1,9 +0,0 @@
-package cn.reghao.devops.common.msg.pub.constant;
-
-/**
- * @author reghao
- * @date 2021-09-15 11:51:17
- */
-public enum PubClazz {
-    NodeEventPubClazz,
-}

+ 0 - 64
common/src/main/java/cn/reghao/devops/common/msg/rpc/RpcMsg.java

@@ -1,64 +0,0 @@
-package cn.reghao.devops.common.msg.rpc;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-import static cn.reghao.jutil.jdk.result.ResultStatus.*;
-
-/**
- * @author reghao
- * @date 2021-08-25 17:19:41
- */
-@Data
-public class RpcMsg implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    // 调用参数
-    private String clazz;
-    private String method;
-    private String jsonParam;
-
-    // 返回结果
-    // 0 - 成功 1 - 失败
-    private int code;
-    private String msg;
-    private String jsonData;
-
-    private RpcMsg() {
-    }
-
-    public static RpcMsg paramMsg(String clazz, String method) {
-        RpcMsg paramMsg = new RpcMsg();
-        paramMsg.setClazz(clazz);
-        paramMsg.setMethod(method);
-        return paramMsg;
-    }
-
-    public static RpcMsg paramMsg(String clazz, String method, String jsonParam) {
-        RpcMsg paramMsg = new RpcMsg();
-        paramMsg.setClazz(clazz);
-        paramMsg.setMethod(method);
-        paramMsg.setJsonParam(jsonParam);
-        return paramMsg;
-    }
-
-    public RpcMsg success(String jsonData) {
-        this.setCode(SUCCESS.getCode());
-        this.setMsg(SUCCESS.getMsg());
-        this.setJsonData(jsonData);
-        return this;
-    }
-
-    public RpcMsg fail(String msg) {
-        this.setCode(FAIL.getCode());
-        this.setMsg(msg);
-        return this;
-    }
-
-    public RpcMsg error(String msg) {
-        this.setCode(ERROR.getCode());
-        this.setMsg(msg);
-        return this;
-    }
-}

+ 0 - 19
common/src/main/java/cn/reghao/devops/common/msg/rpc/clazz/IAppRpcClazz.java

@@ -1,19 +0,0 @@
-package cn.reghao.devops.common.msg.rpc.clazz;
-
-import cn.reghao.devops.common.msg.rpc.dto.app.DeployParam;
-import cn.reghao.devops.common.msg.rpc.dto.app.DeployResult;
-import cn.reghao.devops.common.msg.rpc.dto.app.StatusParam;
-import cn.reghao.devops.common.msg.rpc.dto.app.StatusResult;
-
-/**
- * @author reghao
- * @date 2020-12-25 19:15:00
- */
-public interface IAppRpcClazz {
-    DeployResult deploy(DeployParam deployParam);
-    StatusResult restart(StatusParam statusParam) throws Exception;
-    StatusResult stop(StatusParam statusParam) throws Exception;
-    StatusResult start(StatusParam statusParam) throws Exception;
-    StatusResult status(StatusParam statusParam) throws Exception;
-    void log();
-}

+ 0 - 9
common/src/main/java/cn/reghao/devops/common/msg/rpc/constant/RpcClazz.java

@@ -1,9 +0,0 @@
-package cn.reghao.devops.common.msg.rpc.constant;
-
-/**
- * @author reghao
- * @date 2021-09-14 18:15:05
- */
-public enum RpcClazz {
-    AppRpcClazz
-}

+ 0 - 7
manager/Dockerfile

@@ -1,7 +0,0 @@
-FROM debian10/openjdk11
-
-WORKDIR /app
-RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
-COPY target/devops-manager.jar /app/devops-manager.jar
-
-ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/devops-manager.jar"]

+ 13 - 19
manager/pom.xml

@@ -58,10 +58,6 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-mongodb</artifactId>
-        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-websocket</artifactId>
@@ -72,27 +68,25 @@
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-security</artifactId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-devtools</artifactId>
-            <optional>true</optional>
-            <scope>true</scope>
+            <artifactId>spring-boot-starter-security</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-configuration-processor</artifactId>
-            <optional>true</optional>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
 
         <dependency>
@@ -132,6 +126,12 @@
             <version>2.9.2</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.ecwid.consul</groupId>
+            <artifactId>consul-api</artifactId>
+            <version>1.4.5</version>
+        </dependency>
+
         <dependency>
             <groupId>org.apache.maven.shared</groupId>
             <artifactId>maven-invoker</artifactId>
@@ -170,12 +170,6 @@
             <artifactId>javax.mail</artifactId>
             <version>RELEASE</version>
         </dependency>
-
-        <dependency>
-            <groupId>org.quartz-scheduler</groupId>
-            <artifactId>quartz</artifactId>
-            <version>2.3.2</version>
-        </dependency>
     </dependencies>
 
     <profiles>

+ 8 - 13
manager/src/main/java/cn/reghao/devops/manager/app/controller/AppStatusController.java

@@ -1,6 +1,6 @@
 package cn.reghao.devops.manager.app.controller;
 
-import cn.reghao.devops.manager.app.model.constant.StatusOps;
+import cn.reghao.devops.common.msg.constant.AppOps;
 import cn.reghao.devops.manager.app.service.AppStatusService;
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.jdk.result.ResultStatus;
@@ -8,7 +8,6 @@ import cn.reghao.jutil.jdk.result.WebBody;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.eclipse.paho.client.mqttv3.MqttException;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
@@ -29,32 +28,28 @@ public class AppStatusController {
 
     @ApiOperation(value = "重启应用")
     @PostMapping(value = "/restart/{appId}/{machineId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String restart(@PathVariable("appId") String appId, @PathVariable("machineId") String machineId)
-            throws MqttException {
-        statusService.changeStatus(appId, machineId, StatusOps.restart);
+    public String restart(@PathVariable("appId") String appId, @PathVariable("machineId") String machineId) {
+        statusService.changeStatus(appId, machineId, AppOps.restart);
         return WebBody.result(Result.result(ResultStatus.SUCCESS, appId + " 正在重启,请 10s 后刷新页面查看最新状态"));
     }
 
     @ApiOperation(value = "停止应用")
     @PostMapping(value = "/stop/{appId}/{machineId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String stop(@PathVariable("appId") String appId, @PathVariable("machineId") String machineId)
-            throws MqttException {
-        statusService.changeStatus(appId, machineId, StatusOps.stop);
+    public String stop(@PathVariable("appId") String appId, @PathVariable("machineId") String machineId) {
+        statusService.changeStatus(appId, machineId, AppOps.stop);
         return WebBody.result(Result.result(ResultStatus.SUCCESS, appId + " 正在停止,请稍后刷新页面"));
     }
 
     @ApiOperation(value = "启动应用")
     @PostMapping(value = "/start/{appId}/{machineId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String start(@PathVariable("appId") String appId, @PathVariable("machineId") String machineId)
-            throws MqttException {
-        statusService.changeStatus(appId, machineId, StatusOps.start);
+    public String start(@PathVariable("appId") String appId, @PathVariable("machineId") String machineId) {
+        statusService.changeStatus(appId, machineId, AppOps.start);
         return WebBody.result(Result.result(ResultStatus.SUCCESS, appId + " 正在启动,请 10s 后刷新页面查看最新状态"));
     }
 
     @ApiOperation(value = "应用当前状态")
     @GetMapping(value = "/{appId}/{machineId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String status(@PathVariable("appId") String appId, @PathVariable("machineId") String machineId)
-            throws MqttException {
+    public String status(@PathVariable("appId") String appId, @PathVariable("machineId") String machineId) {
         statusService.getStatus(appId, machineId);
         String msg = String.format("正在获取 %s 的状态,请 10s 后刷新页面查看", appId);
         return WebBody.result(Result.result(ResultStatus.SUCCESS, msg));

+ 7 - 7
manager/src/main/java/cn/reghao/devops/manager/app/controller/BuildDeployController.java

@@ -1,6 +1,7 @@
 package cn.reghao.devops.manager.app.controller;
 
 import cn.reghao.devops.manager.app.service.BuildDeployService;
+import cn.reghao.devops.manager.app.service.WebhookService;
 import cn.reghao.jutil.jdk.result.WebBody;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
 import com.google.gson.JsonObject;
@@ -22,9 +23,11 @@ import org.springframework.web.bind.annotation.*;
 @RequestMapping("/api/app/bd")
 public class BuildDeployController {
     private final BuildDeployService buildDeployService;
+    private WebhookService webhookService;
 
-    public BuildDeployController(BuildDeployService buildDeployService) {
+    public BuildDeployController(BuildDeployService buildDeployService, WebhookService webhookService) {
         this.buildDeployService = buildDeployService;
+        this.webhookService = webhookService;
     }
 
     @ApiOperation(value = "构建部署应用")
@@ -57,12 +60,9 @@ public class BuildDeployController {
 
     @ApiOperation(value = "webhook 自动构建部署")
     @PostMapping("/hook")
-    public String hook(@RequestBody String body) {
-        JsonObject jsonObject = JsonConverter.jsonToJsonElement(body).getAsJsonObject();
-        String repo = jsonObject.get("repository").getAsJsonObject().get("url").getAsString();
-        String ref = jsonObject.get("ref").getAsString();
-        String branch = ref.substring(ref.lastIndexOf("/")+1);
-        return WebBody.success("暂未实现");
+    public String hook(@RequestBody String body) throws Exception {
+        webhookService.hook(body);
+        return WebBody.success();
     }
 
     @ApiOperation(value = "构建包下载接口")

+ 6 - 6
manager/src/main/java/cn/reghao/devops/manager/app/controller/page/BuildDeployLogPageController.java

@@ -4,7 +4,7 @@ import cn.reghao.devops.manager.app.model.constant.EnvList;
 import cn.reghao.devops.manager.app.model.po.log.BuildLog;
 import cn.reghao.devops.manager.app.model.po.log.BuildTime;
 import cn.reghao.devops.manager.app.model.vo.*;
-import cn.reghao.devops.manager.app.util.buildtool.repo.CommitInfo;
+import cn.reghao.devops.manager.build.tool.repo.CommitInfo;
 import cn.reghao.devops.manager.app.service.page.BuildDeployLogPage;
 import cn.reghao.devops.manager.app.service.page.BuildDeployPage;
 import cn.reghao.devops.manager.util.db.PageList;
@@ -83,7 +83,7 @@ public class BuildDeployLogPageController {
     @GetMapping("/build/{buildLogId}/buildconfig")
     public String buildConfigPage(@PathVariable("buildLogId") String buildLogId, Model model) {
         BuildLog buildLog = buildDeployLogPage.findByBuildLogId(buildLogId);
-        BuildConfig buildConfig = buildLog.getBuildConfig();
+        BuildConfig buildConfig = buildLog.getBuildInfo().getBuildConfig();
         model.addAttribute("buildConfig", buildConfig);
         return "/app/bd/log/buildconfig";
     }
@@ -92,7 +92,7 @@ public class BuildDeployLogPageController {
     @GetMapping("/build/{buildLogId}/packscript")
     public String packScriptPage(@PathVariable("buildLogId") String buildLogId, Model model) {
         BuildLog buildLog = buildDeployLogPage.findByBuildLogId(buildLogId);
-        String[] arr = buildLog.getDockerfile().split(System.lineSeparator());
+        String[] arr = buildLog.getBuildInfo().getDockerfile().split(System.lineSeparator());
         model.addAttribute("list", arr);
         return "/app/bd/log/dockerfile";
     }
@@ -101,7 +101,7 @@ public class BuildDeployLogPageController {
     @GetMapping("/build/{buildLogId}/commitinfo")
     public String commitInfoPage(@PathVariable("buildLogId") String buildLogId, Model model) {
         BuildLog buildLog = buildDeployLogPage.findByBuildLogId(buildLogId);
-        CommitInfo commitInfo = buildLog.getCommitInfo();
+        CommitInfo commitInfo = buildLog.getBuildInfo().getCommitInfo();
         if (commitInfo != null) {
             model.addAttribute("commitInfo", new CommitInfoVO(commitInfo));
             return "/app/bd/log/commitinfo";
@@ -116,7 +116,7 @@ public class BuildDeployLogPageController {
     @GetMapping("/build/{buildLogId}/buildtime")
     public String buildTimePage(@PathVariable("buildLogId") String buildLogId, Model model) {
         BuildLog buildLog = buildDeployLogPage.findByBuildLogId(buildLogId);
-        BuildTime buildTime = buildLog.getBuildTime();
+        BuildTime buildTime = buildLog.getBuildInfo().getBuildTime();
         model.addAttribute("buildTime", buildTime);
         return "/app/bd/log/buildtime";
     }
@@ -129,7 +129,7 @@ public class BuildDeployLogPageController {
             list.add("构建结果暂不可用");
         } else {
             BuildLog buildLog = buildDeployLogPage.findByBuildLogId(buildLogId);
-            list = Arrays.stream(buildLog.getResult().getMsg().split(System.lineSeparator()))
+            list = Arrays.stream(buildLog.getBuildInfo().getResult().getMsg().split(System.lineSeparator()))
                     .collect(Collectors.toList());
         }
 

+ 2 - 3
manager/src/main/java/cn/reghao/devops/manager/app/controller/page/BuildDeployPageController.java

@@ -28,7 +28,7 @@ import java.util.*;
 @RequestMapping("/app/bd")
 public class BuildDeployPageController {
     private final BuildDeployPage buildDeployPage;
-    private AppBuildingService buildingService;
+    private final AppBuildingService buildingService;
 
     public BuildDeployPageController(BuildDeployPage buildDeployPage, AppBuildingService buildingService) {
         this.buildDeployPage = buildDeployPage;
@@ -61,8 +61,7 @@ public class BuildDeployPageController {
     @ApiOperation(value = "部署状态页面")
     @GetMapping("/deploy/{appId}")
     public String deployStatusPage(@PathVariable("appId") String appId, Model model) {
-        BuildLog buildLog = buildingService.latestBuilding(appId);
-        String buildLogId = buildLog != null ? buildLog.getId() : null;
+        String buildLogId = buildingService.latestBuildLogId(appId);
         List<AppDeployingVO> list = buildDeployPage.deployStatus(appId);
 
         model.addAttribute("appId", appId);

+ 1 - 1
manager/src/main/java/cn/reghao/devops/manager/app/controller/page/config/AppConfigPageController.java

@@ -1,6 +1,6 @@
 package cn.reghao.devops.manager.app.controller.page.config;
 
-import cn.reghao.devops.common.msg.rpc.dto.app.PackType;
+import cn.reghao.devops.common.msg.dto.app.PackType;
 import cn.reghao.devops.manager.app.model.constant.AppType;
 import cn.reghao.devops.manager.app.model.constant.EnvList;
 import cn.reghao.devops.manager.app.model.po.config.AppConfig;

+ 1 - 1
manager/src/main/java/cn/reghao/devops/manager/app/controller/page/config/PackerPageController.java

@@ -1,7 +1,7 @@
 package cn.reghao.devops.manager.app.controller.page.config;
 
 import cn.reghao.devops.common.machine.Machine;
-import cn.reghao.devops.common.msg.rpc.dto.app.PackType;
+import cn.reghao.devops.common.msg.dto.app.PackType;
 import cn.reghao.devops.manager.app.db.query.config.PackerConfigQuery;
 import cn.reghao.devops.manager.app.model.po.config.build.PackerConfig;
 import cn.reghao.devops.manager.app.model.vo.KeyValue;

+ 1 - 1
manager/src/main/java/cn/reghao/devops/manager/app/db/query/log/BuildLogQuery.java

@@ -11,5 +11,5 @@ import org.springframework.data.domain.Pageable;
 public interface BuildLogQuery {
     Page<BuildLog> findByAppId(String appId, Pageable pageable);
     BuildLog findLatestBuildingByAppId(String appId);
-    BuildLog findById(String id);
+    BuildLog findByBuildLogId(String id);
 }

+ 12 - 16
manager/src/main/java/cn/reghao/devops/manager/app/db/query/log/BuildLogQueryImpl.java

@@ -2,16 +2,12 @@ package cn.reghao.devops.manager.app.db.query.log;
 
 import cn.reghao.devops.manager.app.db.repository.log.BuildLogRepository;
 import cn.reghao.devops.manager.app.model.po.log.BuildLog;
+import cn.reghao.devops.manager.build.BuildChainResult;
+import cn.reghao.jutil.jdk.serializer.JsonConverter;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-
 /**
  * @author reghao
  * @date 2021-06-17 15:50:46
@@ -19,11 +15,9 @@ import java.util.List;
 @Service
 public class BuildLogQueryImpl implements BuildLogQuery {
     private final BuildLogRepository buildLogRepository;
-    private final MongoTemplate mongoTemplate;
 
-    public BuildLogQueryImpl(BuildLogRepository buildLogRepository, MongoTemplate mongoTemplate) {
+    public BuildLogQueryImpl(BuildLogRepository buildLogRepository) {
         this.buildLogRepository = buildLogRepository;
-        this.mongoTemplate = mongoTemplate;
     }
 
     @Override
@@ -33,15 +27,17 @@ public class BuildLogQueryImpl implements BuildLogQuery {
 
     @Override
     public BuildLog findLatestBuildingByAppId(String appId) {
-        Query query = new Query();
-        query.addCriteria(Criteria.where("appId").is(appId));
-        query.with(Sort.by(Sort.Order.desc("createTime"))).limit(1);
-        List<BuildLog> list = mongoTemplate.find(query, BuildLog.class);
-        return list.isEmpty() ? null : list.get(0);
+        return null;
     }
 
     @Override
-    public BuildLog findById(String id) {
-        return buildLogRepository.findById(id).orElse(null);
+    public BuildLog findByBuildLogId(String id) {
+        BuildLog buildLog = buildLogRepository.findByBuildLogId(id);
+        if (buildLog != null) {
+            String json = buildLog.getBuildInfoJson();
+            buildLog.setBuildInfo(JsonConverter.jsonToObject(json, BuildChainResult.class));
+        }
+
+        return buildLog;
     }
 }

+ 3 - 2
manager/src/main/java/cn/reghao/devops/manager/app/db/repository/log/BuildLogRepository.java

@@ -3,12 +3,13 @@ package cn.reghao.devops.manager.app.db.repository.log;
 import cn.reghao.devops.manager.app.model.po.log.BuildLog;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
-import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.jpa.repository.JpaRepository;
 
 /**
  * @author reghao
  * @date 2020-01-21 14:53:03
  */
-public interface BuildLogRepository extends MongoRepository<BuildLog, String> {
+public interface BuildLogRepository extends JpaRepository<BuildLog, String> {
     Page<BuildLog> findByAppId(String appId, Pageable pageable);
+    BuildLog findByBuildLogId(String buildLogId);
 }

+ 2 - 2
manager/src/main/java/cn/reghao/devops/manager/app/db/repository/log/DeployLogRepository.java

@@ -1,7 +1,7 @@
 package cn.reghao.devops.manager.app.db.repository.log;
 
 import cn.reghao.devops.manager.app.model.po.log.DeployLog;
-import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.jpa.repository.JpaRepository;
 
 import java.util.List;
 
@@ -9,7 +9,7 @@ import java.util.List;
  * @author reghao
  * @date 2020-01-21 14:53:03
  */
-public interface DeployLogRepository extends MongoRepository<DeployLog, String> {
+public interface DeployLogRepository extends JpaRepository<DeployLog, String> {
     List<DeployLog> findByBuildLogId(String buildLogId);
     DeployLog findByBuildLogIdAndMachineId(String buildLogId, String machineId);
 }

+ 4 - 3
manager/src/main/java/cn/reghao/devops/manager/spring/interceptor/AppConfigInterceptor.java → manager/src/main/java/cn/reghao/devops/manager/app/interceptor/AppConfigInterceptor.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.manager.spring.interceptor;
+package cn.reghao.devops.manager.app.interceptor;
 
 import lombok.extern.slf4j.Slf4j;
 import org.aspectj.lang.ProceedingJoinPoint;
@@ -18,8 +18,9 @@ import java.util.concurrent.ConcurrentSkipListSet;
  * @date 2020-03-06 16:04:27
  */
 @Slf4j
-@Component
-@Aspect
+//@Component
+//@Aspect
+@Deprecated
 public class AppConfigInterceptor {
     private Set<String> changedApp = new ConcurrentSkipListSet<>();
     // 拦截 cn.reghao.devops.manager.app.db.crud.config 包中的所有方法

+ 0 - 15
manager/src/main/java/cn/reghao/devops/manager/app/model/constant/StatusOps.java

@@ -1,15 +0,0 @@
-package cn.reghao.devops.manager.app.model.constant;
-
-/**
- * 应用状态操作
- *
- * @author reghao
- * @date 2019-10-18 14:31:29
- */
-public enum StatusOps {
-    restart, stop, start;
-
-    public String getName() {
-        return this.name();
-    }
-}

+ 1 - 1
manager/src/main/java/cn/reghao/devops/manager/app/model/constant/build/RepoAuthType.java

@@ -5,7 +5,7 @@ package cn.reghao.devops.manager.app.model.constant.build;
  * @date 2021-02-05 18:50:01
  */
 public enum RepoAuthType {
-    http, ssh;
+    http, ssh, none;
 
     public String getName() {
         return this.name();

+ 5 - 5
manager/src/main/java/cn/reghao/devops/manager/app/model/po/AppBuilding.java

@@ -4,7 +4,7 @@ import cn.reghao.devops.manager.app.model.constant.BuildStatus;
 import cn.reghao.jutil.jdk.result.ResultStatus;
 import cn.reghao.devops.manager.app.model.po.config.AppConfig;
 import cn.reghao.devops.manager.app.model.po.log.BuildLog;
-import cn.reghao.devops.manager.app.util.buildtool.repo.CommitInfo;
+import cn.reghao.devops.manager.build.tool.repo.CommitInfo;
 import cn.reghao.devops.manager.util.db.BaseEntity;
 import cn.reghao.jutil.jdk.converter.DateTimeConverter;
 import lombok.*;
@@ -55,20 +55,20 @@ public class AppBuilding extends BaseEntity<Integer> {
     }
 
     public void afterBuild(BuildLog buildLog) {
-        this.setBuildLogId(buildLog.getId());
-        CommitInfo commitInfo = buildLog.getCommitInfo();
+        this.setBuildLogId(buildLog.getBuildLogId());
+        CommitInfo commitInfo = buildLog.getBuildInfo().getCommitInfo();
         if (commitInfo != null) {
             this.setCommitId(commitInfo.getCommitId());
             this.setCommitTime(DateTimeConverter.localDateTime(commitInfo.getMsCommitTime()));
         }
 
-        int code = buildLog.getResult().getCode();
+        int code = buildLog.getBuildInfo().getResult().getCode();
         if (code == ResultStatus.SUCCESS.getCode()) {
             this.setBuildResult(BuildStatus.buildSuccess.getDesc());
         } else {
             this.setBuildResult(BuildStatus.buildFail.getDesc());
         }
-        this.setBuildTime(buildLog.getBuildTime().getBuildTime());
+        this.setBuildTime(buildLog.getBuildInfo().getBuildTime().getBuildTime());
         this.setPackagePath(buildLog.getPackagePath());
         this.setBuildBy(buildLog.getBuildBy());
         this.setUpdateTime(LocalDateTime.now());

+ 6 - 6
manager/src/main/java/cn/reghao/devops/manager/app/model/po/AppDeploying.java

@@ -2,8 +2,8 @@ package cn.reghao.devops.manager.app.model.po;
 
 import cn.reghao.devops.manager.app.model.constant.DeployStatus;
 import cn.reghao.devops.manager.app.model.po.config.AppDeployConfig;
-import cn.reghao.devops.manager.app.model.po.log.BuildLog;
 import cn.reghao.devops.manager.app.model.po.log.DeployLog;
+import cn.reghao.devops.manager.build.BuildChainResult;
 import cn.reghao.devops.manager.util.db.BaseEntity;
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.jdk.result.ResultStatus;
@@ -43,11 +43,11 @@ public class AppDeploying extends BaseEntity<Integer> {
         this.deployResult = DeployStatus.neverDeploy.getDesc();
     }
 
-    public void beforeDeploy(BuildLog buildLog) {
-        this.buildLogId = buildLog.getId();
-        this.commitId = buildLog.getCommitInfo().getCommitId();
-        this.packagePath = buildLog.getPackagePath();
-        this.deployBy = buildLog.getBuildBy();
+    public void beforeDeploy(BuildChainResult result) {
+        this.buildLogId = result.getBuildLogId();
+        this.commitId = result.getCommitInfo().getCommitId();
+        this.packagePath = result.getPackagePath();
+        this.deployBy = result.getBuildBy();
         this.deployTime = null;
         this.deployResult = DeployStatus.onDeploying.getDesc();
     }

+ 1 - 1
manager/src/main/java/cn/reghao/devops/manager/app/model/po/AppRunning.java

@@ -1,6 +1,6 @@
 package cn.reghao.devops.manager.app.model.po;
 
-import cn.reghao.devops.common.msg.rpc.dto.app.StatusResult;
+import cn.reghao.devops.common.msg.dto.app.StatusResult;
 import cn.reghao.devops.manager.util.db.BaseEntity;
 import lombok.*;
 

+ 1 - 0
manager/src/main/java/cn/reghao/devops/manager/app/model/po/config/AppConfig.java

@@ -30,6 +30,7 @@ public class AppConfig extends BaseEntity<Integer> implements Cloneable {
     @NotNull
     @NotBlank(message = "应用名字不能为空白字符串")
     private String appName;
+    @Deprecated
     private String description;
     @NotNull
     @ValidEnum(value = AppType.class, message = "请选择正确的应用类型")

+ 1 - 1
manager/src/main/java/cn/reghao/devops/manager/app/model/po/config/AppDeployConfig.java

@@ -1,6 +1,6 @@
 package cn.reghao.devops.manager.app.model.po.config;
 
-import cn.reghao.devops.common.msg.rpc.dto.app.PackType;
+import cn.reghao.devops.common.msg.dto.app.PackType;
 import cn.reghao.devops.manager.machine.model.po.MachineHost;
 import cn.reghao.devops.manager.util.db.BaseEntity;
 import cn.reghao.devops.manager.util.validator.ValidEnum;

+ 1 - 1
manager/src/main/java/cn/reghao/devops/manager/app/model/po/config/build/PackerConfig.java

@@ -1,6 +1,6 @@
 package cn.reghao.devops.manager.app.model.po.config.build;
 
-import cn.reghao.devops.common.msg.rpc.dto.app.PackType;
+import cn.reghao.devops.common.msg.dto.app.PackType;
 import cn.reghao.devops.manager.util.validator.ValidEnum;
 import cn.reghao.devops.manager.util.db.BaseEntity;
 import lombok.*;

+ 20 - 21
manager/src/main/java/cn/reghao/devops/manager/app/model/po/log/BuildLog.java

@@ -1,14 +1,15 @@
 package cn.reghao.devops.manager.app.model.po.log;
 
-import cn.reghao.devops.manager.app.model.vo.BuildConfig;
-import cn.reghao.jutil.jdk.result.Result;
+import cn.reghao.devops.manager.build.BuildChainResult;
+import cn.reghao.devops.manager.util.db.BaseEntity;
 import cn.reghao.devops.manager.app.model.po.config.AppConfig;
-import cn.reghao.devops.manager.app.util.buildtool.repo.CommitInfo;
-import cn.reghao.devops.manager.rbac.UserContext;
-import cn.reghao.devops.manager.util.db.BaseDocument;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import org.springframework.data.mongodb.core.mapping.Document;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Transient;
 
 /**
  * 应用构建日志
@@ -16,36 +17,34 @@ import org.springframework.data.mongodb.core.mapping.Document;
  * @author reghao
  * @date 2020-03-10 11:22:05
  */
+@NoArgsConstructor
 @Data
 @EqualsAndHashCode(callSuper = false)
-@Document("BuildLog")
-public class BuildLog extends BaseDocument {
+@Entity
+public class BuildLog extends BaseEntity<Integer> {
+    @Column(unique = true)
+    private String buildLogId;
     private String appId;
     private String appType;
     private String env;
     private String repoBranch;
-    private BuildConfig buildConfig;
-    private String dockerfile;
+    private String commitId;
     private String packagePath;
+    private Integer code;
 
-    private CommitInfo commitInfo;
-    private BuildTime buildTime;
-    private Result result;
+    @Transient
+    private BuildChainResult buildInfo;
+    @Column(columnDefinition = "json")
+    private String buildInfoJson;
     private String buildBy;
 
-    public static BuildLog from(AppConfig app) {
+    public static BuildLog from(String buildLogId, AppConfig app) {
         BuildLog buildLog = new BuildLog();
+        buildLog.setBuildLogId(buildLogId);
         buildLog.setAppId(app.getAppId());
         buildLog.setAppType(app.getAppType());
         buildLog.setEnv(app.getEnv());
         buildLog.setRepoBranch(app.getRepoBranch());
-        buildLog.setBuildConfig(
-                new BuildConfig(app.getRepoAuthConfig(), app.getCompilerConfig(), app.getPackerConfig()));
-        buildLog.setDockerfile(app.getDockerfile());
-
-        buildLog.setBuildTime(new BuildTime());
-        buildLog.setResult(new Result());
-        buildLog.setBuildBy(UserContext.currentUser().getNickname());
         return buildLog;
     }
 }

+ 14 - 5
manager/src/main/java/cn/reghao/devops/manager/app/model/po/log/DeployLog.java

@@ -1,12 +1,16 @@
 package cn.reghao.devops.manager.app.model.po.log;
 
-import cn.reghao.devops.common.msg.rpc.dto.app.DeployResult;
+import cn.reghao.devops.common.msg.dto.app.DeployResult;
+import cn.reghao.devops.manager.util.db.BaseEntity;
 import cn.reghao.jutil.jdk.result.Result;
-import cn.reghao.devops.manager.util.db.BaseDocument;
+import cn.reghao.jutil.jdk.serializer.JsonConverter;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import org.springframework.data.mongodb.core.mapping.Document;
+import lombok.NoArgsConstructor;
 
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Transient;
 import java.time.LocalDateTime;
 
 /**
@@ -15,16 +19,20 @@ import java.time.LocalDateTime;
  * @author reghao
  * @date 2020-03-10 11:22:05
  */
+@NoArgsConstructor
 @Data
 @EqualsAndHashCode(callSuper = false)
-@Document("DeployLog")
-public class DeployLog extends BaseDocument {
+@Entity
+public class DeployLog extends BaseEntity<Integer> {
     private String buildLogId;
     private String machineId;
     private String machineIpv4;
     private String deployBy;
     private LocalDateTime deployTime;
+    @Transient
     private Result result;
+    @Column(columnDefinition = "json")
+    private String resultJson;
 
     public DeployLog(String buildLogId, String machineId, String machineIpv4, String deployBy) {
         this.buildLogId = buildLogId;
@@ -36,5 +44,6 @@ public class DeployLog extends BaseDocument {
     public void updateAfterDeploy(DeployResult deployResult) {
         this.deployTime = deployResult.getDeployTime();
         this.result = deployResult.getResult();
+        this.resultJson = JsonConverter.objectToJson(this.result);
     }
 }

+ 1 - 1
manager/src/main/java/cn/reghao/devops/manager/app/model/vo/AppBuildingVO.java

@@ -36,7 +36,7 @@ public class AppBuildingVO {
         this.repoBranch = appConfig.getRepoBranch();
         this.httpPort = appConfig.getHttpPort() == null ? 0 : appConfig.getHttpPort();
 
-        //this.buildLogId = appBuilding.getBuildLogId() == null ? NotAvailable.na.getDesc() : appBuilding.getBuildLogId();
+        this.buildLogId = appBuilding.getBuildLogId() == null ? "N/A" : appBuilding.getBuildLogId();
         this.buildLogId = appBuilding.getBuildLogId();
         this.commitId = appBuilding.getCommitId() == null ? NotAvailable.na.getDesc() : appBuilding.getCommitId();
         this.commitTime = appBuilding.getCommitTime() == null ?

+ 4 - 4
manager/src/main/java/cn/reghao/devops/manager/app/model/vo/BuildLogVO.java

@@ -21,14 +21,14 @@ public class BuildLogVO {
     private String buildBy;
 
     public BuildLogVO(BuildLog buildLog) {
-        this.buildLogId = buildLog.getId();
+        this.buildLogId = buildLog.getBuildLogId();
         this.appId = buildLog.getAppId();
         this.appType = buildLog.getAppType();
         this.env = buildLog.getEnv();
         this.branch = buildLog.getRepoBranch();
-        this.commitId = buildLog.getCommitInfo() != null ? buildLog.getCommitInfo().getCommitId() : "";
-        this.buildTime = buildLog.getBuildTime() != null ?
-                DateTimeConverter.format(buildLog.getBuildTime().getBuildTime()) : "";
+        this.commitId = buildLog.getBuildInfo().getCommitInfo() != null ? buildLog.getBuildInfo().getCommitInfo().getCommitId() : "";
+        this.buildTime = buildLog.getBuildInfo().getBuildTime() != null ?
+                DateTimeConverter.format(buildLog.getBuildInfo().getBuildTime().getBuildTime()) : "";
         this.packagePath = buildLog.getPackagePath();
         this.buildBy = buildLog.getBuildBy();
     }

+ 2 - 2
manager/src/main/java/cn/reghao/devops/manager/app/model/vo/CommitInfoVO.java

@@ -1,7 +1,7 @@
 package cn.reghao.devops.manager.app.model.vo;
 
-import cn.reghao.devops.manager.app.util.buildtool.repo.ChangedFile;
-import cn.reghao.devops.manager.app.util.buildtool.repo.CommitInfo;
+import cn.reghao.devops.manager.build.tool.repo.ChangedFile;
+import cn.reghao.devops.manager.build.tool.repo.CommitInfo;
 import cn.reghao.jutil.jdk.converter.DateTimeConverter;
 import lombok.Data;
 

+ 0 - 63
manager/src/main/java/cn/reghao/devops/manager/app/service/AppBuildSupplier.java

@@ -1,63 +0,0 @@
-package cn.reghao.devops.manager.app.service;
-
-import cn.reghao.jutil.jdk.result.ResultStatus;
-import cn.reghao.devops.common.util.ExceptionUtil;
-import cn.reghao.devops.manager.app.model.po.log.BuildLog;
-import cn.reghao.devops.manager.app.util.buildtool.repo.CommitInfo;
-
-import java.time.LocalDateTime;
-import java.util.function.Supplier;
-
-/**
- * 更新 -> 编译 -> 打包 -> 构建流水线
- *
- * @author reghao
- * @date 2021-05-22 13:28:31
- */
-public class AppBuildSupplier implements Supplier<BuildLog> {
-    private final AppBuilder appBuilder;
-    private final BuildLog buildLog;
-
-    public AppBuildSupplier(AppBuilder appBuilder) {
-        this.appBuilder = appBuilder;
-        // 由于是异步构建,从 UserContext 中获取当前用户必须是在请求所在的线程
-        this.buildLog = BuildLog.from(appBuilder.app());
-    }
-
-    @Override
-    public BuildLog get() {
-        long start = System.currentTimeMillis();
-        try {
-            CommitInfo commitInfo = appBuilder.update();
-            buildLog.setCommitInfo(commitInfo);
-            buildLog.getBuildTime().setUpdateTotalTime(System.currentTimeMillis()-start);
-
-            start = System.currentTimeMillis();
-            appBuilder.compile();
-            buildLog.getBuildTime().setCompileTotalTime(System.currentTimeMillis()-start);
-
-            start = System.currentTimeMillis();
-            String localPath = appBuilder.pack();
-            buildLog.getBuildTime().setPackTotalTime(System.currentTimeMillis()-start);
-
-            start = System.currentTimeMillis();
-            String packagePath = appBuilder.push(localPath);
-            buildLog.setPackagePath(packagePath);
-            buildLog.getBuildTime().setPushTotalTime(System.currentTimeMillis()-start);
-        } catch (Exception e) {
-            buildException(buildLog, e);
-            return buildLog;
-        }
-
-        buildLog.getResult().setCode(ResultStatus.SUCCESS.getCode());
-        buildLog.getResult().setMsg(ResultStatus.SUCCESS.getMsg());
-        buildLog.getBuildTime().setBuildTime(LocalDateTime.now());
-        return buildLog;
-    }
-
-    private void buildException(BuildLog buildLog, Exception e) {
-        buildLog.getResult().setCode(ResultStatus.FAIL.getCode());
-        buildLog.getResult().setMsg(ExceptionUtil.errorMsg(e));
-        buildLog.getBuildTime().setBuildTime(LocalDateTime.now());
-    }
-}

+ 0 - 198
manager/src/main/java/cn/reghao/devops/manager/app/service/AppBuilder.java

@@ -1,198 +0,0 @@
-package cn.reghao.devops.manager.app.service;
-
-import cn.reghao.devops.common.docker.DockerException;
-import cn.reghao.devops.common.msg.rpc.dto.app.PackType;
-import cn.reghao.devops.manager.app.model.constant.build.CompileType;
-import cn.reghao.devops.manager.app.model.constant.build.RepoType;
-import cn.reghao.devops.manager.app.model.po.config.build.CompilerConfig;
-import cn.reghao.devops.manager.app.model.po.config.build.PackerConfig;
-import cn.reghao.devops.manager.app.model.po.config.build.RepoAuthConfig;
-import cn.reghao.devops.manager.app.model.po.config.AppConfig;
-import cn.reghao.devops.manager.app.util.buildtool.compiler.CodeCompiler;
-import cn.reghao.devops.manager.app.util.buildtool.compiler.MavenCompiler;
-import cn.reghao.devops.manager.app.util.buildtool.compiler.NullCompiler;
-import cn.reghao.devops.manager.app.util.buildtool.compiler.ShellCompiler;
-import cn.reghao.devops.manager.app.util.buildtool.packer.CodePacker;
-import cn.reghao.devops.manager.app.util.buildtool.packer.DockerPack;
-import cn.reghao.devops.manager.app.util.buildtool.packer.ZipPack;
-import cn.reghao.devops.manager.app.util.buildtool.repo.CodeUpdater;
-import cn.reghao.devops.manager.app.util.buildtool.repo.CommitInfo;
-import cn.reghao.devops.manager.app.util.buildtool.repo.GitImpl;
-import cn.reghao.devops.manager.app.util.buildtool.repo.SvnImpl;
-import cn.reghao.devops.manager.app.model.po.config.build.LocalBuildDir;
-import cn.reghao.devops.manager.app.util.BuilderUtil;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * 应用构建部署,每个应用持有一个对象
- *
- * @author reghao
- * @date 2019-10-09 10:54:43
- */
-@Slf4j
-public class AppBuilder {
-    private String appLocalRepo;
-    private String appCompileDir;
-    // TODO 应用二进制文件存储到本地时使用
-    private String appPackDir;
-
-    private AppConfig app;
-    // 远程仓库最近一次提交的信息
-    private CommitInfo latestCommitInfo;
-
-    private CodeUpdater codeUpdater;
-    private CodeCompiler codeCompiler;
-    private CodePacker codePacker;
-
-    public AppBuilder(AppConfig app) throws IOException {
-        this.app = app;
-        init();
-    }
-
-    public AppConfig app() {
-        return app;
-    }
-
-    /**
-     * TODO 若 AppOrchestration 发生变化则重新初始化
-     *
-     * @param
-     * @return
-     * @date 2020-08-06 上午10:39
-     */
-    public void reInit(AppConfig app) throws IOException {
-        this.app = app;
-        init();
-    }
-
-    private void init() throws IOException {
-        initLocalDir();
-        initBuildConfig();
-    }
-
-    private void initLocalDir() {
-        appLocalRepo = LocalBuildDir.localRepo + File.separator + app.getAppId();
-        appCompileDir = LocalBuildDir.compileDir + File.separator + app.getAppId();
-        appPackDir = LocalBuildDir.packDir + File.separator + app.getAppId();
-    }
-
-    /**
-     * 初始化应用构建配置
-     *
-     * @param
-     * @return
-     * @date 2021-02-05 下午11:01
-     */
-    private void initBuildConfig() throws IOException {
-        // 初始化更新配置
-        RepoAuthConfig repoAuthConfig = app.getRepoAuthConfig();
-        switch (RepoType.valueOf(repoAuthConfig.getType())) {
-            case git:
-                codeUpdater = new GitImpl(repoAuthConfig);
-                break;
-            case svn:
-                codeUpdater = new SvnImpl(repoAuthConfig);
-                break;
-            default:
-        }
-
-        // 初始化编译配置
-        CompilerConfig compilerConfig = app.getCompilerConfig();
-        switch (CompileType.valueOf(compilerConfig.getType())) {
-            case shell:
-                codeCompiler = new ShellCompiler(compilerConfig);
-                break;
-            case maven:
-                String appDirPath = app.getAppRootPath();
-                codeCompiler = new MavenCompiler(compilerConfig.getHomePath(), app.getEnv(), appDirPath);
-                break;
-            case docker:
-                codeCompiler = new NullCompiler();
-                break;
-            case no_need_compile:
-                codeCompiler = new NullCompiler();
-                break;
-            default:
-                log.info("暂未实现,使用 NullCompiler");
-                codeCompiler = new NullCompiler();
-        }
-
-        // 初始化打包配置
-        PackerConfig packerConfig = app.getPackerConfig();
-        switch (PackType.valueOf(packerConfig.getType())) {
-            case docker:
-                codePacker = new DockerPack(packerConfig, app.getDockerfile());
-                break;
-            case zip:
-                codePacker = new ZipPack(packerConfig, appPackDir);
-                break;
-            case zipHttp:
-                break;
-            default:
-        }
-    }
-
-    public CommitInfo update() throws Exception {
-        String remote;
-        String branch;
-        // TODO 区分 GIT 和 SVN pull 代码时的不同
-        String local = appLocalRepo;
-        remote = app.getAppRepo();
-        branch = app.getRepoBranch();
-        if (latestCommitInfo == null) {
-            latestCommitInfo = codeUpdater.latestCommitInfo(local, branch);
-        }
-
-        UpdateStatus updateStatus = update0(remote, branch, local);
-        if (updateStatus.isUpdated) {
-            latestCommitInfo = updateStatus.getLatestCommitInfo();
-            // 将代码由本地仓库复制到编译目录
-            BuilderUtil.copyToCompileDir(local, app);
-        }
-
-        return latestCommitInfo;
-    }
-
-    private UpdateStatus update0(String remote, String branch, String local) throws Exception {
-        CommitInfo current = codeUpdater.update(remote, branch, local);
-        if (latestCommitInfo != null) {
-            if (latestCommitInfo.getCommitId().equals(current.getCommitId())) {
-                return new UpdateStatus(current, false);
-            } else if (latestCommitInfo.getMsCommitTime() > current.getMsCommitTime()) {
-                throw new Exception("本地仓库代码比远程仓库更新");
-            }
-        }
-
-        return new UpdateStatus(current, true);
-    }
-
-    public void compile() throws Exception {
-        // TODO 通过脚本调用编译器时会卡住
-        codeCompiler.compile(app.getAppId(), compileDir());
-    }
-
-    public String pack() throws Exception {
-        String appRootPath = compileDir() + File.separator + app.getAppRootPath();
-        return codePacker.pack(app.getAppId(), latestCommitInfo.getCommitId(), appRootPath);
-    }
-
-    public String push(String localPath) throws DockerException {
-        return codePacker.push(localPath);
-    }
-
-    private String compileDir() {
-        return appCompileDir + File.separator + app.getProjDirname();
-    }
-
-    @Data
-    @AllArgsConstructor
-    static class UpdateStatus {
-        private CommitInfo latestCommitInfo;
-        private boolean isUpdated;
-    }
-}

+ 0 - 89
manager/src/main/java/cn/reghao/devops/manager/app/service/AppDeployer.java

@@ -1,89 +0,0 @@
-package cn.reghao.devops.manager.app.service;
-
-import cn.reghao.devops.common.mqtt.AsyncMqttClient;
-import cn.reghao.devops.common.msg.Message;
-import cn.reghao.devops.common.msg.MsgQueue;
-import cn.reghao.devops.common.msg.rpc.RpcMsg;
-import cn.reghao.devops.common.msg.rpc.constant.AppRpcClazz;
-import cn.reghao.devops.common.msg.rpc.dto.app.DeployParam;
-import cn.reghao.devops.manager.app.db.query.config.AppDeployConfigQuery;
-import cn.reghao.devops.manager.app.model.po.config.AppDeployConfig;
-import cn.reghao.devops.manager.app.model.po.log.DeployLog;
-import cn.reghao.devops.manager.app.service.bd.AppDeployingService;
-import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import cn.reghao.devops.manager.app.model.po.log.BuildLog;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.paho.client.mqttv3.MqttException;
-import org.springframework.stereotype.Service;
-
-import java.util.*;
-
-/**
- * 应用部署
- *
- * @author reghao
- * @date 2020-03-13 10:26:22
- */
-@Slf4j
-@Service
-public class AppDeployer {
-    private final AsyncMqttClient mqttClient;
-    private final AppDeployingService deployingService;
-    private final AppDeployConfigQuery deployConfigQuery;
-
-    public AppDeployer(AsyncMqttClient mqttClient, AppDeployingService deployingService,
-                       AppDeployConfigQuery deployConfigQuery) {
-        this.mqttClient = mqttClient;
-        this.deployingService = deployingService;
-        this.deployConfigQuery = deployConfigQuery;
-    }
-
-    public void deploy(BuildLog buildLog) throws MqttException {
-        String appId = buildLog.getAppId();
-        List<AppDeployConfig> deployConfigs = deployConfigQuery.findByAppId(appId);
-        // TODO 使用线程池并发执行
-        for (AppDeployConfig appDeployConfig : deployConfigs) {
-            deploy(buildLog, appDeployConfig);
-        }
-    }
-
-    /**
-     * 部署应用
-     *
-     * @param
-     * @return
-     * @date 2020-03-13 下午1:00
-     */
-    public void deploy(BuildLog buildLog, AppDeployConfig appDeployConfig) throws MqttException {
-        String appId = buildLog.getAppId();
-        String buildLogId = buildLog.getId();
-        String packagePath = buildLog.getPackagePath();
-        String deployBy = buildLog.getBuildBy();
-        String commitId = buildLog.getCommitInfo().getCommitId();
-
-        String machineId = appDeployConfig.getMachineHost().getMachineId();
-        String machineIpv4 = appDeployConfig.getMachineHost().getMachineIpv4();
-        String packType = appDeployConfig.getPackType();
-        String startScript = appDeployConfig.getStartScript();
-        String startHome = appDeployConfig.getStartHome();
-        String unpackScript = appDeployConfig.getUnpackScript();
-
-        DeployParam deployParam = new DeployParam();
-        deployParam.setBuildLogId(buildLogId);
-        deployParam.setAppId(appId);
-        deployParam.setPackagePath(packagePath);
-        deployParam.setPackType(packType);
-        deployParam.setStartScript(startScript);
-        deployParam.setStartHome(startHome);
-
-        deployingService.refreshBeforeDeploy(appDeployConfig, buildLog);
-        deployingService.addDeployLog(new DeployLog(buildLogId, machineId, machineIpv4, deployBy));
-
-        RpcMsg rpcMsg = RpcMsg.paramMsg(AppRpcClazz.class.getSimpleName(), AppRpcClazz.deploy.name(),
-                JsonConverter.objectToJson(deployParam));
-        Message message = Message.rpcParamMsg(rpcMsg);
-        // TODO 对于需要返回值的 pub,需要做一个记录,pub 和 sub 一一对应
-        String topic = MsgQueue.agentTopic(machineId);
-        mqttClient.pubWithResult(topic, 1, message);
-    }
-}

+ 2 - 2
manager/src/main/java/cn/reghao/devops/manager/app/service/AppStatusService.java

@@ -1,6 +1,6 @@
 package cn.reghao.devops.manager.app.service;
 
-import cn.reghao.devops.manager.app.model.constant.StatusOps;
+import cn.reghao.devops.common.msg.constant.AppOps;
 
 /**
  * 应用状态管理
@@ -9,6 +9,6 @@ import cn.reghao.devops.manager.app.model.constant.StatusOps;
  * @date 2019-11-27 11:30:28
  */
 public interface AppStatusService {
-    void changeStatus(String appId, String machineId, StatusOps statusOps);
+    void changeStatus(String appId, String machineId, AppOps appOps);
     void getStatus(String appId, String machineId);
 }

Некоторые файлы не были показаны из-за большого количества измененных файлов