如何捕获Jenkins流水线超时提示并触发用户通知?
解决方案
方法1:捕获超时异常(推荐)
直接针对timeout步骤抛出的异常处理,比解析日志更可靠,能避免因Jenkins版本更新导致日志文本变化的问题。
修改你的流水线阶段代码,用try-catch包裹超时逻辑,精准判断超时异常并触发通知:
stage('My stage') { steps { script { try { timeout(time: 2, unit: 'MINUTES') { // 这里放你的阶段原有执行逻辑 echo '执行阶段任务...' } } catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) { // 判断是否为超时导致的中断 if (e.getCause() instanceof org.jenkinsci.plugins.workflow.steps.TimeoutStepExecution.Timeout) { // 发送通知,示例用Slack(需提前安装Slack插件) slackSend channel: '#pipeline-alerts', message: '⚠️ My stage 阶段执行超时,已自动终止' // 若需要标记流水线为失败,保留下面的抛出语句;若要继续执行则删除 throw e } } } } }
方法2:解析构建日志捕获特定消息
如果必须通过匹配目标日志字符串触发通知,可以在阶段的post块中检查构建日志:
stage('My stage') { steps { timeout(time: 2, unit: 'MINUTES') { // 阶段原有执行逻辑 } } post { always { script { // 获取构建最后1000行日志(可根据需求调整行数) def buildLog = currentBuild.rawBuild.getLog(1000) if (buildLog.contains('Cancelling nested steps due to timeout')) { // 发送通知,示例用邮件(需配置Jenkins邮件服务) mail to: 'user@example.com', subject: '[Jenkins流水线] My stage阶段超时通知', body: '流水线中My stage阶段因超时被终止,请查看构建日志。' } } } } }
注意事项
- 使用方法2时,需要在Jenkins的脚本安全页面授权
hudson.model.Run.getLog(int)方法,否则会报错; - 发送通知的方式需根据已安装的插件选择,比如邮件、Slack、钉钉等,确保对应插件已安装并配置;
- 优先选择方法1,因为它不依赖日志文本,稳定性更强。
内容的提问来源于stack exchange,提问作者fr0zt
相关产品推荐
相关产品推荐

