Преглед изворни кода

调整构建配置相关接口

reghao пре 23 часа
родитељ
комит
b7b5e53d5a
31 измењених фајлова са 219 додато и 138 уклоњено
  1. 1 1
      common/src/main/java/cn/reghao/devops/common/msg/constant/PackType.java
  2. 2 0
      mgr/src/main/java/cn/reghao/devops/mgr/ops/aliyun/controller/AliyunController.java
  3. 3 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/aliyun/db/repository/AliyunAccountRepository.java
  4. 17 10
      mgr/src/main/java/cn/reghao/devops/mgr/ops/aliyun/model/po/AliyunAccount.java
  5. 3 3
      mgr/src/main/java/cn/reghao/devops/mgr/ops/aliyun/service/AliyunCdn.java
  6. 7 3
      mgr/src/main/java/cn/reghao/devops/mgr/ops/aliyun/service/AliyunOss.java
  7. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/aliyun/service/AliyunService.java
  8. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/app/service/impl/AppDeployServiceImpl.java
  9. 11 0
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/controller/CompilerController.java
  10. 5 3
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/controller/DockerRegistryController.java
  11. 19 4
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/controller/PackerController.java
  12. 6 4
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/po/CompilerConfig.java
  13. 10 10
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/po/DockerRegistry.java
  14. 18 9
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/po/PackerConfig.java
  15. 2 0
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/provider/PackerConfigGroupSequenceProvider.java
  16. 21 0
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/vo/DockerRegistryVO.java
  17. 24 0
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/vo/PackerConfigVO.java
  18. 4 6
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/service/DockerRegistryService.java
  19. 20 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/build/service/impl/CompilerConfigServiceImpl.java
  20. 1 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/dto/PackerDto.java
  21. 2 2
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/vo/BuildConfigSnapshot.java
  22. 0 18
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/BuildApp.java
  23. 0 33
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/impl/BuildAppImpl.java
  24. 8 4
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/impl/DeployAppImpl.java
  25. 10 1
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/task/OssDeployTask.java
  26. 1 6
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/webhook/WebhookService.java
  27. 7 7
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/packer/StaticPack.java
  28. 6 6
      mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/packer/ZipPack.java
  29. 1 1
      mgr/src/main/resources/application-dev.yml
  30. 4 1
      mgr/src/main/resources/application.yml
  31. 3 0
      mgr/src/main/resources/logback-spring.xml

+ 1 - 1
common/src/main/java/cn/reghao/devops/common/msg/constant/PackType.java

@@ -7,7 +7,7 @@ package cn.reghao.devops.common.msg.constant;
  * @date 2019-11-15 21:59:35
  */
 public enum PackType {
-    docker, staticFiles, zip;
+    docker, ossStatic, zip;
 
     public String getName() {
         return this.name();

+ 2 - 0
mgr/src/main/java/cn/reghao/devops/mgr/ops/aliyun/controller/AliyunController.java

@@ -5,6 +5,7 @@ import cn.reghao.devops.mgr.ops.aliyun.model.po.AliyunAccount;
 import cn.reghao.devops.mgr.ops.aliyun.model.vo.StsToken;
 import cn.reghao.devops.mgr.ops.aliyun.service.AliyunAccountService;
 import cn.reghao.devops.mgr.ops.aliyun.service.AliyunService;
+import cn.reghao.devops.mgr.util.SelectOption;
 import cn.reghao.jutil.web.WebResult;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
@@ -14,6 +15,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao

+ 3 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/aliyun/db/repository/AliyunAccountRepository.java

@@ -3,10 +3,12 @@ package cn.reghao.devops.mgr.ops.aliyun.db.repository;
 import cn.reghao.devops.mgr.ops.aliyun.model.po.AliyunAccount;
 import org.springframework.data.jpa.repository.JpaRepository;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2025-06-06 09:46:54
  */
 public interface AliyunAccountRepository extends JpaRepository<AliyunAccount, Integer> {
-    AliyunAccount findByType(String type);
+    List<AliyunAccount> findByType(String type);
 }

+ 17 - 10
mgr/src/main/java/cn/reghao/devops/mgr/ops/aliyun/model/po/AliyunAccount.java

@@ -1,15 +1,14 @@
 package cn.reghao.devops.mgr.ops.aliyun.model.po;
 
+import cn.reghao.devops.mgr.ops.build.model.po.RepoAuthConfig;
 import cn.reghao.devops.mgr.util.BaseEntity;
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
 
-import jakarta.persistence.Column;
-import jakarta.persistence.Entity;
-import jakarta.persistence.Table;
-
 /**
  * @author reghao
  * @date 2025-06-06 09:46:18
@@ -21,17 +20,25 @@ import jakarta.persistence.Table;
 @Entity
 @Table(name = "devops_aliyun_account")
 public class AliyunAccount extends BaseEntity {
+    @Column(nullable = false)
+    private String type;
     @Column(nullable = false, unique = true)
-    private String endpoint;
+    private String name;
     @Column(nullable = false)
+    private String endpoint;
+    /*@Column(nullable = false, unique = true)
     private String accessKeyId;
     @Column(nullable = false)
-    private String accessKeySecret;
-    @Column(nullable = false)
-    private String ramUser;
-    @Column(nullable = false, unique = true)
-    private String type;
+    private String accessKeySecret;*/
+    @ManyToOne(cascade = CascadeType.REFRESH)
+    @JoinColumn(name = "repo_auth_config_id")
+    @NotNull
+    private RepoAuthConfig repoAuthConfig;
+    /*@Column(nullable = false)
+    private String ramUser;*/
+    // aliyun oss 使用字段
     private String bucketName;
+    // aliyun cdn 使用字段
     private String region;
     private String roleArn;
 }

+ 3 - 3
mgr/src/main/java/cn/reghao/devops/mgr/ops/aliyun/service/AliyunCdn.java

@@ -34,10 +34,10 @@ public class AliyunCdn {
 
     public Client getClient() throws Exception {
         if (client == null) {
-            AliyunAccount aliyunAccount = aliyunAccountRepository.findByType("cdn");
+            AliyunAccount aliyunAccount = aliyunAccountRepository.findByType("cdn").stream().findFirst().orElse(null);
             String endpoint = aliyunAccount.getEndpoint();
-            String accessKeyId = aliyunAccount.getAccessKeyId();
-            String accessKeySecret = aliyunAccount.getAccessKeySecret();
+            String accessKeyId = aliyunAccount.getRepoAuthConfig().getUsername();
+            String accessKeySecret = aliyunAccount.getRepoAuthConfig().getPassword();
             Config config = new Config()
                     // 必填,您的 AccessKey ID
                     .setAccessKeyId(accessKeyId)

+ 7 - 3
mgr/src/main/java/cn/reghao/devops/mgr/ops/aliyun/service/AliyunOss.java

@@ -36,16 +36,20 @@ public class AliyunOss {
 
     public OSS getOssClient() {
         if (ossClient == null) {
-            AliyunAccount aliyunAccount = aliyunAccountRepository.findByType("oss");
+            AliyunAccount aliyunAccount = aliyunAccountRepository.findByType("oss").stream().findFirst().orElse(null);
             String endpoint = aliyunAccount.getEndpoint();
-            String accessKeyId = aliyunAccount.getAccessKeyId();
-            String accessKeySecret = aliyunAccount.getAccessKeySecret();
+            String accessKeyId = aliyunAccount.getRepoAuthConfig().getUsername();
+            String accessKeySecret = aliyunAccount.getRepoAuthConfig().getPassword();
             ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
         }
 
         return ossClient;
     }
 
+    public OSS getOssClient(String endpoint, String accessKeyId, String accessKeySecret) {
+        return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+    }
+
     public void uploadObject(String bucketName, String objectName, File file) throws IOException {
         PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, file);
         /*ObjectMetadata objectMetadata = new ObjectMetadata();

+ 2 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/aliyun/service/AliyunService.java

@@ -27,8 +27,8 @@ public class AliyunService {
     public void init(AliyunOss aliyunOss, AliyunAccount aliyunAccount) throws Exception {
         this.aliyunOss = aliyunOss;
         String stsEndpoint = aliyunAccount.getEndpoint();
-        String accessKeyId = aliyunAccount.getAccessKeyId();
-        String accessKeySecret = aliyunAccount.getAccessKeySecret();
+        String accessKeyId = aliyunAccount.getRepoAuthConfig().getUsername();
+        String accessKeySecret = aliyunAccount.getRepoAuthConfig().getPassword();
         this.bucket = aliyunAccount.getBucketName();
         this.region = aliyunAccount.getRegion();
         this.roleArn = aliyunAccount.getRoleArn();

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

@@ -275,7 +275,7 @@ public class AppDeployServiceImpl implements AppDeployService {
 
                 log.info("{} 的通知已发送", deployResult.getAppId());
                 AppConfig appConfig = deployConfig.getAppConfig();
-                if (appConfig.getPackerConfig().getType().equals(PackType.staticFiles.getName())) {
+                if (appConfig.getPackerConfig().getType().equals(PackType.ossStatic.getName())) {
                     refreshCdn(appConfig, buildLog);
                 }
             }

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

@@ -85,6 +85,17 @@ public class CompilerController {
         return PageList.pageList(pageNumber, pageSize, (int) total, list);
     }
 
+    @Operation(summary = "编译配置详情", description = "N")
+    @GetMapping(value = "/detail", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String compilerConfigDetail(@RequestParam("id") int id) {
+        CompilerConfig compilerConfig = compilerConfigRepository.findById(id).orElse(null);
+        if (compilerConfig != null) {
+            return WebResult.success(compilerConfig);
+        }
+
+        return WebResult.failWithMsg(String.format("CompilerConfig not found with id %d", id));
+    }
+
     @Operation(summary = "添加 docker 容器映射目录", description = "N")
     @PostMapping(value = "/bind/add", produces = MediaType.APPLICATION_JSON_VALUE)
     public String addContainerBind(@RequestBody @Validated CompilerBindDto compilerBindDto) {

+ 5 - 3
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/controller/DockerRegistryController.java

@@ -2,6 +2,7 @@ package cn.reghao.devops.mgr.ops.build.controller;
 
 import cn.reghao.devops.common.docker.model.DockerAuth;
 import cn.reghao.devops.mgr.ops.build.model.dto.DockerAuthDto;
+import cn.reghao.devops.mgr.ops.build.model.vo.DockerRegistryVO;
 import cn.reghao.devops.mgr.ops.docker.db.repository.DockerRegistryRepository;
 import cn.reghao.devops.mgr.ops.build.model.po.DockerRegistry;
 import cn.reghao.devops.mgr.ops.build.service.DockerRegistryService;
@@ -17,6 +18,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -56,15 +58,15 @@ public class DockerRegistryController {
     public String repoAuthPage(@RequestParam("pn") int pageNumber) {
         PageRequest pageRequest = PageRequest.of(pageNumber-1, pageSize);
         Page<DockerRegistry> page = dockerRegistryRepository.findAll(pageRequest);
-        PageList<DockerRegistry> pageList = getPageList(page);
+        PageList<DockerRegistryVO> pageList = getPageList(page);
         return WebResult.success(pageList);
     }
 
-    private PageList<DockerRegistry> getPageList(Page<DockerRegistry> page) {
+    private PageList<DockerRegistryVO> getPageList(Page<DockerRegistry> page) {
         int pageNumber = page.getNumber() + 1;
         int pageSize = page.getSize();
         long total = page.getTotalElements();
-        List<DockerRegistry> list = page.getContent();
+        List<DockerRegistryVO> list = page.getContent().stream().map(DockerRegistryVO::new).collect(Collectors.toList());
         return PageList.pageList(pageNumber, pageSize, (int) total, list);
     }
 }

+ 19 - 4
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/controller/PackerController.java

@@ -1,6 +1,8 @@
 package cn.reghao.devops.mgr.ops.build.controller;
 
 import cn.reghao.devops.common.msg.constant.PackType;
+import cn.reghao.devops.mgr.ops.aliyun.db.repository.AliyunAccountRepository;
+import cn.reghao.devops.mgr.ops.build.model.vo.PackerConfigVO;
 import cn.reghao.devops.mgr.util.SelectOption;
 import cn.reghao.devops.mgr.ops.docker.db.repository.DockerRegistryRepository;
 import cn.reghao.devops.mgr.ops.build.db.repository.PackerConfigRepository;
@@ -35,14 +37,17 @@ import java.util.stream.Collectors;
 public class PackerController {
     private final PackerConfigRepository packerConfigRepository;
     private final DockerRegistryRepository dockerRegistryRepository;;
+    private final AliyunAccountRepository aliyunAccountRepository;
     private final PackerConfigService packerConfigService;
     private final int pageSize = 10;
 
     public PackerController(PackerConfigRepository packerConfigRepository,
                             DockerRegistryRepository dockerRegistryRepository,
+                            AliyunAccountRepository aliyunAccountRepository,
                             PackerConfigService packerConfigService) {
         this.packerConfigRepository = packerConfigRepository;
         this.dockerRegistryRepository = dockerRegistryRepository;
+        this.aliyunAccountRepository = aliyunAccountRepository;
         this.packerConfigService = packerConfigService;
     }
 
@@ -62,26 +67,36 @@ public class PackerController {
                 })
                 .collect(Collectors.toList());
 
+        List<SelectOption> ossList = aliyunAccountRepository.findByType("oss")
+                .stream()
+                .map(aliyunAccount -> {
+                    String name = aliyunAccount.getBucketName();
+                    String value = aliyunAccount.getBucketName();
+                    return new SelectOption(name, value);
+                })
+                .collect(Collectors.toList());
+
         Map<String, Object> map = new HashMap<>();
         map.put("packTypes", packTypes);
         map.put("registryList", registryList);
+        map.put("ossList", ossList);
         return WebResult.success(map);
     }
 
-    @Operation(summary = "打包配置页面", description = "N")
+    @Operation(summary = "打包配置列表", description = "N")
     @GetMapping(value = "")
     public String packerPage(@RequestParam("pn") int pageNumber) {
         PageRequest pageRequest = PageRequest.of(pageNumber-1, pageSize);
         Page<PackerConfig> page = packerConfigRepository.findAll(pageRequest);
-        PageList<PackerConfig> pageList = getPageList(page);
+        PageList<PackerConfigVO> pageList = getPageList(page);
         return WebResult.success(pageList);
     }
 
-    private PageList<PackerConfig> getPageList(Page<PackerConfig> page) {
+    private PageList<PackerConfigVO> getPageList(Page<PackerConfig> page) {
         int pageNumber = page.getNumber() + 1;
         int pageSize = page.getSize();
         long total = page.getTotalElements();
-        List<PackerConfig> list = page.getContent();
+        List<PackerConfigVO> list = page.getContent().stream().map(PackerConfigVO::new).collect(Collectors.toList());
         return PageList.pageList(pageNumber, pageSize, (int) total, list);
     }
 

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

@@ -37,12 +37,14 @@ public class CompilerConfig extends BaseEntity {
     @Length(max = 255, message = "编译名字的最大长度不能超过 255 个字符")
     @Column(nullable = false, unique = true)
     private String name;
-    @NotBlank(groups = { ShellCompiler.class}, message = "编译命令不能为空")
-    @Length(max = 1000, message = "编译命令长度不能超过 1000 个字符")
+    @NotBlank(groups = { ShellCompiler.class, DockerRunCompiler.class}, message = "编译命令不能为空")
+    @Length(max = 10000, message = "编译命令长度不能超过 10000 个字符")
     @Column(columnDefinition="text")
     private String compileCmd;
-    @NotBlank(groups = { ShellCompiler.class}, message = "编译器版本命令不能为空")
-    @NotBlank(groups = { DockerRunCompiler.class}, message = "编译器版本命令不能为空")
+    @NotBlank(groups = { ShellCompiler.class, DockerRunCompiler.class}, message = "编译命令不能为空")
+    @Length(max = 255, message = "编译命令长度不能超过 255 个字符")
+    private String versionCmd;
+    @NotBlank(groups = { DockerRunCompiler.class}, message = "编译使用的镜像不能为空")
     private String compilerImage;
 
     @ElementCollection(targetClass = CompilerBind.class)

+ 10 - 10
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/po/DockerRegistry.java

@@ -1,14 +1,12 @@
 package cn.reghao.devops.mgr.ops.build.model.po;
 
-import cn.reghao.devops.common.docker.model.DockerAuth;
 import cn.reghao.devops.mgr.util.BaseEntity;
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
 
-import jakarta.persistence.Column;
-import jakarta.persistence.Entity;
-import jakarta.persistence.Table;
 import jakarta.validation.constraints.NotBlank;
 
 /**
@@ -21,15 +19,17 @@ import jakarta.validation.constraints.NotBlank;
 @Entity
 @Table(name = "devops_docker_registry")
 public class DockerRegistry extends BaseEntity {
+    @NotNull
+    @ManyToOne(cascade = CascadeType.REFRESH)
+    @JoinColumn(name = "repo_auth_config_id")
+    private RepoAuthConfig repoAuthConfig;
+
     @Column(nullable = false, unique = true)
     @NotBlank(message = "docker registry 不能为空字符串")
     private String registryUrl;
-    private String username;
-    private String password;
 
-    public DockerRegistry(DockerAuth dockerAuth) {
-        this.registryUrl = dockerAuth.getRegistryUrl();
-        this.username = dockerAuth.getUsername();
-        this.password = dockerAuth.getPassword();
+    public DockerRegistry(String registryUrl, RepoAuthConfig repoAuthConfig) {
+        this.repoAuthConfig = repoAuthConfig;
+        this.registryUrl = registryUrl;
     }
 }

+ 18 - 9
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/po/PackerConfig.java

@@ -2,6 +2,7 @@ package cn.reghao.devops.mgr.ops.build.model.po;
 
 import cn.reghao.devops.common.docker.model.DockerAuth;
 import cn.reghao.devops.common.msg.constant.PackType;
+import cn.reghao.devops.mgr.ops.aliyun.model.po.AliyunAccount;
 import cn.reghao.devops.mgr.ops.build.model.provider.PackerConfigGroupSequenceProvider;
 import cn.reghao.devops.mgr.ops.builder.model.dto.PackerDto;
 import cn.reghao.devops.mgr.util.BaseEntity;
@@ -38,31 +39,39 @@ public class PackerConfig extends BaseEntity {
     @Length(max = 255, message = "打包名字的最大长度不能超过 255 个字符")
     @Column(nullable = false, unique = true)
     private String name;
-    // 打包后的应用存放的位置,可以是一个本地目录,也可以是一个网络位置
-    // 根据打包类型来确定
-    @NotBlank(groups = { DockerPacker.class }, message = "可执行包的存放位置不能为空白字符串")
-    private String targetPath;
+    // 构建生成的可执行文件及配置文件, 脚本文件等所在的目录路径(相对于源码根目录)
+    @NotBlank(groups = { ZipPacker.class }, message = "构建产物路径不能为空")
+    private String artifactPath;
     @NotNull(groups = { DockerPacker.class }, message = "dockerRegistry 不能为 null")
     @OneToOne
     private DockerRegistry dockerRegistry;
-    // 构建生成的可执行文件及配置文件, 脚本文件等所在的目录名, 目录位于 appRootPath 下
-    @NotBlank(groups = { ZipPacker.class }, message = "bin 目录不能为空")
-    private String binDirname;
+    @NotNull(groups = { OssStaticPacker.class }, message = "ossEndpoint 不能为 null")
+    @OneToOne
+    private AliyunAccount ossEndpoint;
+    // 打包后的应用存放的位置,可以是一个本地目录,也可以是一个网络位置
+    // 根据打包类型来确定
+    @NotBlank(groups = { ZipPacker.class }, message = "可执行包的存放位置不能为空白字符串")
+    private String targetPath;
 
     public interface DockerPacker {
     }
 
+    public interface OssStaticPacker {
+    }
+
     public interface ZipPacker {
     }
 
     public PackerDto getPackerDto() {
-        return new PackerDto(this.type, this.name, this.targetPath, this.binDirname);
+        return new PackerDto(this.type, this.name, this.targetPath, this.artifactPath);
     }
 
     public DockerAuth getDockerAuth() {
         DockerRegistry registry = this.dockerRegistry;
         if (registry != null) {
-            return new DockerAuth(registry.getRegistryUrl(), registry.getUsername(), registry.getPassword());
+            String username = registry.getRepoAuthConfig().getUsername();
+            String password = registry.getRepoAuthConfig().getPassword();
+            return new DockerAuth(registry.getRegistryUrl(), username, password);
         }
 
         return null;

+ 2 - 0
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/provider/PackerConfigGroupSequenceProvider.java

@@ -21,6 +21,8 @@ public class PackerConfigGroupSequenceProvider implements DefaultGroupSequencePr
             String packType = packerConfig.getType();
             if (packType.equals(PackType.docker.getName())) {
                 defaultGroupSequence.add(PackerConfig.DockerPacker.class);
+            } else if (packType.equals(PackType.ossStatic.getName())) {
+                defaultGroupSequence.add(PackerConfig.OssStaticPacker.class);
             } else if (packType.equals(PackType.zip.getName())) {
                 defaultGroupSequence.add(PackerConfig.ZipPacker.class);
             }

+ 21 - 0
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/vo/DockerRegistryVO.java

@@ -0,0 +1,21 @@
+package cn.reghao.devops.mgr.ops.build.model.vo;
+
+import cn.reghao.devops.mgr.ops.build.model.po.DockerRegistry;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author reghao
+ * @date 2026-03-21 11:41:47
+ */
+@NoArgsConstructor
+@Data
+public class DockerRegistryVO {
+    private String registryUrl;
+    private String repoAuthName;
+
+    public DockerRegistryVO(DockerRegistry dockerRegistry) {
+        this.registryUrl = dockerRegistry.getRegistryUrl();
+        this.repoAuthName = dockerRegistry.getRepoAuthConfig().getName();
+    }
+}

+ 24 - 0
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/vo/PackerConfigVO.java

@@ -0,0 +1,24 @@
+package cn.reghao.devops.mgr.ops.build.model.vo;
+
+import cn.reghao.devops.mgr.ops.build.model.po.PackerConfig;
+import cn.reghao.jutil.jdk.web.result.NotAvailable;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author reghao
+ * @date 2026-03-21 13:14:54
+ */
+@NoArgsConstructor
+@Data
+public class PackerConfigVO {
+    private String type;
+    private String name;
+    private String artifactPath;
+
+    public PackerConfigVO(PackerConfig packerConfig) {
+        this.type = packerConfig.getType();
+        this.name = packerConfig.getName();
+        this.artifactPath = packerConfig.getArtifactPath() == null ? NotAvailable.na.getDesc() : packerConfig.getArtifactPath();
+    }
+}

+ 4 - 6
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/service/DockerRegistryService.java

@@ -43,14 +43,12 @@ public class DockerRegistryService {
         String registryUrl = dockerAuth.getRegistryUrl();
         DockerRegistry dockerRegistry = dockerAuthRepository.findByRegistryUrl(registryUrl);
         if (dockerRegistry == null) {
-            dockerRegistry = new DockerRegistry(dockerAuth);
-        } else {
-            dockerRegistry.setUsername(dockerAuth.getUsername());
-            dockerRegistry.setPassword(dockerAuth.getPassword());
+            dockerRegistry = new DockerRegistry(registryUrl, repoAuthConfig);
+            dockerAuthRepository.save(dockerRegistry);
+            return Result.success();
         }
 
-        dockerAuthRepository.save(dockerRegistry);
-        return Result.success();
+        return Result.fail(String.format("%s already exists", dockerRegistry.getRegistryUrl()));
     }
 
     public Result delete(int id) {

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

@@ -32,10 +32,13 @@ import java.util.stream.Collectors;
 public class CompilerConfigServiceImpl implements CompilerConfigService {
     private final CompilerConfigRepository compilerConfigRepository;
     private final AppBuildQuery appBuildQuery;
+    private final ShellExecutor shellExecutor;
 
-    public CompilerConfigServiceImpl(CompilerConfigRepository compilerConfigRepository, AppBuildQuery appBuildQuery) {
+    public CompilerConfigServiceImpl(CompilerConfigRepository compilerConfigRepository, AppBuildQuery appBuildQuery,
+                                     ShellExecutor shellExecutor) {
         this.compilerConfigRepository = compilerConfigRepository;
         this.appBuildQuery = appBuildQuery;
+        this.shellExecutor = shellExecutor;
     }
 
     @Override
@@ -88,6 +91,22 @@ public class CompilerConfigServiceImpl implements CompilerConfigService {
         return Result.result(ResultStatus.SUCCESS);
     }
 
+    public String getCompilerVersion(int id) {
+        CompilerConfig compilerConfig = compilerConfigRepository.findById(id).orElse(null);
+        if (compilerConfig == null) {
+            return "not exist";
+        }
+
+        if (!compilerConfig.getType().equals(CompileType.shell.getName())) {
+            return "not shell type";
+        }
+
+        String versionCmd = compilerConfig.getVersionCmd();
+        ShellResult shellResult = shellExecutor.exec(versionCmd.split("\\s+"));
+        String html = StringUtil.txtToHtml(shellResult.getResult());
+        return html;
+    }
+
     @Override
     public Result addContainerBind(CompilerBindDto compilerBindDto) {
         int id = compilerBindDto.getId();

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/model/dto/PackerDto.java

@@ -16,6 +16,6 @@ public class PackerDto implements Serializable {
 
     private String type;
     private String name;
+    private String artifactPath;
     private String targetPath;
-    private String binDirname;
 }

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

@@ -34,7 +34,7 @@ public class BuildConfigSnapshot {
 
     private String packType;
     private String packName;
-    private String binDirname;
+    private String artifactPath;
     private String targetPath;
     private String dockerfile;
 
@@ -52,7 +52,7 @@ public class BuildConfigSnapshot {
 
         this.packType = appConfig.getPackerConfig().getType();
         this.packName = appConfig.getPackerConfig().getName();
-        this.binDirname = appConfig.getPackerConfig().getBinDirname();
+        this.artifactPath = appConfig.getPackerConfig().getArtifactPath();
         this.targetPath = appConfig.getPackerConfig().getTargetPath();
         this.dockerfile = appConfig.getDockerfile();
     }

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

@@ -1,18 +0,0 @@
-package cn.reghao.devops.mgr.ops.builder.service;
-
-import cn.reghao.devops.mgr.ops.builder.model.vo.BuildTask;
-import cn.reghao.jutil.jdk.web.result.Result;
-
-import java.util.List;
-
-/**
- * 构建部署应用
- *
- * @author reghao
- * @date 2023-02-24 21:15:08
- */
-public interface BuildApp {
-    Result buildAndDeploy(String appId, boolean deploy) throws Exception;
-    List<BuildTask> getBuildTasks();
-    void cancelTask(String appId);
-}

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

@@ -1,33 +0,0 @@
-package cn.reghao.devops.mgr.ops.builder.service.impl;
-
-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;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2023-02-24 21:17:44
- */
-@Slf4j
-@Service
-@Deprecated
-public class BuildAppImpl implements BuildApp {
-    @Override
-    public Result buildAndDeploy(String appId, boolean deploy) {
-        return Result.success("构建部署任务已提交");
-    }
-
-    @Override
-    public List<BuildTask> getBuildTasks() {
-        return new ArrayList<>();
-    }
-
-    @Override
-    public void cancelTask(String appId) {
-    }
-}

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

@@ -9,6 +9,7 @@ import cn.reghao.devops.common.msg.event.EvtAppStatResult;
 import cn.reghao.devops.mgr.ops.aliyun.service.AliyunOss;
 import cn.reghao.devops.mgr.ops.app.db.query.AppBuildQuery;
 import cn.reghao.devops.mgr.ops.app.db.query.AppDeployQuery;
+import cn.reghao.devops.mgr.ops.build.model.po.PackerConfig;
 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.app.model.po.AppDeployConfig;
@@ -79,14 +80,15 @@ public class DeployAppImpl implements DeployApp {
     private void deploy(AppBuilding appBuilding, AppDeployConfig appDeployConfig) {
         String packagePath = appBuilding.getPackagePath();
         String appId = appDeployConfig.getAppConfig().getAppId();
-        String packType = appDeployConfig.getAppConfig().getPackerConfig().getType();
+        PackerConfig packerConfig = appDeployConfig.getAppConfig().getPackerConfig();
+        String packType = packerConfig.getType();
 
         String machineId = appDeployConfig.getMachineInfo().getMachineId();
         String startScript = appDeployConfig.getStartScript();
         String startHome = appDeployConfig.getStartHome();
         String unpackScript = appDeployConfig.getUnpackScript();
-        if (packType.equals(PackType.staticFiles.getName())) {
-            OssDeployTask ossDeployTask = new OssDeployTask(aliyunOss, appDeployService, appBuilding, machineId);
+        if (packType.equals(PackType.ossStatic.getName())) {
+            OssDeployTask ossDeployTask = new OssDeployTask(aliyunOss, appDeployService, appBuilding, machineId, packerConfig);
             deployPool.submit(ossDeployTask);
             log.info("submit {} OssDeployTask", appId);
             return;
@@ -103,7 +105,9 @@ public class DeployAppImpl implements DeployApp {
         if (packType.equals(PackType.docker.getName())) {
             DockerRegistry registry = appDeployConfig.getAppConfig().getPackerConfig().getDockerRegistry();
             if (registry != null) {
-                DockerAuth dockerAuth = new DockerAuth(registry.getRegistryUrl(), registry.getUsername(), registry.getPassword());
+                String username = registry.getRepoAuthConfig().getUsername();
+                String password = registry.getRepoAuthConfig().getPassword();
+                DockerAuth dockerAuth = new DockerAuth(registry.getRegistryUrl(), username, password);
                 deployParam.setDockerAuth(dockerAuth);
             }
         }

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

@@ -2,9 +2,11 @@ package cn.reghao.devops.mgr.ops.builder.service.task;
 
 import cn.reghao.devops.common.msg.event.EvtAppStatResult;
 import cn.reghao.devops.mgr.ops.aliyun.service.AliyunOss;
+import cn.reghao.devops.mgr.ops.build.model.po.PackerConfig;
 import cn.reghao.devops.mgr.ops.builder.model.po.AppBuilding;
 import cn.reghao.devops.mgr.ops.app.service.AppDeployService;
 import cn.reghao.devops.mgr.ops.builder.model.LocalBuildDir;
+import com.aliyun.oss.OSS;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.File;
@@ -22,13 +24,15 @@ public class OssDeployTask implements Runnable {
     private final AppDeployService appDeployService;
     private final AppBuilding appBuilding;
     private final String machineId;
+    private PackerConfig packerConfig;
 
     public OssDeployTask(AliyunOss aliyunOss, AppDeployService appDeployService,
-                         AppBuilding appBuilding, String machineId) {
+                         AppBuilding appBuilding, String machineId, PackerConfig packerConfig) {
         this.aliyunOss = aliyunOss;
         this.appDeployService = appDeployService;
         this.appBuilding = appBuilding;
         this.machineId = machineId;
+        this.packerConfig = packerConfig;
     }
 
     @Override
@@ -39,6 +43,11 @@ public class OssDeployTask implements Runnable {
         String destDirPath = LocalBuildDir.packDir + File.separator + appId + File.separator + dirname;
         File destDir = new File(destDirPath);
         if (destDir.exists()) {
+            String endpoint = packerConfig.getOssEndpoint().getEndpoint();
+            String accessKeyId = packerConfig.getOssEndpoint().getRepoAuthConfig().getUsername();
+            String accessKeySecret = packerConfig.getOssEndpoint().getRepoAuthConfig().getPassword();
+            OSS ossClient = aliyunOss.getOssClient(endpoint, accessKeyId, accessKeySecret);
+
             // oss 机器 ID 格式: oss.bucketName
             String bucketName = machineId.split("\\.")[1];
             // 匹配 bucket 下的所有文件

+ 1 - 6
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/webhook/WebhookService.java

@@ -4,7 +4,6 @@ import cn.reghao.devops.mgr.admin.service.NotifyService;
 import cn.reghao.devops.mgr.admin.service.notifier.ding.DingMsg;
 import cn.reghao.devops.mgr.ops.app.db.query.AppBuildQuery;
 import cn.reghao.devops.mgr.ops.app.model.po.AppConfig;
-import cn.reghao.devops.mgr.ops.builder.service.BuildApp;
 import cn.reghao.devops.mgr.ops.builder.service.webhook.event.BuildParam;
 import cn.reghao.devops.mgr.ops.builder.service.webhook.event.GogsPushEvent;
 import cn.reghao.devops.mgr.ops.builder.service.webhook.event.PushEvent;
@@ -26,14 +25,11 @@ import java.util.Map;
 @Service
 public class WebhookService {
     private final AppBuildQuery appBuildQuery;
-    private final BuildApp buildApp;
     private final NotifyService notifyService;
     private final Map<String, PushEvent> map = new HashMap<>();
 
-    public WebhookService(AppBuildQuery appBuildQuery, BuildApp buildApp,
-                          NotifyService notifyService, List<PushEvent> list) {
+    public WebhookService(AppBuildQuery appBuildQuery, NotifyService notifyService, List<PushEvent> list) {
         this.appBuildQuery = appBuildQuery;
-        this.buildApp = buildApp;
         this.notifyService = notifyService;
         initPushEvent(list);
     }
@@ -62,7 +58,6 @@ public class WebhookService {
 
             boolean deploy = !"devops-mgr".equals(appId) && !"devops-agent".equals(appId);
             String opsBy = buildParam.getOpsBy();
-            buildApp.buildAndDeploy(appId, deploy);
         }
     }
 

+ 7 - 7
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/packer/StaticPack.java

@@ -21,10 +21,10 @@ import java.io.IOException;
 @Component
 public class StaticPack implements CodePacker {
     // TODO 必须指定构建存在的目录
-    private String binDirname;
+    private String artifactPath;
 
-    /*public StaticPack(String binDirname) {
-        this.binDirname = binDirname;
+    /*public StaticPack(String artifactPath) {
+        this.artifactPath = artifactPath;
     }*/
 
     private void createTargetDir(String targetPath) throws IOException {
@@ -36,11 +36,11 @@ public class StaticPack implements CodePacker {
 
     //@Override
     public String pack(String appId, String commitId, String appRootPath, String dockerfile) throws Exception {
-        if (binDirname == null) {
-            throw new Exception("存放编译产物的目录 binDirname 不能是 null");
+        if (artifactPath == null) {
+            throw new Exception("存放编译产物的路径 artifactPath 不能是 null");
         }
 
-        String sourceDirPath = appRootPath + File.separator + binDirname;
+        String sourceDirPath = appRootPath + File.separator + artifactPath;
         File srcDir = new File(sourceDirPath);
         String targetDirPath = LocalBuildDir.packDir + File.separator + appId;
         createTargetDir(targetDirPath);
@@ -62,6 +62,6 @@ public class StaticPack implements CodePacker {
 
     @Override
     public String supportType() {
-        return PackType.staticFiles.getName();
+        return PackType.ossStatic.getName();
     }
 }

+ 6 - 6
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/packer/ZipPack.java

@@ -19,10 +19,10 @@ import java.io.IOException;
 @Component
 public class ZipPack implements CodePacker {
     // TODO 必须指定构建存在的目录
-    private String binDirname;
+    private String artifactPath;
 
-    /*public ZipPack(String binDirname) {
-        this.binDirname = binDirname;
+    /*public ZipPack(String artifactPath) {
+        this.artifactPath = artifactPath;
     }*/
 
     private void createTargetDir(String targetPath) throws IOException {
@@ -34,11 +34,11 @@ public class ZipPack implements CodePacker {
 
     //@Override
     public String pack(String appId, String commitId, String appRootPath, String dockerfile) throws Exception {
-        if (binDirname == null) {
-            throw new Exception("存放编译产物的目录 binDirname 不能是 null");
+        if (artifactPath == null) {
+            throw new Exception("构建产物的路径 artifactPath 不能是 null");
         }
 
-        String sourceDirPath = appRootPath + File.separator + binDirname;
+        String sourceDirPath = appRootPath + File.separator + artifactPath;
         String targetDirPath = LocalBuildDir.packDir + File.separator + appId;
         createTargetDir(targetDirPath);
 

+ 1 - 1
mgr/src/main/resources/application-dev.yml

@@ -2,4 +2,4 @@ spring:
   datasource:
     url: jdbc:mysql://127.0.0.1/reghao_devops_rdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
     username: test
-    password: Test@123456
+    password: Test_123456

+ 4 - 1
mgr/src/main/resources/application.yml

@@ -76,4 +76,7 @@ management:
         include: "*"
   metrics:
     tags:
-      application: ${spring.application.name}
+      application: ${spring.application.name}
+logging:
+  level:
+    org: OFF

+ 3 - 0
mgr/src/main/resources/logback-spring.xml

@@ -1,6 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <configuration>
+    <!-- 关闭 logback 本身的状态监听器(StatusListener) 输出 -->
+    <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
+
     <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
         <layout class="ch.qos.logback.classic.PatternLayout">
             <pattern>