Browse Source

mgr 中使用 docker run 和 docker build 两种方式来编译项目源码

reghao 2 days ago
parent
commit
712142c360
57 changed files with 389 additions and 300 deletions
  1. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/db/query/AppBuildQuery.java
  2. 3 3
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/db/query/AppDeployQuery.java
  3. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/db/query/impl/AppBuildQueryImpl.java
  4. 4 4
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/db/query/impl/AppDeployQueryImpl.java
  5. 0 30
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/constant/DeployStatus.java
  6. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/vo/msg/BuildNotifyMsg.java
  7. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/service/PermissionCheck.java
  8. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/service/impl/AppBuildServiceImpl.java
  9. 22 42
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/service/impl/AppDeployServiceImpl.java
  10. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/controller/CompilerController.java
  11. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/controller/RepoAuthController.java
  12. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/constant/CompileType.java
  13. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/constant/EnvType.java
  14. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/po/CompilerConfig.java
  15. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/po/RepoAuthConfig.java
  16. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/provider/CompilerConfigGroupSequenceProvider.java
  17. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/provider/RepoAuthGroupSequenceProvider.java
  18. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/service/impl/CompilerConfigServiceImpl.java
  19. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/controller/AppStatController.java
  20. 5 5
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/controller/BuildDeployController.java
  21. 7 7
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/constant/BuildStatus.java
  22. 3 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/constant/BuildStepName.java
  23. 0 19
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/constant/CompileType.java
  24. 0 17
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/constant/RepoAuthType.java
  25. 0 17
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/constant/RepoType.java
  26. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/constant/RunStatus.java
  27. 16 18
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/po/AppBuilding.java
  28. 18 8
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/po/AppDeploying.java
  29. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/po/PipelineStep.java
  30. 3 3
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/AppBuildingVO.java
  31. 11 14
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/AppDeployingVO.java
  32. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/AppRunning.java
  33. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/AppRunningNode.java
  34. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/BuildConfigSnapshot.java
  35. 4 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/BuildLogVO.java
  36. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/BuildResult.java
  37. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/BuildTask.java
  38. 15 0
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/KeyValue.java
  39. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/BuildApp.java
  40. 9 13
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/BuildLogService.java
  41. 27 20
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/BuildService.java
  42. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/impl/BuildAppImpl.java
  43. 121 17
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/DockerBuild.java
  44. 61 0
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/DockerBuildCompiler.java
  45. 5 4
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/DockerRunCompiler.java
  46. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/EmptyCompiler.java
  47. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/MavenCompiler.java
  48. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/ShellCompiler.java
  49. 1 0
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/packer/CodePacker.java
  50. 9 0
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/packer/DockerPack.java
  51. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/repo/GitImpl.java
  52. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/docker/service/DockerImageService.java
  53. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/machine/service/impl/MachineServiceImpl.java
  54. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/util/BuilderInit.java
  55. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/util/DefaultSetting.java
  56. 0 11
      mgr/src/test/java/devops/AppConfigTest.java
  57. 1 1
      mgr/src/test/java/devops/GitTest.java

+ 2 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/db/query/AppBuildQuery.java

@@ -3,9 +3,9 @@ package cn.reghao.devops.mgr.ops.app.db.query;
 import cn.reghao.devops.mgr.ops.builder.model.po.AppBuilding;
 import cn.reghao.devops.mgr.ops.app.model.po.AppConfig;
 import cn.reghao.devops.mgr.ops.builder.model.po.BuildLog;
-import cn.reghao.devops.mgr.ops.app.model.vo.AppBuildingVO;
+import cn.reghao.devops.mgr.ops.builder.model.vo.AppBuildingVO;
 import cn.reghao.devops.mgr.ops.app.model.vo.AppConfigVO;
-import cn.reghao.devops.mgr.ops.app.model.vo.BuildLogVO;
+import cn.reghao.devops.mgr.ops.builder.model.vo.BuildLogVO;
 import cn.reghao.devops.mgr.ops.build.model.po.CompilerConfig;
 import cn.reghao.devops.mgr.ops.build.model.po.PackerConfig;
 import cn.reghao.devops.mgr.ops.build.model.po.RepoAuthConfig;

+ 3 - 3
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/db/query/AppDeployQuery.java

@@ -1,9 +1,9 @@
 package cn.reghao.devops.mgr.ops.app.db.query;
 
 import cn.reghao.devops.mgr.ops.app.model.po.AppDeployConfig;
-import cn.reghao.devops.mgr.ops.app.model.vo.AppDeployingVO;
-import cn.reghao.devops.mgr.ops.app.model.vo.AppRunning;
-import cn.reghao.devops.mgr.ops.app.model.vo.AppRunningNode;
+import cn.reghao.devops.mgr.ops.builder.model.vo.AppDeployingVO;
+import cn.reghao.devops.mgr.ops.builder.model.vo.AppRunning;
+import cn.reghao.devops.mgr.ops.builder.model.vo.AppRunningNode;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 

+ 2 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/db/query/impl/AppBuildQueryImpl.java

@@ -10,9 +10,9 @@ import cn.reghao.devops.mgr.ops.builder.model.po.AppBuilding;
 import cn.reghao.devops.mgr.ops.builder.model.po.AppDeploying;
 import cn.reghao.devops.mgr.ops.app.model.po.AppConfig;
 import cn.reghao.devops.mgr.ops.builder.model.po.BuildLog;
-import cn.reghao.devops.mgr.ops.app.model.vo.AppBuildingVO;
+import cn.reghao.devops.mgr.ops.builder.model.vo.AppBuildingVO;
 import cn.reghao.devops.mgr.ops.app.model.vo.AppConfigVO;
-import cn.reghao.devops.mgr.ops.app.model.vo.BuildLogVO;
+import cn.reghao.devops.mgr.ops.builder.model.vo.BuildLogVO;
 import cn.reghao.devops.mgr.ops.build.model.po.CompilerConfig;
 import cn.reghao.devops.mgr.ops.build.model.po.PackerConfig;
 import cn.reghao.devops.mgr.ops.build.model.po.RepoAuthConfig;

+ 4 - 4
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/db/query/impl/AppDeployQueryImpl.java

@@ -12,10 +12,10 @@ import cn.reghao.devops.mgr.ops.app.model.po.AppConfig;
 import cn.reghao.devops.mgr.ops.app.model.po.AppDeployConfig;
 import cn.reghao.devops.mgr.ops.builder.model.po.BuildLog;
 import cn.reghao.devops.mgr.ops.builder.model.po.DeployLog;
-import cn.reghao.devops.mgr.ops.app.model.vo.AppDeployingVO;
+import cn.reghao.devops.mgr.ops.builder.model.vo.AppDeployingVO;
 import cn.reghao.devops.mgr.ops.app.model.vo.AppNodeCount;
-import cn.reghao.devops.mgr.ops.app.model.vo.AppRunning;
-import cn.reghao.devops.mgr.ops.app.model.vo.AppRunningNode;
+import cn.reghao.devops.mgr.ops.builder.model.vo.AppRunning;
+import cn.reghao.devops.mgr.ops.builder.model.vo.AppRunningNode;
 import cn.reghao.devops.mgr.ops.machine.model.po.MachineInfo;
 import cn.reghao.devops.mgr.ops.machine.service.MachineQuery;
 import org.springframework.data.domain.Page;
@@ -74,7 +74,7 @@ public class AppDeployQueryImpl implements AppDeployQuery {
                     MachineInfo machineInfo = appDeploying.getAppDeployConfig().getMachineInfo();
                     String machineStatus = machineQuery.isAgentOnline(machineInfo.getMachineId())
                             ? NodeStatus.Online.name() : NodeStatus.Offline.name();
-                    return new AppDeployingVO(appDeploying, null, machineStatus);
+                    return new AppDeployingVO(appDeploying, machineStatus);
                 })
                 .sorted(Comparator.comparing(AppDeployingVO::getDeployTime).reversed())
                 .collect(Collectors.toList());

+ 0 - 30
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/constant/DeployStatus.java

@@ -1,30 +0,0 @@
-package cn.reghao.devops.mgr.ops.app.model.constant;
-
-/**
- * 部署状态
- *
- * @author reghao
- * @date 2021-11-08 16:35:42
- */
-public enum DeployStatus {
-    neverDeploy(1, "尚未部署"),
-    onDeploying(2, "正在部署"),
-    deploySuccess(3, "部署成功"),
-    deployFail(4, "部署失败");
-
-    private final Integer code;
-    private final String desc;
-
-    DeployStatus(Integer code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    public Integer getCode() {
-        return code;
-    }
-
-    public String getDesc() {
-        return desc;
-    }
-}

+ 2 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/vo/msg/BuildNotifyMsg.java

@@ -1,7 +1,7 @@
 package cn.reghao.devops.mgr.ops.app.model.vo.msg;
 
 import cn.reghao.devops.mgr.admin.service.notifier.ding.DingMsg;
-import cn.reghao.devops.mgr.ops.app.model.constant.BuildStatus;
+import cn.reghao.devops.mgr.ops.builder.model.constant.BuildStatus;
 import cn.reghao.devops.mgr.ops.builder.model.po.AppBuilding;
 import cn.reghao.jutil.jdk.converter.DateTimeConverter;
 import lombok.Data;
@@ -31,7 +31,7 @@ public class BuildNotifyMsg {
         this.repoBranch = appBuilding.getAppConfig().getRepoBranch();
         this.commitId = appBuilding.getCommitId();
         this.commitTime = DateTimeConverter.format(appBuilding.getCommitTime());
-        this.buildResult = BuildStatus.getByCode(appBuilding.getBuildStatus()).getDesc();
+        this.buildResult = BuildStatus.valueOf(appBuilding.getBuildStatus()).getDesc();
         this.buildTime = DateTimeConverter.format(appBuilding.getBuildTime());
         this.opsBy = appBuilding.getOpsBy();
     }

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/service/PermissionCheck.java

@@ -5,7 +5,7 @@ import cn.reghao.devops.mgr.admin.model.po.Role;
 import cn.reghao.devops.mgr.admin.model.po.User;
 import cn.reghao.devops.mgr.admin.service.RoleService;
 import cn.reghao.devops.mgr.admin.service.UserContext;
-import cn.reghao.devops.mgr.ops.builder.model.constant.EnvType;
+import cn.reghao.devops.mgr.ops.build.model.constant.EnvType;
 import org.springframework.stereotype.Service;
 
 import java.util.Set;

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/service/impl/AppBuildServiceImpl.java

@@ -13,7 +13,7 @@ import cn.reghao.devops.mgr.ops.app.service.AppDeployService;
 import cn.reghao.devops.mgr.ops.build.model.vo.BuildConfig;
 import cn.reghao.devops.mgr.ops.build.service.BuildConfigChecker;
 import cn.reghao.devops.mgr.ops.builder.model.LocalBuildDir;
-import cn.reghao.devops.mgr.ops.builder.model.constant.RepoType;
+import cn.reghao.devops.mgr.ops.build.model.constant.RepoType;
 import cn.reghao.jutil.jdk.web.result.Result;
 import cn.reghao.jutil.jdk.web.result.ResultStatus;
 import lombok.extern.slf4j.Slf4j;

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

@@ -9,10 +9,10 @@ import cn.reghao.devops.mgr.admin.service.UserContext;
 import cn.reghao.devops.mgr.ops.aliyun.service.AliyunCdn;
 import cn.reghao.devops.mgr.ops.app.db.query.AppBuildQuery;
 import cn.reghao.devops.mgr.ops.app.db.query.AppDeployQuery;
+import cn.reghao.devops.mgr.ops.builder.model.constant.BuildStatus;
 import cn.reghao.devops.mgr.ops.builder.db.repository.AppDeployingRepository;
 import cn.reghao.devops.mgr.ops.app.db.repository.AppDeployConfigRepository;
 import cn.reghao.devops.mgr.ops.builder.db.repository.DeployLogRepository;
-import cn.reghao.devops.mgr.ops.app.model.constant.DeployStatus;
 import cn.reghao.devops.mgr.ops.app.model.dto.DeployConfigDto;
 import cn.reghao.devops.mgr.ops.app.model.dto.DeployConfigUpdateDto;
 import cn.reghao.devops.mgr.ops.builder.model.po.AppBuilding;
@@ -27,8 +27,8 @@ import cn.reghao.devops.mgr.ops.builder.task.RereshCheckTask;
 import cn.reghao.devops.mgr.ops.machine.model.po.MachineInfo;
 import cn.reghao.devops.mgr.ops.machine.service.MachineQuery;
 import cn.reghao.jutil.jdk.converter.DateTimeConverter;
+import cn.reghao.jutil.jdk.web.result.NotAvailable;
 import cn.reghao.jutil.jdk.web.result.Result;
-import cn.reghao.jutil.jdk.web.result.ResultStatus;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
 import cn.reghao.jutil.jdk.thread.ThreadPoolWrapper;
 import lombok.extern.slf4j.Slf4j;
@@ -38,7 +38,6 @@ import org.springframework.util.StringUtils;
 
 import java.time.Duration;
 import java.time.LocalDateTime;
-import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -83,14 +82,14 @@ public class AppDeployServiceImpl implements AppDeployService {
         AppConfig appConfig = appBuildQuery.getAppConfig(appId);
         if (appConfig == null) {
             String msg = String.format("%s 不存在", appId);
-            return Result.result(ResultStatus.ERROR, msg);
+            return Result.result(cn.reghao.jutil.jdk.web.result.ResultStatus.ERROR, msg);
         }
 
         String machineId = deployConfigDto.getMachineId();
         MachineInfo machineInfo = machineQuery.getMachineInfo(machineId);
         if (machineInfo == null) {
             String msg = String.format("%s 不存在", machineId);
-            return Result.result(ResultStatus.ERROR, msg);
+            return Result.result(cn.reghao.jutil.jdk.web.result.ResultStatus.ERROR, msg);
         }
 
         String startScript = deployConfigDto.getStartScript();
@@ -106,13 +105,8 @@ public class AppDeployServiceImpl implements AppDeployService {
         deployConfigRepository.save(appDeployConfig);
 
         AppDeploying appDeploying = new AppDeploying(appDeployConfig);
-        // 定义流水线环节:检出 -> 编译 -> 打包 -> (部署)
-        List<String> stepNames = Arrays.stream(DeployStepName.values())
-                .map(Enum::name)
-                .collect(Collectors.toList());
-        appDeploying.initSteps(stepNames, "");
         appDeployingRepository.save(appDeploying);
-        return Result.result(ResultStatus.SUCCESS);
+        return Result.result(cn.reghao.jutil.jdk.web.result.ResultStatus.SUCCESS);
     }
 
     @Override
@@ -122,7 +116,7 @@ public class AppDeployServiceImpl implements AppDeployService {
         AppDeployConfig appDeployConfig = appDeployQuery.getByAppIdAndMachineId(appId, machineId);
         if (appDeployConfig == null) {
             String msg = String.format("%s 在 %s 上的部署配置不存在", appId, machineId);
-            return Result.result(ResultStatus.ERROR, msg);
+            return Result.result(cn.reghao.jutil.jdk.web.result.ResultStatus.ERROR, msg);
         }
 
         String startScript = deployConfigUpdateDto.getStartScript();
@@ -136,7 +130,7 @@ public class AppDeployServiceImpl implements AppDeployService {
 
         appDeployConfig.setStartScript(startScript);
         deployConfigRepository.save(appDeployConfig);
-        return Result.result(ResultStatus.SUCCESS);
+        return Result.result(cn.reghao.jutil.jdk.web.result.ResultStatus.SUCCESS);
     }
 
     @Override
@@ -149,7 +143,7 @@ public class AppDeployServiceImpl implements AppDeployService {
     public Result deleteDeployConfig(int appDeployConfigId) {
         AppDeployConfig appDeployConfig = deployConfigRepository.findById(appDeployConfigId).orElse(null);
         if (appDeployConfig == null) {
-            return Result.result(ResultStatus.FAIL, "AppDeployConfig not exists");
+            return Result.result(cn.reghao.jutil.jdk.web.result.ResultStatus.FAIL, "AppDeployConfig not exists");
         }
 
         return deleteAppDeployConfig(appDeployConfig);
@@ -162,10 +156,10 @@ public class AppDeployServiceImpl implements AppDeployService {
             appDeployingRepository.delete(appDeploying);
             deployLogRepository.deleteByAppDeployConfig_MachineInfo_MachineId(machineId);
             deployConfigRepository.delete(appDeployConfig);
-            return Result.result(ResultStatus.SUCCESS);
+            return Result.result(cn.reghao.jutil.jdk.web.result.ResultStatus.SUCCESS);
         }
 
-        return Result.result(ResultStatus.FAIL, "app is running");
+        return Result.result(cn.reghao.jutil.jdk.web.result.ResultStatus.FAIL, "app is running");
     }
 
     @Override
@@ -173,12 +167,12 @@ public class AppDeployServiceImpl implements AppDeployService {
         List<AppDeployConfig> list = deployConfigRepository.findByAppConfig_AppId(appId);
         for (AppDeployConfig appDeployConfig : list) {
             Result result = deleteAppDeployConfig(appDeployConfig);
-            if (result.getCode() != ResultStatus.SUCCESS.getCode()) {
+            if (result.getCode() != cn.reghao.jutil.jdk.web.result.ResultStatus.SUCCESS.getCode()) {
                 return result;
             }
         }
 
-        return Result.result(ResultStatus.SUCCESS);
+        return Result.result(cn.reghao.jutil.jdk.web.result.ResultStatus.SUCCESS);
     }
 
     @Override
@@ -217,9 +211,14 @@ public class AppDeployServiceImpl implements AppDeployService {
         AppDeploying appDeploying = appDeployingRepository.findByAppDeployConfig_AppConfig_AppIdAndAppDeployConfig_MachineInfo_MachineId(appId, machineId);
         if (appDeploying != null) {
             String opsBy = UserContext.getUsername();
+            if (opsBy.equals(NotAvailable.na.getDesc())) {
+                opsBy = appBuilding.getOpsBy();
+            }
+
             appDeploying.setDeployTime(LocalDateTime.now());
-            appDeploying.setDeployResult(DeployStatus.onDeploying.getDesc());
+            appDeploying.setDeployStatus(BuildStatus.OpsRunning.name());
             appDeploying.setOpsBy(opsBy);
+            appDeploying.updateBeforeDeploy();
             appDeployingRepository.save(appDeploying);
         } else {
             log.error("AppDeploying with appId {} not exist", appId);
@@ -247,25 +246,7 @@ public class AppDeployServiceImpl implements AppDeployService {
         }
 
         String stepStatus = deployResult.getDeployStepStatus();
-        appDeploying.getSteps().stream()
-                .filter(s -> s.getStepName().equals(stepName))
-                .findFirst()
-                .ifPresent(step -> {
-                    step.setStatus(stepStatus);
-                    step.setErrorMsg(errorMsg);
-                    // 记录时间
-                    if (StepStatus.RUNNING.name().equals(stepStatus)) {
-                        step.setStartTime(LocalDateTime.now());
-                    } else if (StepStatus.SUCCESS.name().equals(stepStatus)
-                            || StepStatus.FAILURE.name().equals(stepStatus)) {
-                        LocalDateTime endTime = LocalDateTime.now();
-                        // 计算总耗时
-                        long seconds = Duration.between(step.getStartTime(), endTime).getSeconds();
-                        step.setEndTime(endTime);
-                        step.setDuration(seconds);
-                    }
-                });
-
+        appDeploying.updateStep(stepName, stepStatus, errorMsg);
         if (stepName.equals(DeployStepName.HEALTH_CHECK.name())) {
             appDeployingRepository.save(appDeploying);
             return;
@@ -276,9 +257,9 @@ public class AppDeployServiceImpl implements AppDeployService {
                 String machineIpv4 = deployConfig.getMachineInfo().getMachineIpv4();
                 log.info("部署在 {} 的应用 {} 已完成", machineIpv4, appId);
                 if (stepStatus.equals(StepStatus.FAILURE.name())) {
-                    appDeploying.setDeployResult(DeployStatus.deployFail.getDesc());
+                    appDeploying.setDeployStatus(BuildStatus.OpsFail.name());
                 } else {
-                    appDeploying.setDeployResult(DeployStatus.deploySuccess.getDesc());
+                    appDeploying.setDeployStatus(BuildStatus.OpsSuccess.name());
                     appDeploying.setRunning(deployResult.getRunning());
                     appDeploying.setStartTime(DateTimeConverter.localDateTime(deployResult.getStartTime()));
                     appDeploying.setPid(deployResult.getPid());
@@ -307,7 +288,6 @@ public class AppDeployServiceImpl implements AppDeployService {
                                    EvtAppStatResult deployResult,BuildLog buildLog) {
         String stepJson = JsonConverter.objectToJson(appDeploying.getSteps());
         String configSnapshot = JsonConverter.objectToJson(appDeployConfig);
-        String stepStatus = deployResult.getDeployStepStatus();
 
         String opsBy = appDeploying.getOpsBy();
         LocalDateTime startTime = appDeploying.getDeployTime();
@@ -318,7 +298,7 @@ public class AppDeployServiceImpl implements AppDeployService {
         deployLog.setStartTime(startTime);
         deployLog.setEndTime(endTime);
         deployLog.setDuration(seconds);
-        deployLog.setStatus(stepStatus);
+        deployLog.setStatus(appDeploying.getDeployStatus());
         deployLog.setErrorMsg(deployResult.getErrorMsg());
         deployLog.setStepJson(stepJson);
         deployLog.setConfigSnapshot(configSnapshot);

+ 2 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/controller/CompilerController.java

@@ -4,7 +4,7 @@ import cn.reghao.devops.mgr.ops.build.db.repository.CompilerConfigRepository;
 import cn.reghao.devops.mgr.ops.build.model.dto.CompilerBindDto;
 import cn.reghao.devops.mgr.ops.build.model.po.CompilerConfig;
 import cn.reghao.devops.mgr.ops.build.service.CompilerConfigService;
-import cn.reghao.devops.mgr.ops.builder.model.constant.CompileType;
+import cn.reghao.devops.mgr.ops.build.model.constant.CompileType;
 import cn.reghao.devops.mgr.util.SelectOption;
 import cn.reghao.jutil.jdk.web.db.PageList;
 import cn.reghao.jutil.jdk.web.result.Result;
@@ -84,7 +84,7 @@ public class CompilerController {
     @GetMapping(value = "/bind/list", produces = MediaType.APPLICATION_JSON_VALUE)
     public String compilerBindPage(@RequestParam("id") int id) {
         CompilerConfig compilerConfig = compilerConfigRepository.findById(id).orElse(null);
-        if (compilerConfig != null && compilerConfig.getType().equals(CompileType.docker.getName())) {
+        if (compilerConfig != null && compilerConfig.getType().equals(CompileType.dockerRun.getName())) {
             return WebResult.success(compilerConfig.getCompilerBinds());
         }
 

+ 2 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/controller/RepoAuthController.java

@@ -3,8 +3,8 @@ package cn.reghao.devops.mgr.ops.build.controller;
 import cn.reghao.devops.mgr.ops.build.db.repository.RepoAuthConfigRepository;
 import cn.reghao.devops.mgr.ops.build.model.po.RepoAuthConfig;
 import cn.reghao.devops.mgr.ops.build.service.RepoAuthConfigService;
-import cn.reghao.devops.mgr.ops.builder.model.constant.RepoAuthType;
-import cn.reghao.devops.mgr.ops.builder.model.constant.RepoType;
+import cn.reghao.devops.mgr.ops.build.model.constant.RepoAuthType;
+import cn.reghao.devops.mgr.ops.build.model.constant.RepoType;
 import cn.reghao.devops.mgr.util.SelectOption;
 import cn.reghao.jutil.jdk.web.db.PageList;
 import cn.reghao.jutil.jdk.web.result.Result;

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/constant/CompileType.java

@@ -7,7 +7,7 @@ package cn.reghao.devops.mgr.ops.build.model.constant;
  * @date 2019-10-18 14:31:29
  */
 public enum CompileType {
-    none, shell, maven;
+    none, shell, maven, dockerRun, dockerBuild;
 
     public String getName() {
         return this.name();

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/constant/EnvType.java → mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/constant/EnvType.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.mgr.ops.builder.model.constant;
+package cn.reghao.devops.mgr.ops.build.model.constant;
 
 /**
  * @author reghao

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/po/CompilerConfig.java

@@ -2,7 +2,7 @@ package cn.reghao.devops.mgr.ops.build.model.po;
 
 import cn.reghao.devops.mgr.ops.build.model.provider.CompilerConfigGroupSequenceProvider;
 import cn.reghao.devops.mgr.ops.builder.model.dto.CompilerDto;
-import cn.reghao.devops.mgr.ops.builder.model.constant.CompileType;
+import cn.reghao.devops.mgr.ops.build.model.constant.CompileType;
 import cn.reghao.devops.mgr.util.BaseEntity;
 import cn.reghao.jutil.jdk.web.validator.ValidEnum;
 import lombok.Getter;

+ 2 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/po/RepoAuthConfig.java

@@ -2,8 +2,8 @@ package cn.reghao.devops.mgr.ops.build.model.po;
 
 import cn.reghao.devops.mgr.ops.build.model.provider.RepoAuthGroupSequenceProvider;
 import cn.reghao.devops.mgr.ops.builder.model.dto.RepoAuth;
-import cn.reghao.devops.mgr.ops.builder.model.constant.RepoAuthType;
-import cn.reghao.devops.mgr.ops.builder.model.constant.RepoType;
+import cn.reghao.devops.mgr.ops.build.model.constant.RepoAuthType;
+import cn.reghao.devops.mgr.ops.build.model.constant.RepoType;
 import cn.reghao.devops.mgr.util.BaseEntity;
 import cn.reghao.jutil.jdk.web.validator.ValidEnum;
 import lombok.Getter;

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/provider/CompilerConfigGroupSequenceProvider.java

@@ -1,7 +1,7 @@
 package cn.reghao.devops.mgr.ops.build.model.provider;
 
 import cn.reghao.devops.mgr.ops.build.model.po.CompilerConfig;
-import cn.reghao.devops.mgr.ops.builder.model.constant.CompileType;
+import cn.reghao.devops.mgr.ops.build.model.constant.CompileType;
 import org.hibernate.validator.spi.group.DefaultGroupSequenceProvider;
 
 import java.util.ArrayList;

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/provider/RepoAuthGroupSequenceProvider.java

@@ -1,7 +1,7 @@
 package cn.reghao.devops.mgr.ops.build.model.provider;
 
 import cn.reghao.devops.mgr.ops.build.model.po.RepoAuthConfig;
-import cn.reghao.devops.mgr.ops.builder.model.constant.RepoAuthType;
+import cn.reghao.devops.mgr.ops.build.model.constant.RepoAuthType;
 import org.hibernate.validator.spi.group.DefaultGroupSequenceProvider;
 
 import java.util.ArrayList;

+ 2 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/service/impl/CompilerConfigServiceImpl.java

@@ -7,7 +7,7 @@ import cn.reghao.devops.mgr.ops.build.model.dto.CompilerBindDto;
 import cn.reghao.devops.mgr.ops.build.model.po.CompilerBind;
 import cn.reghao.devops.mgr.ops.build.model.po.CompilerConfig;
 import cn.reghao.devops.mgr.ops.build.service.CompilerConfigService;
-import cn.reghao.devops.mgr.ops.builder.model.constant.CompileType;
+import cn.reghao.devops.mgr.ops.build.model.constant.CompileType;
 import cn.reghao.devops.mgr.util.StringUtil;
 import cn.reghao.jutil.jdk.web.result.Result;
 import cn.reghao.jutil.jdk.web.result.ResultStatus;
@@ -43,7 +43,7 @@ public class CompilerConfigServiceImpl implements CompilerConfigService {
         CompilerConfig entity = compilerConfigRepository.findByName(name);
         if (entity == null) {
             String type = compilerConfig.getType();
-            if (type.equals(CompileType.docker.getName())) {
+            if (type.equals(CompileType.dockerRun.getName())) {
                 // TODO pull 编译器镜像, 验证是否可用
                 String compilerImage = compilerConfig.getCompilerImage();
             }

+ 2 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/controller/AppStatController.java

@@ -3,8 +3,8 @@ package cn.reghao.devops.mgr.ops.builder.controller;
 import cn.reghao.devops.common.msg.constant.AppStatOps;
 import cn.reghao.devops.mgr.ops.app.model.dto.AppNode;
 import cn.reghao.devops.mgr.ops.app.db.query.AppDeployQuery;
-import cn.reghao.devops.mgr.ops.app.model.vo.AppRunning;
-import cn.reghao.devops.mgr.ops.app.model.vo.AppRunningNode;
+import cn.reghao.devops.mgr.ops.builder.model.vo.AppRunning;
+import cn.reghao.devops.mgr.ops.builder.model.vo.AppRunningNode;
 import cn.reghao.devops.mgr.ops.app.service.AppRunService;
 import cn.reghao.jutil.jdk.web.db.PageList;
 import cn.reghao.jutil.jdk.web.result.Result;

+ 5 - 5
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/controller/BuildDeployController.java

@@ -1,10 +1,10 @@
 package cn.reghao.devops.mgr.ops.builder.controller;
 
 import cn.reghao.devops.mgr.ops.builder.model.po.PipelineStep;
-import cn.reghao.devops.mgr.ops.app.model.vo.AppBuildingVO;
-import cn.reghao.devops.mgr.ops.app.model.vo.AppDeployingVO;
-import cn.reghao.devops.mgr.ops.app.model.vo.BuildLogVO;
-import cn.reghao.devops.mgr.ops.app.model.vo.BuildTask;
+import cn.reghao.devops.mgr.ops.builder.model.vo.AppBuildingVO;
+import cn.reghao.devops.mgr.ops.builder.model.vo.AppDeployingVO;
+import cn.reghao.devops.mgr.ops.builder.model.vo.BuildLogVO;
+import cn.reghao.devops.mgr.ops.builder.model.vo.BuildTask;
 import cn.reghao.devops.mgr.ops.app.service.BuildTimeMetrics;
 import cn.reghao.devops.mgr.ops.builder.service.BuildService;
 import cn.reghao.devops.mgr.util.JsonUtils;
@@ -16,7 +16,7 @@ import cn.reghao.devops.mgr.ops.builder.service.GetApp;
 import cn.reghao.devops.mgr.ops.builder.service.webhook.WebhookService;
 import cn.reghao.devops.mgr.ops.app.db.query.AppBuildQuery;
 import cn.reghao.devops.mgr.ops.app.db.query.AppDeployQuery;
-import cn.reghao.devops.mgr.ops.app.model.vo.BuildConfigSnapshot;
+import cn.reghao.devops.mgr.ops.builder.model.vo.BuildConfigSnapshot;
 import cn.reghao.devops.mgr.ops.builder.model.po.BuildLog;
 import cn.reghao.devops.mgr.ops.builder.service.BuildApp;
 import cn.reghao.jutil.web.WebResult;

+ 7 - 7
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/constant/BuildStatus.java → mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/constant/BuildStatus.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.mgr.ops.app.model.constant;
+package cn.reghao.devops.mgr.ops.builder.model.constant;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Getter;
@@ -7,7 +7,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 /**
- * 构建状态
+ * 构建/部署结果状态
  *
  * @author reghao
  * @date 2021-11-08 16:35:42
@@ -15,10 +15,10 @@ import java.util.Map;
 @JsonFormat(shape = JsonFormat.Shape.OBJECT)
 @Getter
 public enum BuildStatus {
-    neverBuild(1, "尚未构建", "#909399", "info"),
-    onBuilding(2, "正在构建", "#409EFF", "primary"),
-    buildSuccess(3, "构建成功", "#67C23A", "success"),
-    buildFail(4, "构建失败", "#F56C6C", "danger");
+    OpsPending(1, "尚未开始", "#909399", "info"),
+    OpsRunning(2, "正在进行", "#409EFF", "primary"),
+    OpsSuccess(3, "操作成功", "#67C23A", "success"),
+    OpsFail(4, "操作失败", "#F56C6C", "danger");
 
     private final Integer code;
     private final String desc;
@@ -40,6 +40,6 @@ public enum BuildStatus {
     }
 
     public static BuildStatus getByCode(Integer code) {
-        return CACHE.getOrDefault(code, neverBuild);
+        return CACHE.getOrDefault(code, OpsPending);
     }
 }

+ 3 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/constant/BuildStepName.java → mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/constant/BuildStepName.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.mgr.ops.app.model.constant;
+package cn.reghao.devops.mgr.ops.builder.model.constant;
 
 /**
  * 流水线阶段枚举
@@ -8,9 +8,10 @@ package cn.reghao.devops.mgr.ops.app.model.constant;
  */
 public enum BuildStepName {
     CHECKOUT("源码检出"),
+    SCAN("扫描源码"),
     COMPILE("项目编译"),
     PACK("镜像打包"),
-    DEPLOY("应用部署");
+    PUSH("推送镜像");
 
     private final String desc;
     BuildStepName(String desc) { this.desc = desc; }

+ 0 - 19
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/constant/CompileType.java

@@ -1,19 +0,0 @@
-package cn.reghao.devops.mgr.ops.builder.model.constant;
-
-/**
- * 编译方式类型
- *
- * @author reghao
- * @date 2019-10-18 14:31:29
- */
-public enum CompileType {
-    none, shell, maven, docker;
-
-    public String getName() {
-        return this.name();
-    }
-
-    public String getValue() {
-        return this.name();
-    }
-}

+ 0 - 17
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/constant/RepoAuthType.java

@@ -1,17 +0,0 @@
-package cn.reghao.devops.mgr.ops.builder.model.constant;
-
-/**
- * @author reghao
- * @date 2021-02-05 18:50:01
- */
-public enum RepoAuthType {
-    http, ssh, none;
-
-    public String getName() {
-        return this.name();
-    }
-
-    public String getValue() {
-        return this.name();
-    }
-}

+ 0 - 17
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/constant/RepoType.java

@@ -1,17 +0,0 @@
-package cn.reghao.devops.mgr.ops.builder.model.constant;
-
-/**
- * @author reghao
- * @date 2021-02-05 22:50:41
- */
-public enum RepoType {
-    git;
-
-    public String getName() {
-        return this.name();
-    }
-
-    public String getValue() {
-        return this.name();
-    }
-}

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/constant/RunStatus.java → mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/constant/RunStatus.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.mgr.ops.app.model.constant;
+package cn.reghao.devops.mgr.ops.builder.model.constant;
 
 /**
  * 运行状态

+ 16 - 18
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/po/AppBuilding.java

@@ -1,8 +1,8 @@
 package cn.reghao.devops.mgr.ops.builder.model.po;
 
 import cn.reghao.devops.mgr.admin.service.UserContext;
-import cn.reghao.devops.mgr.ops.app.model.constant.BuildStatus;
-import cn.reghao.devops.mgr.ops.app.model.constant.BuildStepName;
+import cn.reghao.devops.mgr.ops.builder.model.constant.BuildStatus;
+import cn.reghao.devops.mgr.ops.builder.model.constant.BuildStepName;
 import cn.reghao.devops.mgr.ops.app.model.po.AppConfig;
 import cn.reghao.devops.common.msg.constant.StepStatus;
 import cn.reghao.devops.mgr.util.BaseEntity;
@@ -41,7 +41,7 @@ public class AppBuilding extends BaseEntity {
     private LocalDateTime commitTime;
     private LocalDateTime buildTime;
     // BuildStatus
-    private int buildStatus;
+    private String buildStatus;
     private String packagePath;
     private String opsBy;
     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@@ -54,32 +54,34 @@ public class AppBuilding extends BaseEntity {
         this.commitId = NotAvailable.na.getDesc();
         this.commitTime = LocalDate.EPOCH.atStartOfDay();
         this.buildTime = LocalDate.EPOCH.atStartOfDay();
-        this.buildStatus = BuildStatus.neverBuild.getCode();
+        this.buildStatus = BuildStatus.OpsPending.name();
         this.packagePath = NotAvailable.na.getDesc();
         this.opsBy = NotAvailable.na.getDesc();
     }
 
-    public void updateBeforeBuild(String buildId) {
+    public void updateBeforeBuild() {
+        this.commitId = NotAvailable.na.getDesc();
+        this.commitTime = LocalDate.EPOCH.atStartOfDay();
         this.buildTime = LocalDateTime.now();
-        this.buildStatus = BuildStatus.onBuilding.getCode();
+        this.buildStatus = BuildStatus.OpsRunning.name();
+        this.packagePath = NotAvailable.na.getDesc();
         this.opsBy = UserContext.getUsername();
 
         // 定义流水线环节:检出 -> 编译 -> 打包 -> (部署)
         List<String> stepNames = Arrays.stream(BuildStepName.values()).map(Enum::name).collect(Collectors.toList());
-        initSteps(stepNames, buildId);
+        initSteps(stepNames);
     }
 
     // 初始化步骤的方法
-    private void initSteps(List<String> stepNames, String buildId) {
+    private void initSteps(List<String> stepNames) {
         if (this.steps.isEmpty()) {
             // 情况 A:如果 List 为空,说明是第一次构建,执行新建
             for (String name : stepNames) {
-                this.steps.add(new PipelineStep(buildId, name));
+                this.steps.add(new PipelineStep(name));
             }
         } else {
             // 情况 B:如果已经存在,则“洗牌”重置
             for (PipelineStep step : this.steps) {
-                //step.setBuildId(buildId);       // 更新为本次构建的 ID
                 step.setStatus("PENDING");     // 重置为待执行
                 step.setStartTime(null);       // 抹除时间
                 step.setEndTime(null);
@@ -88,11 +90,11 @@ public class AppBuilding extends BaseEntity {
             }
 
             // 如果新旧流程步骤数量不一致(比如配置改了),可以做增删逻辑
-            adjustStepsIfNecessary(stepNames, buildId);
+            adjustStepsIfNecessary(stepNames);
         }
     }
 
-    private void adjustStepsIfNecessary(List<String> stepNames, String buildId) {
+    private void adjustStepsIfNecessary(List<String> stepNames) {
         // 1. 删除多余的步骤
         this.steps.removeIf(step -> !stepNames.contains(step.getStepName()));
 
@@ -100,7 +102,7 @@ public class AppBuilding extends BaseEntity {
         for (String name : stepNames) {
             boolean exists = this.steps.stream().anyMatch(s -> s.getStepName().equals(name));
             if (!exists) {
-                this.steps.add(new PipelineStep(buildId, name));
+                this.steps.add(new PipelineStep(name));
             }
         }
     }
@@ -129,11 +131,7 @@ public class AppBuilding extends BaseEntity {
         this.buildLog = buildLog;
         this.commitId = buildLog.getCommitId();
         this.commitTime = buildLog.getCommitTime();
-        if (!StepStatus.SUCCESS.name().equals(buildLog.getStatus())) {
-            this.buildStatus = BuildStatus.buildFail.getCode();
-        } else {
-            this.buildStatus = BuildStatus.buildSuccess.getCode();
-        }
+        this.buildStatus = buildLog.getStatus();
         this.packagePath = buildLog.getPackagePath();
         this.opsBy = buildLog.getOpsBy();
     }

+ 18 - 8
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/po/AppDeploying.java

@@ -1,10 +1,10 @@
 package cn.reghao.devops.mgr.ops.builder.model.po;
 
+import cn.reghao.devops.common.msg.DeployStepName;
 import cn.reghao.devops.common.msg.constant.StepStatus;
-import cn.reghao.devops.mgr.ops.app.model.constant.DeployStatus;
+import cn.reghao.devops.mgr.ops.builder.model.constant.BuildStatus;
 import cn.reghao.devops.mgr.ops.app.model.po.AppDeployConfig;
 import cn.reghao.devops.mgr.util.BaseEntity;
-import cn.reghao.jutil.jdk.converter.DateTimeConverter;
 import cn.reghao.jutil.jdk.web.result.NotAvailable;
 import jakarta.persistence.*;
 import lombok.Data;
@@ -14,7 +14,9 @@ import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -30,8 +32,9 @@ public class AppDeploying extends BaseEntity {
     @ManyToOne(cascade = CascadeType.REFRESH)
     @JoinColumn(name = "app_building_id")
     private AppBuilding appBuilding;
+
     private LocalDateTime deployTime;
-    private String deployResult;
+    private String deployStatus;
     private String opsBy;
 
     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@@ -47,24 +50,31 @@ public class AppDeploying extends BaseEntity {
 
     public AppDeploying(AppDeployConfig appDeployConfig) {
         this.appDeployConfig = appDeployConfig;
-        this.deployResult = DeployStatus.neverDeploy.getDesc();
         this.deployTime = LocalDate.EPOCH.atStartOfDay();
+        this.deployStatus = BuildStatus.OpsPending.name();
         this.opsBy = NotAvailable.na.getDesc();
         this.running = false;
         this.pid = 0;
     }
 
+    public void updateBeforeDeploy() {
+        // 定义流水线环节:检出 -> 编译 -> 打包 -> (部署)
+        List<String> stepNames = Arrays.stream(DeployStepName.values())
+                .map(Enum::name)
+                .collect(Collectors.toList());
+        initSteps(stepNames, "");
+    }
+
     // 初始化步骤的方法
-    public void initSteps(List<String> stepNames, String buildId) {
+    private void initSteps(List<String> stepNames, String buildId) {
         if (this.steps.isEmpty()) {
             // 情况 A:如果 List 为空,说明是第一次构建,执行新建
             for (String name : stepNames) {
-                this.steps.add(new PipelineStep(buildId, name));
+                this.steps.add(new PipelineStep(name));
             }
         } else {
             // 情况 B:如果已经存在,则“洗牌”重置
             for (PipelineStep step : this.steps) {
-                //step.setBuildId(buildId);       // 更新为本次构建的 ID
                 step.setStatus("PENDING");     // 重置为待执行
                 step.setStartTime(null);       // 抹除时间
                 step.setEndTime(null);
@@ -85,7 +95,7 @@ public class AppDeploying extends BaseEntity {
         for (String name : stepNames) {
             boolean exists = this.steps.stream().anyMatch(s -> s.getStepName().equals(name));
             if (!exists) {
-                this.steps.add(new PipelineStep(buildId, name));
+                this.steps.add(new PipelineStep(name));
             }
         }
     }

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/po/PipelineStep.java

@@ -44,7 +44,7 @@ public class PipelineStep {
     private Long duration;
     private String errorMsg;
 
-    public PipelineStep(String buildId, String stepName) {
+    public PipelineStep(String stepName) {
         this.stepName = stepName;
     }
 }

+ 3 - 3
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/vo/AppBuildingVO.java → mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/AppBuildingVO.java

@@ -1,6 +1,6 @@
-package cn.reghao.devops.mgr.ops.app.model.vo;
+package cn.reghao.devops.mgr.ops.builder.model.vo;
 
-import cn.reghao.devops.mgr.ops.app.model.constant.BuildStatus;
+import cn.reghao.devops.mgr.ops.builder.model.constant.BuildStatus;
 import cn.reghao.devops.mgr.ops.builder.model.po.PipelineStep;
 import cn.reghao.devops.mgr.ops.app.model.po.AppConfig;
 import cn.reghao.jutil.jdk.web.result.NotAvailable;
@@ -52,7 +52,7 @@ public class AppBuildingVO {
         this.buildBy = appBuilding.getOpsBy();
         this.totalNode = totalNode;
         this.totalRunning = totalRunning;
-        this.buildResult = new BuildResult(BuildStatus.getByCode(appBuilding.getBuildStatus()));
+        this.buildResult = new BuildResult(BuildStatus.valueOf(appBuilding.getBuildStatus()));
         this.steps = appBuilding.getSteps();
     }
 }

+ 11 - 14
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/vo/AppDeployingVO.java → mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/AppDeployingVO.java

@@ -1,6 +1,7 @@
-package cn.reghao.devops.mgr.ops.app.model.vo;
+package cn.reghao.devops.mgr.ops.builder.model.vo;
 
-import cn.reghao.devops.mgr.ops.builder.model.po.BuildLog;
+import cn.reghao.devops.mgr.ops.builder.model.constant.BuildStatus;
+import cn.reghao.devops.mgr.ops.builder.model.po.PipelineStep;
 import cn.reghao.devops.mgr.ops.machine.model.po.MachineInfo;
 import cn.reghao.jutil.jdk.web.result.NotAvailable;
 import cn.reghao.devops.mgr.ops.builder.model.po.AppDeploying;
@@ -8,6 +9,7 @@ import cn.reghao.jutil.jdk.converter.DateTimeConverter;
 import lombok.Data;
 
 import java.time.LocalDate;
+import java.util.List;
 
 /**
  * @author reghao
@@ -22,24 +24,19 @@ public class AppDeployingVO {
     private String packagePath;
     private String deployBy;
     private String deployTime;
-    private String deployResult;
+    private BuildResult deployResult;
+    private List<PipelineStep> steps;
 
-    public AppDeployingVO(AppDeploying appDeploying, BuildLog buildLog, String machineStatus) {
+    public AppDeployingVO(AppDeploying appDeploying, String machineStatus) {
         MachineInfo machineInfo = appDeploying.getAppDeployConfig().getMachineInfo();
         this.machineId = machineInfo.getMachineId();
         this.machineIpv4 = machineInfo.getMachineIpv4();
         this.machineStatus = machineStatus;
-
-        if (buildLog != null) {
-            this.commitId = buildLog.getCommitId() != null ? buildLog.getCommitId() : NotAvailable.na.getDesc();
-            this.packagePath = buildLog.getPackagePath() != null ? buildLog.getPackagePath() : NotAvailable.na.getDesc();
-        } else {
-            this.commitId = NotAvailable.na.getDesc();
-            this.packagePath = NotAvailable.na.getDesc();
-        }
-
+        this.commitId = appDeploying.getAppBuilding().getCommitId();
+        this.packagePath = appDeploying.getAppBuilding().getPackagePath();
         this.deployBy = appDeploying.getOpsBy() != null ? appDeploying.getOpsBy() : NotAvailable.na.getDesc();
         this.deployTime = appDeploying.getDeployTime().equals(LocalDate.EPOCH.atStartOfDay()) ? NotAvailable.na.getDesc() : DateTimeConverter.format(appDeploying.getDeployTime());
-        this.deployResult = appDeploying.getDeployResult();
+        this.deployResult = new BuildResult(BuildStatus.valueOf(appDeploying.getDeployStatus()));
+        this.steps = appDeploying.getSteps();
     }
 }

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/vo/AppRunning.java → mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/AppRunning.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.mgr.ops.app.model.vo;
+package cn.reghao.devops.mgr.ops.builder.model.vo;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;

+ 2 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/vo/AppRunningNode.java → mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/AppRunningNode.java

@@ -1,6 +1,6 @@
-package cn.reghao.devops.mgr.ops.app.model.vo;
+package cn.reghao.devops.mgr.ops.builder.model.vo;
 
-import cn.reghao.devops.mgr.ops.app.model.constant.RunStatus;
+import cn.reghao.devops.mgr.ops.builder.model.constant.RunStatus;
 import cn.reghao.devops.mgr.ops.app.model.po.AppConfig;
 import cn.reghao.devops.mgr.ops.builder.model.po.BuildLog;
 import cn.reghao.devops.mgr.ops.machine.model.po.MachineInfo;

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/vo/BuildConfigSnapshot.java → mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/BuildConfigSnapshot.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.mgr.ops.app.model.vo;
+package cn.reghao.devops.mgr.ops.builder.model.vo;
 
 import cn.reghao.devops.mgr.ops.app.model.po.AppConfig;
 import lombok.AllArgsConstructor;

+ 4 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/vo/BuildLogVO.java → mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/BuildLogVO.java

@@ -1,5 +1,6 @@
-package cn.reghao.devops.mgr.ops.app.model.vo;
+package cn.reghao.devops.mgr.ops.builder.model.vo;
 
+import cn.reghao.devops.mgr.ops.builder.model.constant.BuildStatus;
 import cn.reghao.devops.mgr.ops.builder.model.po.BuildLog;
 import cn.reghao.jutil.jdk.converter.DateTimeConverter;
 import lombok.Data;
@@ -19,6 +20,7 @@ public class BuildLogVO {
     private String buildTime;
     private String packagePath;
     private String buildBy;
+    private BuildResult buildResult;
 
     public BuildLogVO(BuildLog buildLog) {
         this.buildLogId = buildLog.getBuildLogId();
@@ -30,5 +32,6 @@ public class BuildLogVO {
         this.buildTime = DateTimeConverter.format(buildLog.getStartTime());
         this.packagePath = buildLog.getPackagePath();
         this.buildBy = buildLog.getOpsBy();
+        this.buildResult = new BuildResult(BuildStatus.valueOf(buildLog.getStatus()));
     }
 }

+ 2 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/vo/BuildResult.java → mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/BuildResult.java

@@ -1,6 +1,6 @@
-package cn.reghao.devops.mgr.ops.app.model.vo;
+package cn.reghao.devops.mgr.ops.builder.model.vo;
 
-import cn.reghao.devops.mgr.ops.app.model.constant.BuildStatus;
+import cn.reghao.devops.mgr.ops.builder.model.constant.BuildStatus;
 import lombok.Getter;
 
 /**

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/vo/BuildTask.java → mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/BuildTask.java

@@ -1,4 +1,4 @@
-package cn.reghao.devops.mgr.ops.app.model.vo;
+package cn.reghao.devops.mgr.ops.builder.model.vo;
 
 import cn.reghao.devops.mgr.ops.builder.model.dto.AppDto;
 import lombok.Getter;

+ 15 - 0
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/KeyValue.java

@@ -0,0 +1,15 @@
+package cn.reghao.devops.mgr.ops.builder.model.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author reghao
+ * @date 2026-03-19 10:46:15
+ */
+@AllArgsConstructor
+@Getter
+public class KeyValue {
+    private String key;
+    private String value;
+}

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/BuildApp.java

@@ -1,6 +1,6 @@
 package cn.reghao.devops.mgr.ops.builder.service;
 
-import cn.reghao.devops.mgr.ops.app.model.vo.BuildTask;
+import cn.reghao.devops.mgr.ops.builder.model.vo.BuildTask;
 import cn.reghao.jutil.jdk.web.result.Result;
 
 import java.util.List;

+ 9 - 13
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/BuildLogService.java

@@ -1,12 +1,11 @@
 package cn.reghao.devops.mgr.ops.builder.service;
 
-import cn.reghao.devops.mgr.ops.app.model.constant.BuildStatus;
-import cn.reghao.devops.mgr.ops.app.model.constant.DeployStatus;
+import cn.reghao.devops.mgr.ops.builder.model.constant.BuildStatus;
 import cn.reghao.devops.mgr.ops.builder.db.query.BuildRepository;
 import cn.reghao.devops.mgr.ops.builder.model.po.AppBuilding;
 import cn.reghao.devops.mgr.ops.app.model.po.AppConfig;
 import cn.reghao.devops.common.msg.constant.StepStatus;
-import cn.reghao.devops.mgr.ops.app.model.vo.BuildConfigSnapshot;
+import cn.reghao.devops.mgr.ops.builder.model.vo.BuildConfigSnapshot;
 import cn.reghao.devops.mgr.ops.builder.model.po.AppDeploying;
 import cn.reghao.devops.mgr.ops.builder.model.po.BuildLog;
 import cn.reghao.devops.mgr.ops.builder.tool.repo.CommitInfo;
@@ -34,10 +33,7 @@ public class BuildLogService {
     public String initAppBuilding(AppConfig appConfig) {
         String buildId = UUID.randomUUID().toString().replace("-", "");
         AppBuilding appBuilding = buildRepository.getAppBuilding(appConfig.getAppId());
-        appBuilding.updateBeforeBuild(buildId);
-        // 定义流水线环节:检出 -> 编译 -> 打包 -> (部署)
-        //List<String> stepNames = Arrays.stream(BuildStepName.values()).map(Enum::name).collect(Collectors.toList());
-        //appBuilding.initSteps(stepNames, buildId);
+        appBuilding.updateBeforeBuild();
         buildRepository.saveAppBuilding(appBuilding);
         return buildId;
     }
@@ -54,11 +50,11 @@ public class BuildLogService {
         BuildLog buildLog = getBuildLog(appBuilding, ctx, status);
         appBuilding.updateAfterBuild(buildLog);
 
-        if (appBuilding.getBuildStatus() == BuildStatus.buildSuccess.getCode()) {
+        if (appBuilding.getBuildStatus().equals(BuildStatus.OpsSuccess.name())) {
             List<AppDeploying> appDeployingList = buildRepository.getAppDeployingList(appId);
             appDeployingList.forEach(appDeploying -> {
                 appDeploying.setAppBuilding(appBuilding);
-                appDeploying.setDeployResult(DeployStatus.neverDeploy.getDesc());
+                appDeploying.setDeployStatus(BuildStatus.OpsPending.name());
             });
             buildRepository.save(appBuilding, buildLog, appDeployingList);
         } else {
@@ -91,13 +87,13 @@ public class BuildLogService {
         buildLog.setEndTime(endTime);
         buildLog.setDuration(seconds);
 
-        buildLog.setStatus(status);
         // 如果失败,存入最后几行日志作为摘要,方便在列表页直接查看原因
-        String errorMsg = StepStatus.SUCCESS.name();
         if (!StepStatus.SUCCESS.name().equals(status)) {
-            errorMsg = ctx.getLogSummary();
+            buildLog.setStatus(BuildStatus.OpsFail.name());
+            buildLog.setErrorMsg(ctx.getLogSummary());
+        } else {
+            buildLog.setStatus(BuildStatus.OpsSuccess.name());
         }
-        buildLog.setErrorMsg(errorMsg);
         buildLog.setLogPath(ctx.getLogFile().getAbsolutePath());
 
         String stepsJson = JsonConverter.objectToJson(appBuilding.getSteps());

+ 27 - 20
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/BuildService.java

@@ -1,21 +1,19 @@
 package cn.reghao.devops.mgr.ops.builder.service;
 
-import cn.reghao.devops.mgr.admin.service.UserContext;
 import cn.reghao.devops.mgr.ops.app.db.repository.AppConfigRepository;
 import cn.reghao.devops.mgr.ops.app.model.po.AppConfig;
-import cn.reghao.devops.mgr.ops.app.model.constant.BuildStepName;
+import cn.reghao.devops.mgr.ops.build.model.constant.CompileType;
+import cn.reghao.devops.mgr.ops.builder.model.constant.BuildStepName;
 import cn.reghao.devops.common.msg.constant.StepStatus;
-import cn.reghao.devops.mgr.ops.builder.model.constant.CompileType;
 import cn.reghao.devops.mgr.ops.builder.tool.ToolProvider;
 import cn.reghao.devops.mgr.ops.builder.tool.compiler.CodeCompiler;
 import cn.reghao.devops.mgr.ops.builder.tool.packer.CodePacker;
 import cn.reghao.devops.mgr.ops.builder.tool.repo.CodeUpdater;
 import cn.reghao.devops.mgr.ops.builder.tool.repo.CommitInfo;
+import cn.reghao.jutil.jdk.exception.ExceptionUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.Objects;
-
 /**
  * @author reghao
  * @date 2026-02-26 13:20:54
@@ -63,44 +61,53 @@ public class BuildService {
                         ctx.setCommitInfo(commitInfo);
                     });
 
-                    runStep(ctx, "SCAN", () -> {
-                        ctx.log(">>> [Step 1-1] 正在扫描代码...");
+                    runStep(ctx, BuildStepName.SCAN.name(), () -> {
+                        ctx.log(">>> [Step 2] 正在扫描代码...");
                     });
 
                     // --- 阶段 2: 编译 ---
                     runStep(ctx, BuildStepName.COMPILE.name(), () -> {
-                        ctx.log(">>> [Step 2] 正在执行编译: " + appId);
+                        ctx.log(">>> [Step 3] 正在执行编译: " + appId);
                         CodeCompiler compiler = provider.getCompiler(appConfig.getCompilerConfig().getType());
                         compiler.compile(ctx, appConfig.getCompilerConfig());
                     });
 
                     // --- 阶段 3: 打包 (含 Dockerfile 落地) ---
                     runStep(ctx, BuildStepName.PACK.name(), () -> {
-                        ctx.log(">>> [Step 3] 正在打包产物...");
+                        ctx.log(">>> [Step 4] 正在打包产物...");
+                        String compileType = appConfig.getCompilerConfig().getType();
+                        if (compileType.equals(CompileType.dockerBuild.getName())) {
+                            ctx.log(">>> 采用 Docker 镜像编译的项目会自动打包产物...");
+                        } else {
+                            CodePacker codePacker = provider.getPacker(appConfig.getPackerConfig().getType());
+                            codePacker.pack(ctx, appConfig.getPackerConfig());
+                        }
+                    });
+
+                    runStep(ctx, BuildStepName.PUSH.name(), () -> {
+                        ctx.log(">>> [Step 5] 正在推送镜像...");
                         String compileType = appConfig.getCompilerConfig().getType();
                         /*if (compileType.equals(CompileType.docker.getName())) {
                             ctx.log(">>> 采用 Docker 镜像编译的项目会自动打包产物...");
                         } else */{
                             CodePacker codePacker = provider.getPacker(appConfig.getPackerConfig().getType());
-                            codePacker.pack(ctx, appConfig.getPackerConfig());
+                            codePacker.push(ctx, appConfig.getPackerConfig());
                         }
                     });
 
+                    buildLogService.updateMainStatus(ctx, StepStatus.SUCCESS.name());
+                    ctx.log(">>> [Pipeline] 构建流水线执行成功。");
+
                     // --- 阶段 4: 部署 ---
                     if (deploy) {
-                        runStep(ctx, BuildStepName.DEPLOY.name(), () -> {
-                            ctx.log(">>> [Step 4] 检测到部署指令,开始发布...");
-                            deployApp.deploy(buildId);
-                            ctx.log(">>> [Step 4] 部署任务完成。");
-                        });
-                    } else {
-                        ctx.log(">>> [Step 4] 跳过部署阶段(参数 deploy=false)。");
+                        deployApp.deploy(buildId);
+                        ctx.log(">>> [Step 6] 部署请求已提交。");
                     }
-                    ctx.log(">>> [Pipeline] 恭喜!流水线执行成功。");
-                    buildLogService.updateMainStatus(ctx, StepStatus.SUCCESS.name());
                 } catch (Exception e) {
                     // 核心设计:一旦任何一步抛出异常,立即进入这里
-                    ctx.log("!!! [Pipeline] 任务失败,原因: " + e.getMessage());
+                    String errorMsg = ExceptionUtil.errorMsg(e);
+                    String stackTrace = ExceptionUtil.stackTrace(e);
+                    ctx.log("!!! [Pipeline] 任务失败,原因: " + errorMsg + System.lineSeparator() + stackTrace);
                     // 这里更新数据库状态为 FAILURE
                     buildLogService.updateMainStatus(ctx, StepStatus.FAILURE.name());
                 }

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/impl/BuildAppImpl.java

@@ -1,6 +1,6 @@
 package cn.reghao.devops.mgr.ops.builder.service.impl;
 
-import cn.reghao.devops.mgr.ops.app.model.vo.BuildTask;
+import cn.reghao.devops.mgr.ops.builder.model.vo.BuildTask;
 import cn.reghao.devops.mgr.ops.builder.service.BuildApp;
 import cn.reghao.jutil.jdk.web.result.Result;
 import lombok.extern.slf4j.Slf4j;

+ 121 - 17
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/DockerBuild.java

@@ -2,14 +2,18 @@ package cn.reghao.devops.mgr.ops.builder.tool;
 
 import cn.reghao.devops.common.docker.DockerManager;
 import cn.reghao.devops.mgr.ops.build.model.po.CompilerBind;
+import cn.reghao.devops.mgr.ops.builder.model.vo.KeyValue;
 import cn.reghao.devops.mgr.ops.builder.service.PipelineContext;
 import com.github.dockerjava.api.DockerClient;
 import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.api.command.BuildImageCmd;
 import com.github.dockerjava.api.command.CreateContainerResponse;
 import com.github.dockerjava.api.command.WaitContainerResultCallback;
 import com.github.dockerjava.api.model.*;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -27,8 +31,81 @@ public class DockerBuild {
         this.dockerClient = DockerManager.getDocker().getDockerClient();
     }
 
+    public void build(PipelineContext ctx, String repoTag, String sourceCodeDir, List<String> buildArgs) {
+        // 使用一个原子布尔值或自定义标记来记录回调中的失败
+        AtomicBoolean isFailed = new AtomicBoolean(false);
+        StringBuilder errorMsg = new StringBuilder();
+
+        // 使用自定义的 Callback 来处理 Docker 的流式返回
+        ResultCallback.Adapter<BuildResponseItem> callback = new ResultCallback.Adapter<>() {
+            @Override
+            public void onNext(BuildResponseItem item) {
+                if (item.isErrorIndicated()) {
+                    isFailed.set(true);
+                    errorMsg.append(item.getErrorDetail().getMessage());
+                    ctx.log("[Docker-Error] " + item.getErrorDetail().getMessage());
+                } else if (item.getStream() != null) {
+                    ctx.log("[Docker-Build] " + item.getStream().trim());
+                }
+                super.onNext(item);
+            }
+
+            @Override
+            public void onError(Throwable throwable) {
+                isFailed.set(true);
+                ctx.log("[Docker-Critical] 连接异常: " + throwable.getMessage());
+                super.onError(throwable);
+            }
+        };
+
+        List<KeyValue> keyValueList = buildArgs.stream()
+                .map(arg -> {
+                    String[] kv = arg.split("=");
+                    return new KeyValue(kv[0], kv[1]);
+                })
+                .toList();
+
+        try {
+            BuildImageCmd buildImageCmd = dockerClient.buildImageCmd()
+                    .withCpushares("512")
+                    .withMemory(1024 * 1024 * 1024L)
+                    .withBaseDirectory(new File(sourceCodeDir)) // 上下文路径
+                    .withDockerfile(new File(sourceCodeDir, "Dockerfile"))
+                    .withPull(true)
+                    .withTags(Collections.singleton(repoTag));
+
+            for (KeyValue keyValue : keyValueList) {
+                buildImageCmd.withBuildArg(keyValue.getKey(), keyValue.getValue());
+            }
+
+            buildImageCmd.exec(callback).awaitCompletion();
+            /*dockerClient.buildImageCmd()
+                    .withCpushares("512")
+                    .withMemory(1024 * 1024 * 1024L)
+                    .withBaseDirectory(new File(sourceCodeDir)) // 上下文路径
+                    .withDockerfile(new File(sourceCodeDir, "Dockerfile"))
+                    .withBuildArg("APP_ENV", env)
+                    .withPull(true)
+                    .withTags(Collections.singleton(repoTag))
+                    .exec(callback)
+                    .awaitCompletion();*/
+
+            // 2. 检查回调中是否标记了业务逻辑失败
+            if (isFailed.get()) {
+                String errMsg = "[Docker] 构建终止:检测到内部错误。";
+                ctx.log(">>> " +  errMsg);
+                errorMsg.append(errMsg);
+                throw new RuntimeException(errorMsg.toString());
+            }
+        } catch (Exception e) {
+            ctx.log(">>> [Docker] 构建由于异常中断: " + e.getMessage());
+            throw new RuntimeException(e);
+        }
+    }
+
     public void build(PipelineContext ctx, String repoTag, String sourceCodeDir,
                       String image, String compileCmd, List<CompilerBind> compilerBinds, List<String> envs) {
+        // 这里的 workDir 会在 docker build 使用的 Dockerfile 中被引用
         String workDir = "/app";
         List<Bind> bindList = new ArrayList<>();
         bindList.add(new Bind(sourceCodeDir, new Volume(workDir)));
@@ -36,12 +113,15 @@ public class DockerBuild {
             bindList.add(new Bind(compilerBind.getHostPath(), new Volume(compilerBind.getContainerPath())));
         });
 
+        String user = getCurrentUserMapping();
         CreateContainerResponse container = dockerClient.createContainerCmd(image)
+                .withUser(user)
                 .withEnv(envs.toArray(new String[0]))
                 .withHostConfig(HostConfig.newHostConfig()
                         .withCpuQuota(100000L)
                         .withCpuPeriod(100000L)
                         .withMemory(2 * 1024 * 1024 * 1024L)
+                        .withAutoRemove(true) // --rm (容器停止后自动删除)
                         .withBinds(bindList)) // 关键:缓存挂载
                 .withWorkingDir(workDir)
                 .withEntrypoint("") // 确保覆盖默认入口
@@ -71,20 +151,16 @@ public class DockerBuild {
         WaitContainerResultCallback waitCallback = new WaitContainerResultCallback();
         dockerClient.waitContainerCmd(container.getId()).exec(waitCallback);
         Integer exitCode = waitCallback.awaitStatusCode();
-        ctx.log("编译结束,退出码: " + exitCode);
-
-        // 6. 删除构建产生的一次性容器
-        dockerClient.removeContainerCmd(container.getId())
-                .withForce(true)
-                .withRemoveVolumes(true) // 同时清理关联的匿名卷
-                .exec();
+        if (exitCode != 0) {
+            String errorMsg = "source code compile failed...";
+            throw new RuntimeException(errorMsg);
+        }
     }
 
     public void pack(PipelineContext ctx, String sourceCodeDir, String repoTag) {
         // 使用一个原子布尔值或自定义标记来记录回调中的失败
         AtomicBoolean isFailed = new AtomicBoolean(false);
         StringBuilder errorMsg = new StringBuilder();
-
         // 使用自定义的 Callback 来处理 Docker 的流式返回
         ResultCallback.Adapter<BuildResponseItem> callback = new ResultCallback.Adapter<>() {
             @Override
@@ -109,6 +185,8 @@ public class DockerBuild {
 
         try {
             dockerClient.buildImageCmd()
+                    .withCpushares("512")
+                    .withMemory(1024 * 1024 * 1024L)
                     .withBaseDirectory(new File(sourceCodeDir)) // 上下文路径
                     .withDockerfile(new File(sourceCodeDir, "Dockerfile"))
                     .withTags(Collections.singleton(repoTag))
@@ -117,19 +195,24 @@ public class DockerBuild {
 
             // 2. 检查回调中是否标记了业务逻辑失败
             if (isFailed.get()) {
-                ctx.log(">>> [Docker] 构建终止:检测到内部错误。");
-                //return false;
+                String errMsg = "[Docker] 构建终止:检测到内部错误。";
+                ctx.log(">>> " +  errMsg);
+                errorMsg.append(errMsg);
+                throw new RuntimeException(errorMsg.toString());
             }
         } catch (Exception e) {
             ctx.log(">>> [Docker] 构建由于异常中断: " + e.getMessage());
-            //return false;
+            throw new RuntimeException(e);
         }
 
         // 2. 执行推送并捕获日志
-        push(ctx, repoTag);
+        //push(ctx, repoTag);
     }
 
-    private void push(PipelineContext ctx, String repoTag) {
+    public void push(PipelineContext ctx, String repoTag) {
+        // 使用一个原子布尔值或自定义标记来记录回调中的失败
+        AtomicBoolean isFailed = new AtomicBoolean(false);
+        StringBuilder errorMsg = new StringBuilder();
         // 2. 执行推送并捕获日志
         // 使用推荐的 ResultCallback.Adapter
         ResultCallback.Adapter<PushResponseItem> pushCallback = new ResultCallback.Adapter<>() {
@@ -145,6 +228,7 @@ public class DockerBuild {
 
             @Override
             public void onError(Throwable throwable) {
+                isFailed.set(true);
                 ctx.log("[Docker-Push-Error] 推送过程中发生异常: " + throwable.getMessage());
                 super.onError(throwable);
             }
@@ -162,11 +246,30 @@ public class DockerBuild {
                     //.withAuthConfig(authConfig)
                     .exec(pushCallback)
                     .awaitCompletion();// 阻塞直至 Adapter 收到 onComplete 或 onError
-            ctx.log(">>> [Docker] 镜像推送成功!");
-            //return true;
+
+            if (isFailed.get()) {
+                String errMsg = "[Docker] 推送终止:检测到内部错误。";
+                ctx.log(">>> " +  errMsg);
+                errorMsg.append(errMsg);
+                throw new RuntimeException(errorMsg.toString());
+            }
+            ctx.log(">>> [Docker] 推送成功!");
         } catch (Exception e) {
             ctx.log(">>> [Docker] 推送最终失败: " + e.getMessage());
-            //return false;
+            throw new RuntimeException(e);
+        }
+    }
+
+    public String getCurrentUserMapping() {
+        try {
+            // 使用 sh -c 可以确保在一行内获取
+            Process process = new ProcessBuilder("sh", "-c", "echo $(id -u):$(id -g)").start();
+            try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
+                return reader.readLine().trim();
+            }
+        } catch (Exception e) {
+            // 备选方案:如果执行失败,返回 root (不推荐,但可作为保底)
+            return "0:0";
         }
     }
 
@@ -301,7 +404,8 @@ public class DockerBuild {
     public static void main(String[] args) {
         DockerBuild dockerBuild = new DockerBuild();
         //dockerBuild.executeDockerBuildFlow("");
-        dockerBuild.build1();
+        //dockerBuild.build1();
         //dockerBuild.build2();
+        System.out.println();
     }
 }

+ 61 - 0
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/DockerBuildCompiler.java

@@ -0,0 +1,61 @@
+package cn.reghao.devops.mgr.ops.builder.tool.compiler;
+
+import cn.reghao.devops.mgr.ops.build.model.constant.CompileType;
+import cn.reghao.devops.mgr.ops.build.model.po.CompilerBind;
+import cn.reghao.devops.mgr.ops.build.model.po.CompilerConfig;
+import cn.reghao.devops.mgr.ops.build.model.po.CompilerEnv;
+import cn.reghao.devops.mgr.ops.builder.service.PipelineContext;
+import cn.reghao.devops.mgr.ops.builder.tool.DockerBuild;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2026-03-18 18:19:20
+ */
+@Component
+public class DockerBuildCompiler implements CodeCompiler {
+    private final DockerBuild dockerBuild;
+
+    public DockerBuildCompiler() {
+        this.dockerBuild = new DockerBuild();
+    }
+
+    @Override
+    public void compile(PipelineContext ctx, CompilerConfig compilerConfig) throws Exception {
+        String registryUrl = ctx.getDockerRegistry().getRegistryUrl();
+        String repoTag = String.format("%s/%s:%s", registryUrl, ctx.getAppId(), ctx.getCommitInfo().getCommitId());
+        String sourceCodeDir = ctx.getCompileDir();
+
+        String dockerfileContent = ctx.getDockerfile();
+        if (StringUtils.isBlank(dockerfileContent)) {
+            throw new Exception("未在配置中找到 Dockerfile 内容");
+        }
+
+        // 1. 将数据库中的内容写入到编译目录下的临时文件
+        File dockerFile = new File(sourceCodeDir, "Dockerfile");
+        try (FileWriter writer = new FileWriter(dockerFile)) {
+            writer.write(dockerfileContent);
+        }
+
+        String image = compilerConfig.getCompilerImage();
+        String compileCmd = compilerConfig.getCompileCmd();
+        List<CompilerBind> compilerBinds = compilerConfig.getCompilerBinds();
+        List<String> buildArgs = compilerConfig.getCompilerEnvs().stream()
+                .map(CompilerEnv::getEnv)
+                .collect(Collectors.toList());
+
+        dockerBuild.build(ctx, repoTag, sourceCodeDir, buildArgs);
+        ctx.setBuildTargetPath(repoTag);
+    }
+
+    @Override
+    public String supportType() {
+        return CompileType.dockerBuild.getName();
+    }
+}

+ 5 - 4
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/DockerCompiler.java → mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/DockerRunCompiler.java

@@ -5,7 +5,7 @@ import cn.reghao.devops.mgr.ops.build.model.po.CompilerConfig;
 import cn.reghao.devops.mgr.ops.build.model.po.CompilerEnv;
 import cn.reghao.devops.mgr.ops.builder.tool.DockerBuild;
 import cn.reghao.devops.mgr.ops.builder.service.PipelineContext;
-import cn.reghao.devops.mgr.ops.builder.model.constant.CompileType;
+import cn.reghao.devops.mgr.ops.build.model.constant.CompileType;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
@@ -19,10 +19,10 @@ import java.util.stream.Collectors;
  * @date 2024-08-09 09:49:11
  */
 @Component
-public class DockerCompiler implements CodeCompiler {
+public class DockerRunCompiler implements CodeCompiler {
     private final DockerBuild dockerBuild;
 
-    public DockerCompiler() {
+    public DockerRunCompiler() {
         this.dockerBuild = new DockerBuild();
     }
 
@@ -49,12 +49,13 @@ public class DockerCompiler implements CodeCompiler {
         List<String> envs = compilerConfig.getCompilerEnvs().stream()
                 .map(CompilerEnv::getEnv)
                 .collect(Collectors.toList());
+
         dockerBuild.build(ctx, repoTag, sourceCodeDir, image, compileCmd, compilerBinds, envs);
         ctx.setBuildTargetPath(repoTag);
     }
 
     @Override
     public String supportType() {
-        return CompileType.docker.getName();
+        return CompileType.dockerRun.getName();
     }
 }

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/EmptyCompiler.java

@@ -2,7 +2,7 @@ package cn.reghao.devops.mgr.ops.builder.tool.compiler;
 
 import cn.reghao.devops.mgr.ops.build.model.po.CompilerConfig;
 import cn.reghao.devops.mgr.ops.builder.service.PipelineContext;
-import cn.reghao.devops.mgr.ops.builder.model.constant.CompileType;
+import cn.reghao.devops.mgr.ops.build.model.constant.CompileType;
 import org.springframework.stereotype.Component;
 
 /**

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/MavenCompiler.java

@@ -2,7 +2,7 @@ package cn.reghao.devops.mgr.ops.builder.tool.compiler;
 
 import cn.reghao.devops.mgr.ops.build.model.po.CompilerConfig;
 import cn.reghao.devops.mgr.ops.builder.service.PipelineContext;
-import cn.reghao.devops.mgr.ops.builder.model.constant.CompileType;
+import cn.reghao.devops.mgr.ops.build.model.constant.CompileType;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/ShellCompiler.java

@@ -2,7 +2,7 @@ package cn.reghao.devops.mgr.ops.builder.tool.compiler;
 
 import cn.reghao.devops.mgr.ops.build.model.po.CompilerConfig;
 import cn.reghao.devops.mgr.ops.builder.service.PipelineContext;
-import cn.reghao.devops.mgr.ops.builder.model.constant.CompileType;
+import cn.reghao.devops.mgr.ops.build.model.constant.CompileType;
 import cn.reghao.jutil.jdk.shell.ShellExecutor;
 import cn.reghao.jutil.jdk.shell.ShellResult;
 import org.springframework.stereotype.Component;

+ 1 - 0
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/packer/CodePacker.java

@@ -11,5 +11,6 @@ import cn.reghao.devops.mgr.ops.builder.service.PipelineContext;
  */
 public interface CodePacker {
     void pack(PipelineContext ctx, PackerConfig packerConfig);
+    default void push(PipelineContext ctx, PackerConfig packerConfig) {}
     String supportType();
 }

+ 9 - 0
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/packer/DockerPack.java

@@ -30,6 +30,15 @@ public class DockerPack implements CodePacker {
 
             String sourceCodeDir = ctx.getCompileDir();
             dockerBuild.pack(ctx, sourceCodeDir, repoTag);
+            ctx.setBuildTargetPath(repoTag);
+        }
+    }
+
+    public void push(PipelineContext ctx, PackerConfig packerConfig) {
+        if (packerConfig.getType().equals(PackType.docker.getName())) {
+            String registryUrl = ctx.getDockerRegistry().getRegistryUrl();
+            String repoTag = String.format("%s/%s:%s", registryUrl, ctx.getAppId(), ctx.getCommitInfo().getCommitId());
+            dockerBuild.push(ctx, repoTag);
         }
     }
 

+ 2 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/repo/GitImpl.java

@@ -2,8 +2,8 @@ package cn.reghao.devops.mgr.ops.builder.tool.repo;
 
 import cn.reghao.devops.mgr.ops.build.model.po.RepoAuthConfig;
 import cn.reghao.devops.mgr.ops.builder.service.PipelineContext;
-import cn.reghao.devops.mgr.ops.builder.model.constant.RepoAuthType;
-import cn.reghao.devops.mgr.ops.builder.model.constant.RepoType;
+import cn.reghao.devops.mgr.ops.build.model.constant.RepoAuthType;
+import cn.reghao.devops.mgr.ops.build.model.constant.RepoType;
 import cn.reghao.devops.mgr.ops.builder.tool.BuilderUtil;
 import org.eclipse.jgit.api.*;
 import org.eclipse.jgit.diff.DiffEntry;

+ 2 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/docker/service/DockerImageService.java

@@ -3,7 +3,7 @@ package cn.reghao.devops.mgr.ops.docker.service;
 import cn.reghao.devops.common.msg.constant.PackType;
 import cn.reghao.devops.mgr.ops.app.db.repository.AppConfigRepository;
 import cn.reghao.devops.mgr.ops.build.db.repository.CompilerConfigRepository;
-import cn.reghao.devops.mgr.ops.builder.model.constant.CompileType;
+import cn.reghao.devops.mgr.ops.build.model.constant.CompileType;
 import cn.reghao.devops.mgr.ops.docker.model.vo.DockerImage;
 import org.springframework.stereotype.Service;
 
@@ -28,7 +28,7 @@ public class DockerImageService {
         List<DockerImage> list = new ArrayList<>();
 
         compilerConfigRepository.findAll().stream()
-                .filter(compilerConfig -> compilerConfig.getType().equals(CompileType.docker.name()))
+                .filter(compilerConfig -> compilerConfig.getType().equals(CompileType.dockerRun.name()))
                 .forEach(compilerConfig -> {
                     String compileName = compilerConfig.getName();
                     String compilerImage = compilerConfig.getCompilerImage();

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/machine/service/impl/MachineServiceImpl.java

@@ -3,7 +3,7 @@ package cn.reghao.devops.mgr.ops.machine.service.impl;
 import cn.reghao.devops.common.util.Machine;
 import cn.reghao.devops.common.msg.constant.NodeStatus;
 import cn.reghao.devops.common.msg.event.EvtAgentStart;
-import cn.reghao.devops.mgr.ops.builder.model.constant.EnvType;
+import cn.reghao.devops.mgr.ops.build.model.constant.EnvType;
 import cn.reghao.devops.mgr.ops.util.DefaultSetting;
 import cn.reghao.devops.mgr.ops.machine.db.repository.MachineInfoRepository;
 import cn.reghao.devops.mgr.ops.machine.model.po.MachineInfo;

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/util/BuilderInit.java

@@ -5,7 +5,7 @@ import cn.reghao.devops.mgr.config.AppProperties;
 import cn.reghao.devops.mgr.ops.build.db.repository.CompilerConfigRepository;
 import cn.reghao.devops.mgr.ops.build.model.po.CompilerConfig;
 import cn.reghao.devops.mgr.ops.build.service.BuildDirService;
-import cn.reghao.devops.mgr.ops.builder.model.constant.CompileType;
+import cn.reghao.devops.mgr.ops.build.model.constant.CompileType;
 import cn.reghao.jutil.jdk.shell.ShellExecutor;
 import cn.reghao.jutil.jdk.shell.ShellResult;
 import lombok.extern.slf4j.Slf4j;

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/util/DefaultSetting.java

@@ -4,7 +4,7 @@ import cn.reghao.devops.mgr.admin.db.repository.SiteOptionRepository;
 import cn.reghao.devops.mgr.admin.model.po.SiteOption;
 import cn.reghao.devops.mgr.admin.service.UserContext;
 import cn.reghao.devops.mgr.ops.app.model.constant.AppType;
-import cn.reghao.devops.mgr.ops.builder.model.constant.EnvType;
+import cn.reghao.devops.mgr.ops.build.model.constant.EnvType;
 import org.springframework.stereotype.Service;
 
 import java.util.Arrays;

+ 0 - 11
mgr/src/test/java/devops/AppConfigTest.java

@@ -34,11 +34,6 @@ public class AppConfigTest {
         List<AppDeploying> list = deployConfigRepository.findAll().stream()
                 .map(appDeployConfig -> {
                     AppDeploying appDeploying = new AppDeploying(appDeployConfig);
-                    // 定义流水线环节:检出 -> 编译 -> 打包 -> (部署)
-                    List<String> stepNames = Arrays.stream(DeployStepName.values())
-                            .map(Enum::name)
-                            .collect(Collectors.toList());
-                    appDeploying.initSteps(stepNames, "");
                     return appDeploying;
                 })
                 .collect(Collectors.toList());
@@ -56,17 +51,11 @@ public class AppConfigTest {
                     return new AppBuilding(appConfig);
                 })
                 .collect(Collectors.toList());
-
         buildingRepository.saveAll(appBuildingList);
 
         List<AppDeploying> list = deployConfigRepository.findAll().stream()
                 .map(appDeployConfig -> {
                     AppDeploying appDeploying = new AppDeploying(appDeployConfig);
-                    // 定义流水线环节:检出 -> 编译 -> 打包 -> (部署)
-                    List<String> stepNames = Arrays.stream(DeployStepName.values())
-                            .map(Enum::name)
-                            .collect(Collectors.toList());
-                    appDeploying.initSteps(stepNames, "");
                     return appDeploying;
                 })
                 .collect(Collectors.toList());

+ 1 - 1
mgr/src/test/java/devops/GitTest.java

@@ -1,7 +1,7 @@
 package devops;
 
 import cn.reghao.devops.mgr.ops.build.model.po.RepoAuthConfig;
-import cn.reghao.devops.mgr.ops.builder.model.constant.RepoAuthType;
+import cn.reghao.devops.mgr.ops.build.model.constant.RepoAuthType;
 import cn.reghao.devops.mgr.ops.builder.tool.repo.GitImpl;
 import cn.reghao.devops.mgr.ops.deployer.model.constant.SshAuthType;
 import cn.reghao.devops.mgr.ops.deployer.model.po.RemoteHost;