Commit 5754ded9 authored by 黎博's avatar 黎博

合并master

parents 3faeeda1 d0c7a412
...@@ -161,6 +161,12 @@ ...@@ -161,6 +161,12 @@
<version>3.1.305</version> <version>3.1.305</version>
</dependency> </dependency>
<!-- 参数校验 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
...@@ -3,26 +3,61 @@ package cn.qg.holmes.aspect; ...@@ -3,26 +3,61 @@ package cn.qg.holmes.aspect;
import cn.qg.holmes.common.JsonResult; import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.exception.TokenInvalidException; import cn.qg.holmes.exception.TokenInvalidException;
import cn.qg.holmes.exception.UnauthorizedException; import cn.qg.holmes.exception.UnauthorizedException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
/**
* 全局异常处理
* @author libo
*/
@ControllerAdvice @ControllerAdvice
@ResponseBody @ResponseBody
public class ExceptionHandlerAdvice { public class ExceptionHandlerAdvice {
/**
* 权限不足
*/
@ExceptionHandler(UnauthorizedException.class) @ExceptionHandler(UnauthorizedException.class)
public JsonResult handleException(UnauthorizedException e) { public JsonResult handleException(UnauthorizedException e) {
e.printStackTrace(); e.printStackTrace();
return JsonResult.buildErrorStateResult("权限不足!", false); return JsonResult.buildErrorStateResult("权限不足!", false);
} }
/**
* Token无效
*/
@ExceptionHandler(TokenInvalidException.class) @ExceptionHandler(TokenInvalidException.class)
public JsonResult handleException(TokenInvalidException e) { public JsonResult handleException(TokenInvalidException e) {
e.printStackTrace(); e.printStackTrace();
return JsonResult.buildErrorStateResult("登录已失效,请重新登录!", false); return JsonResult.buildErrorStateResult("登录已失效,请重新登录!", false);
} }
/**
* 参数验证失败
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public JsonResult handleException(MethodArgumentNotValidException e) {
e.printStackTrace();
ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
return JsonResult.buildErrorStateResult(objectError.getDefaultMessage(), false);
}
/**
* 参数必须性处理
*/
@ExceptionHandler(MissingServletRequestParameterException.class)
public JsonResult handleException(MissingServletRequestParameterException e) {
e.printStackTrace();
return JsonResult.buildErrorStateResult(e.getMessage(), false);
}
/**
* 其他所有异常
*/
@ExceptionHandler(Exception.class) @ExceptionHandler(Exception.class)
public JsonResult handleException(Exception e) { public JsonResult handleException(Exception e) {
e.printStackTrace(); e.printStackTrace();
......
package cn.qg.holmes.controller.effect;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.effect.BuildData;
import cn.qg.holmes.entity.effect.BuildDataDetail;
import cn.qg.holmes.service.effect.BuildDataDetailService;
import cn.qg.holmes.service.effect.BuildDataService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 造数据文档controller
* @author libo
*/
@CrossOrigin
@RestController
@RequestMapping("/build/data")
public class BuildDataController {
@Autowired
BuildDataService buildDataService;
@Autowired
BuildDataDetailService buildDataDetailService;
/**
* 获取造数据页面展示
* @return
*/
@GetMapping("/index")
public JsonResult getBuildDataIndex() {
List<Map<String, Object>> resultList = new ArrayList<>();
List<BuildData> buildDataList = buildDataService.list();
QueryWrapper<BuildDataDetail> queryWrapper = new QueryWrapper<>();
for (BuildData buildData: buildDataList) {
Map<String, Object> map = new HashMap<>();
Integer moduleId = buildData.getId();
queryWrapper.eq("module", moduleId);
List<BuildDataDetail> buildDataDetails = buildDataDetailService.list(queryWrapper);
map.put("moduleId", moduleId);
map.put("moduleName", buildData.getName());
map.put("type", buildData.getColor());
map.put("list", buildDataDetails);
resultList.add(map);
queryWrapper.clear();
}
return JsonResult.buildSuccessResult(resultList);
}
/**
* 获取详情列表
* @param name 造数据详情名称
* @param module 模块id
* @return
*/
@GetMapping("/list")
public JsonResult getBuildDataDetailList(String name, Integer module) {
QueryWrapper<BuildDataDetail> queryWrapper = new QueryWrapper<>();
if (!StringUtils.isEmpty(name)) {
queryWrapper.eq("name", name);
}
if (module != null) {
queryWrapper.eq("module", module);
}
queryWrapper.orderByDesc("id");
List<BuildDataDetail> buildDataDetailList = buildDataDetailService.list(queryWrapper);
Map<Integer, String> moduleMap = buildDataService.list().stream().collect(Collectors.toMap(BuildData::getId, BuildData::getName));
for (BuildDataDetail buildDataDetail: buildDataDetailList) {
buildDataDetail.setModuleName(moduleMap.get(buildDataDetail.getModule()));
}
return JsonResult.buildSuccessResult(buildDataDetailList);
}
/**
* 返回造数据模块,不分页
* @return
*/
@GetMapping("/modules")
public JsonResult getBuildDataModules() {
return JsonResult.buildSuccessResult(buildDataService.list());
}
/**
* 新增造数据详情
* @param buildDataDetail
* @return
*/
@RequiresPermissions("build:data:add")
@PostMapping("/add")
public JsonResult addBuildDataDetail(@Valid @RequestBody BuildDataDetail buildDataDetail) {
QueryWrapper<BuildDataDetail> queryWrapper = new QueryWrapper<>();
queryWrapper
.eq("name", buildDataDetail.getName())
.eq("module", buildDataDetail.getModule());
if (buildDataDetailService.getOne(queryWrapper) != null) {
return JsonResult.buildErrorStateResult("数据已存在,不能重复添加!", false);
}
return JsonResult.buildSuccessResult(buildDataDetailService.save(buildDataDetail));
}
/**
* 更新造数据详情
* @param buildDataDetail
* @return
*/
@RequiresPermissions("build:data:update")
@PostMapping("/update")
public JsonResult updateBuildDataDetail(@Valid @RequestBody BuildDataDetail buildDataDetail) {
return JsonResult.buildSuccessResult(buildDataDetailService.updateById(buildDataDetail));
}
/**
* 删除造数据详情
* @param buildDataDetail
* @return
*/
@RequiresPermissions("build:data:delete")
@PostMapping("/delete")
public JsonResult deleteBuildDataDetail(@Valid @RequestBody BuildDataDetail buildDataDetail) {
return JsonResult.buildSuccessResult(buildDataDetailService.removeById(buildDataDetail.getId()));
}
}
...@@ -2,8 +2,11 @@ package cn.qg.holmes.controller.effect; ...@@ -2,8 +2,11 @@ package cn.qg.holmes.controller.effect;
import cn.qg.holmes.common.JsonResult; import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.service.effect.DatabaseSyncService; import cn.qg.holmes.service.effect.DatabaseSyncService;
import cn.qg.holmes.service.k8s.K8sService;
import cn.qg.holmes.utils.JenkinsService; import cn.qg.holmes.utils.JenkinsService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.JdbcNamedParameter;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -35,22 +38,43 @@ public class DbSyncController { ...@@ -35,22 +38,43 @@ public class DbSyncController {
@Value("${dbsync.mysql.password}") @Value("${dbsync.mysql.password}")
private String password; private String password;
@Autowired
K8sService k8sService;
/**
* 同步数据库
* @param namespace 环境
* @param dbName 数据库名称
* @param tableName 表名称
* @param businessData 是否保留业务数据
* @return
*/
@GetMapping("/one") @GetMapping("/one")
public JsonResult syncSingleTable(@RequestParam String namespace, @RequestParam String dbName, @RequestParam String tableName) { public JsonResult syncDatabase(@RequestParam String namespace, @RequestParam String dbName, @RequestParam String tableName, @RequestParam boolean businessData) {
try { try {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
Map<String, String> map = databaseSyncService.getMysqlInfoByNamespace(namespace); Map<String, String> map = k8sService.getMysqlAddressByNamespace(namespace);
String destIp = map.get("ip"); String destIp = map.get("host");
String destPort = map.get("port"); String destPort = map.get("port");
log.info("获取到{}环境的Mysql地址为:{}", namespace, destIp + ":" + destPort); log.info("获取到{}环境的Mysql地址为:{}", namespace, destIp + ":" + destPort);
if (!StringUtils.isEmpty(dbName)) {
// 同步所有数据库
if (dbName.equalsIgnoreCase("all")) {
List<String> dbList = databaseSyncService.getDatabaseList(ip, port, username, password);
databaseSyncService.getDbInfoFromSource(ip, port, username, password, dbName);
databaseSyncService.syncDbToDest(destIp, destPort, "qa", "qatest", dbName, namespace, businessData);
} else {
// 同步单个数据库或单张表
if (tableName.equalsIgnoreCase("all") || tableName.equals("")) { if (tableName.equalsIgnoreCase("all") || tableName.equals("")) {
log.info("开始同步{}库下所有的表", dbName); log.info("开始同步{}库下所有表到{}环境,保留业务数据:{}", dbName, namespace, businessData);
databaseSyncService.getDbInfoFromSource(ip, port, username, password, dbName); databaseSyncService.getDbInfoFromSource(ip, port, username, password, dbName);
databaseSyncService.syncDbToDest(destIp, destPort, "qa", "qatest", dbName, namespace); databaseSyncService.syncDbToDest(destIp, destPort, "qa", "qatest", dbName, namespace, businessData);
} else { } else {
log.info("开始同步{}库下{}表", dbName, tableName); log.info("开始同步{}库下{}表到{}环境,保留业务数据:{}", dbName, tableName, namespace, businessData);
databaseSyncService.getSingleTableFromSource(ip, port, username, password, dbName, tableName); databaseSyncService.getSingleTableFromSource(ip, port, username, password, dbName, tableName);
databaseSyncService.syncSingleTableToDest(destIp, destPort, "qa", "qatest", dbName, tableName); databaseSyncService.syncSingleTableToDest(destIp, destPort, "qa", "qatest", dbName, tableName, businessData);
}
}
} }
long endTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis();
long elapsedTime = (endTime - startTime) / 1000; long elapsedTime = (endTime - startTime) / 1000;
...@@ -77,11 +101,79 @@ public class DbSyncController { ...@@ -77,11 +101,79 @@ public class DbSyncController {
*/ */
@GetMapping("/tables") @GetMapping("/tables")
public JsonResult getTableList(@RequestParam String dbName) { public JsonResult getTableList(@RequestParam String dbName) {
List<Object> tableList = databaseSyncService.getTableListByDb(ip, port, username, password, dbName); List<String> tableList = databaseSyncService.getTableListByDb(ip, port, username, password, dbName);
tableList.add(0, "all"); tableList.add(0, "all");
return JsonResult.buildSuccessResult(tableList); return JsonResult.buildSuccessResult(tableList);
} }
/**
* 给数据库同步脚本使用的接口
* @param database 数据库名
* @return
*/
@GetMapping("/tableList")
public String getTableListForSync(@RequestParam String database) {
List<String> tableList = databaseSyncService.getTableListByDb(ip, port, username, password, database);
return StringUtils.join(tableList, " ");
}
/**
* 获取同步库所有的数据库
* 给数据库同步脚本使用的接口
* @return
*/
@GetMapping("/dbList")
public String getDbListForSync() {
List<String> dbList = databaseSyncService.getDatabaseList(ip, port, username, password);
return StringUtils.join(dbList, " ");
}
/**
* 同步表结构
* @param targetIp
* @param targetPort
* @param database
* @param table
* @return
*/
@GetMapping("/table/structure")
public JsonResult handleTableStructure(@RequestParam String targetIp, @RequestParam String targetPort, @RequestParam String database, @RequestParam String table) {
try {
log.info("开始同步表结构到测试环境,地址:{}:{}, 数据库:{}, 表:{}", targetIp, targetPort, database, table);
databaseSyncService.getSourceDbStructure(ip, port, username, password, database, table);
databaseSyncService.syncDbStructureToDest(targetIp, targetPort, "qa", "qatest", database, table);
} catch (Exception e) {
e.printStackTrace();
return JsonResult.buildErrorStateResult("创建表结构失败!", false);
}
return JsonResult.buildSuccessResult("创建" + targetIp + ":" + targetPort + "环境表结构成功!");
}
/**
* 新-同步数据库,构建jenkins job db_sync
* @param namespace 环境
* @param targetHost 目标环境ip
* @param targetPort 目标环境端口
* @param database 数据库名称
* @param table 表名
* @param businessData 是否保留业务数据
* @return
*/
@PostMapping("new")
public JsonResult dbSyncNew(@RequestParam String namespace,
@RequestParam String targetHost,
@RequestParam String targetPort,
@RequestParam String database,
@RequestParam String table,
@RequestParam boolean businessData) {
int buildNum = jenkinsService.buildDbSyncJobNew(namespace, targetHost, targetPort, database, table, businessData);
if (buildNum == 0) {
return JsonResult.buildErrorStateResult("数据库同步失败!", 0);
} else {
return JsonResult.buildSuccessResult("开始同步数据库!", buildNum);
}
}
/** /**
* 老数据库同步,调用Jenkins job sync_database_schema * 老数据库同步,调用Jenkins job sync_database_schema
* @param dbName 数据库名 * @param dbName 数据库名
......
...@@ -30,7 +30,7 @@ public class JenkinsController { ...@@ -30,7 +30,7 @@ public class JenkinsController {
@RequestParam String namespace) { @RequestParam String namespace) {
try { try {
log.info("开始构建jenkins项目:项目类型:{}, 项目名:{}, 分支:{}, 部署至环境:{}", type, project, branch, namespace); log.info("开始构建jenkins项目:项目类型:{}, 项目名:{}, 分支:{}, 部署至环境:{}", type, project, branch, namespace);
jenkinsService.buildJenkinsJob(type, project, branch, namespace); jenkinsService.buildTkeJob(type, project, branch, namespace);
return JsonResult.buildSuccessResult(true); return JsonResult.buildSuccessResult(true);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
......
...@@ -2,9 +2,11 @@ package cn.qg.holmes.controller.gitlab; ...@@ -2,9 +2,11 @@ package cn.qg.holmes.controller.gitlab;
import cn.qg.holmes.common.JsonResult; import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions; import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.auth.UserInfoVo;
import cn.qg.holmes.entity.gitlab.DingRobotPipelineVo; import cn.qg.holmes.entity.gitlab.DingRobotPipelineVo;
import cn.qg.holmes.entity.gitlab.Pipeline; import cn.qg.holmes.entity.gitlab.Pipeline;
import cn.qg.holmes.entity.jira.DingRobot; import cn.qg.holmes.entity.jira.DingRobot;
import cn.qg.holmes.service.auth.TokenService;
import cn.qg.holmes.service.gitlab.PipelineService; import cn.qg.holmes.service.gitlab.PipelineService;
import cn.qg.holmes.service.jira.DingRobotService; import cn.qg.holmes.service.jira.DingRobotService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
...@@ -35,6 +37,12 @@ public class PipelineController { ...@@ -35,6 +37,12 @@ public class PipelineController {
@Autowired @Autowired
DingRobotService dingRobotService; DingRobotService dingRobotService;
@Autowired
HttpServletRequest servletRequest;
@Autowired
TokenService tokenService;
/** /**
* gitlab webhook * gitlab webhook
* @param request * @param request
...@@ -57,7 +65,7 @@ public class PipelineController { ...@@ -57,7 +65,7 @@ public class PipelineController {
} }
@GetMapping("/list") @GetMapping("/list")
public JsonResult getDingRobotAndPipelineList(String jiraProjectKey, String projectName, String namespace, public JsonResult getDingRobotAndPipelineList(String jiraProjectKey, String projectName, String namespace, Integer status,
@RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) { @RequestParam(defaultValue = "10") Integer pageSize) {
IPage<DingRobot> page = new Page<>(pageNum, pageSize); IPage<DingRobot> page = new Page<>(pageNum, pageSize);
...@@ -71,6 +79,9 @@ public class PipelineController { ...@@ -71,6 +79,9 @@ public class PipelineController {
if (!StringUtils.isEmpty(namespace)) { if (!StringUtils.isEmpty(namespace)) {
dingRobotQueryWrapper.eq("namespace", namespace); dingRobotQueryWrapper.eq("namespace", namespace);
} }
if (status != null) {
dingRobotQueryWrapper.eq("status", status);
}
dingRobotQueryWrapper.orderByDesc("id"); dingRobotQueryWrapper.orderByDesc("id");
IPage<DingRobot> projectRobotIPage = dingRobotService.page(page, dingRobotQueryWrapper); IPage<DingRobot> projectRobotIPage = dingRobotService.page(page, dingRobotQueryWrapper);
List<DingRobot> dingRobotList = projectRobotIPage.getRecords(); List<DingRobot> dingRobotList = projectRobotIPage.getRecords();
...@@ -99,6 +110,10 @@ public class PipelineController { ...@@ -99,6 +110,10 @@ public class PipelineController {
public JsonResult addRobotAndPipeline(@RequestBody DingRobotPipelineVo dingRobotPipelineVo) { public JsonResult addRobotAndPipeline(@RequestBody DingRobotPipelineVo dingRobotPipelineVo) {
try { try {
DingRobot dingRobot = dingRobotPipelineVo.getDingRobot(); DingRobot dingRobot = dingRobotPipelineVo.getDingRobot();
// 设置创建人
String token = servletRequest.getHeader("token");
UserInfoVo userInfoVo = tokenService.getUserInfoFromCache(token);
dingRobot.setCreator(userInfoVo.getChineseName());
String projectName = dingRobot.getProjectName(); String projectName = dingRobot.getProjectName();
String jiraProjectKey = dingRobot.getJiraProjectKey(); String jiraProjectKey = dingRobot.getJiraProjectKey();
QueryWrapper<DingRobot> dingRobotQueryWrapper = new QueryWrapper<>(); QueryWrapper<DingRobot> dingRobotQueryWrapper = new QueryWrapper<>();
...@@ -205,4 +220,29 @@ public class PipelineController { ...@@ -205,4 +220,29 @@ public class PipelineController {
} }
} }
/**
* 更新状态
* @param dingRobotId 机器人id
* @param status 状态,1-进行中,2-已完成
* @return
*/
@RequiresPermissions("qa:process:finish")
@PostMapping("/finish")
public JsonResult finishPipeline(@RequestParam Integer dingRobotId, @RequestParam Integer status) {
try {
DingRobot dingRobot = dingRobotService.getById(dingRobotId);
if (dingRobot == null) {
return JsonResult.buildErrorStateResult("该测试流程不存在!", false);
}
// 设置状态为已完成
dingRobot.setStatus(status);
if (!dingRobotService.updateById(dingRobot)) {
return JsonResult.buildErrorStateResult("更新状态失败!", false);
}
return JsonResult.buildSuccessResult("更新状态成功!", true);
} catch (Exception e) {
return JsonResult.buildErrorStateResult("更新状态失败!", false);
}
}
} }
...@@ -29,10 +29,10 @@ public class DockerProjectController { ...@@ -29,10 +29,10 @@ public class DockerProjectController {
* @return * @return
*/ */
@GetMapping("/list") @GetMapping("/list")
public JsonResult getDockerProjectList(String projectName, String projectType, Integer isActive, public JsonResult getDockerProjectList(String projectName, String projectType, Integer isActive, String hostName,
@RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) { @RequestParam(defaultValue = "10") Integer pageSize) {
IPage projectIPage = dockerProjectService.getDockerProjectList(projectName, projectType, isActive, pageNum, pageSize); IPage projectIPage = dockerProjectService.getDockerProjectList(projectName, projectType, isActive, hostName, pageNum, pageSize);
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("total", projectIPage.getTotal()); map.put("total", projectIPage.getTotal());
map.put("list", projectIPage.getRecords()); map.put("list", projectIPage.getRecords());
...@@ -169,4 +169,18 @@ public class DockerProjectController { ...@@ -169,4 +169,18 @@ public class DockerProjectController {
return dockerProject.getGitPath(); return dockerProject.getGitPath();
} }
@GetMapping("/get_info")
public String getStartCommand(@RequestParam String projectName, @RequestParam String key) {
QueryWrapper<DockerProject> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("project_name", projectName);
DockerProject dockerProject = dockerProjectService.getOne(queryWrapper);
if (key.equals("start_command")) {
return dockerProject.getStartCommand();
}
if (key.equals("host_name")) {
return dockerProject.getHostName();
}
return "";
}
} }
package cn.qg.holmes.controller.k8s;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.k8s.EnvTemplate;
import cn.qg.holmes.entity.k8s.EnvTemplateDetail;
import cn.qg.holmes.entity.k8s.EnvTemplateVo;
import cn.qg.holmes.service.k8s.EnvTemplateDetailService;
import cn.qg.holmes.service.k8s.EnvTemplateService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@CrossOrigin
@RestController
@RequestMapping("/env/template")
public class EnvTemplateController {
@Autowired
EnvTemplateService envTemplateService;
@Autowired
EnvTemplateDetailService envTemplateDetailService;
@GetMapping("/list")
public JsonResult getTemplateList(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
IPage<EnvTemplate> envTemplateIPage = new Page<>(pageNum, pageSize);
IPage<EnvTemplate> IPage = envTemplateService.page(envTemplateIPage);
List<EnvTemplate> envTemplateList = IPage.getRecords();
List<EnvTemplateVo> envTemplateVoList = new ArrayList<>();
QueryWrapper<EnvTemplateDetail> queryWrapper = new QueryWrapper<>();
for (EnvTemplate envTemplate: envTemplateList) {
EnvTemplateVo envTemplateVo = new EnvTemplateVo();
envTemplateVo.setEnvTemplate(envTemplate);
queryWrapper.eq("template_id", envTemplate.getId());
List<EnvTemplateDetail> envTemplateDetailList = envTemplateDetailService.list(queryWrapper);
envTemplateVo.setEnvTemplateDetailList(envTemplateDetailList);
envTemplateVoList.add(envTemplateVo);
queryWrapper.clear();
}
Map<String, Object> map = new HashMap<>();
map.put("total", IPage.getTotal());
map.put("list", envTemplateVoList);
return JsonResult.buildSuccessResult(map);
}
/**
* 获取所有的模板及其关联的服务
* @return
*/
@GetMapping("/getAll")
public JsonResult getTemplateByName() {
List<Map<String, Object>> resultList = new ArrayList<>();
List<EnvTemplate> envTemplateList = envTemplateService.list();
QueryWrapper<EnvTemplateDetail> queryWrapper = new QueryWrapper<>();
for (EnvTemplate envTemplate: envTemplateList) {
Map<String, Object> map = new HashMap<>();
map.put("id", envTemplate.getId());
map.put("name", envTemplate.getName());
map.put("updateTime", envTemplate.getUpdateTime());
queryWrapper.eq("template_id", envTemplate.getId());
List<EnvTemplateDetail> envTemplateDetailList = envTemplateDetailService.list(queryWrapper);
for (EnvTemplateDetail envTemplateDetail: envTemplateDetailList) {
List<EnvTemplateDetail> envTemplateDetailListTemp;
if (map.containsKey(envTemplateDetail.getLabel())) {
envTemplateDetailListTemp = (List<EnvTemplateDetail>) map.get(envTemplateDetail.getLabel());
} else {
envTemplateDetailListTemp = new ArrayList<>();
}
envTemplateDetailListTemp.add(envTemplateDetail);
map.put(envTemplateDetail.getLabel(), envTemplateDetailListTemp);
}
queryWrapper.clear();
resultList.add(map);
}
return JsonResult.buildSuccessResult(resultList);
}
/**
* 新建模板
* @param envTemplateVo 模板虚拟实体类
* @return
*/
@RequiresPermissions("docker:envTemplate:create")
@PostMapping("/create")
public JsonResult saveEnvTemplate(@RequestBody EnvTemplateVo envTemplateVo) {
EnvTemplate envTemplate = envTemplateVo.getEnvTemplate();
QueryWrapper<EnvTemplate> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", envTemplate.getName());
if (envTemplateService.getOne(queryWrapper) != null) {
return JsonResult.buildErrorStateResult("模板已存在!", false);
}
// 保存模板
if (!envTemplateService.save(envTemplate)) {
return JsonResult.buildErrorStateResult("模板创建失败!", false);
}
// 模板详情列表设置模板id
Integer templateId = envTemplateService.getOne(queryWrapper).getId();
List<EnvTemplateDetail> envTemplateDetailList = envTemplateVo.getEnvTemplateDetailList();
for (EnvTemplateDetail envTemplateDetail: envTemplateDetailList) {
envTemplateDetail.setTemplateId(templateId);
}
// 保存模板详情
if (!envTemplateDetailService.saveBatch(envTemplateDetailList)) {
return JsonResult.buildErrorStateResult("模板详情保存失败!", false);
}
return JsonResult.buildSuccessResult(true);
}
/**
* 编辑模板及模板详情
* @param envTemplateVo 模板列表
* @return
*/
@RequiresPermissions("docker:envTemplate:modify")
@PostMapping("/modify")
public JsonResult modifyEnvTemplate(@RequestBody EnvTemplateVo envTemplateVo) {
EnvTemplate envTemplate = envTemplateVo.getEnvTemplate();
if (!envTemplateService.updateById(envTemplate)) {
return JsonResult.buildErrorStateResult("模板更新失败!", false);
}
// 参数传过来的列表
List<EnvTemplateDetail> envTemplateDetailList = envTemplateVo.getEnvTemplateDetailList();
// 查询出数据库里该模板的所有条目
QueryWrapper<EnvTemplateDetail> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("template_id", envTemplate.getId());
List<EnvTemplateDetail> envTemplateDetailListDb = envTemplateDetailService.list(queryWrapper);
// 删除传参里没有的
for (EnvTemplateDetail envTemplateDetailDb: envTemplateDetailListDb) {
boolean delete = true;
for (EnvTemplateDetail envTemplateDetail: envTemplateDetailList) {
if (envTemplateDetail.getId() != null) {
if (envTemplateDetail.getId().equals(envTemplateDetailDb.getId())) {
delete = false;
break;
}
}
}
if (delete) {
envTemplateDetailService.removeById(envTemplateDetailDb.getId());
}
}
// 设置一下templateId
envTemplateDetailList.forEach(envTemplateDetail -> {
envTemplateDetail.setTemplateId(envTemplate.getId());
});
// 剩余的批量新增/修改
if (!envTemplateDetailService.saveOrUpdateBatch(envTemplateDetailList)) {
return JsonResult.buildErrorStateResult("更新模板详情失败!", false);
}
return JsonResult.buildSuccessResult("模板更新成功");
}
/**
*
* @param templateId 模板id
* @return
*/
@RequiresPermissions("docker:envTemplate:delete")
@PostMapping("/delete")
public JsonResult deleteEnvTemplate(@RequestParam Integer templateId) {
if (!envTemplateService.removeById(templateId)) {
return JsonResult.buildErrorStateResult("模板删除失败!", false);
}
QueryWrapper<EnvTemplateDetail> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("template_id", templateId);
if (!envTemplateDetailService.remove(queryWrapper)) {
return JsonResult.buildErrorStateResult("模板详情删除失败", false);
}
return JsonResult.buildSuccessResult("模板删除成功!");
}
}
...@@ -69,19 +69,10 @@ public class NavigateController { ...@@ -69,19 +69,10 @@ public class NavigateController {
Map<Integer, String> moduleMap =navigateModuleList.stream().collect(Collectors.toMap(NavigateModule::getId, NavigateModule::getName)); Map<Integer, String> moduleMap =navigateModuleList.stream().collect(Collectors.toMap(NavigateModule::getId, NavigateModule::getName));
// 获取导航列表 // 获取导航列表
List<NavigateDetail> navigateDetailList = navigateDetailService.list(detailQueryWrapper); List<NavigateDetail> navigateDetailList = navigateDetailService.list(detailQueryWrapper);
List<Map<String, Object>> resultList = new ArrayList<>();
for (NavigateDetail navigateDetail: navigateDetailList) { for (NavigateDetail navigateDetail: navigateDetailList) {
Map<String, Object> map = new HashMap<>(); navigateDetail.setModuleName(moduleMap.get(navigateDetail.getModule()));
map.put("id", navigateDetail.getId());
map.put("name", navigateDetail.getName());
map.put("url", navigateDetail.getUrl());
map.put("module", navigateDetail.getModule());
map.put("moduleName", moduleMap.get(navigateDetail.getModule()));
map.put("createTime", navigateDetail.getCreateTime());
map.put("updateTime", navigateDetail.getUpdateTime());
resultList.add(map);
} }
return JsonResult.buildSuccessResult(resultList); return JsonResult.buildSuccessResult(navigateDetailList);
} }
/** /**
......
package cn.qg.holmes.entity.effect;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.Date;
/**
* 造数据文档模块类
*/
@TableName(value = "build_data")
@Data
public class BuildData {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 模块名称
*/
@TableField(value = "name")
@NotBlank(message = "模块名称不能为空")
private String name;
/**
* 模块颜色
*/
@TableField(value = "color")
@NotBlank(message = "模块颜色不能为空")
private String color;
/**
* 更新时间
*/
@TableField(value = "update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
package cn.qg.holmes.entity.effect;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* 造数据详情实体类
*/
@TableName(value = "build_data_detail")
@Data
public class BuildDataDetail {
/**
* 主键id
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 造数据说明
*/
@TableField(value = "name")
@NotBlank(message = "名称不能为空")
private String name;
/**
* 链接地址
*/
@TableField(value = "url")
@NotBlank(message = "链接名称不能为空")
private String url;
/**
* 模块id
*/
@TableField(value = "module")
@NotNull(message = "模块id不能为空")
private Integer module;
/**
* 更新时间
*/
@TableField(value = "update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
@TableField(exist = false)
private String moduleName;
}
...@@ -13,11 +13,30 @@ import java.util.Date; ...@@ -13,11 +13,30 @@ import java.util.Date;
public class DingRobot { public class DingRobot {
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
private Integer id; private Integer id;
/**
* 项目名称,与提BUG时【】里的内容进行匹配
*/
private String projectName; private String projectName;
/**
* jira项目关键字
*/
private String jiraProjectKey; private String jiraProjectKey;
/**
* 钉钉机器人webhook
*/
private String dingUrl; private String dingUrl;
/**
* 创建人
*/
private String creator; private String creator;
/**
* 环境
*/
private String namespace; private String namespace;
/**
* 1-进行中,2-已完成
*/
private Integer status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime; private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
......
...@@ -44,10 +44,16 @@ public class JiraBugPool { ...@@ -44,10 +44,16 @@ public class JiraBugPool {
* 钉钉robot * 钉钉robot
*/ */
private String dingUrl; private String dingUrl;
/**
* 对应项目id
*/
private Integer dingRobotId;
/** /**
* 是否有效,1-有效,0-无效 * 是否有效,1-有效,0-无效
*/ */
private Integer enable; private Integer enable;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime; private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
......
package cn.qg.holmes.entity.k8s;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
/**
* 环境模板实体类
* @author libo
*/
@TableName(value = "env_template")
@Data
public class EnvTemplate {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
package cn.qg.holmes.entity.k8s;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
@TableName(value = "env_template_detail")
public class EnvTemplateDetail {
@TableId(type = IdType.AUTO)
private Integer id;
private String serviceName;
private String serviceType;
private String label;
private String domain;
private String tag;
private Integer templateId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
package cn.qg.holmes.entity.k8s;
import lombok.Data;
import java.util.List;
/**
* 创建环境模板虚拟实体类
*/
@Data
public class EnvTemplateVo {
private EnvTemplate envTemplate;
private List<EnvTemplateDetail> envTemplateDetailList;
}
package cn.qg.holmes.entity.navigate; package cn.qg.holmes.entity.navigate;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
...@@ -45,4 +46,7 @@ public class NavigateDetail { ...@@ -45,4 +46,7 @@ public class NavigateDetail {
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime; private Date updateTime;
@TableField(exist = false)
private String moduleName;
} }
package cn.qg.holmes.mapper.effect;
import cn.qg.holmes.entity.effect.BuildDataDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface BuildDataDetailMapper extends BaseMapper<BuildDataDetail> {
}
package cn.qg.holmes.mapper.effect;
import cn.qg.holmes.entity.effect.BuildData;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface BuildDataMapper extends BaseMapper<BuildData> {
}
...@@ -6,5 +6,5 @@ import com.baomidou.mybatisplus.core.metadata.IPage; ...@@ -6,5 +6,5 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
public interface DockerProjectMapper extends BaseMapper<DockerProject> { public interface DockerProjectMapper extends BaseMapper<DockerProject> {
IPage<DockerProject> getDockerProjectList(IPage<DockerProject> page, String projectName, String projectType, Integer isActive); IPage<DockerProject> getDockerProjectList(IPage<DockerProject> page, String projectName, String projectType, Integer isActive, String hostName);
} }
package cn.qg.holmes.mapper.k8s;
import cn.qg.holmes.entity.k8s.EnvTemplateDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface EnvTemplateDetailMapper extends BaseMapper<EnvTemplateDetail> {
}
package cn.qg.holmes.mapper.k8s;
import cn.qg.holmes.entity.k8s.EnvTemplate;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface EnvTemplateMapper extends BaseMapper<EnvTemplate> {
}
package cn.qg.holmes.service.effect;
import cn.qg.holmes.entity.effect.BuildDataDetail;
import com.baomidou.mybatisplus.extension.service.IService;
public interface BuildDataDetailService extends IService<BuildDataDetail> {
}
package cn.qg.holmes.service.effect;
import cn.qg.holmes.entity.effect.BuildData;
import com.baomidou.mybatisplus.extension.service.IService;
public interface BuildDataService extends IService<BuildData> {
}
package cn.qg.holmes.service.effect; package cn.qg.holmes.service.effect;
import java.util.List; import java.util.List;
import java.util.Map;
public interface DatabaseSyncService { public interface DatabaseSyncService {
boolean getDbInfoFromSource(String ip, String port, String username, String password, String dbName); boolean getDbInfoFromSource(String ip, String port, String username, String password, String dbName);
boolean syncDbToDest(String ip, String port, String username, String password, String dbName, String namespace); boolean syncDbToDest(String ip, String port, String username, String password, String dbName, String namespace, boolean businessData);
boolean getSingleTableFromSource(String ip, String port, String username, String password, String dbName, String tableName); boolean getSingleTableFromSource(String ip, String port, String username, String password, String dbName, String tableName);
boolean syncSingleTableToDest(String ip, String port, String username, String password, String dbName, String tableName); boolean syncSingleTableToDest(String ip, String port, String username, String password, String dbName, String tableName, boolean businessData);
List<Object> getDatabaseList(String ip, String port, String username, String password); List<String> getDatabaseList(String ip, String port, String username, String password);
Map<String, String> getMysqlInfoByNamespace(String namespace); List<String> getTableListByDb(String ip, String port, String username, String password, String dbName);
List<Object> getTableListByDb(String ip, String port, String username, String password, String dbName); // 从同步库获取表结构
boolean getSourceDbStructure(String ip, String port, String username, String password, String dbName, String tableName);
// 将同步库的表结构同步到环境
boolean syncDbStructureToDest(String ip, String port, String username, String password, String dbName, String tableName);
} }
\ No newline at end of file
package cn.qg.holmes.service.effect.impl;
import cn.qg.holmes.entity.effect.BuildDataDetail;
import cn.qg.holmes.mapper.effect.BuildDataDetailMapper;
import cn.qg.holmes.service.effect.BuildDataDetailService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class BuildDataDetailServiceImpl extends ServiceImpl<BuildDataDetailMapper, BuildDataDetail>
implements BuildDataDetailService {
}
package cn.qg.holmes.service.effect.impl;
import cn.qg.holmes.entity.effect.BuildData;
import cn.qg.holmes.mapper.effect.BuildDataMapper;
import cn.qg.holmes.service.effect.BuildDataService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class BuildDataServiceImpl extends ServiceImpl<BuildDataMapper, BuildData> implements BuildDataService {
}
...@@ -53,7 +53,7 @@ public class PipelineServiceImpl extends ServiceImpl<PipelineMapper, Pipeline> i ...@@ -53,7 +53,7 @@ public class PipelineServiceImpl extends ServiceImpl<PipelineMapper, Pipeline> i
if (pipeline != null) { if (pipeline != null) {
if (pipeline.getEnable() == 1) { if (pipeline.getEnable() == 1) {
log.info("pipeline中找到对应项目,且项目是启动状态,开始构建:{}", pipeline.toString()); log.info("pipeline中找到对应项目,且项目是启动状态,开始构建:{}", pipeline.toString());
Integer buildNum = jenkinsService.buildJenkinsJob(pipeline.getServiceType(), projectName, branch, pipeline.getNamespace()); Integer buildNum = jenkinsService.buildTkeJob(pipeline.getServiceType(), projectName, branch, pipeline.getNamespace());
String markdown = DingdingUtils.buildPipelineMarkdownMsg(projectName, branch, pipeline.getServiceType(), author, message, commitDate, pipeline.getNamespace(), buildNum.toString()); String markdown = DingdingUtils.buildPipelineMarkdownMsg(projectName, branch, pipeline.getServiceType(), author, message, commitDate, pipeline.getNamespace(), buildNum.toString());
DingdingUtils.sendToDingding(markdown, dingRobotService.getById(pipeline.getDingRobotId()).getDingUrl()); DingdingUtils.sendToDingding(markdown, dingRobotService.getById(pipeline.getDingRobotId()).getDingUrl());
} else { } else {
......
...@@ -42,16 +42,20 @@ public class DingRobotServiceImpl extends ServiceImpl<DingRobotMapper, DingRobot ...@@ -42,16 +42,20 @@ public class DingRobotServiceImpl extends ServiceImpl<DingRobotMapper, DingRobot
String priority = JsonPath.read(jiraData, "$.issue.fields.priority.name"); String priority = JsonPath.read(jiraData, "$.issue.fields.priority.name");
String module = JsonPath.read(jiraData, "$.issue.fields.components[0].name"); String module = JsonPath.read(jiraData, "$.issue.fields.components[0].name");
String robotUrl = null; String robotUrl = null;
Integer dingRobotId = null;
Integer status = null;
List<DingRobot> dingRobots = dingRobotMapper.selectList(null); List<DingRobot> dingRobots = dingRobotMapper.selectList(null);
for (DingRobot dingRobot : dingRobots) { for (DingRobot dingRobot : dingRobots) {
String projectName = "【" + dingRobot.getProjectName() + "】"; String projectName = "【" + dingRobot.getProjectName() + "】";
if (summary.contains(projectName)) { if (summary.contains(projectName)) {
robotUrl = dingRobot.getDingUrl(); robotUrl = dingRobot.getDingUrl();
dingRobotId = dingRobot.getId();
status = dingRobot.getStatus();
break; break;
} }
} }
// 只有创建了dingRobot的项目的BUG才会被放到BUG池子里 // 只有创建了dingRobot的项目的BUG才会被放到BUG池子里
if (robotUrl != null) { if (robotUrl != null && dingRobotId != null) {
// 首次提交的BUG放入bug池子 // 首次提交的BUG放入bug池子
JiraBugPool jiraBugPool = new JiraBugPool(); JiraBugPool jiraBugPool = new JiraBugPool();
jiraBugPool.setKey(key); jiraBugPool.setKey(key);
...@@ -61,9 +65,11 @@ public class DingRobotServiceImpl extends ServiceImpl<DingRobotMapper, DingRobot ...@@ -61,9 +65,11 @@ public class DingRobotServiceImpl extends ServiceImpl<DingRobotMapper, DingRobot
jiraBugPool.setAssignee(assignee); jiraBugPool.setAssignee(assignee);
jiraBugPool.setUrl("http://jira2.quantgroup.cn/browse/" + key); jiraBugPool.setUrl("http://jira2.quantgroup.cn/browse/" + key);
jiraBugPool.setDingUrl(robotUrl); jiraBugPool.setDingUrl(robotUrl);
jiraBugPool.setDingRobotId(dingRobotId);
jiraBugPoolService.save(jiraBugPool); jiraBugPoolService.save(jiraBugPool);
} }
if (robotUrl != null) { // 只有项目是进行中才会发送通知
if (robotUrl != null && status == 1) {
String markdownMsg = DingdingUtils.buildBugCommitMarkdownMsg(key, summary, creator, assignee, priority, module); String markdownMsg = DingdingUtils.buildBugCommitMarkdownMsg(key, summary, creator, assignee, priority, module);
return DingdingUtils.sendToDingding(markdownMsg, robotUrl); return DingdingUtils.sendToDingding(markdownMsg, robotUrl);
} }
......
...@@ -5,5 +5,5 @@ import com.baomidou.mybatisplus.core.metadata.IPage; ...@@ -5,5 +5,5 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
public interface DockerProjectService extends IService<DockerProject> { public interface DockerProjectService extends IService<DockerProject> {
IPage<DockerProject> getDockerProjectList(String projectName, String projectType, Integer isActive, Integer pageNum, Integer pageSize); IPage<DockerProject> getDockerProjectList(String projectName, String projectType, Integer isActive, String hostName, Integer pageNum, Integer pageSize);
} }
package cn.qg.holmes.service.k8s;
import cn.qg.holmes.entity.k8s.EnvTemplateDetail;
import com.baomidou.mybatisplus.extension.service.IService;
public interface EnvTemplateDetailService extends IService<EnvTemplateDetail> {
}
package cn.qg.holmes.service.k8s;
import cn.qg.holmes.entity.k8s.EnvTemplate;
import com.baomidou.mybatisplus.extension.service.IService;
public interface EnvTemplateService extends IService<EnvTemplate> {
}
...@@ -45,12 +45,13 @@ public class ImageService { ...@@ -45,12 +45,13 @@ public class ImageService {
* @param repoName 服务名 * @param repoName 服务名
* @return * @return
*/ */
public Map<String, Object> getImageListByService(String repoName) { public TagInfoResp getImageListByService(String repoName) {
try { try {
DescribeImagePersonalRequest request = new DescribeImagePersonalRequest(); DescribeImagePersonalRequest request = new DescribeImagePersonalRequest();
request.setRepoName(repoName); request.setRepoName(repoName);
DescribeImagePersonalResponse response = tcrClient.DescribeImagePersonal(request); DescribeImagePersonalResponse response = tcrClient.DescribeImagePersonal(request);
return JSON.parseObject(DescribeImagePersonalResponse.toJsonString(response.getData()), Map.class); // return JSON.parseObject(DescribeImagePersonalResponse.toJsonString(response.getData()), Map.class);
return response.getData();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return null; return null;
...@@ -97,7 +98,8 @@ public class ImageService { ...@@ -97,7 +98,8 @@ public class ImageService {
public static void main(String[] args) { public static void main(String[] args) {
ImageService imageService = new ImageService(); ImageService imageService = new ImageService();
System.out.println(JSON.toJSONString(imageService.getRepoInfoList("qa-test"))); // System.out.println(JSON.toJSONString(imageService.getRepoInfoList("qa-base")));
System.out.println(JSON.toJSONString(imageService.getImageListByService("qa-base/mongodb")));
} }
} }
...@@ -16,6 +16,7 @@ public class MqService { ...@@ -16,6 +16,7 @@ public class MqService {
/** /**
* 获取MQ信息 * 获取MQ信息
*
* @param host * @param host
* @param auth * @param auth
* @return * @return
...@@ -29,6 +30,7 @@ public class MqService { ...@@ -29,6 +30,7 @@ public class MqService {
/** /**
* 同步线上MQ到测试 * 同步线上MQ到测试
*
* @param host * @param host
* @return * @return
*/ */
...@@ -39,13 +41,14 @@ public class MqService { ...@@ -39,13 +41,14 @@ public class MqService {
Map<String, Object> onlineDefinitions = getDefinitionsOfHost(ONLINE_MQ_URL, ONLINE_MQ_AUTH); Map<String, Object> onlineDefinitions = getDefinitionsOfHost(ONLINE_MQ_URL, ONLINE_MQ_AUTH);
List<Map<String, String>> permissionList = (List<Map<String, String>>) onlineDefinitions.get("permissions"); List<Map<String, String>> permissionList = (List<Map<String, String>>) onlineDefinitions.get("permissions");
List<Map<String, String>> qaPermissionList = new ArrayList<>(); List<Map<String, String>> qaPermissionList = new ArrayList<>();
for (Map<String, String> permission: permissionList) { for (Map<String, String> permission : permissionList) {
if (permission.get("user").equals("rabbit_admin")) { if (permission.get("user").equals("rabbit_admin")) {
qaPermissionList.add(permission); Map<String, String> temp = new HashMap<>();
temp.putAll(permission);
qaPermissionList.add(temp);
permission.put("user", "qa"); permission.put("user", "qa");
qaPermissionList.add(permission); qaPermissionList.add(permission);
} } else if (!permission.get("user").equals("qa") && !permission.get("user").equals("rabbit_admin")) {
if (!permission.get("user").equals("qa") && !permission.get("user").equals("rabbit_admin")) {
qaPermissionList.add(permission); qaPermissionList.add(permission);
} }
} }
...@@ -65,8 +68,73 @@ public class MqService { ...@@ -65,8 +68,73 @@ public class MqService {
} }
} }
/**
* 获取 sourceMapList 比 targetMapList 多出的元素
*
* @param sourceMapList
* @param targetMapList
* @return
*/
public List<String> mqListCompare(List<Map<String, String>> sourceMapList, List<Map<String, String>> targetMapList) {
List<String> resultList = new ArrayList<>();
for (Map<String, String> sourceMap : sourceMapList) {
boolean flag = false;
for (Map<String, String> targetMap : targetMapList) {
if (sourceMap.get("name").equals(targetMap.get("name"))) {
flag = true;
}
}
if (!flag) {
resultList.add(sourceMap.get("name"));
}
}
return resultList;
}
/**
* 比较测试环境与线上mq
* @param host 测试环境mq地址:ip+端口
* @return
*/
public Map<String, Object> getMqDiff(String host) {
String ONLINE_MQ_URL = "http://172.30.3.140:15672";
String ONLINE_MQ_AUTH = "Basic cmFiYml0X2FkbWluOmFiYzEyMzQ=";
Map<String, Object> onlineDefinitions = getDefinitionsOfHost(ONLINE_MQ_URL, ONLINE_MQ_AUTH);
String qaMqUrl = "http://" + host;
String QA_MQ_AUTH = "Basic cWE6cWF0ZXN0";
Map<String, Object> qaDefinitions = getDefinitionsOfHost(qaMqUrl, QA_MQ_AUTH);
List<Map<String, String>> onlineHostList = (List<Map<String, String>>) onlineDefinitions.get("vhosts");
List<Map<String, String>> qaHostList = (List<Map<String, String>>) qaDefinitions.get("vhosts");
List<Map<String, String>> onlineQueueList = (List<Map<String, String>>) onlineDefinitions.get("queues");
List<Map<String, String>> qaQueueList = (List<Map<String, String>>) qaDefinitions.get("queues");
List<String> lostVhostList = mqListCompare(onlineHostList, qaHostList);
List<String> moreVhostList = mqListCompare(qaHostList, onlineHostList);
List<String> lostQueueList = mqListCompare(onlineQueueList, qaQueueList);
List<String> moreQueueList = mqListCompare(qaQueueList, onlineQueueList);
Map<String, Object> map = new HashMap<>();
Map<String, Object> lostMap = new HashMap<>();
lostMap.put("vhost", lostVhostList);
lostMap.put("queue", lostQueueList);
Map<String, Object> moreMap = new HashMap<>();
moreMap.put("vhost", moreVhostList);
moreMap.put("queue", moreQueueList);
if (lostVhostList.size() > 0 || lostQueueList.size() > 0) {
lostMap.put("show", true);
} else {
lostMap.put("show", false);
}
if (moreVhostList.size() > 0 || moreQueueList.size() > 0) {
moreMap.put("show", true);
} else {
moreMap.put("show", false);
}
map.put("lost", lostMap);
map.put("more", moreMap);
return map;
}
public static void main(String[] args) { public static void main(String[] args) {
MqService mqService = new MqService(); MqService mqService = new MqService();
mqService.setDefinitions("172.17.5.17:31426"); mqService.setDefinitions("172.17.5.46:32419");
} }
} }
...@@ -25,8 +25,8 @@ public class DockerProjectServiceImpl extends ServiceImpl<DockerProjectMapper, D ...@@ -25,8 +25,8 @@ public class DockerProjectServiceImpl extends ServiceImpl<DockerProjectMapper, D
* @return * @return
*/ */
@Override @Override
public IPage<DockerProject> getDockerProjectList(String projectName, String projectType, Integer isActive, Integer pageNum, Integer pageSize) { public IPage<DockerProject> getDockerProjectList(String projectName, String projectType, Integer isActive, String hostName, Integer pageNum, Integer pageSize) {
IPage<DockerProject> page = new Page<>(pageNum, pageSize); IPage<DockerProject> page = new Page<>(pageNum, pageSize);
return dockerProjectMapper.getDockerProjectList(page, projectName, projectType, isActive); return dockerProjectMapper.getDockerProjectList(page, projectName, projectType, isActive, hostName);
} }
} }
package cn.qg.holmes.service.k8s.impl;
import cn.qg.holmes.entity.k8s.EnvTemplateDetail;
import cn.qg.holmes.mapper.k8s.EnvTemplateDetailMapper;
import cn.qg.holmes.service.k8s.EnvTemplateDetailService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class EnvTemplateDetailServiceImpl extends ServiceImpl<EnvTemplateDetailMapper, EnvTemplateDetail> implements EnvTemplateDetailService {
}
package cn.qg.holmes.service.k8s.impl;
import cn.qg.holmes.entity.k8s.EnvTemplate;
import cn.qg.holmes.mapper.k8s.EnvTemplateMapper;
import cn.qg.holmes.service.k8s.EnvTemplateService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class EnvTemplateServiceImpl extends ServiceImpl<EnvTemplateMapper, EnvTemplate> implements EnvTemplateService {
}
package cn.qg.holmes.task.jira; package cn.qg.holmes.task;
import cn.qg.holmes.entity.jira.DingRobot;
import cn.qg.holmes.entity.jira.JiraBugPool; import cn.qg.holmes.entity.jira.JiraBugPool;
import cn.qg.holmes.service.jira.DingRobotService;
import cn.qg.holmes.service.jira.JiraBugPoolService; import cn.qg.holmes.service.jira.JiraBugPoolService;
import cn.qg.holmes.service.jira.JiraIssueService; import cn.qg.holmes.service.jira.JiraIssueService;
import cn.qg.holmes.utils.DingdingUtils; import cn.qg.holmes.utils.DingdingUtils;
...@@ -16,11 +18,11 @@ import org.springframework.stereotype.Component; ...@@ -16,11 +18,11 @@ import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
/** /**
* Jira BUG通知到钉钉定时任务类 * JIRA BUG相关定时任务
*/ */
@Component @Component
@Slf4j @Slf4j
public class JiraToDingding { public class BugNotifyTask {
@Autowired @Autowired
JiraIssueService jiraIssueService; JiraIssueService jiraIssueService;
...@@ -28,6 +30,9 @@ public class JiraToDingding { ...@@ -28,6 +30,9 @@ public class JiraToDingding {
@Autowired @Autowired
JiraBugPoolService jiraBugPoolService; JiraBugPoolService jiraBugPoolService;
@Autowired
DingRobotService dingRobotService;
@Value("${sjgd.ding.url}") @Value("${sjgd.ding.url}")
private String sjgdDingUrl; private String sjgdDingUrl;
...@@ -80,9 +85,13 @@ public class JiraToDingding { ...@@ -80,9 +85,13 @@ public class JiraToDingding {
log.info("{} BUG持续时间:{}小时", issue.getKey(), duration); log.info("{} BUG持续时间:{}小时", issue.getKey(), duration);
// 如果已超过4个小时,则发送钉钉通知 // 如果已超过4个小时,则发送钉钉通知
if (duration >= 4) { if (duration >= 4) {
DingRobot dingRobot = dingRobotService.getById(jiraBugPool.getDingRobotId());
// 项目进行中才发送通知
if (dingRobot.getStatus() == 1) {
DingdingUtils.sendToDingding(DingdingUtils.buildBugFixRemindMsg(issue, duration), jiraBugPool.getDingUrl()); DingdingUtils.sendToDingding(DingdingUtils.buildBugFixRemindMsg(issue, duration), jiraBugPool.getDingUrl());
} }
} }
}
} else { } else {
log.info("JIRA上未找到该issue,将BUG: {} 置为无效", jiraBugPool.getKey()); log.info("JIRA上未找到该issue,将BUG: {} 置为无效", jiraBugPool.getKey());
jiraBugPool.setEnable(0); jiraBugPool.setEnable(0);
......
package cn.qg.holmes.task;
import cn.qg.holmes.utils.JenkinsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* 数据库同步定时任务
*/
@Slf4j
@Component
public class DbSyncTask {
@Autowired
JenkinsService jenkinsService;
@Scheduled(cron = "0 0 23 * * ?")
public void getDbInfoFromSourceJob() {
jenkinsService.buildDbDailyBackupJob();
}
}
...@@ -118,7 +118,7 @@ public class DingdingUtils { ...@@ -118,7 +118,7 @@ public class DingdingUtils {
content += "今日测试进度:" + progress + " \n\n"; content += "今日测试进度:" + progress + " \n\n";
content = content + "剩余未解决BUG列表:" + "\n\n"; content = content + "剩余未解决BUG列表:" + "\n\n";
if (issueList.size() == 0) { if (issueList.size() == 0) {
content += "暂无未解决BUG!"; content += "暂无未解决BUG!\n\n";
} }
int count = 0; int count = 0;
for (Issue issue: issueList) { for (Issue issue: issueList) {
......
...@@ -171,7 +171,7 @@ public class HttpClientUtils { ...@@ -171,7 +171,7 @@ public class HttpClientUtils {
public static String doPostJson(String url, Map<String, String> headers, String json) { public static String doPostJson(String url, Map<String, String> headers, String json) {
CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse httpResponse = null; CloseableHttpResponse httpResponse = null;
String resultString = ""; String resultString = null;
try { try {
// 创建Http Post请求 // 创建Http Post请求
HttpPost httpPost = new HttpPost(url); HttpPost httpPost = new HttpPost(url);
...@@ -183,7 +183,9 @@ public class HttpClientUtils { ...@@ -183,7 +183,9 @@ public class HttpClientUtils {
setHeader(headers, httpPost); setHeader(headers, httpPost);
httpResponse = httpClient.execute(httpPost); httpResponse = httpClient.execute(httpPost);
if (httpResponse.getEntity() != null) {
resultString = EntityUtils.toString(httpResponse.getEntity(), ENCODING); resultString = EntityUtils.toString(httpResponse.getEntity(), ENCODING);
}
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
......
...@@ -51,7 +51,7 @@ public class JenkinsService { ...@@ -51,7 +51,7 @@ public class JenkinsService {
* @param namespace 部署的环境 * @param namespace 部署的环境
* @return * @return
*/ */
public int buildJenkinsJob(String type, String project, String branch, String namespace) { public int buildTkeJob(String type, String project, String branch, String namespace) {
Map<String, String> buildParams = new HashMap<>(); Map<String, String> buildParams = new HashMap<>();
buildParams.put("GIT_REPO", project); buildParams.put("GIT_REPO", project);
buildParams.put("BRANCH_NAME", branch); buildParams.put("BRANCH_NAME", branch);
...@@ -154,6 +154,16 @@ public class JenkinsService { ...@@ -154,6 +154,16 @@ public class JenkinsService {
} }
} }
/**
* 构建sync_database_schema
* @param dbName
* @param host
* @param port
* @param replaceDomain
* @param notDeleteBusinessData
* @param useCache
* @return build num
*/
public int buildDbSyncJob(String dbName, String host, String port, public int buildDbSyncJob(String dbName, String host, String port,
boolean replaceDomain, boolean notDeleteBusinessData, boolean useCache) { boolean replaceDomain, boolean notDeleteBusinessData, boolean useCache) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
...@@ -188,6 +198,51 @@ public class JenkinsService { ...@@ -188,6 +198,51 @@ public class JenkinsService {
return result; return result;
} }
/**
* 构建db_sync
* @param namespace
* @param host
* @param port
* @param database
* @param table
* @param businessData
* @return build num
*/
public int buildDbSyncJobNew(String namespace, String host, String port, String database, String table, boolean businessData) {
Map<String, String> params = new HashMap<>();
params.put("namespace", namespace);
params.put("target_db_host", host);
params.put("target_db_port", port);
params.put("database", database);
params.put("table", table);
params.put("business_data", String.valueOf(businessData));
try {
jenkinsServer.getJob("db_sync").build(params);
Build build = jenkinsServer.getJob("db_sync").getLastBuild();
return build.getNumber() + 1;
} catch (Exception e) {
log.info("执行数据库同步脚本失败,host:{}, port: {}, dbName: {}", host, port, database);
e.printStackTrace();
return 0;
}
}
/**
* 构建db_daily_backup
* @return
*/
public int buildDbDailyBackupJob() {
try {
jenkinsServer.getJob("db_daily_backup").build();
Build build = jenkinsServer.getJob("db_daily_backup").getLastBuild();
return build.getNumber() + 1;
} catch (Exception e) {
log.info("执行数据库备份失败!");
e.printStackTrace();
return 0;
}
}
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
JenkinsService jenkinsApi = new JenkinsService(); JenkinsService jenkinsApi = new JenkinsService();
// List<Build> buildList = jenkinsApi.getJobBuildList("tke-java", 1, "kdsp"); // List<Build> buildList = jenkinsApi.getJobBuildList("tke-java", 1, "kdsp");
......
...@@ -14,6 +14,9 @@ ...@@ -14,6 +14,9 @@
<if test="isActive != null"> <if test="isActive != null">
AND `is_active` = #{isActive} AND `is_active` = #{isActive}
</if> </if>
<if test="hostName != null and hostName !=''">
AND `host_name` like CONCAT('%', #{hostName}, '%')
</if>
ORDER BY `id` DESC ORDER BY `id` DESC
</select> </select>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment