Commit 47dd6cd5 authored by 黎博's avatar 黎博

Merge branch 'master' into k8s

parents 0dcbec57 28fd73f2
......@@ -5,17 +5,26 @@ 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.entity.quality.DingRobot;
import cn.qg.holmes.entity.quality.SubmitTestInstruction;
import cn.qg.holmes.service.auth.TokenService;
import cn.qg.holmes.service.gitlab.PipelineService;
import cn.qg.holmes.service.jira.DingRobotService;
import cn.qg.holmes.service.quality.DingRobotService;
import cn.qg.holmes.service.quality.JiraService;
import cn.qg.holmes.service.quality.SubmitTestInstructionService;
import cn.qg.holmes.utils.DingdingUtils;
import cn.qg.holmes.utils.HttpClientUtils;
import cn.qg.holmes.utils.JenkinsService;
import com.alibaba.fastjson.JSONArray;
import com.atlassian.jira.rest.client.api.domain.BasicProject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
......@@ -43,6 +52,24 @@ public class PipelineController {
@Autowired
TokenService tokenService;
@Autowired
SubmitTestInstructionService submitTestInstructionService;
@Autowired
JiraService jiraService;
@Autowired
JenkinsService jenkinsService;
@Value("${qa-platform.https}")
private String qaPlatformHost;
@Value("${test.desc.ding.url}")
private String testDescDingUrl;
@Value("${qa-platform-ui.host}")
private String qaPlatformUiHost;
/**
* gitlab webhook
* @param request
......@@ -86,7 +113,20 @@ public class PipelineController {
IPage<DingRobot> projectRobotIPage = dingRobotService.page(page, dingRobotQueryWrapper);
List<DingRobot> dingRobotList = projectRobotIPage.getRecords();
List<DingRobotPipelineVo> dingRobotPipelineVoList = new ArrayList<>();
// 获取jira项目Map
Map<String, String> projectMap = new HashMap<>();
try {
Iterable<BasicProject> projects = jiraService.getJiraProjectList();
for (BasicProject project: projects) {
projectMap.put(project.getKey(), project.getName());
}
} catch (Exception e) {
log.info("获取jira项目Map失败.");
e.printStackTrace();
}
for (DingRobot dingRobot: dingRobotList) {
// 设置jiraProjectName
dingRobot.setJiraProjectName(projectMap.get(dingRobot.getJiraProjectKey()));
DingRobotPipelineVo dingRobotPipelineVo = new DingRobotPipelineVo();
dingRobotPipelineVo.setDingRobot(dingRobot);
QueryWrapper<Pipeline> pipelineQueryWrapper = new QueryWrapper<>();
......@@ -138,6 +178,39 @@ public class PipelineController {
}
pipelineService.saveBatch(pipelineList);
}
String dingUrl = dingRobot.getDingUrl();
Integer submitTestInstructionId = dingRobot.getSubmitTestInstructionId();
SubmitTestInstruction submitTestInstruction = submitTestInstructionService.getById(submitTestInstructionId);
// 提测说明不为空时
if (submitTestInstruction != null) {
// 开始循环执行SQL
String database = submitTestInstruction.getDatabase();
List<Map> databaseMapList = JSONArray.parseArray(database, Map.class);
String sqlExecUrl = qaPlatformHost + "/sql/execute";
Map<String, String> sqlExecParams = new HashMap<>();
sqlExecParams.put("namespace", dingRobot.getNamespace());
for (Map map: databaseMapList) {
String db = map.get("db").toString();
String sql = map.get("sql").toString();
sqlExecParams.put("database", db);
sqlExecParams.put("sql", sql);
sqlExecParams.put("type", sql.split(" ")[0]);
String response = HttpClientUtils.doGet(sqlExecUrl, sqlExecParams);
log.info("开始在数据库:{} 执行SQL: {}, 返回结果:{}", db, sql, response);
}
// 开始循环部署项目
for (Pipeline pipeline: pipelineList) {
log.info("首次创建提测说明,部署项目:{}, 分支:{}, 项目类型:{}, Namespace:{}", pipeline.getServiceName(),
pipeline.getServiceBranch(), pipeline.getServiceType(), pipeline.getNamespace());
jenkinsService.buildTkeJob(pipeline.getServiceType(), pipeline.getServiceName(), pipeline.getServiceBranch(), pipeline.getNamespace());
}
String submitTestUrl = qaPlatformUiHost + "/qa/detailTestDescription?projectName=" + projectName + "&jiraProjectKey=" + jiraProjectKey;
String msg = DingdingUtils.buildTestSubmitInstructionMsg(projectName, submitTestUrl);
boolean sendToDingResult = DingdingUtils.sendToDingding(msg, testDescDingUrl);
log.info("创建测试流程时,发送给数据组的通知结果:" + sendToDingResult);
}
log.info("新增dingRobot以及对应pipeline成功: {}", dingRobotPipelineVo);
return JsonResult.buildSuccessResult(true);
} catch (Exception e) {
e.printStackTrace();
......
......@@ -183,4 +183,26 @@ public class DockerProjectController {
return "";
}
/**
* 给提测说明提供的项目列表接口,目前只给出java项目和node项目
* @return
*/
@GetMapping("/list_for_test_desc")
public JsonResult getProjectListForTestDesc() {
QueryWrapper<DockerProject> dockerProjectQueryWrapper = new QueryWrapper<>();
List<String> projectTypeList = new ArrayList<>();
projectTypeList.add("java");
projectTypeList.add("node");
dockerProjectQueryWrapper
.in("project_type", projectTypeList)
.eq("is_active", 1);
List<DockerProject> dockerProjectList = dockerProjectService.list(dockerProjectQueryWrapper);
Collections.sort(dockerProjectList, (d1, d2) -> {
String projectName1 = d1.getProjectName();
String projectName2 = d2.getProjectName();
return projectName1.compareTo(projectName2);
});
return JsonResult.buildSuccessResult(dockerProjectList);
}
}
package cn.qg.holmes.controller.jira;
package cn.qg.holmes.controller.quality;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.jira.DingRobot;
import cn.qg.holmes.entity.jira.SendScheduleVo;
import cn.qg.holmes.entity.jira.SendSmokingResultVo;
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.entity.quality.DingRobot;
import cn.qg.holmes.entity.quality.SendScheduleVo;
import cn.qg.holmes.entity.quality.SendSmokingResultVo;
import cn.qg.holmes.service.quality.DingRobotService;
import cn.qg.holmes.service.quality.JiraBugPoolService;
import cn.qg.holmes.service.quality.JiraService;
import cn.qg.holmes.utils.DingdingUtils;
import com.atlassian.jira.rest.client.api.domain.BasicProject;
import com.atlassian.jira.rest.client.api.domain.Issue;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -24,13 +25,14 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@CrossOrigin
@RestController
@RequestMapping("/jira")
public class JiraController {
@Autowired
JiraIssueService jiraIssueService;
JiraService jiraService;
@Autowired
JiraBugPoolService jiraBugPoolService;
......@@ -66,7 +68,7 @@ public class JiraController {
@GetMapping("/list/project")
public JsonResult getJiraProjectKey() throws Exception {
List<Map<String, String>> jiraKeyList = new ArrayList<>();
Iterable<BasicProject> projects = jiraIssueService.getJiraProjectList();
Iterable<BasicProject> projects = jiraService.getJiraProjectList();
for (BasicProject project: projects) {
Map<String, String> map = new HashMap<>();
map.put("id", project.getId().toString());
......@@ -145,7 +147,7 @@ public class JiraController {
@GetMapping("/report/project")
public void sendReportToDingdingGroup(String project, String webhook) throws Exception {
Iterable<Issue> issues = jiraIssueService.getUnsolvedIssueListByProject(project);
Iterable<Issue> issues = jiraService.getUnsolvedIssueListByProject(project);
String markdownMsg = DingdingUtils.buildMarkdownMsgForUnsolvedIssueList(issues);
DingdingUtils.sendToDingding(markdownMsg, webhook);
}
......@@ -159,7 +161,7 @@ public class JiraController {
@PostMapping("/send/schedule")
public JsonResult sendTestReport(@RequestBody SendScheduleVo sendScheduleVo) throws Exception {
String JQL = "project = " + sendScheduleVo.getJiraProjectKey() + " AND resolution = Unresolved AND text ~ \"" + sendScheduleVo.getTestProjectName() + "\" ORDER BY priority DESC, updated DESC";
Iterable<Issue> issues = jiraIssueService.getIssueListByJQL(JQL);
Iterable<Issue> issues = jiraService.getIssueListByJQL(JQL);
String markdownMsg = DingdingUtils.buildTestScheduleMarkdownMsg(issues, sendScheduleVo.getProgress(), sendScheduleVo.getRisk());
return JsonResult.buildSuccessResult(DingdingUtils.sendToDingding(markdownMsg, sendScheduleVo.getWebhook()));
}
......@@ -174,7 +176,7 @@ public class JiraController {
public JsonResult sendSmokingResult(@RequestBody SendSmokingResultVo sendSmokingResultVo) throws Exception {
String JQL = "project = " + sendSmokingResultVo.getJiraProjectKey() + " AND resolution = Unresolved AND text ~ \""
+ sendSmokingResultVo.getTestProjectName() + "\" ORDER BY priority DESC, updated DESC";
Iterable<Issue> issues = jiraIssueService.getIssueListByJQL(JQL);
Iterable<Issue> issues = jiraService.getIssueListByJQL(JQL);
String markdownMsg = DingdingUtils.buildSmokingResultMarkdownMsg(issues, sendSmokingResultVo.getResult(), sendSmokingResultVo.getRisk());
return JsonResult.buildSuccessResult(DingdingUtils.sendToDingding(markdownMsg, sendSmokingResultVo.getWebhook()));
}
......@@ -196,7 +198,7 @@ public class JiraController {
} else {
JQL = "project = " + jiraProjectKey + " AND resolution = Unresolved AND text ~ \"" + projectName + "\" ORDER BY priority DESC, updated DESC";
}
Iterable<Issue> issues = jiraIssueService.getIssueListByJQL(JQL);
Iterable<Issue> issues = jiraService.getIssueListByJQL(JQL);
List<Map<String, Object>> mapList = new ArrayList<>();
for (Issue issue: issues) {
Map<String, Object> map = new HashMap<>();
......
package cn.qg.holmes.controller.quality;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.quality.SubmitTestInstruction;
import cn.qg.holmes.service.quality.JiraService;
import cn.qg.holmes.service.quality.SubmitTestInstructionService;
import com.atlassian.jira.rest.client.api.domain.BasicProject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 质量管理相关接口
* @author libo
* 2021-10-29
*/
@Slf4j
@CrossOrigin
@RestController
@RequestMapping("/quality")
public class QualityController {
@Autowired
SubmitTestInstructionService instructionService;
@Autowired
JiraService jiraService;
/**
* 提测说明分页列表
* @param projectName 项目名称
* @param jiraProjectKey jira项目关键字
* @param pageNum 第几页
* @param pageSize 每页多少个
* @return
*/
@GetMapping("/testInstruction/list")
public JsonResult getSubmitTestInstructionList(String projectName, String jiraProjectKey,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
QueryWrapper<SubmitTestInstruction> queryWrapper = new QueryWrapper<>();
if (!StringUtils.isEmpty(projectName)) {
queryWrapper.like("project_name", projectName);
}
if (!StringUtils.isEmpty(jiraProjectKey)) {
queryWrapper.like("jira_project_key", jiraProjectKey);
}
queryWrapper.orderByDesc("id");
IPage<SubmitTestInstruction> instructionIPage = new Page<>(pageNum, pageSize);
IPage<SubmitTestInstruction> page = instructionService.page(instructionIPage, queryWrapper);
Map<String, Object> map = new HashMap<>();
// map.put("list", page.getRecords());
List<SubmitTestInstruction> submitTestInstructionList = page.getRecords();
map.put("total", page.getTotal());
// 获取jira项目Map
Map<String, String> projectMap = new HashMap<>();
try {
Iterable<BasicProject> projects = jiraService.getJiraProjectList();
for (BasicProject project: projects) {
projectMap.put(project.getKey(), project.getName());
}
} catch (Exception e) {
log.info("获取jira项目Map失败.");
e.printStackTrace();
}
// 循环设置列表字段jiraProjectName
for (SubmitTestInstruction submitTestInstruction: submitTestInstructionList) {
submitTestInstruction.setJiraProjectName(projectMap.get(submitTestInstruction.getJiraProjectKey()));
}
map.put("list", submitTestInstructionList);
return JsonResult.buildSuccessResult(map);
}
/**
* 新增提测说明
* @param submitTestInstruction 提测说明实体类
* @return
*/
@RequiresPermissions("qa:testDescription:add")
@PostMapping("/testInstruction/save")
public JsonResult saveSubmitTestInstruction(@RequestBody SubmitTestInstruction submitTestInstruction) {
String projectName = submitTestInstruction.getProjectName();
String jiraProjectKey = submitTestInstruction.getJiraProjectKey();
QueryWrapper<SubmitTestInstruction> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("project_name", projectName);
queryWrapper.eq("jira_project_key", jiraProjectKey);
if (instructionService.getOne(queryWrapper) != null) {
return JsonResult.buildErrorStateResult("项目已存在,无法创建!", false);
}
return JsonResult.buildSuccessResult("项目创建成功!", instructionService.save(submitTestInstruction));
}
/**
* 更新提测说明
* @param submitTestInstruction 提测说明实体
* @return
*/
@RequiresPermissions("qa:testDescription:edit")
@PostMapping("/testInstruction/update")
public JsonResult updateSubmitTestInstruction(@RequestBody SubmitTestInstruction submitTestInstruction) {
return JsonResult.buildSuccessResult("更新成功!", instructionService.saveOrUpdate(submitTestInstruction));
}
/**
* 删除提测说明
* @param submitTestInstruction 提测说明实体
* @return
*/
@RequiresPermissions("qa:testDescription:del")
@PostMapping("/testInstruction/delete")
public JsonResult deleteSubmitTestInstruction(@RequestBody SubmitTestInstruction submitTestInstruction) {
return JsonResult.buildSuccessResult("删除成功!", instructionService.removeById(submitTestInstruction.getId()));
}
/**
* 根据jira项目关键字获取项目名称
* @param jiraProjectKey jira项目关键字,例如APP
* @return
*/
@GetMapping("/testInstruction/getProjectNameList")
public JsonResult getTestInstructionListForQaProcess(@RequestParam String jiraProjectKey) {
QueryWrapper<SubmitTestInstruction> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("jira_project_key", jiraProjectKey);
return JsonResult.buildSuccessResult("获取项目列表成功", instructionService.list(queryWrapper));
}
/**
* 获取详情
* @param projectName 项目名称
* @param jiraProjectKey jira项目关键字
* @return
*/
@GetMapping("/testInstruction/detail")
public JsonResult getTestInstructionDetail(@RequestParam String projectName, @RequestParam String jiraProjectKey) {
QueryWrapper<SubmitTestInstruction> queryWrapper = new QueryWrapper<>();
queryWrapper
.eq("project_name", projectName)
.eq("jira_project_key", jiraProjectKey);
SubmitTestInstruction submitTestInstruction = instructionService.getOne(queryWrapper);
if (submitTestInstruction == null) {
return JsonResult.buildErrorStateResult("所选项目不存在", false);
}
// 设置jiraProjectName
try {
Iterable<BasicProject> projects = jiraService.getJiraProjectList();
for (BasicProject project: projects) {
if (project.getKey().equals(submitTestInstruction.getJiraProjectKey())) {
submitTestInstruction.setJiraProjectName(project.getName());
}
}
} catch (Exception e) {
log.info("获取jira项目Map失败.");
e.printStackTrace();
}
return JsonResult.buildSuccessResult(submitTestInstruction);
}
}
package cn.qg.holmes.entity.gitlab;
import cn.qg.holmes.entity.jira.DingRobot;
import cn.qg.holmes.entity.quality.DingRobot;
import lombok.Data;
import java.util.List;
......
package cn.qg.holmes.entity.jira;
package cn.qg.holmes.entity.quality;
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;
......@@ -37,8 +38,17 @@ public class DingRobot {
* 1-进行中,2-已完成
*/
private Integer status;
/**
* 提测说明id
*/
private Integer submitTestInstructionId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
@TableField(exist = false)
private String jiraProjectName;
}
package cn.qg.holmes.entity.jira;
package cn.qg.holmes.entity.quality;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
......
package cn.qg.holmes.entity.jira;
package cn.qg.holmes.entity.quality;
import lombok.Data;
......
package cn.qg.holmes.entity.quality;
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 java.util.Date;
/**
* 提测说明实体类
* @author libo
* 2021-10-29
*/
@Data
@TableName(value = "submit_test_instruction")
public class SubmitTestInstruction {
@TableId(type = IdType.AUTO)
private Integer id;
/**
* 项目名称
*/
private String projectName;
/**
* jira项目关键字
*/
private String jiraProjectKey;
/**
* 服务和分支
*/
private String serviceAndBranch;
/**
* apollo配置
*/
private String apollo;
/**
* 数据库变更
*/
@TableField(value = "`database`")
private String database;
/**
* 需求文档地址
*/
@TableField(value = "`requirement`")
private String requirement;
/**
* 接口文档地址
*/
@TableField(value = "`api`")
private String api;
/**
* 提测范围
*/
@TableField(value = "`scope`")
private String scope;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
@TableField(exist = false)
private String jiraProjectName;
}
package cn.qg.holmes.mapper.jira;
package cn.qg.holmes.mapper.quality;
import cn.qg.holmes.entity.jira.DingRobot;
import cn.qg.holmes.entity.quality.DingRobot;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface DingRobotMapper extends BaseMapper<DingRobot> {
......
package cn.qg.holmes.mapper.jira;
package cn.qg.holmes.mapper.quality;
import cn.qg.holmes.entity.jira.JiraBugPool;
import cn.qg.holmes.entity.quality.JiraBugPool;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface JiraBugPoolMapper extends BaseMapper<JiraBugPool> {
......
package cn.qg.holmes.mapper.quality;
import cn.qg.holmes.entity.quality.SubmitTestInstruction;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface SubmitTestInstructionMapper extends BaseMapper<SubmitTestInstruction> {
}
......@@ -7,6 +7,7 @@ import com.alibaba.fastjson.JSON;
import com.jayway.jsonpath.JsonPath;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.HashMap;
......@@ -27,6 +28,9 @@ public class AutoUtilsServiceImpl implements AutoUtilsService {
@Autowired
RedisUtils redisUtils;
@Value("${qa-platform.https}")
private String qaPlatformHost;
/**
* 参数替换-新
* @param parameters headers或者parameters
......@@ -191,7 +195,7 @@ public class AutoUtilsServiceImpl implements AutoUtilsService {
params.put("sql", sql);
params.put("type", type);
log.info("开始执行SQL:{}", sql);
String url = "https://qa-platform-yxm.liangkebang.net/sql/execute";
String url = qaPlatformHost + "/sql/execute";
String result = HttpClientUtils.doGet(url, params);
log.info("SQL返回结果:{}", result);
// 只有select才需要加入Map
......
......@@ -3,7 +3,7 @@ package cn.qg.holmes.service.gitlab.impl;
import cn.qg.holmes.entity.gitlab.Pipeline;
import cn.qg.holmes.mapper.gitlab.PipelineMapper;
import cn.qg.holmes.service.gitlab.PipelineService;
import cn.qg.holmes.service.jira.DingRobotService;
import cn.qg.holmes.service.quality.DingRobotService;
import cn.qg.holmes.utils.DingdingUtils;
import cn.qg.holmes.utils.JenkinsService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
......
......@@ -645,24 +645,38 @@ public class K8sService {
// 需要做健康检查的不创建存活检查和就绪检查
List<String> noHealthCheckServiceList = Arrays.asList(noHealthCheckService.split(","));
if (!noHealthCheckServiceList.contains(serviceName)) {
// livenessProbe
Probe livenessProbe = new Probe();
ExecAction execAction = new ExecAction();
List<String> commandList = new ArrayList<>();
commandList.add("/home/quant_group/readyCheck.sh");
execAction.setCommand(commandList);
// livenessProbe 存活检查,检查容器是否正常,不正常则重启实例
Probe livenessProbe = new Probe();
livenessProbe.setExec(execAction);
// 启动延时,容器延时启动健康检查的时间
livenessProbe.setInitialDelaySeconds(200);
// 间隔时间,进行健康检查的时间间隔
livenessProbe.setPeriodSeconds(30);
// 响应超时,每次健康检查响应的最大超时时间
livenessProbe.setTimeoutSeconds(5);
// 健康阈值,表示后端容器从失败到成功的连续健康检查成功次数
livenessProbe.setSuccessThreshold(1);
livenessProbe.setFailureThreshold(40);
// 不健康阈值,表示后端容器从成功到失败的连续健康检查成功次数
livenessProbe.setFailureThreshold(3);
container.setLivenessProbe(livenessProbe);
//readinessProbe
//readinessProbe 就绪检查,检查容器是否就绪,不就绪则停止转发流量到当前实例
Probe readinessProbe = new Probe();
readinessProbe.setExec(execAction);
readinessProbe.setInitialDelaySeconds(200);
readinessProbe.setTimeoutSeconds(2);
readinessProbe.setPeriodSeconds(40);
// 启动延时
readinessProbe.setInitialDelaySeconds(30);
// 响应超时
readinessProbe.setTimeoutSeconds(5);
// 间隔时间
readinessProbe.setPeriodSeconds(10);
// 健康阈值
readinessProbe.setSuccessThreshold(1);
// 不健康阈值
readinessProbe.setFailureThreshold(3);
container.setReadinessProbe(readinessProbe);
}
......
package cn.qg.holmes.service.jira;
package cn.qg.holmes.service.quality;
import cn.qg.holmes.entity.jira.DingRobot;
import cn.qg.holmes.entity.quality.DingRobot;
import com.baomidou.mybatisplus.extension.service.IService;
public interface DingRobotService extends IService<DingRobot> {
......
package cn.qg.holmes.service.jira;
package cn.qg.holmes.service.quality;
import cn.qg.holmes.entity.jira.JiraBugPool;
import cn.qg.holmes.entity.quality.JiraBugPool;
import com.baomidou.mybatisplus.extension.service.IService;
public interface JiraBugPoolService extends IService<JiraBugPool> {
......
package cn.qg.holmes.service.jira;
package cn.qg.holmes.service.quality;
import com.atlassian.jira.rest.client.api.domain.BasicProject;
import com.atlassian.jira.rest.client.api.domain.Issue;
import org.joda.time.DateTime;
public interface JiraIssueService {
public interface JiraService {
Iterable<Issue> getUnsolvedIssueListByProject(String project) throws Exception;
......
package cn.qg.holmes.service.quality;
import cn.qg.holmes.entity.quality.SubmitTestInstruction;
import com.baomidou.mybatisplus.extension.service.IService;
public interface SubmitTestInstructionService extends IService<SubmitTestInstruction> {
}
package cn.qg.holmes.service.jira.impl;
package cn.qg.holmes.service.quality.impl;
import cn.qg.holmes.entity.jira.DingRobot;
import cn.qg.holmes.entity.jira.JiraBugPool;
import cn.qg.holmes.mapper.jira.DingRobotMapper;
import cn.qg.holmes.service.jira.DingRobotService;
import cn.qg.holmes.service.jira.JiraBugPoolService;
import cn.qg.holmes.entity.quality.DingRobot;
import cn.qg.holmes.entity.quality.JiraBugPool;
import cn.qg.holmes.mapper.quality.DingRobotMapper;
import cn.qg.holmes.service.quality.DingRobotService;
import cn.qg.holmes.service.quality.JiraBugPoolService;
import cn.qg.holmes.utils.DingdingUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jayway.jsonpath.JsonPath;
......
package cn.qg.holmes.service.jira.impl;
package cn.qg.holmes.service.quality.impl;
import cn.qg.holmes.entity.jira.JiraBugPool;
import cn.qg.holmes.mapper.jira.JiraBugPoolMapper;
import cn.qg.holmes.service.jira.JiraBugPoolService;
import cn.qg.holmes.entity.quality.JiraBugPool;
import cn.qg.holmes.mapper.quality.JiraBugPoolMapper;
import cn.qg.holmes.service.quality.JiraBugPoolService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
......
package cn.qg.holmes.service.jira.impl;
package cn.qg.holmes.service.quality.impl;
import cn.qg.holmes.service.jira.JiraIssueService;
import cn.qg.holmes.service.quality.JiraService;
import com.atlassian.jira.rest.client.api.JiraRestClient;
import com.atlassian.jira.rest.client.api.JiraRestClientFactory;
import com.atlassian.jira.rest.client.api.domain.BasicProject;
......@@ -14,10 +14,9 @@ import org.springframework.stereotype.Service;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.concurrent.ExecutionException;
@Service
public class JiraIssueServiceImpl implements JiraIssueService {
public class JiraServiceImpl implements JiraService {
public static String url = "http://jira2.quantgroup.cn/";
public static String username = "test1";
......
package cn.qg.holmes.service.quality.impl;
import cn.qg.holmes.entity.quality.SubmitTestInstruction;
import cn.qg.holmes.mapper.quality.SubmitTestInstructionMapper;
import cn.qg.holmes.service.quality.SubmitTestInstructionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class SubmitTestInstructionServiceImpl extends ServiceImpl<SubmitTestInstructionMapper, SubmitTestInstruction>
implements SubmitTestInstructionService {
}
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.entity.quality.DingRobot;
import cn.qg.holmes.entity.quality.JiraBugPool;
import cn.qg.holmes.service.quality.DingRobotService;
import cn.qg.holmes.service.quality.JiraBugPoolService;
import cn.qg.holmes.service.quality.JiraService;
import cn.qg.holmes.utils.DingdingUtils;
import com.atlassian.jira.rest.client.api.domain.Issue;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
......@@ -25,7 +25,7 @@ import java.util.List;
public class BugNotifyTask {
@Autowired
JiraIssueService jiraIssueService;
JiraService jiraService;
@Autowired
JiraBugPoolService jiraBugPoolService;
......@@ -47,7 +47,7 @@ public class BugNotifyTask {
public void SJGDJiraIssueStatisticsTimedJob() throws Exception {
if (taskDebug.equals("true")) {
log.info("开始执行数据工单BUG统计定时任务!");
Iterable<Issue> issues = jiraIssueService.getUnsolvedIssueListByProject("SJGD");
Iterable<Issue> issues = jiraService.getUnsolvedIssueListByProject("SJGD");
String markdownMsg = DingdingUtils.buildMarkdownMsgForUnsolvedIssueList(issues);
DingdingUtils.sendToDingding(markdownMsg, sjgdDingUrl);
} else {
......@@ -67,7 +67,7 @@ public class BugNotifyTask {
jiraBugPoolQueryWrapper.eq("enable", 1);
List<JiraBugPool> jiraBugPoolList = jiraBugPoolService.list(jiraBugPoolQueryWrapper);
for (JiraBugPool jiraBugPool: jiraBugPoolList) {
Issue issue = jiraIssueService.getJiraIssueByKey(jiraBugPool.getKey());
Issue issue = jiraService.getJiraIssueByKey(jiraBugPool.getKey());
if (issue != null) {
String resolveResult = issue.getStatus().getName();
// 如果已关闭,仅修改状态
......@@ -81,7 +81,7 @@ public class BugNotifyTask {
} else {
DateTime startDate = issue.getCreationDate();
DateTime curDate = new DateTime();
int duration = jiraIssueService.calculateBugFixTime(startDate, curDate);
int duration = jiraService.calculateBugFixTime(startDate, curDate);
log.info("{} BUG持续时间:{}小时", issue.getKey(), duration);
// 如果已超过4个小时,则发送钉钉通知
if (duration >= 4) {
......
......@@ -234,6 +234,21 @@ public class DingdingUtils {
return buildMarkdownMsg(title, content, true);
}
/**
* 构建发送给 项目上线后消息同步 的消息
* @param projectName 项目名称
* @param submitTestUrl 提测说明地址
* @return
*/
public static String buildTestSubmitInstructionMsg(String projectName, String submitTestUrl) {
String title = "新项目提测通知";
String content = "亲爱的数仓小伙伴,有新的项目提测啦。请关注:\n\n";
content += "- 项目名:" + projectName + "\n";
content += "- 项目详细信息:" + submitTestUrl + "\n\n";
content += "测试已经开始接手项目,正在紧急的测试中,项目上线后还会触发一个上线机器人。请根据实际情况,关注项目上线后的情况~";
return buildMarkdownMsg(title, content, true);
}
public static void main(String[] args) {
// String markdown = buildMarkdownMsg("YXM-1499", "【羊小咩v7.6.00】【VCC首次交易率提升专题】巴拉巴拉", "黎博", "于巧玲", "p1", "kddsp");
// String markdown = buildPipelineMarkdownMsg("holmes", "master", "bo.li", "测试", "2021-06-03 14:59:45", "fe");
......
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