本教程详细介绍了如何在jenkins中通过http请求插件获取api的html响应,并利用groovy脚本解析响应内容以提取特定数值。文章将指导读者如何根据提取到的数值设置条件判断,并在满足特定条件(例如数值大于100)时自动触发邮件通知,实现自动化监控与告警。
在现代CI/CD工作流中,根据外部服务状态自动触发监控和告警是确保系统稳定性的关键环节。Jenkins作为强大的自动化服务器,能够周期性地检查外部API响应,并在满足特定条件时执行预设动作,例如发送邮件通知。本教程将深入探讨如何利用Jenkins Pipeline、http_request 插件和Groovy脚本,实现从GET API获取HTML响应、提取其中的数值并基于该数值进行条件判断,最终触发邮件通知的完整流程。
核心步骤一:发送HTTP请求并获取响应
要从Jenkins Pipeline中与外部API进行交互,推荐使用 http_request 插件。请确保该插件已安装在您的Jenkins实例上(通过“管理Jenkins” -> “管理插件” -> “可选插件”进行安装)。安装完成后,您可以在Jenkinsfile(Groovy DSL)中使用 httpRequest 步骤发送GET请求并捕获其响应。
示例代码:
// Jenkinsfile
pipeline {
agent any
environment {
// 定义API URL,便于管理和修改
API_URL = "http://{Project_IP}/{app_name}/ServiceQueueMonitorServlet?Action=retrieve"
}
stages {
stage('Monitor API') {
steps {
script {
echo "正在向 ${env.API_URL} 发送GET请求..."
// 使用httpRequest插件发送GET请求
def response = httpRequest url: env.API_URL, customHeaders: [[name: 'Accept', value: 'text/html']]
// 检查HTTP响应状态码,确保请求成功
if (response.status != 200) {
error "HTTP请求失败,状态码: ${response.status}。响应内容: ${response.content}"
}
echo "已收到HTML响应:\n${response.content}"
// 将响应内容存储到环境变量,以便后续阶段使用
env.HTML_RESPONSE_CONTENT = response.content
}
}
}
// ... 后续解析和通知阶段
}
}注意事项:
- 请将 http://{Project_IP}/{app_name}/ServiceQueueMonitorServlet?Action=retrieve 替换为您的实际API地址。
- customHeaders 可用于设置请求头,例如指定接受 text/html 类型。
- 对 response.status 进行检查是良好的实践,可以及时发现请求失败的情况。
核心步骤二:解析HTML响应提取数值
获取到HTML响应内容后,下一步是从中提取我们关注的数值。对于结构相对简单的HTML,Groovy强大的字符串操作功能(特别是正则表达式)足以胜任。
假设的HTML响应示例:
Tag1 502
我们的目标是从
Groovy正则表达式提取示例:
// 承接上一步,env.HTML_RESPONSE_CONTENT 包含了API的HTML响应 // 为了演示,此处直接使用字符串 def responseContent = env.HTML_RESPONSE_CONTENT def monitoredValue = -1 // 默认值,表示未找到或解析失败 echo "开始解析HTML响应内容..." // 使用正则表达式匹配紧邻 标签前的中的数字 // 这个正则表达式会找到 后跟着一个或多个数字,然后是 ,再是可选的空白符,最后是 def matcher = (responseContent =~ /
(\d+)<\/TD>\s*<\/TR>/) if (matcher.find()) { // group(1) 捕获了正则表达式中第一个括号内的内容,即我们想要的数字 monitoredValue = matcher.group(1).toInteger() echo "成功提取到数值: ${monitoredValue}" } else { echo "未能从HTML响应中提取到所需数值,请检查HTML结构或正则表达式。" // 在实际应用中,此处可以根据业务需求选择抛出错误或继续以默认值处理 // error "Failed to parse required value from HTML." } // 将提取到的数值存储到环境变量,供后续阶段使用 env.MONITORED_VALUE = monitoredValue 对于复杂HTML结构的处理: 如果HTML结构非常复杂,正则表达式可能难以维护或不够健壮。在这种情况下,可以考虑使用更专业的HTML解析库,例如 Jsoup。然而,在Jenkins Pipeline中引入外部库通常需要Jenkins管理员预先配置(如通过Shared Libraries或在Jenkins沙盒中允许特定类),并可能涉及沙盒安全策略。对于大多数自动化监控场景,精细设计的正则表达式通常能满足需求。
核心步骤三:条件判断与邮件通知
在成功提取到数值后,我们可以根据预设的阈值进行条件判断,并在满足条件时触发邮件通知。Jenkins通过 Mail 插件提供强大的邮件通知功能。请确保 Mail 插件已安装,并且在Jenkins系统配置中正确设置了SMTP服务器。
示例代码:
// 承接上一步,env.MONITORED_VALUE 包含了提取到的数值 pipeline { agent any environment { API_URL = "http://{Project_IP}/{app_name}/ServiceQueueMonitorServlet?Action=retrieve" EMAIL_RECIPIENT = "your_email@example.com" // 替换为接收通知的邮箱地址 THRESHOLD_VALUE = 100 // 定义告警阈值 } stages { // ... 前面的API监控和值提取阶段 ... stage('Conditional Email Notification') { steps { script { def currentValue = env.MONITORED_VALUE.toInteger() def threshold = env.THRESHOLD_VALUE.toInteger() echo "当前监控值: ${currentValue},告警阈值: ${threshold}" if (currentValue > threshold) { echo "监控值 ${currentValue} 已超过阈值 ${threshold}。正在发送邮件通知至 ${env.EMAIL_RECIPIENT}。" mail ( to: env.EMAIL_RECIPIENT, subject: "Jenkins告警: API监控值超限 (${currentValue})", body: """ 团队您好, 监控的API服务值已超出预设阈值。 API URL: ${env.API_URL} 当前值: ${currentValue} 阈值: ${threshold} 请尽快检查服务状态。 Jenkins构建链接: ${env.BUILD_URL} """ ) } else { echo "监控值 ${currentValue} 在可接受范围内 (<= ${threshold})。无需发送邮件。" } } } } } }注意事项:
- 请将 your_email@example.com 替换为实际的收件人邮箱地址。
- mail 步骤的 to、subject 和 body 参数支持Groovy表达式,可以动态插入变量。
- env.BUILD_URL 是Jenkins提供的内置环境变量,可以直接在邮件内容中引用,方便快速跳转到构建详情页。
完整示例代码
将上述所有步骤整合到一个Jenkinsfile中,即可实现完整的自动化监控和告警流程。
// Jenkinsfile pipeline { agent any environment { API_URL = "http://{Project_IP}/{app_name}/ServiceQueueMonitorServlet?Action=retrieve" // 替换为您的API地址 EMAIL_RECIPIENT = "your_email@example.com" // 替换为接收通知的邮箱 THRESHOLD_VALUE = 100 // 定义告警阈值 } stages { stage('Monitor API and Extract Value') { steps { script { echo "正在向 ${env.API_URL} 发送GET请求..." def response = httpRequest url: env.API_URL, customHeaders: [[name: 'Accept', value: 'text/html']] if (response.status != 200) { error "HTTP请求失败,状态码: ${response.status}。响应内容: ${response.content}" } echo "已收到HTML响应:\n${response.content}" def monitoredValue = -1 // 默认值,表示未找到或解析失败 echo "开始解析HTML响应内容..." // 使用正则表达式寻找紧邻 标签前的中的数字

atcher = (responseContent =~ /






