From af79d15a4a51107931b1fa683dbde194a835a14e Mon Sep 17 00:00:00 2001 From: ddmte32 Date: Sat, 21 Jun 2025 09:21:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=8F=91=E7=8E=AF=E5=A2=83=E5=8F=AF?= =?UTF-8?q?=E9=80=89=E4=BB=A3=E7=A0=81=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/platform/domain/DevEnvironment.java | 2 +- .../impl/DevEnvironmentServiceImpl.java | 58 ++++++++++++++++++- .../service/impl/JupyterServiceImpl.java | 2 +- .../service/impl/ModelsServiceImpl.java | 5 +- .../service/impl/NewDatasetServiceImpl.java | 6 +- .../ruoyi/platform/utils/K8sClientUtil.java | 15 +++-- .../ruoyi/platform/vo/DevEnvironmentVo.java | 5 ++ .../DevEnvironmentDaoMapper.xml | 14 ++--- 8 files changed, 84 insertions(+), 23 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/DevEnvironment.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/DevEnvironment.java index 90a67719..8acca733 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/DevEnvironment.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/DevEnvironment.java @@ -63,7 +63,7 @@ public class DevEnvironment implements Serializable { /** * 备用字段2 */ - private String altField2; + private String codePath; /** * 创建者 */ diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DevEnvironmentServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DevEnvironmentServiceImpl.java index 4ecef87b..d64a45a5 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DevEnvironmentServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DevEnvironmentServiceImpl.java @@ -1,18 +1,23 @@ package com.ruoyi.platform.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.platform.domain.CodeConfig; import com.ruoyi.platform.domain.DevEnvironment; import com.ruoyi.platform.domain.PodStatus; import com.ruoyi.platform.mapper.DevEnvironmentDao; -import com.ruoyi.platform.service.DevEnvironmentService; -import com.ruoyi.platform.service.JupyterService; -import com.ruoyi.platform.service.ResourceOccupyService; +import com.ruoyi.platform.service.*; +import com.ruoyi.platform.utils.DVCUtils; import com.ruoyi.platform.utils.JacksonUtil; import com.ruoyi.platform.vo.DevEnvironmentVo; +import com.ruoyi.platform.vo.GitProjectVo; import com.ruoyi.platform.vo.PodStatusVo; import com.ruoyi.system.api.constant.Constant; import com.ruoyi.system.api.model.LoginUser; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -23,6 +28,9 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Date; import java.util.List; +import java.util.Map; + +import static com.ruoyi.common.security.utils.SecurityUtils.decrypt; /** * (DevEnvironment)表服务实现类 @@ -30,6 +38,7 @@ import java.util.List; * @author Xidaray * @since 2024-06-03 15:17:37 */ +@Slf4j @Service("devEnvironmentService") public class DevEnvironmentServiceImpl implements DevEnvironmentService { @Resource @@ -38,9 +47,19 @@ public class DevEnvironmentServiceImpl implements DevEnvironmentService { @Resource @Lazy private JupyterService jupyterService; + @Resource private ResourceOccupyService resourceOccupyService; + @Resource + private DVCUtils dvcUtils; + + @Value("${git.localPath}") + String localPathlocal; + + @Resource + private CodeConfigService codeConfigService; + /** * 通过ID查询单条数据 * @@ -101,6 +120,7 @@ public class DevEnvironmentServiceImpl implements DevEnvironmentService { //插入预备,此时不需要判断版本重复 DevEnvironment devEnvironment = new DevEnvironment(); LoginUser loginUser = SecurityUtils.getLoginUser(); + String localPath = cloneCode(devEnvironmentVo.getCodeConfigId()); devEnvironment.setName(devEnvironmentVo.getName()); //状态先设为未知 devEnvironment.setStatus(Constant.Unknown); @@ -120,6 +140,7 @@ public class DevEnvironmentServiceImpl implements DevEnvironmentService { devEnvironment.setUpdateTime(new Date()); devEnvironment.setCreateTime(new Date()); devEnvironment.setState(Constant.State_valid); + devEnvironment.setCodePath(localPath); this.devEnvironmentDao.insert(devEnvironment); return devEnvironment; } @@ -174,4 +195,35 @@ public class DevEnvironmentServiceImpl implements DevEnvironmentService { resourceOccupyService.deleteTaskState(Constant.TaskType_Dev, Long.valueOf(id), null); return this.devEnvironmentDao.update(devEnvironment) > 0 ? "删除成功" : "删除失败"; } + + /** + * 保存代码数据并返回保存路径 + * @param codeConfigId + * @return + */ + private String cloneCode(Long codeConfigId) { + String localPath = null; + try { + CodeConfig codeConfig = codeConfigService.queryById(codeConfigId); + if (ObjectUtil.isEmpty(codeConfig)) { + log.info("[returnCodeConfig error,codeConfigId={}]", codeConfigId); + return localPath; + } + + LoginUser loginUser = SecurityUtils.getLoginUser(); + String gitLinkUsername = loginUser.getSysUser().getUserName(); + String ci4sUsername = Boolean.TRUE.equals(codeConfig.getIsPublic()) ? Constant.Item_Public : loginUser.getUsername(); + + String gitLinkPassword = decrypt(loginUser.getSysUser().getOriginPassword()); + String repositoryName = ci4sUsername + "_code_" + DateUtils.dateTimeNow(); + + String relatePath = ci4sUsername + "/code/" + repositoryName + "/" + codeConfig.getGitBranch(); + localPath = localPathlocal + relatePath; + dvcUtils.gitClone(localPath, codeConfig.getGitUrl(), codeConfig.getGitBranch(), gitLinkUsername, gitLinkPassword); + + } catch (Exception e) { + log.error("[returnCodeConfig error,codeConfigId={}]", codeConfigId); + } + return localPath; + } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/JupyterServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/JupyterServiceImpl.java index 7cd30203..e79f2139 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/JupyterServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/JupyterServiceImpl.java @@ -105,7 +105,7 @@ public class JupyterServiceImpl implements JupyterService { // 调用修改后的 createPod 方法,传入额外的参数 // Integer podPort = k8sClientUtil.createConfiguredPod(podName, namespace, port, mountPath, pvc, devEnvironment, minioPvcName, datasetPath, modelPath); - Integer podPort = k8sClientUtil.createConfiguredPod(podName, namespace, port, mountPath, null, devEnvironment, minioPvcName, datasetPath, modelPath); + Integer podPort = k8sClientUtil.createConfiguredPod(podName, namespace, port, mountPath, null, devEnvironment, minioPvcName, datasetPath, modelPath,devEnvironment.getCodePath()); String url = masterIp + ":" + podPort; redisService.setCacheObject(podName, masterIp + ":" + podPort); devEnvironment.setStatus(Constant.Pending); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java index 2d939421..e1aeb57e 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.platform.service.impl; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; @@ -1325,10 +1326,10 @@ public class ModelsServiceImpl implements ModelsService { } if (modelTopicName != null && modelTopic.equals(modelTopicName)) { - if (StringUtils.isNotEmpty(modelTagName) && !modelTagName.toLowerCase().equals(modelTag)) { + if (StrUtil.containsAnyIgnoreCase(modelTagName,modelTag)) { continue; } - if (StringUtils.isNotEmpty(modelTypeName) && !modelTypeName.toLowerCase().equals(modelType)) { + if (StrUtil.containsAnyIgnoreCase(modelTypeName,modelType)) { continue; } newModelVo.setModelTag(modelTagName); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/NewDatasetServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/NewDatasetServiceImpl.java index 8d5a4244..f9104abc 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/NewDatasetServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/NewDatasetServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.platform.service.impl; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSON; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.security.utils.SecurityUtils; @@ -34,7 +35,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; -import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -666,10 +666,10 @@ public class NewDatasetServiceImpl implements NewDatasetService { } if (datasetTopic.equals(datasetTopicName)) { - if (StringUtils.isNotEmpty(datasetTagName) && !datasetTagName.toLowerCase().equals(datasetTag)) { + if (StrUtil.containsAnyIgnoreCase(datasetTagName,datasetTag)) { continue; } - if (StringUtils.isNotEmpty(datasetTypeName) && !datasetTypeName.toLowerCase().equals(datasetType)) { + if (StrUtil.containsAnyIgnoreCase(datasetTypeName,datasetType)) { continue; } newDatasetVo.setDataTag(datasetTagName); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java index d29ed668..99e170c1 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java @@ -73,10 +73,10 @@ public class K8sClientUtil { this.http = http; this.token = token; try { -// this.apiClient = new ClientBuilder(). -// setBasePath(http).setVerifyingSsl(false). -// setAuthentication(new AccessTokenAuthentication(token)).build(); - this.apiClient = Config.fromCluster(); + this.apiClient = new ClientBuilder(). + setBasePath(http).setVerifyingSsl(false). + setAuthentication(new AccessTokenAuthentication(token)).build(); +// this.apiClient = Config.fromCluster(); } catch (Exception e) { log.error("构建K8s-Client异常", e); throw new RuntimeException("构建K8s-Client异常"); @@ -436,7 +436,7 @@ public class K8sClientUtil { } // 创建配置好的Pod - public Integer createConfiguredPod(String podName, String namespace, Integer port, String mountPath, V1PersistentVolumeClaim pvc, DevEnvironment devEnvironment, String dataPvcName, String datasetPath, String modelPath) throws IOException { + public Integer createConfiguredPod(String podName, String namespace, Integer port, String mountPath, V1PersistentVolumeClaim pvc, DevEnvironment devEnvironment, String dataPvcName, String datasetPath, String modelPath,String codePath) throws IOException { //设置选择节点,pod反亲和性 Map selector = new LinkedHashMap<>(); @@ -512,7 +512,10 @@ public class K8sClientUtil { if (StringUtils.isNotEmpty(modelPath)) { volumeMounts.add(new V1VolumeMount().name("data").mountPath("/opt/model").subPath(modelPath).readOnly(true)); } - if (StringUtils.isNotEmpty(datasetPath) || StringUtils.isNotEmpty(modelPath)) { + if (StringUtils.isNotEmpty(modelPath)) { + volumeMounts.add(new V1VolumeMount().name("data").mountPath("/opt/code").subPath(modelPath).readOnly(true)); + } + if (StringUtils.isNotEmpty(datasetPath) || StringUtils.isNotEmpty(modelPath) || StringUtils.isNotEmpty(codePath)) { volumes.add(new V1Volume().name("data").hostPath(new V1HostPathVolumeSource().path(hostPath).type("DirectoryOrCreate"))); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/DevEnvironmentVo.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/DevEnvironmentVo.java index 5fc9030e..0cce7d79 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/DevEnvironmentVo.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/DevEnvironmentVo.java @@ -31,6 +31,11 @@ public class DevEnvironmentVo implements Serializable { * 环境变量 */ private String envVariable; + + /** + * 代码配置ID + */ + private Long codeConfigId; /** * 所用镜像 */ diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/DevEnvironmentDaoMapper.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/DevEnvironmentDaoMapper.xml index 01dfc703..b09ab9a5 100644 --- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/DevEnvironmentDaoMapper.xml +++ b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/DevEnvironmentDaoMapper.xml @@ -46,8 +46,8 @@ and url = #{devEnvironment.url} - - and alt_field2 = #{devEnvironment.altField2} + + and alt_field2 = #{devEnvironment.codePath} and create_by = #{devEnvironment.createBy} @@ -105,8 +105,8 @@ and url = #{devEnvironment.url} - - and alt_field2 = #{devEnvironment.altField2} + + and alt_field2 = #{devEnvironment.codePath} and create_by = #{devEnvironment.createBy} @@ -143,7 +143,7 @@ #{devEnvironment.dataset}, #{devEnvironment.model}, #{devEnvironment.url}, - #{devEnvironment.altField2}, + #{devEnvironment.codePath}, #{devEnvironment.createBy}, #{devEnvironment.createTime}, #{devEnvironment.updateBy}, @@ -186,8 +186,8 @@ url = #{devEnvironment.url}, - - alt_field2 = #{devEnvironment.altField2}, + + alt_field2 = #{devEnvironment.codePath}, create_by = #{devEnvironment.createBy},