实现通过Jenkins api找到job构建人信息并定时发邮件(通过公司邮箱)
创始人
2024-03-25 09:29:49
0

需求

在大屏上显示出每个项目的构建情况,如果构建失败,大屏上项目颜色变红的同时要给最新构建这个项目的用户发送邮件,提醒他构建失败了。

准备知识

大屏上显示的项目构建情况,其实是通过Jenkins api 获取的,想要看Jenkins 每个页面的api内容,直接在网页地址后面加上api/json就行了,如下图所示。对Jenkins api 不理解的可以去看:Jenkins API简单使用
在这里插入图片描述

效果

在这里插入图片描述

编码过程

pom.xml

添加好 jenkins api 、邮件、模板引擎的依赖

       com.cdancyjenkins-rest0.0.30com.google.guavaguava31.1-jreorg.springframework.bootspring-boot-starter-freemarkercom.surevineews-java-api2.15javax.xml.wsjaxws-api2.3.1cn.hutoolhutool-all5.5.8com.sunldapbp1.0

发送邮件定时任务RemindTask

@Slf4j
@Component("remindTask")
public class RemindTask {@Autowiredprivate CiDashBoardMapper ciDashBoardMapper;@Autowiredprivate JenkinsConfig jenkinsConfig;@Autowiredprivate CiDashBoardService ciDashBoardService;public void sendRemindEmail() {log.info("sendRemindEmail start! ");List ciDashBoardVOList = ciDashBoardMapper.getCiDashBoardData();ciDashBoardVOList.forEach(ciDashBoardVO -> {String color=getColor(ciDashBoardVO.getColors());//如果是红色就给对应责任人发邮件if(Objects.equals( color, "red")){List remindTaskVOList= ciDashBoardMapper.getDashBoardJobUrl(ciDashBoardVO.getProjectName(),color);if (CollUtil.isEmpty(remindTaskVOList)) {log.info("remindTaskVOList列表是空的");}remindTaskVOList.forEach(remindTaskVO -> {//创建jenkins连接,根据api一层层的找对应构建责任人JobsApi jobApi = jenkinsConfig.connection().jobsApi();String folderName=remindTaskVO.getFolderName();String jobName=remindTaskVO.getJobName();JobInfo jobInfo = jobApi.jobInfo(folderName, jobName);int  number=jobInfo.lastBuild().number();BuildInfo buildInfo = jobApi.buildInfo(folderName, jobName,number);// String userId=buildInfo.actions().get(1).causes().get(0).userId();String userName=buildInfo.actions().get(1).causes().get(0).userName();//找到后发邮件try {Boolean sendRemindEmail=ciDashBoardService.sendRemindEmail(folderName,jobName,userName);if(sendRemindEmail){log.info("给构建失败责任人{}发送提醒邮件成功",userName);}else{log.info("给构建失败责任人{}发送提醒邮件失败,请检查",userName);}} catch (ParseException e) {throw new RuntimeException(e);}});}else{log.info("项目没有报红");}});log.info("sendRemindEmail end! ");}/*** @Description: 计算构建的颜色*/private String getColor(String colors) {if (StrUtil.isBlank(colors)) {return JenkinsColorStatusEnum.UNKNOWN.getInfo();}if (colors.contains(JenkinsColorStatusEnum.RED.getInfo())) {return JenkinsColorStatusEnum.RED.getInfo();}if (colors.contains(JenkinsColorStatusEnum.YELLOW.getInfo())) {return JenkinsColorStatusEnum.YELLOW.getInfo();}return JenkinsColorStatusEnum.BLUE.getInfo();}}

remindTaskVO

/*** @Description: 提醒任务vo*/
@Data
public class remindTaskVO {private String folderName;private String jobName;}

CiDashBoardMapper :获取展示在大屏上的所有项目以及对应job的projectName和urlName

public interface CiDashBoardMapper {List getCiDashBoardData();/*** @Description: 获取展示在大屏上的所有项目对应job的projectName和urlName*/List getDashBoardJobUrl(String projectName, String color);
}

CiDashBoardMapper.xml




CiDashBoardService

public interface CiDashBoardService {AjaxResult getCiDashBoardData();/*** @Description: 发送邮件提醒功能*/public  boolean sendRemindEmail(String folderName,String jobName,String username) throws ParseException;}

CiDashBoardServiceImpl


@Slf4j
@Service
@AllArgsConstructor
public class CiDashBoardServiceImpl implements CiDashBoardService {@Autowiredprivate CiDashBoardMapper ciDashBoardMapper;private final Configuration configuration;/*** @Description: 动态获取构建大屏的数据*/@Overridepublic AjaxResult getCiDashBoardData() {List ciDashBoardVOList = ciDashBoardMapper.getCiDashBoardData();if (CollUtil.isEmpty(ciDashBoardVOList)) {return AjaxResult.error("ciDashBoardVOList列表是空的");}JSONArray jsonArray = new JSONArray();ciDashBoardVOList.forEach(ciDashBoardVO -> {JSONObject jsonObject = new JSONObject();jsonObject.set("projectName", ciDashBoardVO.getProjectName());jsonObject.set("color", getColor(ciDashBoardVO.getColors()));jsonArray.put(jsonObject);});return AjaxResult.success(jsonArray);}/*** @Description: 发送邮件提醒功能*/@Overridepublic boolean sendRemindEmail(String folderName,String jobName,String username) throws ParseException {DesvMailUtil mailUtil = new DesvMailUtil(“这里写公司规定发邮件的邮箱”);HashMap params = new HashMap<>();Template template;try {template = configuration.getTemplate("SendRemindTask.ftl");} catch (IOException e) {log.error("configuration.getTemplate error:{}", e.getMessage());return Boolean.FALSE;}initRemindEmailData(params, folderName,jobName,username);try {mailUtil.sendEmailByFreemarker(params, template);} catch (Exception e) {log.error("sendMail error:{}", e.getMessage());return Boolean.FALSE;}return Boolean.TRUE;}/*** @Description: 初始化邮件内容*/private void initRemindEmailData(HashMap params,String folderName,String jobName,String username) {SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");//params.put("to", appCpsp.getResponseEmail());params.put("to", "");params.put("title", "项目构建失败提醒");params.put("ResponseName",username);params.put("projectName",folderName);params.put("jobName",jobName);//当前日期params.put("today", DateUtil.format(new Date(), DatePattern.CHINESE_DATE_PATTERN));}/*** @Description: 计算构建的颜色*/private String getColor(String colors) {if (StrUtil.isBlank(colors)) {return JenkinsColorStatusEnum.UNKNOWN.getInfo();}if (colors.contains(JenkinsColorStatusEnum.RED.getInfo())) {return JenkinsColorStatusEnum.RED.getInfo();}if (colors.contains(JenkinsColorStatusEnum.YELLOW.getInfo())) {return JenkinsColorStatusEnum.YELLOW.getInfo();}return JenkinsColorStatusEnum.BLUE.getInfo();}}

DesvMailUtil 发送邮件工具


/*** @Description: 发送邮件工具*/
@Data
@Slf4j
public class DesvMailUtil {private String username;private String password;private String domain;private String uri;public DesvMailUtil(String username, String password, String domain, String uri) {this.username = username;this.password = password;this.domain = domain;this.uri = uri;}public void sendEmailByFreemarker(Map params, Template template) throws Exception {// 新建server版本ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010);// 用户名,密码,域名ExchangeCredentials credentials = new WebCredentials(username, password, domain);service.setCredentials(credentials);service.setUrl(new URI(uri));String s = FreeMarkerTemplateUtils.processTemplateIntoString(template, params);EmailMessage msg = new EmailMessage(service);msg.setSubject(MapUtil.getStr(params, "title"));msg.setBody(MessageBody.getMessageBodyFromText(s));// 收件人msg.getToRecipients().add(MapUtil.getStr(params, "to"));// 发送msg.send();}
}

SendRemindTask.ftl




Dear ${ResponseName}:

您的 ${projectName}项目中的job: ${jobName}构建失败,请及时处理。

如您有任何疑问,可联系:

${today}

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...