فهرست منبع

调整构建部署流程中的相关实现

reghao 4 روز پیش
والد
کامیت
4235df2c54
23فایلهای تغییر یافته به همراه111 افزوده شده و 179 حذف شده
  1. 3 1
      common/src/main/java/cn/reghao/devops/common/docker/Docker.java
  2. 9 15
      common/src/main/java/cn/reghao/devops/common/docker/DockerImpl.java
  3. 6 16
      mgr/src/main/java/cn/reghao/devops/mgr/admin/service/UserContext.java
  4. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/db/query/impl/AppBuildQueryImpl.java
  5. 2 7
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/vo/msg/DeployNotifyMsg.java
  6. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/vo/msg/DingTestMsg.java
  7. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/service/AppDeployService.java
  8. 35 12
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/service/impl/AppDeployServiceImpl.java
  9. 3 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/po/AppBuilding.java
  10. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/po/BuildLog.java
  11. 6 7
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/po/DeployLog.java
  12. 6 7
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/BuildLogService.java
  13. 7 4
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/BuildService.java
  14. 1 3
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/impl/DeployAppImpl.java
  15. 10 22
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/DockerBuild.java
  16. 0 9
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/CodeCompiler.java
  17. 0 11
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/DockerCompiler.java
  18. 0 4
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/EmptyCompiler.java
  19. 0 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/MavenCompiler.java
  20. 0 13
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/ShellCompiler.java
  21. 3 37
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/packer/DockerPack.java
  22. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/docker/service/DockerRegistryService.java
  23. 13 0
      mgr/src/test/java/devops/AppConfigTest.java

+ 3 - 1
common/src/main/java/cn/reghao/devops/common/docker/Docker.java

@@ -2,6 +2,7 @@ package cn.reghao.devops.common.docker;
 
 import cn.reghao.devops.common.docker.model.DockerAuth;
 import cn.reghao.devops.common.docker.model.DockerContainerConfig;
+import com.github.dockerjava.api.DockerClient;
 import com.github.dockerjava.api.command.InspectContainerResponse;
 import com.github.dockerjava.api.model.Image;
 import com.github.dockerjava.api.model.Version;
@@ -16,7 +17,8 @@ import java.util.List;
  * @date 2021-10-27 04:17:38
  */
 public interface Docker {
-    void auth();
+    DockerClient getDockerClient();
+    void auth(DockerAuth dockerAuth);
     Version version();
     void ping();
     void build(String repoTag, String compileHome, String dockerfileContent) throws Exception;

+ 9 - 15
common/src/main/java/cn/reghao/devops/common/docker/DockerImpl.java

@@ -36,6 +36,7 @@ public class DockerImpl implements Docker {
     private final String unixSock = "/var/run/docker.sock";
 
     public DockerImpl() {
+        // 1. 配置:默认读取环境变量(如 DOCKER_HOST)
         DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
                 .withDockerHost("unix://" + unixSock)
                 .withDockerTlsVerify(false)
@@ -48,19 +49,6 @@ public class DockerImpl implements Docker {
         init(config);
     }
 
-    public DockerImpl(DockerAuth dockerAuth) {
-        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
-                .withDockerHost("unix://" + unixSock)
-                .withDockerTlsVerify(false)
-                //.withDockerCertPath(String.format("%s/.docker", System.getProperty("user.home")))
-                .withRegistryUrl(dockerAuth.getRegistryUrl())
-                .withRegistryUsername(dockerAuth.getUsername())
-                .withRegistryPassword(dockerAuth.getPassword())
-                //.withRegistryEmail(registryMail)
-                .build();
-        init(config);
-    }
-
     private void init(DockerClientConfig config) {
         DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
                 .dockerHost(config.getDockerHost())
@@ -73,8 +61,14 @@ public class DockerImpl implements Docker {
     }
 
     @Override
-    public void auth() {
-        dockerClient.authCmd().exec();
+    public DockerClient getDockerClient() {
+        return dockerClient;
+    }
+
+    @Override
+    public void auth(DockerAuth dockerAuth) {
+        AuthConfig authConfig = getAuthConfig(dockerAuth);
+        dockerClient.authCmd().withAuthConfig(authConfig).exec();
     }
 
     @Override

+ 6 - 16
mgr/src/main/java/cn/reghao/devops/mgr/admin/service/UserContext.java

@@ -3,6 +3,7 @@ package cn.reghao.devops.mgr.admin.service;
 import cn.reghao.devops.mgr.admin.model.constant.RoleType;
 import cn.reghao.devops.mgr.admin.security.form.AccountAuthToken;
 import cn.reghao.devops.mgr.admin.model.po.User;
+import cn.reghao.jutil.jdk.web.result.NotAvailable;
 import cn.reghao.jutil.web.ServletUtil;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContext;
@@ -36,24 +37,13 @@ public class UserContext {
         return user != null ? user.getId() : -1;
     }
 
-    public static String getUserRole() {
+    public static String getUsername() {
         User user = getUser();
-        return user != null ? user.getRole().iterator().next() : RoleType.ROLE_ANONYMOUS.name();
+        return user != null ? user.getUsername() : NotAvailable.na.getDesc();
     }
 
-    /**
-     * 设置通过 oss-sdk 登入的用户
-     *
-     * @param
-     * @return
-     * @date 2025-06-03 11:39:45
-     */
-    public static void setOssUser(User user) {
-        String sessionId = ServletUtil.getSessionId();
-        AccountAuthToken authToken = new AccountAuthToken(sessionId, false, user.getId(), "");
-        authToken.setAuthenticated(true);
-        Authentication auth = new AccountAuthToken(authToken, user);
-        SecurityContext securityContext = SecurityContextHolder.getContext();
-        securityContext.setAuthentication(auth);
+    public static String getUserRole() {
+        User user = getUser();
+        return user != null ? user.getRole().iterator().next() : RoleType.ROLE_ANONYMOUS.name();
     }
 }

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

@@ -41,7 +41,7 @@ public class AppBuildQueryImpl implements AppBuildQuery {
     private final BuildLogRepository buildLogRepository;
     private final AppDeployConfigRepository deployConfigRepository;
     private final AppDeployingRepository appDeployingRepository;
-    private TextFile textFile = new TextFile();
+    private final TextFile textFile = new TextFile();
 
     public AppBuildQueryImpl(AppConfigRepository appConfigRepository, AppBuildingRepository buildingRepository,
                              BuildLogRepository buildLogRepository, AppDeployConfigRepository deployConfigRepository,
@@ -188,7 +188,7 @@ public class AppBuildQueryImpl implements AppBuildQuery {
         String html = "";
         BuildLog buildLog = buildLogRepository.findByBuildLogId(buildLogId);
         if (buildLog != null) {
-            html = StringUtil.txtToHtml(buildLog.getLogSummary());
+            html = StringUtil.txtToHtml(buildLog.getErrorMsg());
         }
         return html;
     }

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

@@ -33,13 +33,8 @@ public class DeployNotifyMsg {
         this.commitId = buildLog.getCommitId();
         this.commitTime = DateTimeConverter.format(buildLog.getCommitTime());
         this.machineIpv4 = deployLog.getAppDeployConfig().getMachineInfo().getMachineIpv4();
-        /*int code = deployLog.getCode();
-        if (code == ResultStatus.SUCCESS.getCode()) {
-            this.deployResult = ResultStatus.SUCCESS.getMsg();
-        } else {
-            this.deployResult = deployLog.getMsg();
-        }*/
-        this.deployTime = DateTimeConverter.format(deployLog.getDeployTime());
+        this.deployResult = deployLog.getStatus();
+        this.deployTime = DateTimeConverter.format(deployLog.getEndTime());
         this.opsBy = deployLog.getOpsBy();
     }
 

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

@@ -16,7 +16,7 @@ public class DingTestMsg {
 
     public DingTestMsg() {
         this.sendTime = DateTimeConverter.format(System.currentTimeMillis());
-        this.sendBy = UserContext.getUser().getUsername();
+        this.sendBy = UserContext.getUsername();
     }
 
     public DingMsg dingMsg() {

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

@@ -20,6 +20,6 @@ public interface AppDeployService {
     void deleteAppDeploying(String appId, String machineId);
     void deleteDeployLog(String buildLogId);
 
-    void updateBeforeDeploy(AppBuilding appBuilding, String machineId, String opsBy);
+    void updateBeforeDeploy(AppBuilding appBuilding, String machineId);
     void updateAfterDeploy(EvtAppStatResult statResult);
 }

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

@@ -5,6 +5,7 @@ import cn.reghao.devops.common.docker.model.DockerContainerConfig;
 import cn.reghao.devops.common.msg.constant.PackType;
 import cn.reghao.devops.common.msg.constant.StepStatus;
 import cn.reghao.devops.common.msg.event.EvtAppStatResult;
+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;
@@ -211,18 +212,18 @@ public class AppDeployServiceImpl implements AppDeployService {
     }
 
     @Override
-    public void updateBeforeDeploy(AppBuilding appBuilding, String machineId, String opsBy) {
+    public void updateBeforeDeploy(AppBuilding appBuilding, String machineId) {
         String appId = appBuilding.getAppConfig().getAppId();
         AppDeploying appDeploying = appDeployingRepository.findByAppDeployConfig_AppConfig_AppIdAndAppDeployConfig_MachineInfo_MachineId(appId, machineId);
-        String machineId1 = appDeploying.getAppDeployConfig().getMachineInfo().getMachineId();
-        if (machineId1.equals(machineId)) {
+        if (appDeploying != null) {
+            String opsBy = UserContext.getUsername();
+            appDeploying.setDeployTime(LocalDateTime.now());
             appDeploying.setDeployResult(DeployStatus.onDeploying.getDesc());
             appDeploying.setOpsBy(opsBy);
+            appDeployingRepository.save(appDeploying);
+        } else {
+            log.error("AppDeploying with appId {} not exist", appId);
         }
-
-        BuildLog buildLog = appBuilding.getBuildLog();
-        //DeployLog deployLog = new DeployLog(buildLog);
-        appDeployingRepository.save(appDeploying);
     }
 
     @Override
@@ -235,11 +236,13 @@ public class AppDeployServiceImpl implements AppDeployService {
 
         AppDeployConfig deployConfig = deployConfigRepository.findByAppConfig_AppIdAndMachineInfo_MachineId(appId, machineId);
         if (deployConfig == null) {
+            log.error("AppDeployConfig with appId {} not exist", appId);
             return;
         }
 
         AppDeploying appDeploying = appDeployingRepository.findByAppDeployConfigId(deployConfig.getId());
         if (appDeploying == null) {
+            log.error("AppDeploying with appId {} not exist", appId);
             return;
         }
 
@@ -285,11 +288,9 @@ public class AppDeployServiceImpl implements AppDeployService {
                 AppDeployConfig appDeployConfig = appDeploying.getAppDeployConfig();
                 BuildLog buildLog = appBuildQuery.getAppBuilding(appId).getBuildLog();
 
-                String stepJson = JsonConverter.objectToJson(appDeploying.getSteps());
-                String configSnapshot = JsonConverter.objectToJson(appDeployConfig);
-                DeployLog deployLog = new DeployLog(buildLog, appDeployConfig);
-                //deployLogRepository.save(deployLog);
-                //buildDeployNotify.deployNotify(deployLog);
+                DeployLog deployLog = getDeployLog(appDeploying, appDeployConfig, deployResult, buildLog);
+                deployLogRepository.save(deployLog);
+                buildDeployNotify.deployNotify(deployLog);
 
                 log.info("{} 的通知已发送", deployResult.getAppId());
                 AppConfig appConfig = deployConfig.getAppConfig();
@@ -302,6 +303,28 @@ public class AppDeployServiceImpl implements AppDeployService {
         appDeployingRepository.save(appDeploying);
     }
 
+    private DeployLog getDeployLog(AppDeploying appDeploying, AppDeployConfig appDeployConfig,
+                                   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();
+        LocalDateTime endTime = LocalDateTime.now();
+        long seconds = Duration.between(startTime, endTime).getSeconds();
+
+        DeployLog deployLog = new DeployLog(buildLog, appDeployConfig, opsBy);
+        deployLog.setStartTime(startTime);
+        deployLog.setEndTime(endTime);
+        deployLog.setDuration(seconds);
+        deployLog.setStatus(stepStatus);
+        deployLog.setErrorMsg(deployResult.getErrorMsg());
+        deployLog.setStepJson(stepJson);
+        deployLog.setConfigSnapshot(configSnapshot);
+        return deployLog;
+    }
+
     private void refreshCdn(AppConfig appConfig, BuildLog buildLog) {
         String buildId = buildLog.getBuildLogId();
         String appId = appConfig.getAppId();

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

@@ -1,5 +1,6 @@
 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.app.model.po.AppConfig;
@@ -58,10 +59,10 @@ public class AppBuilding extends BaseEntity {
         this.opsBy = NotAvailable.na.getDesc();
     }
 
-    public void updateBeforeBuild(String opsBy, String buildId) {
+    public void updateBeforeBuild(String buildId) {
         this.buildTime = LocalDateTime.now();
         this.buildStatus = BuildStatus.onBuilding.getCode();
-        this.opsBy = opsBy;
+        this.opsBy = UserContext.getUsername();
 
         // 定义流水线环节:检出 -> 编译 -> 打包 -> (部署)
         List<String> stepNames = Arrays.stream(BuildStepName.values()).map(Enum::name).collect(Collectors.toList());

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

@@ -38,7 +38,7 @@ public class BuildLog extends BaseEntity {
     private Long duration;
     private String status;
     @Column(columnDefinition = "TEXT")
-    private String logSummary;   // 关键错误摘要
+    private String errorMsg;   // 关键错误摘要
     private String logPath;
     @Column(columnDefinition = "json")
     private String stepJson; // 存储历史步骤快照

+ 6 - 7
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/po/DeployLog.java

@@ -2,7 +2,6 @@ package cn.reghao.devops.mgr.ops.builder.model.po;
 
 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 lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
@@ -30,20 +29,20 @@ public class DeployLog extends BaseEntity {
     private AppDeployConfig appDeployConfig;
 
     private String opsBy;
-    private LocalDateTime deployTime;
+    private LocalDateTime startTime;
+    private LocalDateTime endTime;
     private Long duration;
     private String status;
     @Column(columnDefinition = "TEXT")
-    private String logSummary;   // 关键错误摘要
+    private String errorMsg;
     @Column(columnDefinition = "json")
-    private String stepJson; // 存储历史步骤快照
+    private String stepJson;
     @Column(columnDefinition = "json")
     private String configSnapshot;
 
-    public DeployLog(BuildLog buildLog, AppDeployConfig appDeployConfig) {
+    public DeployLog(BuildLog buildLog, AppDeployConfig appDeployConfig, String opsBy) {
         this.buildLog = buildLog;
         this.appDeployConfig = appDeployConfig;
-        this.opsBy = buildLog.getOpsBy();
-        this.deployTime = DateTimeConverter.localDateTime(System.currentTimeMillis());
+        this.opsBy = opsBy;
     }
 }

+ 6 - 7
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/BuildLogService.java

@@ -31,10 +31,10 @@ public class BuildLogService {
         this.buildRepository = buildRepository;
     }
 
-    public String initAppBuilding(AppConfig appConfig, String opsBy) {
+    public String initAppBuilding(AppConfig appConfig) {
         String buildId = UUID.randomUUID().toString().replace("-", "");
         AppBuilding appBuilding = buildRepository.getAppBuilding(appConfig.getAppId());
-        appBuilding.updateBeforeBuild(opsBy, buildId);
+        appBuilding.updateBeforeBuild(buildId);
         // 定义流水线环节:检出 -> 编译 -> 打包 -> (部署)
         //List<String> stepNames = Arrays.stream(BuildStepName.values()).map(Enum::name).collect(Collectors.toList());
         //appBuilding.initSteps(stepNames, buildId);
@@ -72,8 +72,7 @@ public class BuildLogService {
     private BuildLog getBuildLog(AppBuilding appBuilding, PipelineContext ctx, String status) {
         String buildId = ctx.getBuildId();
         LocalDateTime startTime = appBuilding.getBuildTime();
-        LocalDateTime endTime = appBuilding.getBuildTime();
-        // 计算总耗时
+        LocalDateTime endTime = LocalDateTime.now();
         long seconds = Duration.between(startTime, endTime).getSeconds();
 
         AppConfig appConfig = ctx.getAppConfig();
@@ -94,11 +93,11 @@ public class BuildLogService {
 
         buildLog.setStatus(status);
         // 如果失败,存入最后几行日志作为摘要,方便在列表页直接查看原因
-        String logSummary = StepStatus.SUCCESS.name();
+        String errorMsg = StepStatus.SUCCESS.name();
         if (!StepStatus.SUCCESS.name().equals(status)) {
-            logSummary = ctx.getLogSummary();
+            errorMsg = ctx.getLogSummary();
         }
-        buildLog.setLogSummary(logSummary);
+        buildLog.setErrorMsg(errorMsg);
         buildLog.setLogPath(ctx.getLogFile().getAbsolutePath());
 
         String stepsJson = JsonConverter.objectToJson(appBuilding.getSteps());

+ 7 - 4
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/BuildService.java

@@ -47,9 +47,8 @@ public class BuildService {
             log.error("appId {} 不存在", appId);
             return;
         }
-        String opsBy = Objects.requireNonNull(UserContext.getUser()).getUsername();
 
-        String buildId = buildLogService.initAppBuilding(appConfig, opsBy);
+        String buildId = buildLogService.initAppBuilding(appConfig);
         jobScheduler.submitJob(appId, () -> {
             // 2. 初始化上下文(此时应开始记录日志,并标记数据库状态为 RUNNING)
             try {
@@ -64,6 +63,10 @@ public class BuildService {
                         ctx.setCommitInfo(commitInfo);
                     });
 
+                    runStep(ctx, "SCAN", () -> {
+                        ctx.log(">>> [Step 1-1] 正在扫描代码...");
+                    });
+
                     // --- 阶段 2: 编译 ---
                     runStep(ctx, BuildStepName.COMPILE.name(), () -> {
                         ctx.log(">>> [Step 2] 正在执行编译: " + appId);
@@ -75,9 +78,9 @@ public class BuildService {
                     runStep(ctx, BuildStepName.PACK.name(), () -> {
                         ctx.log(">>> [Step 3] 正在打包产物...");
                         String compileType = appConfig.getCompilerConfig().getType();
-                        if (compileType.equals(CompileType.docker.getName())) {
+                        /*if (compileType.equals(CompileType.docker.getName())) {
                             ctx.log(">>> 采用 Docker 镜像编译的项目会自动打包产物...");
-                        } else {
+                        } else */{
                             CodePacker codePacker = provider.getPacker(appConfig.getPackerConfig().getType());
                             codePacker.pack(ctx, appConfig.getPackerConfig());
                         }

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

@@ -78,9 +78,7 @@ public class DeployAppImpl implements DeployApp {
     }
 
     private void deploy(AppBuilding appBuilding, AppDeployConfig appDeployConfig) {
-        String opsBy = appBuilding.getOpsBy();
         String packagePath = appBuilding.getPackagePath();
-
         String appId = appDeployConfig.getAppConfig().getAppId();
         String packType = appDeployConfig.getAppConfig().getPackerConfig().getType();
 
@@ -125,7 +123,7 @@ public class DeployAppImpl implements DeployApp {
             return;
         }
 
-        appDeployService.updateBeforeDeploy(appBuilding, machineId, opsBy);
+        appDeployService.updateBeforeDeploy(appBuilding, machineId);
         try {
             AgentMessage<EvtAppDeploy> message = new AgentMessage<>();
             message.setType(AgentCommand.DEPLOY_TASK);

+ 10 - 22
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/DockerBuild.java

@@ -1,5 +1,6 @@
 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.service.PipelineContext;
 import com.github.dockerjava.api.DockerClient;
@@ -7,10 +8,6 @@ import com.github.dockerjava.api.async.ResultCallback;
 import com.github.dockerjava.api.command.CreateContainerResponse;
 import com.github.dockerjava.api.command.WaitContainerResultCallback;
 import com.github.dockerjava.api.model.*;
-import com.github.dockerjava.core.DefaultDockerClientConfig;
-import com.github.dockerjava.core.DockerClientImpl;
-import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
-import com.github.dockerjava.transport.DockerHttpClient;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -24,25 +21,10 @@ import java.util.concurrent.atomic.AtomicBoolean;
  * @date 2026-02-26 13:21:42
  */
 public class DockerBuild {
-    private DockerClient dockerClient;
+    private final DockerClient dockerClient;
 
     public DockerBuild() {
-        initDockerClient();
-    }
-
-    private void initDockerClient() {
-        // 1. 配置:默认读取环境变量(如 DOCKER_HOST)
-        DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder().build();
-
-        // 2. 传输层:使用 HttpClient5
-        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
-                .dockerHost(config.getDockerHost())
-                .sslConfig(config.getSSLConfig())
-                .maxConnections(100)
-                .build();
-
-        // 3. 实例化客户端
-        this.dockerClient = DockerClientImpl.getInstance(config, httpClient);
+        this.dockerClient = DockerManager.getDocker().getDockerClient();
     }
 
     public void build(PipelineContext ctx, String repoTag, String sourceCodeDir,
@@ -66,7 +48,7 @@ public class DockerBuild {
                 .withCmd("sh", "-c", compileCmd)
                 .exec();
         runContainer(ctx, container);
-        pack(ctx, sourceCodeDir, repoTag);
+        //pack(ctx, sourceCodeDir, repoTag);
     }
 
     private void runContainer(PipelineContext ctx, CreateContainerResponse container) {
@@ -90,6 +72,12 @@ public class DockerBuild {
         dockerClient.waitContainerCmd(container.getId()).exec(waitCallback);
         Integer exitCode = waitCallback.awaitStatusCode();
         ctx.log("编译结束,退出码: " + exitCode);
+
+        // 6. 删除构建产生的一次性容器
+        dockerClient.removeContainerCmd(container.getId())
+                .withForce(true)
+                .withRemoveVolumes(true) // 同时清理关联的匿名卷
+                .exec();
     }
 
     public void pack(PipelineContext ctx, String sourceCodeDir, String repoTag) {

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

@@ -10,15 +10,6 @@ import cn.reghao.devops.mgr.ops.builder.service.PipelineContext;
  * @date 2020-01-21 16:17:22
  */
 public interface CodeCompiler {
-    /**
-     * @param appId 应用标识
-     * @param appCompileHome 编译应用代码所处的目录
-     * @date 2020-01-21 下午4:20
-     */
-    void compile(String appId, String appCompileHome) throws Exception;
-    default void compile(String appId, String appCompileHome, String env, String appRootPath) throws Exception {
-    }
-
     /**
      * 执行编译核心逻辑
      * @param ctx 运行时上下文(包含 buildId, log 方法, 工作目录等)

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

@@ -26,17 +26,6 @@ public class DockerCompiler implements CodeCompiler {
         this.dockerBuild = new DockerBuild();
     }
 
-    @Override
-    public void compile(String appId, String appCompileHome) throws Exception {
-        /*DockerContainerConfig config1;
-        synchronized(this) {
-            config.getVolumes().getMap().put("/app", appCompileHome);
-            config1 = (DockerContainerConfig) config.clone();
-        }
-
-        docker.runAndRm(config1);*/
-    }
-
     @Override
     public void compile(PipelineContext ctx, CompilerConfig compilerConfig) throws Exception {
         String registryUrl = ctx.getDockerRegistry().getRegistryUrl();

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

@@ -13,10 +13,6 @@ import org.springframework.stereotype.Component;
  */
 @Component
 public class EmptyCompiler implements CodeCompiler {
-    @Override
-    public void compile(String appId, String appCompileHome) throws Exception {
-    }
-
     @Override
     public void compile(PipelineContext ctx, CompilerConfig compilerConfig) {
     }

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

@@ -33,12 +33,10 @@ public class MavenCompiler implements CodeCompiler {
         this.standaloneArgs = new String[]{"clean", "package", "-Dmaven.test.skip=true"};
     }
 
-    @Override
     public void compile(String appId, String appCompileHome) throws Exception {
         throw new Exception("未实现此方法");
     }
 
-    @Override
     public void compile(String appId, String appCompileHome, String env, String appRootPath) throws Exception {
         String pomPath = appCompileHome + "/pom.xml";
         boolean multiModule = isMultiModule(pomPath);

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

@@ -23,18 +23,6 @@ public class ShellCompiler implements CodeCompiler {
         this.shell = new ShellExecutor();
     }
 
-    @Override
-    public void compile(String appId, String appCompileHome) throws Exception {
-        ShellResult result;
-        for (String compileScript : compileCmds) {
-            result = shell.execWithDir(appCompileHome, compileScript.split("\\s+"));
-            if (!result.isSuccess()) {
-                throw new Exception(result.getResult());
-                //throw new Exception(JsonConverter.objectToJson(result.getResult()));
-            }
-        }
-    }
-
     @Override
     public void compile(PipelineContext ctx, CompilerConfig compilerConfig) throws Exception {
         String sourceCodeDir = ctx.getCompileDir();
@@ -44,7 +32,6 @@ public class ShellCompiler implements CodeCompiler {
             result = shell.execWithDir(sourceCodeDir, compileScript.split("\\s+"));
             if (!result.isSuccess()) {
                 throw new Exception(result.getResult());
-                //throw new Exception(JsonConverter.objectToJson(result.getResult()));
             }
         }
     }

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

@@ -1,6 +1,5 @@
 package cn.reghao.devops.mgr.ops.builder.tool.packer;
 
-import cn.reghao.devops.common.docker.Docker;
 import cn.reghao.devops.common.msg.constant.PackType;
 import cn.reghao.devops.mgr.ops.build.model.po.PackerConfig;
 import cn.reghao.devops.mgr.ops.builder.tool.DockerBuild;
@@ -8,8 +7,6 @@ import cn.reghao.devops.mgr.ops.builder.service.PipelineContext;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
-import java.io.File;
-
 /**
  * 打包为 docker 应用
  *
@@ -19,41 +16,10 @@ import java.io.File;
 @Slf4j
 @Component
 public class DockerPack implements CodePacker {
-    private String targetPath;
-    private Docker docker;
-    private DockerBuild dockerBuild;
-
-    /*public DockerPack(String targetPath, DockerAuth dockerAuth) {
-        this.targetPath = targetPath;
-        this.docker = new DockerImpl(dockerAuth);
-    }
-
-    public DockerPack(String targetPath) {
-        this.targetPath = targetPath;
-        this.docker = new DockerImpl();
-    }*/
-
-    //@Override
-    public String pack(String appId, String commitId, String appRootPath, String dockerfile) throws Exception {
-        int idx = targetPath.lastIndexOf("/");
-        String appId1 = targetPath.substring(idx+1);
-        String repo;
-        if (appId1.equals(appId)) {
-            repo = targetPath;
-        } else {
-            repo = targetPath + File.separator + appId;
-        }
-
-        //String repo = targetPath + File.separator + appId;
-        String image = repo + ":" + commitId;
-        docker.build(image, appRootPath, dockerfile);
-        return image;
-    }
+    private final DockerBuild dockerBuild;
 
-    //@Override
-    public String push(String localPath) throws Exception {
-        docker.push(localPath);
-        return localPath;
+    public DockerPack() {
+        this.dockerBuild = new DockerBuild();
     }
 
     @Override

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

@@ -21,8 +21,8 @@ public class DockerRegistryService {
     }
 
     public void addOrUpdate(DockerAuth dockerAuth) {
-        DockerImpl docker = new DockerImpl(dockerAuth);
-        docker.auth();
+        DockerImpl docker = new DockerImpl();
+        docker.auth(dockerAuth);
 
         String registryUrl = dockerAuth.getRegistryUrl();
         DockerRegistry dockerRegistry = dockerAuthRepository.findByRegistryUrl(registryUrl);

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

@@ -58,5 +58,18 @@ public class AppConfigTest {
                 .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());
+        appDeployingRepository.saveAll(list);
     }
 }