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

合并master

parents 3faeeda1 d0c7a412
......@@ -161,6 +161,12 @@
<version>3.1.305</version>
</dependency>
<!-- 参数校验 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
<build>
......
......@@ -3,26 +3,61 @@ package cn.qg.holmes.aspect;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.exception.TokenInvalidException;
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.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 全局异常处理
* @author libo
*/
@ControllerAdvice
@ResponseBody
public class ExceptionHandlerAdvice {
/**
* 权限不足
*/
@ExceptionHandler(UnauthorizedException.class)
public JsonResult handleException(UnauthorizedException e) {
e.printStackTrace();
return JsonResult.buildErrorStateResult("权限不足!", false);
}
/**
* Token无效
*/
@ExceptionHandler(TokenInvalidException.class)
public JsonResult handleException(TokenInvalidException e) {
e.printStackTrace();
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)
public JsonResult handleException(Exception e) {
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;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.service.effect.DatabaseSyncService;
import cn.qg.holmes.service.k8s.K8sService;
import cn.qg.holmes.utils.JenkinsService;
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.Value;
import org.springframework.web.bind.annotation.*;
......@@ -35,22 +38,43 @@ public class DbSyncController {
@Value("${dbsync.mysql.password}")
private String password;
@Autowired
K8sService k8sService;
/**
* 同步数据库
* @param namespace 环境
* @param dbName 数据库名称
* @param tableName 表名称
* @param businessData 是否保留业务数据
* @return
*/
@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 {
long startTime = System.currentTimeMillis();
Map<String, String> map = databaseSyncService.getMysqlInfoByNamespace(namespace);
String destIp = map.get("ip");
Map<String, String> map = k8sService.getMysqlAddressByNamespace(namespace);
String destIp = map.get("host");
String destPort = map.get("port");
log.info("获取到{}环境的Mysql地址为:{}", namespace, destIp + ":" + destPort);
if (tableName.equalsIgnoreCase("all") || tableName.equals("")) {
log.info("开始同步{}库下所有的表", dbName);
databaseSyncService.getDbInfoFromSource(ip, port, username, password, dbName);
databaseSyncService.syncDbToDest(destIp, destPort, "qa", "qatest", dbName, namespace);
} else {
log.info("开始同步{}库下{}表", dbName, tableName);
databaseSyncService.getSingleTableFromSource(ip, port, username, password, dbName, tableName);
databaseSyncService.syncSingleTableToDest(destIp, destPort, "qa", "qatest", dbName, tableName);
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("")) {
log.info("开始同步{}库下所有表到{}环境,保留业务数据:{}", dbName, namespace, businessData);
databaseSyncService.getDbInfoFromSource(ip, port, username, password, dbName);
databaseSyncService.syncDbToDest(destIp, destPort, "qa", "qatest", dbName, namespace, businessData);
} else {
log.info("开始同步{}库下{}表到{}环境,保留业务数据:{}", dbName, tableName, namespace, businessData);
databaseSyncService.getSingleTableFromSource(ip, port, username, password, dbName, tableName);
databaseSyncService.syncSingleTableToDest(destIp, destPort, "qa", "qatest", dbName, tableName, businessData);
}
}
}
long endTime = System.currentTimeMillis();
long elapsedTime = (endTime - startTime) / 1000;
......@@ -77,11 +101,79 @@ public class DbSyncController {
*/
@GetMapping("/tables")
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");
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
* @param dbName 数据库名
......
......@@ -30,7 +30,7 @@ public class JenkinsController {
@RequestParam String namespace) {
try {
log.info("开始构建jenkins项目:项目类型:{}, 项目名:{}, 分支:{}, 部署至环境:{}", type, project, branch, namespace);
jenkinsService.buildJenkinsJob(type, project, branch, namespace);
jenkinsService.buildTkeJob(type, project, branch, namespace);
return JsonResult.buildSuccessResult(true);
} catch (Exception e) {
e.printStackTrace();
......
......@@ -2,9 +2,11 @@ package cn.qg.holmes.controller.gitlab;
import cn.qg.holmes.common.JsonResult;
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.Pipeline;
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.jira.DingRobotService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
......@@ -35,6 +37,12 @@ public class PipelineController {
@Autowired
DingRobotService dingRobotService;
@Autowired
HttpServletRequest servletRequest;
@Autowired
TokenService tokenService;
/**
* gitlab webhook
* @param request
......@@ -57,7 +65,7 @@ public class PipelineController {
}
@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 = "10") Integer pageSize) {
IPage<DingRobot> page = new Page<>(pageNum, pageSize);
......@@ -71,6 +79,9 @@ public class PipelineController {
if (!StringUtils.isEmpty(namespace)) {
dingRobotQueryWrapper.eq("namespace", namespace);
}
if (status != null) {
dingRobotQueryWrapper.eq("status", status);
}
dingRobotQueryWrapper.orderByDesc("id");
IPage<DingRobot> projectRobotIPage = dingRobotService.page(page, dingRobotQueryWrapper);
List<DingRobot> dingRobotList = projectRobotIPage.getRecords();
......@@ -99,6 +110,10 @@ public class PipelineController {
public JsonResult addRobotAndPipeline(@RequestBody DingRobotPipelineVo dingRobotPipelineVo) {
try {
DingRobot dingRobot = dingRobotPipelineVo.getDingRobot();
// 设置创建人
String token = servletRequest.getHeader("token");
UserInfoVo userInfoVo = tokenService.getUserInfoFromCache(token);
dingRobot.setCreator(userInfoVo.getChineseName());
String projectName = dingRobot.getProjectName();
String jiraProjectKey = dingRobot.getJiraProjectKey();
QueryWrapper<DingRobot> dingRobotQueryWrapper = new QueryWrapper<>();
......@@ -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 {
* @return
*/
@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 = "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.put("total", projectIPage.getTotal());
map.put("list", projectIPage.getRecords());
......@@ -169,4 +169,18 @@ public class DockerProjectController {
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 {
Map<Integer, String> moduleMap =navigateModuleList.stream().collect(Collectors.toMap(NavigateModule::getId, NavigateModule::getName));
// 获取导航列表
List<NavigateDetail> navigateDetailList = navigateDetailService.list(detailQueryWrapper);
List<Map<String, Object>> resultList = new ArrayList<>();
for (NavigateDetail navigateDetail: navigateDetailList) {
Map<String, Object> map = new HashMap<>();
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);
navigateDetail.setModuleName(moduleMap.get(navigateDetail.getModule()));
}
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;
public class DingRobot {
@TableId(type = IdType.AUTO)
private Integer id;
/**
* 项目名称,与提BUG时【】里的内容进行匹配
*/
private String projectName;
/**
* jira项目关键字
*/
private String jiraProjectKey;
/**
* 钉钉机器人webhook
*/
private String dingUrl;
/**
* 创建人
*/
private String creator;
/**
* 环境
*/
private String namespace;
/**
* 1-进行中,2-已完成
*/
private Integer status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
......
......@@ -44,10 +44,16 @@ public class JiraBugPool {
* 钉钉robot
*/
private String dingUrl;
/**
* 对应项目id
*/
private Integer dingRobotId;
/**
* 是否有效,1-有效,0-无效
*/
private Integer enable;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@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;
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;
......@@ -45,4 +46,7 @@ public class NavigateDetail {
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
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;
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;
import java.util.List;
import java.util.Map;
public interface DatabaseSyncService {
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 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
if (pipeline != null) {
if (pipeline.getEnable() == 1) {
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());
DingdingUtils.sendToDingding(markdown, dingRobotService.getById(pipeline.getDingRobotId()).getDingUrl());
} else {
......
......@@ -42,16 +42,20 @@ public class DingRobotServiceImpl extends ServiceImpl<DingRobotMapper, DingRobot
String priority = JsonPath.read(jiraData, "$.issue.fields.priority.name");
String module = JsonPath.read(jiraData, "$.issue.fields.components[0].name");
String robotUrl = null;
Integer dingRobotId = null;
Integer status = null;
List<DingRobot> dingRobots = dingRobotMapper.selectList(null);
for (DingRobot dingRobot : dingRobots) {
String projectName = "【" + dingRobot.getProjectName() + "】";
if (summary.contains(projectName)) {
robotUrl = dingRobot.getDingUrl();
dingRobotId = dingRobot.getId();
status = dingRobot.getStatus();
break;
}
}
// 只有创建了dingRobot的项目的BUG才会被放到BUG池子里
if (robotUrl != null) {
if (robotUrl != null && dingRobotId != null) {
// 首次提交的BUG放入bug池子
JiraBugPool jiraBugPool = new JiraBugPool();
jiraBugPool.setKey(key);
......@@ -61,9 +65,11 @@ public class DingRobotServiceImpl extends ServiceImpl<DingRobotMapper, DingRobot
jiraBugPool.setAssignee(assignee);
jiraBugPool.setUrl("http://jira2.quantgroup.cn/browse/" + key);
jiraBugPool.setDingUrl(robotUrl);
jiraBugPool.setDingRobotId(dingRobotId);
jiraBugPoolService.save(jiraBugPool);
}
if (robotUrl != null) {
// 只有项目是进行中才会发送通知
if (robotUrl != null && status == 1) {
String markdownMsg = DingdingUtils.buildBugCommitMarkdownMsg(key, summary, creator, assignee, priority, module);
return DingdingUtils.sendToDingding(markdownMsg, robotUrl);
}
......
......@@ -5,5 +5,5 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
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 {
* @param repoName 服务名
* @return
*/
public Map<String, Object> getImageListByService(String repoName) {
public TagInfoResp getImageListByService(String repoName) {
try {
DescribeImagePersonalRequest request = new DescribeImagePersonalRequest();
request.setRepoName(repoName);
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) {
e.printStackTrace();
return null;
......@@ -97,7 +98,8 @@ public class ImageService {
public static void main(String[] args) {
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 {
/**
* 获取MQ信息
*
* @param host
* @param auth
* @return
......@@ -29,6 +30,7 @@ public class MqService {
/**
* 同步线上MQ到测试
*
* @param host
* @return
*/
......@@ -39,13 +41,14 @@ public class MqService {
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>> qaPermissionList = new ArrayList<>();
for (Map<String, String> permission: permissionList) {
for (Map<String, String> permission : permissionList) {
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");
qaPermissionList.add(permission);
}
if (!permission.get("user").equals("qa") && !permission.get("user").equals("rabbit_admin")) {
} else if (!permission.get("user").equals("qa") && !permission.get("user").equals("rabbit_admin")) {
qaPermissionList.add(permission);
}
}
......@@ -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) {
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
* @return
*/
@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);
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.service.jira.DingRobotService;
import cn.qg.holmes.service.jira.JiraBugPoolService;
import cn.qg.holmes.service.jira.JiraIssueService;
import cn.qg.holmes.utils.DingdingUtils;
......@@ -16,11 +18,11 @@ import org.springframework.stereotype.Component;
import java.util.List;
/**
* Jira BUG通知到钉钉定时任务类
* JIRA BUG相关定时任务
*/
@Component
@Slf4j
public class JiraToDingding {
public class BugNotifyTask {
@Autowired
JiraIssueService jiraIssueService;
......@@ -28,6 +30,9 @@ public class JiraToDingding {
@Autowired
JiraBugPoolService jiraBugPoolService;
@Autowired
DingRobotService dingRobotService;
@Value("${sjgd.ding.url}")
private String sjgdDingUrl;
......@@ -80,7 +85,11 @@ public class JiraToDingding {
log.info("{} BUG持续时间:{}小时", issue.getKey(), duration);
// 如果已超过4个小时,则发送钉钉通知
if (duration >= 4) {
DingdingUtils.sendToDingding(DingdingUtils.buildBugFixRemindMsg(issue, duration), jiraBugPool.getDingUrl());
DingRobot dingRobot = dingRobotService.getById(jiraBugPool.getDingRobotId());
// 项目进行中才发送通知
if (dingRobot.getStatus() == 1) {
DingdingUtils.sendToDingding(DingdingUtils.buildBugFixRemindMsg(issue, duration), jiraBugPool.getDingUrl());
}
}
}
} else {
......
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 {
content += "今日测试进度:" + progress + " \n\n";
content = content + "剩余未解决BUG列表:" + "\n\n";
if (issueList.size() == 0) {
content += "暂无未解决BUG!";
content += "暂无未解决BUG!\n\n";
}
int count = 0;
for (Issue issue: issueList) {
......
......@@ -171,7 +171,7 @@ public class HttpClientUtils {
public static String doPostJson(String url, Map<String, String> headers, String json) {
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse httpResponse = null;
String resultString = "";
String resultString = null;
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
......@@ -183,7 +183,9 @@ public class HttpClientUtils {
setHeader(headers, httpPost);
httpResponse = httpClient.execute(httpPost);
resultString = EntityUtils.toString(httpResponse.getEntity(), ENCODING);
if (httpResponse.getEntity() != null) {
resultString = EntityUtils.toString(httpResponse.getEntity(), ENCODING);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
......
......@@ -51,7 +51,7 @@ public class JenkinsService {
* @param namespace 部署的环境
* @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<>();
buildParams.put("GIT_REPO", project);
buildParams.put("BRANCH_NAME", branch);
......@@ -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,
boolean replaceDomain, boolean notDeleteBusinessData, boolean useCache) {
Map<String, String> params = new HashMap<>();
......@@ -188,6 +198,51 @@ public class JenkinsService {
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 {
JenkinsService jenkinsApi = new JenkinsService();
// List<Build> buildList = jenkinsApi.getJobBuildList("tke-java", 1, "kdsp");
......
......@@ -14,6 +14,9 @@
<if test="isActive != null">
AND `is_active` = #{isActive}
</if>
<if test="hostName != null and hostName !=''">
AND `host_name` like CONCAT('%', #{hostName}, '%')
</if>
ORDER BY `id` DESC
</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