瀏覽代碼

1.更新 AppBuildServiceImpl 中的 AppConfig 更新相关实现
2.添加 Dockerfile 等镜像和容器相关配置和脚本, 将 ops-mgr 构建为镜像并在容器中运行
3.ops-mgr 在容器中运行时, 涉及到 Docker-outside-of-Docker, 即在容器内使用宿主机的 Docker Daemon, 这涉及到宿主机和容器的路径转换, 在 DockerBuild 中提供了一个 getHostPath 方法来处理这种转换, 并且需要在 AppProperties 中添加一个 hostRoot 字段指定映射的宿主机目录. 这种路径转换只有在容器内执行 docker run 时需要使用, 使用 docker build 时不需要路径转换

reghao 2 天之前
父節點
當前提交
e571fecece

+ 11 - 0
Dockerfile

@@ -0,0 +1,11 @@
+FROM eclipse-temurin:17-jdk
+
+WORKDIR /app
+
+RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
+
+COPY bin/mgr/ /app/
+
+ENV JAVA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC"
+
+ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar ops-mgr.jar --spring.config.location=classpath:/application.yml,file:/app/mgr.yml"]

+ 6 - 3
bin/mgr/mgr.yml

@@ -1,5 +1,8 @@
 spring:
   datasource:
-    url: jdbc:mysql://192.168.0.220/iquizoo_devops_tdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
-    username: azytest
-    password: Azy@123456
+    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
+app:
+  ops-root: /opt/data/devops_data1
+  host-root: /opt/data/devops_data0

+ 25 - 0
docker-compose.yml

@@ -0,0 +1,25 @@
+services:
+  ops-mgr:
+    image: registry.cn-chengdu.aliyuncs.com/tnb028/ops-mgr:12345678
+    environment:
+      - SPRING_DATASOURCE_URL=jdbc:mysql://127.0.0.1/reghao_devops_rdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
+      - SPRING_DATASOURCE_USERNAME=test
+      - SPRING_DATASOURCE_PASSWORD=Test_123456
+      - APP_OPS_ROOT=/opt/data/devops_data1
+      - APP_HOST_ROOT=/opt/data/devops_data2
+    volumes:
+      - /etc/localtime:/etc/localtime:ro
+      - /var/run/docker.sock:/var/run/docker.sock
+      - /opt/data/devops_data2:/opt/data/devops_data1
+    deploy:
+      resources:
+        limits:
+          cpus: '2.0'       # 限制使用 2 个 CPU 核心
+          memory: 2GB       # 容器内存上限
+        reservations:
+          memory: 1GB       # 预留最少 1GB 内存
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"     # 每个日志文件最大 10MB
+        max-file: "3"       # 最多保留 3 个旧日志文件

+ 32 - 0
docker-run.sh

@@ -0,0 +1,32 @@
+#!/bin/bash
+
+docker stop ops-mgr
+docker rm ops-mgr
+
+#docker run -d \
+#  --name ops-mgr \
+#  --network=host \
+#  -v /var/run/docker.sock:/var/run/docker.sock \
+#  -v /opt/data/devops_data0:/opt/data/devops_data1 \
+#  -u root \
+#  ops-mgr:12345678
+
+db_host='192.168.0.147'
+db_port='3306'
+db_name='reghao_devops_rdb'
+db_url='jdbc:mysql://127.0.0.1/reghao_devops_rdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8'
+db_username='test'
+db_password='Test@123456'
+
+docker run -d \
+  --name ops-mgr \
+  --network=host \
+  -e SPRING_DATASOURCE_URL='jdbc:mysql://'${db_host}':'${db_port}'/'${db_name}'?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8' \
+  -e SPRING_DATASOURCE_USERNAME=${db_username} \
+  -e SPRING_DATASOURCE_PASSWORD=${db_password} \
+  -e APP_OPS_ROOT=/opt/data/devops_data1 \
+  -e APP_HOST_ROOT=/opt/data/devops_data2 \
+  -v /var/run/docker.sock:/var/run/docker.sock \
+  -v /opt/data/devops_data2:/opt/data/devops_data1 \
+  -u root \
+  ops-mgr:12345678

+ 6 - 4
mgr/src/main/java/cn/reghao/devops/mgr/config/AppProperties.java

@@ -5,9 +5,6 @@ import lombok.Setter;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
 
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * @author reghao
  * @date 2021-12-30 11:01:46
@@ -17,5 +14,10 @@ import java.util.Map;
 @Setter
 @Getter
 public class AppProperties {
-    private String opsDir;
+    private String opsRoot;
+    private String hostRoot;
+
+    public boolean match() {
+        return opsRoot.equals(hostRoot);
+    }
 }

+ 2 - 0
mgr/src/main/java/cn/reghao/devops/mgr/ops/app/model/dto/AppConfigUpdateDto.java

@@ -21,6 +21,8 @@ public class AppConfigUpdateDto {
 
     // buildConfig
     @NotNull(message = "必须指定编译配置")
+    private String repoAuthConfig;
+    @NotNull(message = "必须指定编译配置")
     private String compilerConfig;
     @NotNull(message = "必须指定打包配置")
     private String packerConfig;

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

@@ -91,6 +91,7 @@ public class AppConfig extends BaseEntity implements Cloneable {
 
     public AppConfig update(AppConfigUpdateDto appConfigUpdateDto, BuildConfig buildConfig) {
         this.repoBranch = appConfigUpdateDto.getRepoBranch();
+        this.repoAuthConfig = buildConfig.getRepoAuth();
         this.compilerConfig = buildConfig.getCompiler();
         this.packerConfig = buildConfig.getPacker();
         this.dockerfile = appConfigUpdateDto.getDockerfile();

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

@@ -127,9 +127,10 @@ public class AppBuildServiceImpl implements AppBuildService {
             buildDirService.eraseLocalRepo(appId);
         }
 
+        String repoAuthName = appConfigUpdateDto.getRepoAuthConfig();
         String compilerName = appConfigUpdateDto.getCompilerConfig();
         String packerName = appConfigUpdateDto.getPackerConfig();
-        BuildConfig buildConfig = buildConfigChecker.checkAndGet(compilerName, packerName);
+        BuildConfig buildConfig = buildConfigChecker.checkAndGet(repoAuthName, compilerName, packerName);
         appConfig.update(appConfigUpdateDto, buildConfig);
         appBuildRepository.update(appConfig);
         return Result.result(ResultStatus.SUCCESS);

+ 1 - 1
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/model/vo/BuildConfig.java

@@ -19,6 +19,6 @@ public class BuildConfig {
 
     @Override
     public String toString() {
-        return repoAuth.getName() + "-" + compiler.getName() + "-" + packer.getName();
+        return /*repoAuth.getName() + "-" + */compiler.getName() + "-" + packer.getName();
     }
 }

+ 7 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/service/BuildConfigChecker.java

@@ -57,7 +57,12 @@ public class BuildConfigChecker {
         return new BuildConfig(repoAuthConfig, compilerConfig, packerConfig);
     }
 
-    public BuildConfig checkAndGet(String compilerName, String packerName) {
+    public BuildConfig checkAndGet(String repoAuthName, String compilerName, String packerName) {
+        RepoAuthConfig repoAuthConfig = repoAuthConfigRepository.findByName(repoAuthName);
+        if (repoAuthConfig == null) {
+            throw new RuntimeException("仓库认证不存在");
+        }
+
         CompilerConfig compilerConfig = compilerConfigRepository.findByName(compilerName);
         if (compilerConfig == null) {
             throw new RuntimeException("编译器配置不存在");
@@ -68,6 +73,6 @@ public class BuildConfigChecker {
             throw new RuntimeException("打包配置不存在");
         }
 
-        return new BuildConfig(null, compilerConfig, packerConfig);
+        return new BuildConfig(repoAuthConfig, compilerConfig, packerConfig);
     }
 }

+ 13 - 14
mgr/src/main/java/cn/reghao/devops/mgr/ops/build/service/impl/BuildDirServiceImpl.java

@@ -7,7 +7,6 @@ import cn.reghao.devops.mgr.ops.build.model.po.BuildDir;
 import cn.reghao.devops.mgr.ops.build.service.BuildDirService;
 import cn.reghao.devops.mgr.ops.builder.model.LocalBuildDir;
 import cn.reghao.jutil.jdk.converter.ByteConverter;
-import cn.reghao.jutil.jdk.web.result.Result;
 import jakarta.annotation.PostConstruct;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
@@ -24,14 +23,14 @@ import java.util.List;
 @Slf4j
 @Service
 public class BuildDirServiceImpl implements BuildDirService {
-    private final String opsDir;
+    private final String opsRoot;
     private final BuildDir buildDir;
     private final ByteConverter byteConverter;
     private final Disk disk;
 
     public BuildDirServiceImpl(AppProperties appProperties, Disk disk, ByteConverter byteConverter) {
-        this.opsDir = appProperties.getOpsDir();
-        this.buildDir = new BuildDir(this.opsDir);
+        this.opsRoot = appProperties.getOpsRoot();
+        this.buildDir = new BuildDir(this.opsRoot);
         this.disk = disk;
         this.byteConverter = byteConverter;
     }
@@ -39,13 +38,13 @@ public class BuildDirServiceImpl implements BuildDirService {
     @PostConstruct
     @Override
     public void init() {
-        File dir = new File(opsDir);
+        File dir = new File(opsRoot);
         if (!dir.exists() && !dir.mkdirs()) {
-            log.error("创建本地构建目录 {} 失败,ops-mgr 结束运行", opsDir);
+            log.error("创建本地构建目录 {} 失败,ops-mgr 结束运行", opsRoot);
             System.exit(1);
         } else {
             try {
-                createLocalBuildDir(opsDir);
+                createLocalBuildDir(opsRoot);
             } catch (Exception e) {
                 log.error("初始化本地构建目录失败,ops-mgr 结束运行: {}", e.getMessage());
                 System.exit(1);
@@ -53,12 +52,12 @@ public class BuildDirServiceImpl implements BuildDirService {
         }
     }
 
-    private void createLocalBuildDir(String opsDir) throws Exception {
-        LocalBuildDir.localRepo = String.format("%s/local-repo", opsDir);
-        LocalBuildDir.compileDir = String.format("%s/compile-dir", opsDir);
-        LocalBuildDir.packDir = String.format("%s/pack-dir", opsDir);
-        LocalBuildDir.cacheDir = String.format("%s/cache", opsDir);
-        LocalBuildDir.logDir = String.format("%s/log", opsDir);
+    private void createLocalBuildDir(String opsRoot) throws Exception {
+        LocalBuildDir.localRepo = String.format("%s/local-repo", opsRoot);
+        LocalBuildDir.compileDir = String.format("%s/compile-dir", opsRoot);
+        LocalBuildDir.packDir = String.format("%s/pack-dir", opsRoot);
+        LocalBuildDir.cacheDir = String.format("%s/cache", opsRoot);
+        LocalBuildDir.logDir = String.format("%s/log", opsRoot);
         List<String> dirPathList = List.of(
                 LocalBuildDir.localRepo,
                 LocalBuildDir.compileDir,
@@ -107,7 +106,7 @@ public class BuildDirServiceImpl implements BuildDirService {
 
     @Override
     public BuildDir getBuildDir() {
-        DiskDetail diskDetail = disk.diskDetail(opsDir);
+        DiskDetail diskDetail = disk.diskDetail(opsRoot);
         String mountedOn = diskDetail.getMountedOn();
         long total = diskDetail.getTotal();
         String totalStr = byteConverter.convert(total);

+ 4 - 2
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/service/PipelineContext.java

@@ -29,6 +29,7 @@ public class PipelineContext implements AutoCloseable {
     private AppBuildingRepository buildingRepository;
     private AppConfig appConfig;
     private String appId;
+    private String projDir;
     private String appType;
     private String buildId;
     private String gitUrl;
@@ -52,12 +53,13 @@ public class PipelineContext implements AutoCloseable {
         this.buildingRepository = buildingRepository;
         this.appConfig = appConfig;
         this.appId = appConfig.getAppId();
+        this.projDir = appConfig.getProjName();
         this.appType = appConfig.getAppType();
         this.buildId = buildId;
         this.gitUrl = appConfig.getAppRepo();
         this.branch = appConfig.getRepoBranch();
-        this.gitLocal = String.format("%s/%s_%s", LocalBuildDir.localRepo, this.appId, getProjName(this.gitUrl));
-        this.compileDir = String.format("%s/%s_%s", LocalBuildDir.compileDir, this.appId, getProjName(this.gitUrl));
+        this.gitLocal = String.format("%s/%s_%s", LocalBuildDir.localRepo, this.appId, this.projDir);
+        this.compileDir = String.format("%s/%s_%s", LocalBuildDir.compileDir, this.appId, this.projDir);
         this.dockerfile = appConfig.getDockerfile();
         this.logFile = new File(String.format("%s/%s_%s.log", LocalBuildDir.logDir, this.appId, this.buildId));
         if (!logFile.getParentFile().exists()) logFile.getParentFile().mkdirs();

+ 52 - 15
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/DockerBuild.java

@@ -1,6 +1,7 @@
 package cn.reghao.devops.mgr.ops.builder.tool;
 
 import cn.reghao.devops.common.docker.DockerManager;
+import cn.reghao.devops.mgr.config.AppProperties;
 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;
@@ -12,10 +13,10 @@ import com.github.dockerjava.api.command.PullImageResultCallback;
 import com.github.dockerjava.api.command.WaitContainerResultCallback;
 import com.github.dockerjava.api.exception.NotFoundException;
 import com.github.dockerjava.api.model.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.InputStreamReader;
+import java.io.*;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -26,14 +27,25 @@ import java.util.concurrent.atomic.AtomicBoolean;
  * @author reghao
  * @date 2026-02-26 13:21:42
  */
+@Slf4j
+@Component
 public class DockerBuild {
     private final DockerClient dockerClient;
+    private final AppProperties appProperties;
 
-    public DockerBuild() {
+    public DockerBuild(AppProperties appProperties) {
         this.dockerClient = DockerManager.getDocker().getDockerClient();
+        this.appProperties = appProperties;
     }
 
-    public void build(PipelineContext ctx, String repoTag, String sourceCodeDir, List<String> buildArgs) {
+    /**
+     * 采用 docker build 方式编译源码
+     *
+     * @param
+     * @return
+     * @date 2026-03-26 14:19:52
+     */
+    public void dockerBuildCompile(PipelineContext ctx, String repoTag, String sourceCodeDir, List<String> buildArgs) {
         // 使用一个原子布尔值或自定义标记来记录回调中的失败
         AtomicBoolean isFailed = new AtomicBoolean(false);
         StringBuilder errorMsg = new StringBuilder();
@@ -104,25 +116,36 @@ public class DockerBuild {
         }
     }
 
-    public void build(PipelineContext ctx, String repoTag, String sourceCodeDir,
-                      String image, String compileCmd, List<CompilerBind> compilerBinds, List<String> envs) {
+    /**
+     * 采用 docker run 方式编译源码
+     *
+     * @param
+     * @return
+     * @date 2026-03-26 14:20:15
+     */
+    public void dockerRunCompile(PipelineContext ctx, String sourceCodeDir, String compilerImage, String compileCmd,
+                                 List<CompilerBind> compilerBinds, List<String> compilerEnvs) {
+        if (appProperties.getHostRoot() != null && !appProperties.match()) {
+            sourceCodeDir = getHostPath(sourceCodeDir);
+        }
+
         try {
             // 1. 尝试查看镜像信息
-            dockerClient.inspectImageCmd(image).exec();
+            dockerClient.inspectImageCmd(compilerImage).exec();
         } catch (NotFoundException e) {
             // 2. 如果镜像不存在,执行拉取
-            ctx.log("镜像 " + image + " 不存在,正在从仓库拉取...");
+            ctx.log("镜像 " + compilerImage + " 不存在,正在从仓库拉取...");
             try {
-                dockerClient.pullImageCmd(image)
+                dockerClient.pullImageCmd(compilerImage)
                         .exec(new PullImageResultCallback())
                         .awaitCompletion(); // 这是一个阻塞操作,确保拉取完成后再继续
-                ctx.log("镜像 " + image + " 拉取完成");
+                ctx.log("镜像 " + compilerImage + " 拉取完成");
             } catch (InterruptedException ex) {
                 throw new RuntimeException(ex);
             }
         }
 
-        // 这里的 workDir 会在 docker build 使用的 Dockerfile 中被引用
+        // TODO 这里的 workDir 会在 docker build 使用的 Dockerfile 中被引用
         String workDir = "/app";
         List<Bind> bindList = new ArrayList<>();
         bindList.add(new Bind(sourceCodeDir, new Volume(workDir)));
@@ -131,9 +154,9 @@ public class DockerBuild {
         });
 
         String user = getCurrentUserMapping();
-        CreateContainerResponse container = dockerClient.createContainerCmd(image)
+        CreateContainerResponse container = dockerClient.createContainerCmd(compilerImage)
                 .withUser(user)
-                .withEnv(envs.toArray(new String[0]))
+                .withEnv(compilerEnvs.toArray(new String[0]))
                 .withHostConfig(HostConfig.newHostConfig()
                         .withCpuQuota(100000L)
                         .withCpuPeriod(100000L)
@@ -148,6 +171,20 @@ public class DockerBuild {
         //pack(ctx, sourceCodeDir, repoTag);
     }
 
+    /**
+     * opsRoot 容器目录 /opt/data/devops_data0
+     * hostRoot 主机目录 /opt/data/devops_data1
+     * 将容器目录转化为主机目录, ops-mgr 运行在容器中, 并采用 docker build 或 docker run 编译源码时需要转换目录
+     *
+     * @param
+     * @return
+     * @date 2026-03-26 15:15:38
+     */
+    private String getHostPath(String currentPath) {
+        // 将 /opt/data/devops_data0 前缀转换为 /opt/data/devops_data1
+        return currentPath.replace(appProperties.getOpsRoot(), appProperties.getHostRoot());
+    }
+
     private void runContainer(PipelineContext ctx, CreateContainerResponse container) {
         // 3. 启动容器
         dockerClient.startContainerCmd(container.getId()).exec();
@@ -419,7 +456,7 @@ public class DockerBuild {
     }
 
     public static void main(String[] args) {
-        DockerBuild dockerBuild = new DockerBuild();
+        //DockerBuild dockerBuild = new DockerBuild();
         //dockerBuild.executeDockerBuildFlow("");
         //dockerBuild.build1();
         //dockerBuild.build2();

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

@@ -22,20 +22,20 @@ import java.util.stream.Collectors;
 public class DockerBuildCompiler implements CodeCompiler {
     private final DockerBuild dockerBuild;
 
-    public DockerBuildCompiler() {
-        this.dockerBuild = new DockerBuild();
+    public DockerBuildCompiler(DockerBuild dockerBuild) {
+        this.dockerBuild = dockerBuild;
     }
 
     @Override
     public void compile(PipelineContext ctx, CompilerConfig compilerConfig) throws Exception {
         String repoTag = ctx.getRepoTag();
         String sourceCodeDir = ctx.getCompileDir();
+
+        // 1. 将数据库中的内容写入到编译目录下的临时文件
         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);
@@ -48,7 +48,7 @@ public class DockerBuildCompiler implements CodeCompiler {
                 .map(CompilerEnv::getEnv)
                 .collect(Collectors.toList());
 
-        dockerBuild.build(ctx, repoTag, sourceCodeDir, buildArgs);
+        dockerBuild.dockerBuildCompile(ctx, repoTag, sourceCodeDir, buildArgs);
         ctx.setBuildTargetPath(repoTag);
     }
 

+ 7 - 7
mgr/src/main/java/cn/reghao/devops/mgr/ops/builder/tool/compiler/DockerRunCompiler.java

@@ -22,33 +22,33 @@ import java.util.stream.Collectors;
 public class DockerRunCompiler implements CodeCompiler {
     private final DockerBuild dockerBuild;
 
-    public DockerRunCompiler() {
-        this.dockerBuild = new DockerBuild();
+    public DockerRunCompiler(DockerBuild dockerBuild) {
+        this.dockerBuild = dockerBuild;
     }
 
     @Override
     public void compile(PipelineContext ctx, CompilerConfig compilerConfig) throws Exception {
         String repoTag = ctx.getRepoTag();
         String sourceCodeDir = ctx.getCompileDir();
+
+        // 1. 将数据库中的内容写入到编译目录下的临时文件
         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 compilerImage = compilerConfig.getCompilerImage();
         String compileCmd = compilerConfig.getCompileCmd();
         List<CompilerBind> compilerBinds = compilerConfig.getCompilerBinds();
-        List<String> envs = compilerConfig.getCompilerEnvs().stream()
+        List<String> compilerEnvs = compilerConfig.getCompilerEnvs().stream()
                 .map(CompilerEnv::getEnv)
                 .collect(Collectors.toList());
 
-        dockerBuild.build(ctx, repoTag, sourceCodeDir, image, compileCmd, compilerBinds, envs);
+        dockerBuild.dockerRunCompile(ctx, sourceCodeDir, compilerImage, compileCmd, compilerBinds, compilerEnvs);
         ctx.setBuildTargetPath(repoTag);
     }
 

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

@@ -18,8 +18,8 @@ import org.springframework.stereotype.Component;
 public class DockerPack implements CodePacker {
     private final DockerBuild dockerBuild;
 
-    public DockerPack() {
-        this.dockerBuild = new DockerBuild();
+    public DockerPack(DockerBuild dockerBuild) {
+        this.dockerBuild = dockerBuild;
     }
 
     @Override

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

@@ -2,4 +2,6 @@ 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
+app:
+  ops-root: /opt/data/devops_data

+ 3 - 1
mgr/src/main/resources/application-test.yml

@@ -2,4 +2,6 @@ spring:
   datasource:
     url: jdbc:mysql://192.168.0.220/iquizoo_devops_tdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
     username: azytest
-    password: Azy@123456
+    password: Azy@123456
+app:
+  ops-root: /opt/data/devops_data