在大屏上显示出每个项目的构建情况,如果构建失败,大屏上项目颜色变红的同时要给最新构建这个项目的用户发送邮件,提醒他构建失败了。
大屏上显示的项目构建情况,其实是通过Jenkins api 获取的,想要看Jenkins 每个页面的api内容,直接在网页地址后面加上api/json
就行了,如下图所示。对Jenkins api 不理解的可以去看:Jenkins API简单使用
添加好 jenkins api 、邮件、模板引擎的依赖
com.cdancy jenkins-rest 0.0.30 com.google.guava guava 31.1-jre org.springframework.boot spring-boot-starter-freemarker com.surevine ews-java-api 2.15 javax.xml.ws jaxws-api 2.3.1 cn.hutool hutool-all 5.5.8 com.sun ldapbp 1.0
@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();}}
/*** @Description: 提醒任务vo*/
@Data
public class remindTaskVO {private String folderName;private String jobName;}
public interface CiDashBoardMapper {List getCiDashBoardData();/*** @Description: 获取展示在大屏上的所有项目对应job的projectName和urlName*/List getDashBoardJobUrl(String projectName, String color);
}
public interface CiDashBoardService {AjaxResult getCiDashBoardData();/*** @Description: 发送邮件提醒功能*/public boolean sendRemindEmail(String folderName,String jobName,String username) throws ParseException;}
@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();}}
/*** @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();}
}
Dear ${ResponseName}:
您的 ${projectName}项目中的job: ${jobName}构建失败,请及时处理。
如您有任何疑问,可联系:
${today}
上一篇:启发式搜索算法