From a6c4eaa537014cf18d8deaf0abc936daac3f7284 Mon Sep 17 00:00:00 2001 From: lvzk <897706680@qq.com> Date: Sat, 19 Apr 2025 22:39:35 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=93=9D=E7=BB=BF=E6=89=A7=E8=A1=8C=E7=AD=96?= =?UTF-8?q?=E7=95=A5=20#[1402157146800128]=E5=8F=91=E5=B8=83=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=93=9D=E7=BB=BF=E6=89=A7=E8=A1=8C=E7=AD=96=E7=95=A5?= =?UTF-8?q?=20http://192.168.0.96:8090/demo/rdm.html#/story-detail/9390509?= =?UTF-8?q?47543040/939050947543042/1402157146800128?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../env/GetDeployAppConfigEnvInfoApi.java | 26 +++++- .../api/bluegreen/SaveBlueGreenApi.java | 82 +++++++++++++++++ .../bluegreen/SaveInstanceBlueGreenApi.java | 77 ++++++++++++++++ .../api/bluegreen/SearchBlueGreenApi.java | 87 ++++++++++++++++++ .../dao/mapper/DeployBlueGreenMapper.java | 49 ++++++++++ .../dao/mapper/DeployBlueGreenMapper.xml | 89 +++++++++++++++++++ .../type/DeployJobSourceTypeHandler.java | 52 ++++++++++- .../changelog/2025-04-19/neatlogic_tenant.sql | 25 ++++++ .../resources/deploy/sqlscript/dml.sql | 5 +- 9 files changed, 487 insertions(+), 5 deletions(-) create mode 100644 src/main/java/neatlogic/module/deploy/api/bluegreen/SaveBlueGreenApi.java create mode 100644 src/main/java/neatlogic/module/deploy/api/bluegreen/SaveInstanceBlueGreenApi.java create mode 100644 src/main/java/neatlogic/module/deploy/api/bluegreen/SearchBlueGreenApi.java create mode 100644 src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.java create mode 100644 src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.xml create mode 100644 src/main/resources/neatlogic/resources/deploy/changelog/2025-04-19/neatlogic_tenant.sql diff --git a/src/main/java/neatlogic/module/deploy/api/appconfig/env/GetDeployAppConfigEnvInfoApi.java b/src/main/java/neatlogic/module/deploy/api/appconfig/env/GetDeployAppConfigEnvInfoApi.java index 3da3c014..d428352e 100644 --- a/src/main/java/neatlogic/module/deploy/api/appconfig/env/GetDeployAppConfigEnvInfoApi.java +++ b/src/main/java/neatlogic/module/deploy/api/appconfig/env/GetDeployAppConfigEnvInfoApi.java @@ -15,6 +15,7 @@ along with this program. If not, see .*/ package neatlogic.module.deploy.api.appconfig.env; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.common.utils.CollectionUtils; @@ -29,11 +30,13 @@ import neatlogic.framework.deploy.auth.DEPLOY_BASE; import neatlogic.framework.deploy.dto.app.DeployAppConfigEnvDBConfigVo; import neatlogic.framework.deploy.dto.app.DeployAppEnvAutoConfigKeyValueVo; import neatlogic.framework.deploy.dto.app.DeployAppEnvAutoConfigVo; +import neatlogic.framework.deploy.dto.app.DeployInstanceBlueGreenVo; import neatlogic.framework.deploy.dto.instance.DeployInstanceVersionVo; import neatlogic.framework.restful.annotation.*; import neatlogic.framework.restful.constvalue.OperationTypeEnum; import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase; import neatlogic.module.deploy.dao.mapper.DeployAppConfigMapper; +import neatlogic.module.deploy.dao.mapper.DeployBlueGreenMapper; import neatlogic.module.deploy.dao.mapper.DeployInstanceVersionMapper; import neatlogic.module.deploy.dao.mapper.DeployResourceMapper; import org.springframework.stereotype.Service; @@ -64,6 +67,9 @@ public class GetDeployAppConfigEnvInfoApi extends PrivateApiComponentBase { @Resource private DeployResourceMapper deployResourceMapper; + @Resource + private DeployBlueGreenMapper blueGreenMapper; + @Override public String getToken() { return "deploy/app/config/env/info/get"; @@ -110,7 +116,7 @@ public class GetDeployAppConfigEnvInfoApi extends PrivateApiComponentBase { Map versionMap = instanceVersionVoList.stream().collect(Collectors.toMap(DeployInstanceVersionVo::getResourceId, e -> e)); JSONArray instanceArray = new JSONArray(); for (ResourceVo resourceVo : instanceList) { - JSONObject instanceObj = (JSONObject) JSONObject.toJSON(resourceVo); + JSONObject instanceObj = (JSONObject) JSON.toJSON(resourceVo); instanceObj.put("version", versionMap.containsKey(resourceVo.getId()) ? versionMap.get(resourceVo.getId()).getVersion() : ""); instanceObj.put("instanceVersion", versionMap.get(resourceVo.getId())); instanceArray.add(instanceObj); @@ -133,6 +139,24 @@ public class GetDeployAppConfigEnvInfoApi extends PrivateApiComponentBase { autoConfigVo.setInstanceIp(instanceResourceVo.getIp()); autoConfigVo.setInstancePort(instanceResourceVo.getPort()); } + + //补充蓝绿 + List instanceBlueGreenVos = blueGreenMapper.listInstanceBlueGreen(paramObj.getLong("appSystemId"), paramObj.getLong("appModuleId"), paramObj.getLong("envId"), instanceIdList); + if(CollectionUtils.isNotEmpty(instanceBlueGreenVos)){ + Map deployInstanceBlueGreenVoMap = instanceBlueGreenVos.stream().collect(Collectors.toMap(DeployInstanceBlueGreenVo::getResourceId, e->e)); + JSONArray instanceArray = envInfo.getJSONArray("instanceList"); + if(CollectionUtils.isNotEmpty(instanceArray)){ + for (int i = 0; i < instanceArray.size(); i++) { + JSONObject instanceJson = instanceArray.getJSONObject(i); + DeployInstanceBlueGreenVo deployInstanceBlueGreenVo = deployInstanceBlueGreenVoMap.get(instanceJson.getLong("id")); + if(deployInstanceBlueGreenVo != null) { + instanceJson.put("blueGreenId", deployInstanceBlueGreenVo.getBlueGreenId()); + instanceJson.put("blueGreenName", deployInstanceBlueGreenVo.getBlueGreenName()); + } + } + } + + } } /*获取DB配置,核实dbResourceId是否存在,不存在则删除关系*/ diff --git a/src/main/java/neatlogic/module/deploy/api/bluegreen/SaveBlueGreenApi.java b/src/main/java/neatlogic/module/deploy/api/bluegreen/SaveBlueGreenApi.java new file mode 100644 index 00000000..58bc6dbe --- /dev/null +++ b/src/main/java/neatlogic/module/deploy/api/bluegreen/SaveBlueGreenApi.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2025 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package neatlogic.module.deploy.api.bluegreen; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.auth.core.AuthAction; +import neatlogic.framework.common.constvalue.ApiParamType; +import neatlogic.framework.deploy.auth.DEPLOY_BASE; +import neatlogic.framework.deploy.dto.app.DeployBlueGreenVo; +import neatlogic.framework.restful.annotation.Description; +import neatlogic.framework.restful.annotation.Input; +import neatlogic.framework.restful.annotation.OperationType; +import neatlogic.framework.restful.annotation.Param; +import neatlogic.framework.restful.constvalue.OperationTypeEnum; +import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase; +import neatlogic.module.deploy.dao.mapper.DeployBlueGreenMapper; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author longrf + * @date 2022/12/8 14:42 + */ + +@Service +@AuthAction(action = DEPLOY_BASE.class) +@OperationType(type = OperationTypeEnum.SEARCH) +public class SaveBlueGreenApi extends PrivateApiComponentBase { + + @Resource + DeployBlueGreenMapper deployBlueGreenMapper; + + @Override + public String getName() { + return "nmdab.savebluegreenapi.getname"; + } + + @Override + public String getToken() { + return "deploy/bluegreen/save"; + } + + @Override + public String getConfig() { + return null; + } + + @Input({ + @Param(name = "id", type = ApiParamType.LONG, desc = "id"), + @Param(name = "name", type = ApiParamType.STRING, desc = "common.name", isRequired = true, xss = true), + @Param(name = "sort", type = ApiParamType.INTEGER, desc = "common.sort", isRequired = true), + @Param(name = "isActive", type = ApiParamType.INTEGER, desc = "common.isactive", isRequired = true), + }) + @Description(desc = "nmdab.savebluegreenapi.getname") + @Override + public Object myDoService(JSONObject paramObj) throws Exception { + Long id = paramObj.getLong("id"); + DeployBlueGreenVo blueGreenVo = JSON.toJavaObject(paramObj, DeployBlueGreenVo.class); + if(id != null){ + deployBlueGreenMapper.updateBlueGreen(blueGreenVo); + }else{ + deployBlueGreenMapper.insertBlueGreen(blueGreenVo); + } + return null; + } +} diff --git a/src/main/java/neatlogic/module/deploy/api/bluegreen/SaveInstanceBlueGreenApi.java b/src/main/java/neatlogic/module/deploy/api/bluegreen/SaveInstanceBlueGreenApi.java new file mode 100644 index 00000000..a174cc00 --- /dev/null +++ b/src/main/java/neatlogic/module/deploy/api/bluegreen/SaveInstanceBlueGreenApi.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2025 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package neatlogic.module.deploy.api.bluegreen; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.auth.core.AuthAction; +import neatlogic.framework.common.constvalue.ApiParamType; +import neatlogic.framework.deploy.auth.DEPLOY_BASE; +import neatlogic.framework.deploy.dto.app.DeployInstanceBlueGreenVo; +import neatlogic.framework.restful.annotation.Description; +import neatlogic.framework.restful.annotation.Input; +import neatlogic.framework.restful.annotation.OperationType; +import neatlogic.framework.restful.annotation.Param; +import neatlogic.framework.restful.constvalue.OperationTypeEnum; +import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase; +import neatlogic.module.deploy.dao.mapper.DeployBlueGreenMapper; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author longrf + * @date 2022/12/8 14:42 + */ + +@Service +@AuthAction(action = DEPLOY_BASE.class) +@OperationType(type = OperationTypeEnum.SEARCH) +public class SaveInstanceBlueGreenApi extends PrivateApiComponentBase { + + @Resource + DeployBlueGreenMapper deployBlueGreenMapper; + + @Override + public String getName() { + return "nmdab.saveinstancebluegreenapi.getname"; + } + + @Override + public String getToken() { + return "deploy/app/instance/bluegreen/save"; + } + + @Override + public String getConfig() { + return null; + } + + @Input({ + @Param(name = "appSystemId", type = ApiParamType.LONG, desc = "应用id", isRequired = true), + @Param(name = "appModuleId", type = ApiParamType.LONG, desc = "模块id", isRequired = true), + @Param(name = "envId", type = ApiParamType.LONG, desc = "环境id", isRequired = true), + @Param(name = "resourceId", type = ApiParamType.LONG, desc = "实例id", isRequired = true), + @Param(name = "blueGreenId", type = ApiParamType.LONG, desc = "蓝绿id", isRequired = true) + }) + @Description(desc = "nmdab.saveinstancebluegreenapi.getname") + @Override + public Object myDoService(JSONObject paramObj) throws Exception { + DeployInstanceBlueGreenVo instanceBlueGreenVo = JSON.toJavaObject(paramObj, DeployInstanceBlueGreenVo.class); + return deployBlueGreenMapper.insertInstanceBlueGreen(instanceBlueGreenVo); + } +} diff --git a/src/main/java/neatlogic/module/deploy/api/bluegreen/SearchBlueGreenApi.java b/src/main/java/neatlogic/module/deploy/api/bluegreen/SearchBlueGreenApi.java new file mode 100644 index 00000000..0944410a --- /dev/null +++ b/src/main/java/neatlogic/module/deploy/api/bluegreen/SearchBlueGreenApi.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2025 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package neatlogic.module.deploy.api.bluegreen; + +import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.auth.core.AuthAction; +import neatlogic.framework.common.constvalue.ApiParamType; +import neatlogic.framework.deploy.auth.DEPLOY_BASE; +import neatlogic.framework.deploy.dto.app.DeployBlueGreenVo; +import neatlogic.framework.deploy.dto.type.DeployTypeVo; +import neatlogic.framework.restful.annotation.*; +import neatlogic.framework.restful.constvalue.OperationTypeEnum; +import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase; +import neatlogic.framework.util.TableResultUtil; +import neatlogic.module.deploy.dao.mapper.DeployBlueGreenMapper; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * @author longrf + * @date 2022/12/8 14:42 + */ + +@Service +@AuthAction(action = DEPLOY_BASE.class) +@OperationType(type = OperationTypeEnum.SEARCH) +public class SearchBlueGreenApi extends PrivateApiComponentBase { + + @Resource + DeployBlueGreenMapper deployBlueGreenMapper; + + @Override + public String getName() { + return "nmdab.searchbluegreenapi.getname"; + } + + @Override + public String getToken() { + return "deploy/bluegreen/search"; + } + + @Override + public String getConfig() { + return null; + } + + @Input({ + @Param(name = "keyword", type = ApiParamType.STRING, desc = "nmdab.searchbluegreenapi.input.param.desc.keyword", xss = true), + @Param(name = "isActive", type = ApiParamType.INTEGER, desc = "nmdab.searchbluegreenapi.input.param.desc.isactive"), + @Param(name = "currentPage", type = ApiParamType.INTEGER, desc = "common.currentpage"), + @Param(name = "pageSize", type = ApiParamType.INTEGER, desc = "nmdab.searchbluegreenapi.input.param.desc.pagesize"), + @Param(name = "needPage", type = ApiParamType.BOOLEAN, desc = "nmdab.searchbluegreenapi.input.param.desc.needpage") + }) + @Output({ + @Param(name = "tbodyList", type = ApiParamType.JSONARRAY, explode = DeployTypeVo[].class), + @Param(explode = DeployBlueGreenVo.class) + }) + @Description(desc = "nmdab.searchbluegreenapi.getname") + @Override + public Object myDoService(JSONObject paramObj) throws Exception { + DeployBlueGreenVo deployBlueGreenVo = paramObj.toJavaObject(DeployBlueGreenVo.class); + List deployBlueGreenList = new ArrayList<>(); + int rowNum = deployBlueGreenMapper.getBlueGreenCount(deployBlueGreenVo); + if (rowNum > 0) { + deployBlueGreenVo.setRowNum(rowNum); + deployBlueGreenList = deployBlueGreenMapper.searchBlueGreen(deployBlueGreenVo); + } + return TableResultUtil.getResult(deployBlueGreenList, deployBlueGreenVo); + } +} diff --git a/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.java b/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.java new file mode 100644 index 00000000..83dbc8a7 --- /dev/null +++ b/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2025 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package neatlogic.module.deploy.dao.mapper; + +import neatlogic.framework.deploy.dto.app.DeployBlueGreenVo; +import neatlogic.framework.deploy.dto.app.DeployInstanceBlueGreenVo; +import neatlogic.framework.deploy.dto.app.DeployJobPhaseNodeBlueGreenVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author longrf + * @date 2022/12/8 15:07 + */ + +public interface DeployBlueGreenMapper { + + + Integer getBlueGreenCount(DeployBlueGreenVo deployBlueGreenVo); + + List searchBlueGreen(DeployBlueGreenVo deployBlueGreenVo); + + Integer updateBlueGreen(DeployBlueGreenVo deployBlueGreenVo); + + Integer insertBlueGreen(DeployBlueGreenVo deployBlueGreenVo); + + Integer insertInstanceBlueGreen(DeployInstanceBlueGreenVo instanceBlueGreenVo); + + List listInstanceBlueGreen(@Param("appSystemId") Long appSystemId, @Param("appModuleId") Long appModuleId, @Param("envId") Long envId, @Param("resourceIdList") List instanceIdList); + + void insertDeployJobPhaseNodeBlueGreen(List deployJobPhaseNodeBlueGreenVos); + + void deleteJobPhaseNodeBlueGreenByJobPhaseIdAndUpdateTag(Long jobPhaseId, Long updateTag); +} diff --git a/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.xml b/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.xml new file mode 100644 index 00000000..fc31059c --- /dev/null +++ b/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + update `deploy_blue_green` set `name` = #{name},`is_active` = #{isActive} + where `id` = #{id} + + + + insert into `deploy_blue_green` (`id`, `name`, `sort`, `is_active`) + values (#{id}, #{name}, #{sort}, #{isActive}) + + + insert into `deploy_app_instance_blue_green` (`app_system_id`, `app_module_id`, `env_id`, `resource_id`, + `blue_green_id`) + values (#{appSystemId}, #{appModuleId}, #{envId}, #{resourceId}, #{blueGreenId}) + on duplicate key + update `blue_green_id` = #{blueGreenId} + + + + insert into `deploy_job_phase_node_blue_green`(`job_id`, + `job_phase_id`,`job_phase_node_id`,`blue_green_id`,`update_tag`) + values + + (#{jobId}, #{jobPhaseId},#{jobPhaseNodeId},#{blueGreenId},#{updateTag}) + + on duplicate key + update `blue_green_id` = VALUES(`blue_green_id`), + `update_tag` = VALUES(`update_tag`) + + + + DELETE + FROM `deploy_job_phase_node_blue_green` + where `job_phase_id` = #{jobPhaseId} + and `update_tag` != #{updateTag} + + \ No newline at end of file diff --git a/src/main/java/neatlogic/module/deploy/job/source/type/DeployJobSourceTypeHandler.java b/src/main/java/neatlogic/module/deploy/job/source/type/DeployJobSourceTypeHandler.java index e9505c71..59e1d261 100644 --- a/src/main/java/neatlogic/module/deploy/job/source/type/DeployJobSourceTypeHandler.java +++ b/src/main/java/neatlogic/module/deploy/job/source/type/DeployJobSourceTypeHandler.java @@ -46,9 +46,7 @@ import neatlogic.framework.deploy.auth.BATCHDEPLOY_MODIFY; import neatlogic.framework.deploy.auth.DEPLOY_MODIFY; import neatlogic.framework.deploy.auth.core.DeployAppAuthChecker; import neatlogic.framework.deploy.constvalue.*; -import neatlogic.framework.deploy.dto.app.DeployAppConfigAuthorityActionVo; -import neatlogic.framework.deploy.dto.app.DeployPipelineConfigVo; -import neatlogic.framework.deploy.dto.app.DeployProfileVo; +import neatlogic.framework.deploy.dto.app.*; import neatlogic.framework.deploy.dto.instance.DeployInstanceVersionVo; import neatlogic.framework.deploy.dto.job.DeployJobContentVo; import neatlogic.framework.deploy.dto.job.DeployJobVo; @@ -114,6 +112,9 @@ public class DeployJobSourceTypeHandler extends AutoexecJobSourceTypeHandlerBase @Resource DeployInstanceVersionMapper deployInstanceVersionMapper; + @Resource + DeployBlueGreenMapper deployBlueGreenMapper; + @Override public String getName() { return JobSourceType.DEPLOY.getValue(); @@ -753,6 +754,11 @@ public class DeployJobSourceTypeHandler extends AutoexecJobSourceTypeHandlerBase Long appModuleId = deployJobVo.getAppModuleId(); Long envId = deployJobVo.getEnvId(); List instanceIdList = jobPhaseNodeVoList.stream().map(AutoexecJobPhaseNodeVo::getResourceId).filter(Objects::nonNull).collect(Collectors.toList()); + List deployInstanceBlueGreenVos = deployBlueGreenMapper.listInstanceBlueGreen(deployJobVo.getAppSystemId(), deployJobVo.getAppModuleId(), deployJobVo.getEnvId(), instanceIdList); + Map deployInstanceBlueGreenVoMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(deployInstanceBlueGreenVos)) { + deployInstanceBlueGreenVoMap = deployInstanceBlueGreenVos.stream().collect(Collectors.toMap(DeployInstanceBlueGreenVo::getResourceId, e -> e)); + } if (CollectionUtils.isNotEmpty(instanceIdList)) { List instanceVersionVoList = deployInstanceVersionMapper.getDeployInstanceVersionByEnvIdAndInstanceIdList(appSystemId, appModuleId, envId, instanceIdList); Map versionMap = instanceVersionVoList.stream().collect(Collectors.toMap(DeployInstanceVersionVo::getResourceId, e -> e)); @@ -764,10 +770,50 @@ public class DeployJobSourceTypeHandler extends AutoexecJobSourceTypeHandlerBase } extraInfo.put("version", versionMap.containsKey(jobPhaseNodeVo.getResourceId()) ? versionMap.get(jobPhaseNodeVo.getResourceId()).getVersion() : ""); extraInfo.put("instanceVersion", versionMap.get(jobPhaseNodeVo.getResourceId())); + + DeployInstanceBlueGreenVo deployInstanceBlueGreenVo = deployInstanceBlueGreenVoMap.get(jobPhaseNodeVo.getResourceId()); + if (deployInstanceBlueGreenVo != null) { + extraInfo.put("blueGreenId", deployInstanceBlueGreenVo.getBlueGreenId()); + extraInfo.put("blueGreenName", deployInstanceBlueGreenVo.getBlueGreenName()); + } jobPhaseNodeVo.setExtraInfo(extraInfo); } } } } } + + @Override + public void handleAddJobPhaseNodeEvent(AutoexecJobVo jobVo, List autoexecJobPhaseNodeVos, String userName, Long protocolId, Long updateTag) { + //补充作业节点蓝绿关系 + if (CollectionUtils.isNotEmpty(autoexecJobPhaseNodeVos)) { + DeployJobVo deployJobVo = deployJobMapper.getDeployJobByJobId(jobVo.getId()); + List resourceIdList = autoexecJobPhaseNodeVos.stream().map(AutoexecJobPhaseNodeVo::getResourceId).collect(Collectors.toList()); + List deployInstanceBlueGreenVos = deployBlueGreenMapper.listInstanceBlueGreen(deployJobVo.getAppSystemId(), deployJobVo.getAppModuleId(), deployJobVo.getEnvId(), resourceIdList); + if (CollectionUtils.isNotEmpty(deployInstanceBlueGreenVos)) { + Map deployInstanceBlueGreenVoMap = deployInstanceBlueGreenVos.stream().collect(Collectors.toMap(DeployInstanceBlueGreenVo::getResourceId, e -> e)); + List deployJobPhaseNodeBlueGreenVos = new ArrayList<>(); + for (AutoexecJobPhaseNodeVo autoexecJobPhaseNodeVo : autoexecJobPhaseNodeVos) { + DeployJobPhaseNodeBlueGreenVo blueGreenVo = new DeployJobPhaseNodeBlueGreenVo(); + blueGreenVo.setJobId(jobVo.getId()); + blueGreenVo.setJobPhaseId(jobVo.getCurrentPhase().getId()); + blueGreenVo.setJobPhaseNodeId(autoexecJobPhaseNodeVo.getNodeId()); + blueGreenVo.setUpdateTag(updateTag); + DeployInstanceBlueGreenVo instanceBlueGreenVo = deployInstanceBlueGreenVoMap.get(autoexecJobPhaseNodeVo.getResourceId()); + if (instanceBlueGreenVo != null) { + blueGreenVo.setBlueGreenId(instanceBlueGreenVo.getBlueGreenId()); + deployJobPhaseNodeBlueGreenVos.add(blueGreenVo); + } + } + if (CollectionUtils.isNotEmpty(deployJobPhaseNodeBlueGreenVos)) { + deployBlueGreenMapper.insertDeployJobPhaseNodeBlueGreen(deployJobPhaseNodeBlueGreenVos); + } + } + } + } + + @Override + public void handleDeleteJobPhaseNodeEvent(Long jobPhaseId, Long updateTag) { + deployBlueGreenMapper.deleteJobPhaseNodeBlueGreenByJobPhaseIdAndUpdateTag(jobPhaseId, updateTag); + } } diff --git a/src/main/resources/neatlogic/resources/deploy/changelog/2025-04-19/neatlogic_tenant.sql b/src/main/resources/neatlogic/resources/deploy/changelog/2025-04-19/neatlogic_tenant.sql new file mode 100644 index 00000000..cb77cfb4 --- /dev/null +++ b/src/main/resources/neatlogic/resources/deploy/changelog/2025-04-19/neatlogic_tenant.sql @@ -0,0 +1,25 @@ +CREATE TABLE IF NOT EXISTS `deploy_blue_green` ( + `id` bigint NOT NULL COMMENT 'id', + `name` varchar(50) NULL COMMENT '姓名', + `sort` integer NULL COMMENT '排序', + `is_active` tinyint(1) NULL DEFAULT 1 COMMENT '是否激活', + PRIMARY KEY (`id`), + UNIQUE INDEX `uniqu`(`id`) +) COMMENT = '发布蓝绿表'; + +CREATE TABLE IF NOT EXISTS `deploy_app_instance_blue_green` ( + `id` bigint NOT NULL COMMENT 'id', + `app_system_id` bigint NULL COMMENT '系统id', + `app_module_id` bigint NULL COMMENT '模块id', + `env_id` bigint NULL COMMENT '环境id', + `resource_id` bigint NULL COMMENT '实例id', + `blue_green_id` bigint NULL COMMENT '蓝绿id', + PRIMARY KEY (`id`, `app_system_id`, `app_module_id`, `env_id`, `resource_id`) USING BTREE +) COMMENT = '发布实例蓝绿关系表'; + + +CREATE TABLE IF NOT EXISTS `deploy_job_phase_node_blue_green` ( + `job_phase_node_id` bigint NOT NULL COMMENT '作业节点ID', + `blue_green_id` bigint NOT NULL COMMENT '蓝绿ID', + PRIMARY KEY (`job_phase_node_id`, `blue_green_id`) +) COMMENT = '发布作业蓝绿id'; \ No newline at end of file diff --git a/src/main/resources/neatlogic/resources/deploy/sqlscript/dml.sql b/src/main/resources/neatlogic/resources/deploy/sqlscript/dml.sql index f0720d03..92476650 100644 --- a/src/main/resources/neatlogic/resources/deploy/sqlscript/dml.sql +++ b/src/main/resources/neatlogic/resources/deploy/sqlscript/dml.sql @@ -9,4 +9,7 @@ insert ignore into `deploy_type_status`(`type_id`,`is_active`) values (477316643 insert ignore into `deploy_type_status`(`type_id`,`is_active`) values (477317977612288,1); insert ignore into `deploy_type_status`(`type_id`,`is_active`) values (477319286235136,1); insert ignore into `deploy_type_status`(`type_id`,`is_active`) values (651160662843392,1); -insert ignore into `deploy_type_status`(`type_id`,`is_active`) values (681687327449088,1); \ No newline at end of file +insert ignore into `deploy_type_status`(`type_id`,`is_active`) values (681687327449088,1); + +insert ignore into `deploy_blue_green`(`id`,`name`,`sort`,`is_active`) values (1,'蓝',1,1); +insert ignore into `deploy_blue_green`(`id`,`name`,`sort`,`is_active`) values (2,'绿',2,1); \ No newline at end of file -- Gitee From efa7d976a86cdeb98fedfd02118c4ad0779a4f2e Mon Sep 17 00:00:00 2001 From: lvzk <897706680@qq.com> Date: Mon, 21 Apr 2025 16:25:46 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=93=9D=E7=BB=BF=E6=89=A7=E8=A1=8C=E7=AD=96?= =?UTF-8?q?=E7=95=A5=20#[1402157146800128]=E5=8F=91=E5=B8=83=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=93=9D=E7=BB=BF=E6=89=A7=E8=A1=8C=E7=AD=96=E7=95=A5?= =?UTF-8?q?=20http://192.168.0.96:8090/demo/rdm.html#/story-detail/9390509?= =?UTF-8?q?47543040/939050947543042/1402157146800128?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../env/GetDeployAppConfigEnvInfoApi.java | 38 ++++++++------- .../dao/mapper/DeployBlueGreenMapper.java | 6 ++- .../dao/mapper/DeployBlueGreenMapper.xml | 17 +++++-- .../type/DeployJobSourceTypeHandler.java | 46 ++++++++++++++++--- 4 files changed, 76 insertions(+), 31 deletions(-) diff --git a/src/main/java/neatlogic/module/deploy/api/appconfig/env/GetDeployAppConfigEnvInfoApi.java b/src/main/java/neatlogic/module/deploy/api/appconfig/env/GetDeployAppConfigEnvInfoApi.java index d428352e..32af5576 100644 --- a/src/main/java/neatlogic/module/deploy/api/appconfig/env/GetDeployAppConfigEnvInfoApi.java +++ b/src/main/java/neatlogic/module/deploy/api/appconfig/env/GetDeployAppConfigEnvInfoApi.java @@ -39,11 +39,13 @@ import neatlogic.module.deploy.dao.mapper.DeployAppConfigMapper; import neatlogic.module.deploy.dao.mapper.DeployBlueGreenMapper; import neatlogic.module.deploy.dao.mapper.DeployInstanceVersionMapper; import neatlogic.module.deploy.dao.mapper.DeployResourceMapper; +import org.apache.commons.collections4.MapUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -108,17 +110,31 @@ public class GetDeployAppConfigEnvInfoApi extends PrivateApiComponentBase { //获取实例autoConfig if (CollectionUtils.isNotEmpty(instanceIdList)) { - List instanceList = deployResourceMapper.getAppInstanceResourceListByIdList(instanceIdList); // 补充实例当前版本信息 List instanceVersionVoList = deployInstanceVersionMapper.getDeployInstanceVersionByEnvIdAndInstanceIdList(envAutoConfigVo.getAppSystemId(), envAutoConfigVo.getAppModuleId(), envAutoConfigVo.getEnvId(), instanceIdList); + //补充蓝绿 + Map deployInstanceBlueGreenVoMap = new HashMap<>(); + Map versionMap = new HashMap<>(); + List instanceBlueGreenVos = blueGreenMapper.listInstanceBlueGreen(paramObj.getLong("appSystemId"), paramObj.getLong("appModuleId"), paramObj.getLong("envId"), instanceIdList); + if (CollectionUtils.isNotEmpty(instanceBlueGreenVos)) { + deployInstanceBlueGreenVoMap = instanceBlueGreenVos.stream().collect(Collectors.toMap(DeployInstanceBlueGreenVo::getResourceId, e -> e)); + } if (CollectionUtils.isNotEmpty(instanceVersionVoList)) { - Map versionMap = instanceVersionVoList.stream().collect(Collectors.toMap(DeployInstanceVersionVo::getResourceId, e -> e)); + versionMap = instanceVersionVoList.stream().collect(Collectors.toMap(DeployInstanceVersionVo::getResourceId, e -> e)); + } + if (MapUtils.isNotEmpty(deployInstanceBlueGreenVoMap) || MapUtils.isNotEmpty(versionMap)) { JSONArray instanceArray = new JSONArray(); for (ResourceVo resourceVo : instanceList) { JSONObject instanceObj = (JSONObject) JSON.toJSON(resourceVo); instanceObj.put("version", versionMap.containsKey(resourceVo.getId()) ? versionMap.get(resourceVo.getId()).getVersion() : ""); instanceObj.put("instanceVersion", versionMap.get(resourceVo.getId())); + DeployInstanceBlueGreenVo deployInstanceBlueGreenVo = deployInstanceBlueGreenVoMap.get(instanceObj.getLong("id")); + if (deployInstanceBlueGreenVo != null) { + instanceObj.put("blueGreenId", deployInstanceBlueGreenVo.getBlueGreenId()); + instanceObj.put("blueGreenName", deployInstanceBlueGreenVo.getBlueGreenName()); + instanceObj.put("blueGreenSort", deployInstanceBlueGreenVo.getBlueGreenSort()); + } instanceArray.add(instanceObj); } envInfo.put("instanceList", instanceArray); @@ -139,24 +155,6 @@ public class GetDeployAppConfigEnvInfoApi extends PrivateApiComponentBase { autoConfigVo.setInstanceIp(instanceResourceVo.getIp()); autoConfigVo.setInstancePort(instanceResourceVo.getPort()); } - - //补充蓝绿 - List instanceBlueGreenVos = blueGreenMapper.listInstanceBlueGreen(paramObj.getLong("appSystemId"), paramObj.getLong("appModuleId"), paramObj.getLong("envId"), instanceIdList); - if(CollectionUtils.isNotEmpty(instanceBlueGreenVos)){ - Map deployInstanceBlueGreenVoMap = instanceBlueGreenVos.stream().collect(Collectors.toMap(DeployInstanceBlueGreenVo::getResourceId, e->e)); - JSONArray instanceArray = envInfo.getJSONArray("instanceList"); - if(CollectionUtils.isNotEmpty(instanceArray)){ - for (int i = 0; i < instanceArray.size(); i++) { - JSONObject instanceJson = instanceArray.getJSONObject(i); - DeployInstanceBlueGreenVo deployInstanceBlueGreenVo = deployInstanceBlueGreenVoMap.get(instanceJson.getLong("id")); - if(deployInstanceBlueGreenVo != null) { - instanceJson.put("blueGreenId", deployInstanceBlueGreenVo.getBlueGreenId()); - instanceJson.put("blueGreenName", deployInstanceBlueGreenVo.getBlueGreenName()); - } - } - } - - } } /*获取DB配置,核实dbResourceId是否存在,不存在则删除关系*/ diff --git a/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.java b/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.java index 83dbc8a7..6f7a4ec1 100644 --- a/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.java +++ b/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.java @@ -43,7 +43,9 @@ public interface DeployBlueGreenMapper { List listInstanceBlueGreen(@Param("appSystemId") Long appSystemId, @Param("appModuleId") Long appModuleId, @Param("envId") Long envId, @Param("resourceIdList") List instanceIdList); - void insertDeployJobPhaseNodeBlueGreen(List deployJobPhaseNodeBlueGreenVos); + List listDeployJobPhaseNodeBlueGreen(@Param("list")List jobNodeList); - void deleteJobPhaseNodeBlueGreenByJobPhaseIdAndUpdateTag(Long jobPhaseId, Long updateTag); + void insertDeployJobPhaseNodeBlueGreen(@Param("list") List deployJobPhaseNodeBlueGreenVos); + + void deleteJobPhaseNodeBlueGreenByJobPhaseIdAndUpdateTag(@Param("jobPhaseId") Long jobPhaseId,@Param("updateTag") Long updateTag); } diff --git a/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.xml b/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.xml index fc31059c..05d35903 100644 --- a/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.xml +++ b/src/main/java/neatlogic/module/deploy/dao/mapper/DeployBlueGreenMapper.xml @@ -39,7 +39,7 @@ + + update `deploy_blue_green` set `name` = #{name},`is_active` = #{isActive} where `id` = #{id} @@ -72,8 +83,8 @@ insert into `deploy_job_phase_node_blue_green`(`job_id`, `job_phase_id`,`job_phase_node_id`,`blue_green_id`,`update_tag`) values - - (#{jobId}, #{jobPhaseId},#{jobPhaseNodeId},#{blueGreenId},#{updateTag}) + + (#{nodeBlueGreen.jobId}, #{nodeBlueGreen.jobPhaseId},#{nodeBlueGreen.jobPhaseNodeId},#{nodeBlueGreen.blueGreenId},#{nodeBlueGreen.updateTag}) on duplicate key update `blue_green_id` = VALUES(`blue_green_id`), diff --git a/src/main/java/neatlogic/module/deploy/job/source/type/DeployJobSourceTypeHandler.java b/src/main/java/neatlogic/module/deploy/job/source/type/DeployJobSourceTypeHandler.java index 59e1d261..053b6e58 100644 --- a/src/main/java/neatlogic/module/deploy/job/source/type/DeployJobSourceTypeHandler.java +++ b/src/main/java/neatlogic/module/deploy/job/source/type/DeployJobSourceTypeHandler.java @@ -754,10 +754,11 @@ public class DeployJobSourceTypeHandler extends AutoexecJobSourceTypeHandlerBase Long appModuleId = deployJobVo.getAppModuleId(); Long envId = deployJobVo.getEnvId(); List instanceIdList = jobPhaseNodeVoList.stream().map(AutoexecJobPhaseNodeVo::getResourceId).filter(Objects::nonNull).collect(Collectors.toList()); - List deployInstanceBlueGreenVos = deployBlueGreenMapper.listInstanceBlueGreen(deployJobVo.getAppSystemId(), deployJobVo.getAppModuleId(), deployJobVo.getEnvId(), instanceIdList); - Map deployInstanceBlueGreenVoMap = new HashMap<>(); - if (CollectionUtils.isNotEmpty(deployInstanceBlueGreenVos)) { - deployInstanceBlueGreenVoMap = deployInstanceBlueGreenVos.stream().collect(Collectors.toMap(DeployInstanceBlueGreenVo::getResourceId, e -> e)); + List jobNodeIdList = jobPhaseNodeVoList.stream().map(AutoexecJobPhaseNodeVo::getId).filter(Objects::nonNull).collect(Collectors.toList()); + List deployJobNodeBlueGreenVos = deployBlueGreenMapper.listDeployJobPhaseNodeBlueGreen(jobNodeIdList); + Map deployJobPhaseNodeBlueGreenVoMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(deployJobNodeBlueGreenVos)) { + deployJobPhaseNodeBlueGreenVoMap = deployJobNodeBlueGreenVos.stream().collect(Collectors.toMap(DeployJobPhaseNodeBlueGreenVo::getJobPhaseNodeId, e -> e)); } if (CollectionUtils.isNotEmpty(instanceIdList)) { List instanceVersionVoList = deployInstanceVersionMapper.getDeployInstanceVersionByEnvIdAndInstanceIdList(appSystemId, appModuleId, envId, instanceIdList); @@ -771,10 +772,43 @@ public class DeployJobSourceTypeHandler extends AutoexecJobSourceTypeHandlerBase extraInfo.put("version", versionMap.containsKey(jobPhaseNodeVo.getResourceId()) ? versionMap.get(jobPhaseNodeVo.getResourceId()).getVersion() : ""); extraInfo.put("instanceVersion", versionMap.get(jobPhaseNodeVo.getResourceId())); - DeployInstanceBlueGreenVo deployInstanceBlueGreenVo = deployInstanceBlueGreenVoMap.get(jobPhaseNodeVo.getResourceId()); + DeployJobPhaseNodeBlueGreenVo deployInstanceBlueGreenVo = deployJobPhaseNodeBlueGreenVoMap.get(jobPhaseNodeVo.getId()); if (deployInstanceBlueGreenVo != null) { extraInfo.put("blueGreenId", deployInstanceBlueGreenVo.getBlueGreenId()); extraInfo.put("blueGreenName", deployInstanceBlueGreenVo.getBlueGreenName()); + extraInfo.put("blueGreenSort", deployInstanceBlueGreenVo.getBlueGreenSort()); + } + jobPhaseNodeVo.setExtraInfo(extraInfo); + } + } + } + } + } + + @Override + public void addExtraJobPhaseNodeBlueGreenInfoByList(Long jobId, List jobPhaseNodeVoList) { + if (jobId != null && CollectionUtils.isNotEmpty(jobPhaseNodeVoList)) { + DeployJobVo deployJobVo = deployJobMapper.getDeployJobByJobId(jobId); + if (deployJobVo != null) { + List jobNodeIdList = jobPhaseNodeVoList.stream().map(AutoexecJobPhaseNodeVo::getId).filter(Objects::nonNull).collect(Collectors.toList()); + List deployJobNodeBlueGreenVos = deployBlueGreenMapper.listDeployJobPhaseNodeBlueGreen(jobNodeIdList); + Map deployJobPhaseNodeBlueGreenVoMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(deployJobNodeBlueGreenVos)) { + deployJobPhaseNodeBlueGreenVoMap = deployJobNodeBlueGreenVos.stream().collect(Collectors.toMap(DeployJobPhaseNodeBlueGreenVo::getJobPhaseNodeId, e -> e)); + } + if (CollectionUtils.isNotEmpty(jobNodeIdList)) { + JSONObject extraInfo = null; + for (AutoexecJobPhaseNodeVo jobPhaseNodeVo : jobPhaseNodeVoList) { + extraInfo = jobPhaseNodeVo.getExtraInfo(); + if (extraInfo == null) { + extraInfo = new JSONObject(); + } + + DeployJobPhaseNodeBlueGreenVo deployJobNodeBlueGreenVo = deployJobPhaseNodeBlueGreenVoMap.get(jobPhaseNodeVo.getId()); + if (deployJobNodeBlueGreenVo != null) { + extraInfo.put("blueGreenId", deployJobNodeBlueGreenVo.getBlueGreenId()); + extraInfo.put("blueGreenName", deployJobNodeBlueGreenVo.getBlueGreenName()); + extraInfo.put("blueGreenSort", deployJobNodeBlueGreenVo.getBlueGreenSort()); } jobPhaseNodeVo.setExtraInfo(extraInfo); } @@ -797,7 +831,7 @@ public class DeployJobSourceTypeHandler extends AutoexecJobSourceTypeHandlerBase DeployJobPhaseNodeBlueGreenVo blueGreenVo = new DeployJobPhaseNodeBlueGreenVo(); blueGreenVo.setJobId(jobVo.getId()); blueGreenVo.setJobPhaseId(jobVo.getCurrentPhase().getId()); - blueGreenVo.setJobPhaseNodeId(autoexecJobPhaseNodeVo.getNodeId()); + blueGreenVo.setJobPhaseNodeId(autoexecJobPhaseNodeVo.getId()); blueGreenVo.setUpdateTag(updateTag); DeployInstanceBlueGreenVo instanceBlueGreenVo = deployInstanceBlueGreenVoMap.get(autoexecJobPhaseNodeVo.getResourceId()); if (instanceBlueGreenVo != null) { -- Gitee