Explorar o código

更改采用 ossStatic 打包类型时的应用部署实现

reghao hai 3 días
pai
achega
6f68aae91a

+ 23 - 47
mgr/src/main/java/cn/reghao/devops/mgr/ops/aliyun/service/AliyunOss.java

@@ -27,37 +27,10 @@ import java.util.List;
 @Slf4j
 @Component
 public class AliyunOss {
-    private OSS ossClient;
-    private final AliyunAccountRepository aliyunAccountRepository;
-
-    public AliyunOss(AliyunAccountRepository aliyunAccountRepository) {
-        this.aliyunAccountRepository = aliyunAccountRepository;
-    }
-
-    public OSS getOssClient() {
-        if (ossClient == null) {
-            AliyunAccount aliyunAccount = aliyunAccountRepository.findByType("oss").stream().findFirst().orElse(null);
-            String endpoint = aliyunAccount.getEndpoint();
-            String accessKeyId = aliyunAccount.getRepoAuthConfig().getUsername();
-            String accessKeySecret = aliyunAccount.getRepoAuthConfig().getPassword();
-            ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
-        }
-
-        return ossClient;
-    }
-
     public OSS getOssClient(String endpoint, String accessKeyId, String accessKeySecret) {
         return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
     }
 
-    public void uploadObject(String bucketName, String objectName, File file) throws IOException {
-        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, file);
-        /*ObjectMetadata objectMetadata = new ObjectMetadata();
-        objectMetadata.setObjectAcl(CannedAccessControlList.PublicRead);
-        putObjectRequest.setMetadata(objectMetadata);*/
-        getOssClient().putObject(putObjectRequest);
-    }
-
     /**
      * 将指定目录中的所有文件上传到 oss 根目录
      *
@@ -65,18 +38,18 @@ public class AliyunOss {
      * @return
      * @date 2025-06-05 16:05:45
      */
-    public List<String> uploadDir(String bucketName, String localDir) {
+    public List<String> uploadDir(OSS ossClient, String bucketName, String localDir) {
         List<String> failedList = new ArrayList<>();
         try {
-            walkDir(bucketName, Path.of(localDir), failedList);
+            walkDir(ossClient, bucketName, Path.of(localDir), failedList);
         } catch (IOException e) {
-            e.printStackTrace();
+            log.error(e.getMessage(), e);
         }
 
         return failedList;
     }
 
-    private void walkDir(String bucketName, Path path, List<String> failedList) throws IOException {
+    private void walkDir(OSS ossClient, String bucketName, Path path, List<String> failedList) throws IOException {
         final String BLANK = "";
         if (path.toString().equals(BLANK)) {
             throw new IOException("CAN NOT specify a BLANK path");
@@ -90,7 +63,7 @@ public class AliyunOss {
 
             @Override
             public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
-                uploadObject(bucketName, file.toFile(), path.toString(), failedList);
+                uploadObject(ossClient, bucketName, file.toFile(), path.toString(), failedList);
                 return FileVisitResult.CONTINUE;
             }
 
@@ -106,22 +79,26 @@ public class AliyunOss {
         });
     }
 
-    private void uploadObject(String bucketName, File file, String baseDir, List<String> failedList) {
+    private void uploadObject(OSS ossClient, String bucketName, File file, String baseDir, List<String> failedList) {
         String absolutePath = file.getAbsolutePath();
         String objectName = absolutePath.replace(baseDir + "/", "");
         try {
-            uploadObject(bucketName, objectName, file);
-        } catch (IOException e) {
-            e.printStackTrace();
+            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, file);
+            /*ObjectMetadata objectMetadata = new ObjectMetadata();
+            objectMetadata.setObjectAcl(CannedAccessControlList.PublicRead);
+            putObjectRequest.setMetadata(objectMetadata);*/
+            ossClient.putObject(putObjectRequest);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
             failedList.add(file.getAbsolutePath());
         }
     }
 
-    public void deleteObject(String bucketName, String objectName) {
-        getOssClient().deleteObject(bucketName, objectName);
+    public void deleteObject(OSS ossClient, String bucketName, String objectName) {
+        ossClient.deleteObject(bucketName, objectName);
     }
 
-    public void deleteObjects(String bucketName, String prefix) {
+    public void deleteObjects(OSS ossClient, String bucketName, String prefix) {
         // 删除目录及目录下的所有文件
         String nextMarker = null;
         ObjectListing objectListing = null;
@@ -129,16 +106,15 @@ public class AliyunOss {
             ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName)
                     .withPrefix(prefix)
                     .withMarker(nextMarker);
-            objectListing = getOssClient().listObjects(listObjectsRequest);
+            objectListing = ossClient.listObjects(listObjectsRequest);
             if (objectListing.getObjectSummaries().size() > 0) {
                 List<String> keys = new ArrayList<>();
                 for (OSSObjectSummary s : objectListing.getObjectSummaries()) {
-                    log.info("key name in bucket {} -> {}", bucketName, s.getKey());
+                    //log.info("key name in bucket {} -> {}", bucketName, s.getKey());
                     keys.add(s.getKey());
                 }
-
                 /*DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucketName).withKeys(keys).withEncodingType("url");
-                DeleteObjectsResult deleteObjectsResult = getOssClient().deleteObjects(deleteObjectsRequest);
+                DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(deleteObjectsRequest);
                 List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
                 for(String obj : deletedObjects) {
                     String deleteObj =  URLDecoder.decode(obj, StandardCharsets.UTF_8);
@@ -146,20 +122,20 @@ public class AliyunOss {
                     log.info("delete object {} in bucket {}", deleteObj, bucketName);
                 }*/
             }
-
             nextMarker = objectListing.getNextMarker();
         } while (objectListing.isTruncated());
     }
 
     public String getSignedUrl(String bucketName, String objectName) {
+        OSS ossClient = null;
         int expireSecond = 3600;
         long timestamp = System.currentTimeMillis() + expireSecond*1000L;
         Date expiration = new Date(timestamp);
-        URL url = getOssClient().generatePresignedUrl(bucketName, objectName, expiration);
+        URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
         return url.toString();
     }
 
-    public void close() {
-        getOssClient().shutdown();
+    public void close(OSS ossClient) {
+        ossClient.shutdown();
     }
 }

+ 4 - 3
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/service/impl/AppDeployServiceImpl.java

@@ -93,12 +93,13 @@ public class AppDeployServiceImpl implements AppDeployService {
         }
 
         String startScript = deployConfigDto.getStartScript();
+        if (startScript == null || startScript.isBlank()) {
+            startScript = "{}";
+        }
+
         String packType = deployConfigDto.getPackType();
         if (packType.equals(PackType.docker.name())) {
             DockerContainerConfig containerConfig = JsonConverter.jsonToObject(startScript, DockerContainerConfig.class);
-            if (startScript == null || startScript.isBlank()) {
-                startScript = "{}";
-            }
         }
 
         AppDeployConfig appDeployConfig = new AppDeployConfig(appConfig, machineInfo, startScript);

+ 17 - 13
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/impl/DeployAppImpl.java

@@ -3,9 +3,12 @@ package cn.reghao.devops.mgr.ops.builder.service.impl;
 import cn.reghao.devops.common.msg.AgentCommand;
 import cn.reghao.devops.common.msg.AgentMessage;
 import cn.reghao.devops.common.docker.model.DockerAuth;
+import cn.reghao.devops.common.msg.DeployStepName;
 import cn.reghao.devops.common.msg.constant.PackType;
+import cn.reghao.devops.common.msg.constant.StepStatus;
 import cn.reghao.devops.common.msg.event.EvtAppDeploy;
 import cn.reghao.devops.common.msg.event.EvtAppStatResult;
+import cn.reghao.devops.common.util.Machine;
 import cn.reghao.devops.mgr.ops.aliyun.service.AliyunOss;
 import cn.reghao.devops.mgr.ops.app.db.query.AppBuildQuery;
 import cn.reghao.devops.mgr.ops.app.db.query.AppDeployQuery;
@@ -82,18 +85,28 @@ public class DeployAppImpl implements DeployApp {
         String appId = appDeployConfig.getAppConfig().getAppId();
         PackerConfig packerConfig = appDeployConfig.getAppConfig().getPackerConfig();
         String packType = packerConfig.getType();
-
         String machineId = appDeployConfig.getMachineInfo().getMachineId();
-        String startScript = appDeployConfig.getStartScript();
-        String startHome = appDeployConfig.getStartHome();
-        String unpackScript = appDeployConfig.getUnpackScript();
+        if (appDeployQuery.isDeploying(appId, machineId)) {
+            log.info("应用 {} 正在部署中...", appId);
+            return;
+        }
+
+        if (!machineQuery.isAgentOnline(machineId)) {
+            log.info("机器 {} 不在线...", appDeployConfig.getMachineInfo().getMachineIpv4());
+            return;
+        }
+
         if (packType.equals(PackType.ossStatic.getName())) {
             OssDeployTask ossDeployTask = new OssDeployTask(aliyunOss, appDeployService, appBuilding, machineId, packerConfig);
             deployPool.submit(ossDeployTask);
             log.info("submit {} OssDeployTask", appId);
+            appDeployService.updateBeforeDeploy(appBuilding, machineId);
             return;
         }
 
+        String startScript = appDeployConfig.getStartScript();
+        String startHome = appDeployConfig.getStartHome();
+        String unpackScript = appDeployConfig.getUnpackScript();
         int appPort = appDeployConfig.getAppConfig().getHttpPort();
         EvtAppDeploy deployParam = new EvtAppDeploy();
         deployParam.setAppId(appId);
@@ -112,15 +125,6 @@ public class DeployAppImpl implements DeployApp {
             }
         }
 
-        if (appDeployQuery.isDeploying(appId, machineId)) {
-            log.info("应用正在部署...");
-            return;
-        }
-
-        if (!machineQuery.isAgentOnline(machineId)) {
-            return;
-        }
-
         appDeployService.updateBeforeDeploy(appBuilding, machineId);
         try {
             AgentMessage<EvtAppDeploy> message = new AgentMessage<>();

+ 30 - 9
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/task/OssDeployTask.java

@@ -1,5 +1,7 @@
 package cn.reghao.devops.mgr.ops.builder.service.task;
 
+import cn.reghao.devops.common.msg.DeployStepName;
+import cn.reghao.devops.common.msg.constant.StepStatus;
 import cn.reghao.devops.common.msg.event.EvtAppStatResult;
 import cn.reghao.devops.mgr.ops.aliyun.model.po.AliyunAccount;
 import cn.reghao.devops.mgr.ops.aliyun.service.AliyunOss;
@@ -25,7 +27,7 @@ public class OssDeployTask implements Runnable {
     private final AppDeployService appDeployService;
     private final AppBuilding appBuilding;
     private final String machineId;
-    private PackerConfig packerConfig;
+    private final PackerConfig packerConfig;
 
     public OssDeployTask(AliyunOss aliyunOss, AppDeployService appDeployService,
                          AppBuilding appBuilding, String machineId, PackerConfig packerConfig) {
@@ -39,10 +41,17 @@ public class OssDeployTask implements Runnable {
     @Override
     public void run() {
         String appId = appBuilding.getAppConfig().getAppId();
+        EvtAppStatResult evtAppStatResult = new EvtAppStatResult(appId, machineId);
+        evtAppStatResult.setDeployStepName(DeployStepName.DEPLOY_DONE.name());
+        evtAppStatResult.setDeployStepStatus(StepStatus.RUNNING.name());
+        evtAppStatResult.setErrorMsg(null);
+        appDeployService.updateAfterDeploy(evtAppStatResult);
+
         String commitId = appBuilding.getCommitId();
         String dirname = String.format("%s_%s", appId, commitId);
         String destDirPath = LocalBuildDir.packDir + File.separator + appId + File.separator + dirname;
         File destDir = new File(destDirPath);
+        EvtAppStatResult deployResult = new EvtAppStatResult(appId, machineId);
         if (destDir.exists()) {
             AliyunAccount aliyunAccount = packerConfig.getTargetPathOss();
             String endpoint = aliyunAccount.getEndpoint();
@@ -58,28 +67,40 @@ public class OssDeployTask implements Runnable {
             log.info("start {}'s oss deploy, upload dir {} to bucket {}", appId, destDirPath, bucketName);
             try {
                 // 删除 bucket 下的所有文件
-                aliyunOss.deleteObjects(bucketName, prefix);
-                List<String> failedList = aliyunOss.uploadDir(bucketName, destDirPath);
-
-                EvtAppStatResult deployResult = new EvtAppStatResult(appId, machineId);
+                aliyunOss.deleteObjects(ossClient, bucketName, prefix);
+                List<String> failedList = aliyunOss.uploadDir(ossClient, bucketName, destDirPath);
                 deployResult.setCommitId(commitId);
                 if (!failedList.isEmpty()) {
                     String errMsg = failedList.size() > 10 ? failedList.subList(0, 10).toString() : failedList.toString();
+                    deployResult.setDeployStepName(DeployStepName.DEPLOY_DONE.name());
+                    deployResult.setDeployStepStatus(StepStatus.FAILURE.name());
+                    deployResult.setErrorMsg(errMsg);
+
                     deployResult.setRunning(false);
                     deployResult.setStartTime(0);
                     deployResult.setPid(-1);
-                    deployResult.setErrorMsg(errMsg);
                 } else {
+                    deployResult.setDeployStepName(DeployStepName.DEPLOY_DONE.name());
+                    deployResult.setDeployStepStatus(StepStatus.SUCCESS.name());
+
                     deployResult.setRunning(true);
                     deployResult.setStartTime(System.currentTimeMillis());
                     deployResult.setPid(10086);
                 }
-                appDeployService.updateAfterDeploy(deployResult);
             } catch (Exception e) {
-                e.printStackTrace();
+                log.error("upload dir {} to bucket {} failed", destDirPath, bucketName, e);
+                deployResult.setDeployStepName(DeployStepName.DEPLOY_DONE.name());
+                deployResult.setDeployStepStatus(StepStatus.FAILURE.name());
+                deployResult.setErrorMsg(e.getMessage());
             }
         } else {
-            log.error("{} not exist", destDirPath);
+            String errorMsg = String.format("%s not exist", destDirPath);
+            log.error("{}", errorMsg);
+            deployResult.setDeployStepName(DeployStepName.DEPLOY_DONE.name());
+            deployResult.setDeployStepStatus(StepStatus.FAILURE.name());
+            deployResult.setErrorMsg(errorMsg);
         }
+
+        appDeployService.updateAfterDeploy(deployResult);
     }
 }

+ 13 - 7
mgr/src/main/java/cn/reghao/devops/mgr/ops/machine/service/impl/MachineQueryImpl.java

@@ -27,6 +27,7 @@ import java.util.stream.Collectors;
  */
 @Service
 public class MachineQueryImpl implements MachineQuery {
+    private final String ossPrefix = "oss";
     private final MachineInfoRepository machineInfoRepository;
     private final AppDeployConfigRepository deployConfigRepository;
     private final WebSocketSessionManager wsSessionManager;
@@ -40,7 +41,6 @@ public class MachineQueryImpl implements MachineQuery {
 
     @Override
     public Page<MachineDetail> getMachineInfoByPage(String env, Pageable pageable) {
-        String ossPrefix = "oss";
         Specification<MachineInfo> specification = (root, query, cb) -> {
             String likeQuery = String.format("%s%%", ossPrefix);
             Predicate predicate = cb.notLike(root.get("machineId"), likeQuery);
@@ -61,7 +61,6 @@ public class MachineQueryImpl implements MachineQuery {
 
     @Override
     public List<MachineDetail> getAliyunOss() {
-        String ossPrefix = "oss.";
         Specification<MachineInfo> specification = (root, query, cb) -> {
             String likeQuery = String.format("%s%%", ossPrefix);
             Predicate predicate = cb.like(root.get("machineId"), likeQuery);
@@ -99,7 +98,15 @@ public class MachineQueryImpl implements MachineQuery {
     public List<MachineStat> getMachineStats() {
         PageRequest pageRequest = PageRequest.of(0, 100);
         Page<MachineInfo> page = machineInfoRepository.findAll(pageRequest);
-        Map<String, List<MachineInfo>> map = page.stream().collect(Collectors.groupingBy(MachineInfo::getEnv));
+        Map<String, List<MachineInfo>> map = page.stream()
+                .peek(machineInfo -> {
+                    int status = NodeStatus.Offline.getCode();
+                    if (isAgentOnline(machineInfo.getMachineId())) {
+                        status = NodeStatus.Online.getCode();
+                    }
+                    machineInfo.setStat(status);
+                })
+                .collect(Collectors.groupingBy(MachineInfo::getEnv));
 
         List<MachineStat> stats = new ArrayList<>();
         map.forEach((env, list) -> {
@@ -119,7 +126,7 @@ public class MachineQueryImpl implements MachineQuery {
 
     private String getMachineStat(String machineId) {
         String status = NodeStatus.Offline.name();
-        if (wsSessionManager.getAgentSession(machineId) != null) {
+        if (isAgentOnline(machineId)) {
             status = NodeStatus.Online.name();
         }
         return status;
@@ -151,7 +158,7 @@ public class MachineQueryImpl implements MachineQuery {
     public List<SelectOption> getOnlineMachines(String env) {
         PageRequest pageRequest = PageRequest.of(0, 100);
         return machineInfoRepository.findByEnv(env, pageRequest).stream()
-                .filter(machineInfo -> machineInfo.getStat().equals(NodeStatus.Online.getCode()))
+                .filter(machineInfo -> isAgentOnline(machineInfo.getMachineId()))
                 .map(machineInfo -> new SelectOption(machineInfo.getMachineId(), machineInfo.getMachineIpv4()))
                 .collect(Collectors.toList());
     }
@@ -162,7 +169,6 @@ public class MachineQueryImpl implements MachineQuery {
         if (machineInfo == null) {
             return false;
         }
-
-        return Objects.equals(machineInfo.getStat(), NodeStatus.Online.getCode());
+        return machineId.startsWith(ossPrefix) || wsSessionManager.getAgentSession(machineInfo.getMachineId()) != null;
     }
 }