如何配置Jenkins作业:node离线时终止作业并发送邮件告警
当然可以实现!针对你这种仅在作业触发时检查专属Node状态、不想被全局Node监控插件频繁打扰的需求,完全可以在作业内部做针对性处理,下面分两种常见的Jenkins作业类型给你具体方案:
方案1:Pipeline作业(推荐,灵活可控)
在你的Pipeline脚本最开头加入Node状态检查逻辑,先判断专属Node是否在线,离线就直接终止作业并发送通知,避免进入pending状态。
示例Pipeline脚本:
// 替换成你的专属Node名称 def targetNode = "your-exclusive-node-name" pipeline { agent none // 先不绑定Node,避免直接进入pending stages { stage('检查专属Node状态') { steps { script { // 获取目标Node的实例对象 def nodeInstance = Jenkins.instance.getNode(targetNode) // 判断Node是否存在且在线 if (!nodeInstance || !nodeInstance.toComputer().isOnline()) { // 发送离线通知邮件 emailext( subject: "Jenkins作业[${env.JOB_NAME}]执行终止:专属Node离线", body: """作业${env.JOB_NAME}触发后,发现专属Node **${targetNode}** 当前处于离线状态,已终止作业执行。 请检查Node的网络连接或Jenkins代理状态。""", to: "your-email@example.com" // 替换成你的接收邮箱 ) // 抛出错误终止作业,标记为失败 error("专属Node ${targetNode} 离线,作业终止") } else { echo "✅ 专属Node ${targetNode} 在线,继续执行作业" } } } } stage('执行核心作业任务') { agent { node { label targetNode } } steps { // 这里写你原来的作业执行逻辑 echo "开始执行作业核心任务..." // sh "your-command-here" } } } }
关键说明:
- 先设置
agent none,避免一开始就绑定Node导致进入pending状态; - 通过Groovy脚本直接查询Jenkins内部的Node状态,判断准确;
- 一旦检测到离线,立即发送邮件并终止作业,不会等待Node上线。
方案2:自由风格作业
如果你的作业是自由风格,也可以通过前置脚本检查+失败邮件通知来实现:
添加前置检查脚本
进入作业配置页,在「构建」环节添加「执行系统Groovy脚本」,输入以下代码:def targetNode = "your-exclusive-node-name" // 替换成你的Node名称 def nodeInstance = Jenkins.instance.getNode(targetNode) if (!nodeInstance || !nodeInstance.toComputer().isOnline()) { // 抛出异常触发构建失败 throw new Exception("专属Node ${targetNode} 离线,作业无法执行") }配置失败邮件通知
在「构建后操作」添加「Editable Email Notification」(需提前安装Email Extension插件),然后:- 邮件主题设置为:
Jenkins作业${PROJECT_NAME}执行失败:专属Node离线 - 邮件内容说明Node离线的情况;
- 关键设置:在「触发器」里选择「Failure - Any」,并通过「高级」选项添加匹配规则,只当构建失败原因包含「专属Node离线」关键字时才发送邮件,避免其他失败场景误发通知。
- 邮件主题设置为:
注意事项:
- 执行Groovy脚本需要权限:如果遇到权限报错,进入「Manage Jenkins」→「In-process Script Approval」,批准脚本中涉及的方法调用;
- 确保已安装
Email Extension Plugin,否则无法使用emailext功能; - 这个方案完全符合你的需求:只有当作业触发时才检查Node状态,不会在非作业时段发送离线通知。
内容的提问来源于stack exchange,提问作者brigadir
相关产品推荐
相关产品推荐

