讲师中心 微信公众号
AI工具推荐 视频效率加速

Jenkins自动化:解析HTML响应并根据数值条件触发邮件通知

梦晨君_6565

梦晨君_6565

发布时间:2025-12-13 18:16:14

|

1020人浏览过

|

来源于php中文网

原创

Jenkins自动化:解析HTML响应并根据数值条件触发邮件通知

本文详细介绍了如何在jenkins中实现一个自动化流程,通过发起http get请求获取html响应。我们将学习如何利用jenkins dsl和groovy脚本解析html内容,提取特定数值,并根据该数值是否超过预设阈值(例如100)来触发邮件通知。这为监控系统状态、服务队列或其他基于html响应的指标提供了强大的自动化预警机制,确保关键事件能够及时通知相关人员。

1. 概述与应用场景

在自动化运维和持续集成/持续交付(CI/CD)流程中,我们经常需要监控外部服务的状态或特定指标。当这些指标达到或超过某个阈值时,需要及时收到通知以便采取行动。本文将聚焦于一个具体的场景:通过Jenkins向一个GET API发送请求,获取其返回的HTML响应,从HTML中提取一个数值,并根据该数值与预设阈值的比较结果,决定是否触发邮件通知。

这种机制在以下场景中尤为实用:

  • 服务队列监控: 监控消息队列或任务队列的深度,当队列积压超过一定数量时发出预警。
  • 系统健康检查: 检查特定API返回的HTML页面中包含的关键指标(如错误计数、连接数),判断系统是否处于健康状态。
  • 资源使用率告警: 从定制化的状态页面中提取CPU、内存或磁盘使用率,实现自定义告警。

2. Jenkins环境与插件准备

要实现上述自动化流程,您需要一个运行中的Jenkins实例,并确保安装了以下核心组件或插件:
  • Jenkins Pipeline: 推荐使用Pipeline(即Jenkinsfile)来定义您的自动化任务,这使得任务定义更具版本控制和可维护性。
  • HTTP Request Plugin: 此插件允许Jenkins Pipeline发起HTTP/HTTPS请求,并获取响应内容。您可以通过Jenkins的“插件管理”页面搜索并安装它。
  • 邮件通知配置: 确保Jenkins系统设置中已正确配置SMTP服务器,以便能够发送邮件。通常在“管理Jenkins” -> “系统配置” -> “邮件通知”部分进行设置。

3. 发起HTTP请求获取HTML响应

在Jenkins Pipeline中,我们可以使用`httpRequest`步骤来向目标API发送GET请求并获取其响应。`httpRequest`步骤会返回一个包含响应内容(`content`)、状态码(`status`)等信息的对象。

以下是一个示例,展示如何在Jenkinsfile中发起HTTP GET请求并存储HTML响应:

// Jenkinsfile
pipeline {
    agent any
    environment {
        // 定义API的URL,请替换为您的实际URL
        API_URL = "http://{Project_IP}/{app_name}/ServiceQueueMonitorServlet?Action=retrieve"
        // 定义阈值和收件人邮箱,方便后续修改
        THRESHOLD = 100
        RECIPIENT_EMAIL = "your_email@example.com"
    }
    stages {
        stage('Fetch HTML Response') {
            steps {
                script {
                    try {
                        // 发起HTTP GET请求,并期望状态码为200
                        def response = httpRequest url: env.API_URL, validResponseCodes: '200'
                        // 将HTML内容存储到环境变量中,供后续阶段使用
                        env.HTML_RESPONSE = response.content
                        echo "成功获取HTML响应:\n${env.HTML_RESPONSE}"
                    } catch (Exception e) {
                        // 请求失败时抛出错误,中断Pipeline
                        error "获取HTML响应失败: ${e.getMessage()}"
                    }
                }
            }
        }
        // 后续阶段将在此处添加
    }
}

在上述代码中,response.content将包含API返回的完整HTML字符串。

Wechat HTML Publisher
Wechat HTML Publisher

直接上传HTML富文本到微信公众号草稿箱。支持完整的HTML格式,无需Markdown转换。

下载

4. 解析HTML响应并提取数值

获取到HTML响应后,下一步是从中提取我们关心的数值。针对不同复杂度的HTML结构,我们可以采用不同的Groovy字符串操作或HTML解析库。

4.1 针对简单HTML结构的Groovy字符串操作

如果HTML结构相对简单且固定,例如本教程提供的示例: ```html Tag1 502 ``` 我们可以使用Groovy的正则表达式(Regex)功能来高效地提取数值。
// 在Jenkinsfile的script块内
stage('Parse HTML and Extract Value') {
    steps {
        script {
            def valueToMonitor = -1 // 默认设置为一个无效值
            String htmlContent = env.HTML_RESPONSE

            // 使用正则表达式提取数值。
            // 这里的正则表达式匹配 <TR>...</TR> 内部的第二个 <TD> 中的数字。
            // `[^<]+` 匹配非 `<` 的任意字符,用于跳过 "Tag1"。
            def matcher = (htmlContent =~ /<TR>\s*<TD>[^<]+<\/TD>\s*<TD>(\d+)<\/TD>\s*<\/TR>/)

            if (matcher.find()) {
                // `matcher.group(1)` 获取正则表达式中第一个捕获组的内容,即数字部分
                def rawValue = matcher.group(1)
                try {
                    valueToMonitor = rawValue.toInteger() // 将字符串转换为整数
                    echo "成功提取数值: ${valueToMonitor}"
                } catch (NumberFormatException e) {
                    error "解析数值'${rawValue}'失败: ${e.getMessage()}"
                }
            } else {
                error "未能使用正则表达式在HTML中找到目标数值。"
            }
            // 将提取到的数值存储到环境变量中
            env.MONITORED_VALUE = valueToMonitor.toString()
        }
    }
}

这种方法简单直接,但对HTML结构的微小变化较为敏感。

立即学习“前端免费学习笔记(深入)”;

4.2 针对复杂HTML结构的Groovy HTML解析库

如果API返回的HTML结构复杂,或者可能存在不确定性,那么使用专门的HTML解析库会更加健壮和灵活。例如,Java生态系统中的**Jsoup**库是一个非常流行的HTML解析器,它提供了类似jQuery的API,可以通过CSS选择器轻松定位和提取元素。

要在Jenkins Pipeline中使用Jsoup,您可以:

  1. 在Jenkins Agent上预装Jsoup库。
  2. 在Pipeline中使用`@Grab`注解动态下载并引入Jsoup(这需要Agent能够访问Maven中央仓库,且Jenkins的沙盒安全策略允许)。
使用Jsoup的示例概念: ```groovy // 概念性代码,非完整可运行Jenkinsfile // @Grab('org.jsoup:jsoup:1.14.3') // 如果允许动态下载 // import org.jsoup.Jsoup // import org.jsoup.nodes.Document

// String htmlContent = env.HTML_RESPONSE // Document doc = Jsoup.parse(htmlContent) // // 使用CSS选择器定位元素,例如:选择第二个TR中第二个TD的文本 // String valueText = doc.select("tr:eq(0) td:eq(1)").text() // int valueToMonitor = valueText.toInteger() // echo "Extracted value using Jsoup: ${valueToMonitor}"

虽然Jsoup提供了更强大的解析能力,但对于本教程的简单HTML示例,Groovy的正则表达式已足够。

<h2>5. 条件判断与邮件通知</h2>
在成功提取数值后,我们需要将其与预设的阈值进行比较,并根据比较结果决定是否发送邮件通知。Jenkins Pipeline提供了`mail`步骤来发送邮件。

```groovy
// 在Jenkinsfile的script块内
stage('Conditional Email Notification') {
    steps {
        script {
            // 将环境变量中的字符串数值转换为整数进行比较
            int monitoredValue = env.MONITORED_VALUE.toInteger()
            int threshold = env.THRESHOLD.toInteger()

            if (monitoredValue > threshold) {
                echo "监测值 ${monitoredValue} 超过阈值 (${threshold})。正在发送邮件通知..."
                mail (
                    to: env.RECIPIENT_EMAIL,
                    subject: "Jenkins告警: 服务队列监测值已超出阈值",
                    body: "尊敬的管理员,\n\n监测到的服务队列值为 ${monitoredValue},已超过预设阈值 ${threshold}。\n\n请尽快检查服务:${env.API_URL}\n\nJenkins自动化通知"
                )
            } else {
                echo "监测值 ${monitoredValue} 在可接受范围内 (${threshold})。未发送邮件。"
            }
        }
    }
}

6. 完整的Jenkins Pipeline示例

将上述所有步骤整合到一个完整的Jenkinsfile中,如下所示:
// Jenkinsfile
pipeline {
    agent any
    environment {
        // 定义API的URL,请替换为您的实际URL
        API_URL = "http://{Project_IP}/{app_name}/ServiceQueueMonitorServlet?Action=retrieve"
        // 定义阈值
        THRESHOLD = 100
        // 定义邮件收件人,可为多个,用逗号分隔
        RECIPIENT_EMAIL = "your_email@example.com, another_email@example.com"
    }
    stages {
        stage('Fetch HTML Response') {
            steps {
                script {
                    try {
                        // 发起HTTP GET请求,并期望状态码为200
                        def response = httpRequest url: env.API_URL, validResponseCodes: '200'
                        env.HTML_RESPONSE = response.content
                        echo "成功获取HTML响应:\n${env.HTML_RESPONSE}"
                    } catch (Exception e) {
                        // 请求失败时抛出错误,中断Pipeline
                        error "获取HTML响应失败: ${e.getMessage()}"
                    }
                }
            }
        }
        stage('Parse HTML and Extract Value') {
            steps {
                script {
                    def valueToMonitor = -1 // 默认设置为一个无效值
                    String htmlContent = env.HTML_RESPONSE

                    // 使用正则表达式提取数值。
                    // 这里的正则表达式匹配 <TR>...</TR> 内部的第二个 <TD> 中的数字。
                    def matcher = (htmlContent =~ /<TR>\s*<TD>[^<]+<\/TD>\s*<TD>(\d+)<\/TD>\s*<\/TR>/)

                    if (matcher.find()) {
                        def rawValue = matcher.group(1)
                        try {
                            valueToMonitor = rawValue.toInteger()
                            echo "成功提取数值: ${valueToMonitor}"
                        } catch (NumberFormatException e) {
                            error "解析数值'${rawValue}'失败: ${e.getMessage()}"
                        }
                    } else {
                        error "未能使用正则表达式在HTML中找到目标数值。"
                    }
                    env.MONITORED_VALUE = valueToMonitor.toString()
                }
            }
        }
        stage('Conditional Email Notification') {
            steps {
                script {
                    int monitoredValue = env.MONITORED_VALUE.toInteger()
                    int threshold = env.THRESHOLD.toInteger()

                    if (monitoredValue > threshold) {
                        echo "监测值 ${monitoredValue} 超过阈值 (${threshold})。正在发送邮件通知..."
                        mail (
                            to: env.RECIPIENT_EMAIL,
                            subject: "Jenkins告警: 服务队列监测值已超出阈值",
                            body: "尊敬的管理员,\n\n监测到的服务队列值为 ${monitoredValue},已超过预设阈值 ${threshold}。\n\n请尽快检查服务:${env.API_URL}\n\nJenkins自动化通知"
                        )
                    } else {
                        echo "监测值 ${monitoredValue} 在可接受范围内 (${threshold})。未发送邮件。"
                    }
                }
            }
        }
    }
}

7. 注意事项与最佳实践

在部署和运行此类Jenkins自动化任务时,请考虑以下几点:

    热门AI工具

    更多
    PixPix
    PixPix Hot

    PixPix是一款面向电商视觉生产的AI商品图生成工具。

    WorkBuddy

    一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

    讯飞智作

    讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

    DeepSeek

    DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

    超级简历WonderCV

    一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

    VibeKnow
    VibeKnow Hot

    一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

    豆包大模型

    豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

    Atoms
    Atoms Hot

    Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

    AionClaw
    AionClaw Hot

    AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

    相关专题

    更多
    jquery插件有哪些
    jquery插件有哪些

    jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

    581

    2023.09.12

    jquery怎么操作json
    jquery怎么操作json

    操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

    996

    2023.10.13

    jquery删除元素的方法
    jquery删除元素的方法

    jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

    2142

    2023.11.10

    jQuery hover()方法的使用
    jQuery hover()方法的使用

    hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

    2128

    2023.12.04

    jquery实现分页方法
    jquery实现分页方法

    在jQuery中实现分页可以使用插件或者自定义实现。想了解更多jquery分页的相关内容,可以阅读本专题下面的文章。

    473

    2023.12.06

    jquery中隐藏元素是什么
    jquery中隐藏元素是什么

    jquery中隐藏元素是非常重要的一个概念,在使用jquery隐藏元素之前,需要先了解css样式中关于元素隐藏的属性,比如display、visibility、opacity等属性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    317

    2024.02.23

    jquery中什么是高亮显示
    jquery中什么是高亮显示

    jquery中高亮显示是指对页面搜索关键词时进行高亮显示,其实现办法:1、先获取要高亮显示的行,获取搜索的内容,再遍历整行内容,最后添加高亮颜色;2、使用“jquery highlight”高亮插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    606

    2024.02.23

    jQuery 正则表达式相关教程
    jQuery 正则表达式相关教程

    本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

    269

    2026.01.13

    LLVM自定义Pass怎么写
    LLVM自定义Pass怎么写

    本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

    100

    2026.09.30

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Sass 教程
    Sass 教程

    共14课时 | 1.5万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 5.8万人学习

    CSS教程
    CSS教程

    共754课时 | 96.3万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn