如何在Jenkins中获取人工重建定时触发任务的BUILD_USER?
解决Jenkins人工重建定时任务时Slack通知显示操作用户而非定时器的问题
问题场景
使用parameterized-scheduler插件调度Jenkins定时任务,已配置Slack通知:
- 定时触发时,Slack频道收到:
(/ci/master-15): Started by timer with parameters: {URL=https://shop.com, USERNAME=yyy, PASSWORD=xxs, SLACK-NOTIFY-CHANNEL=#JENKINS-REPORTS} - 任务完成时收到:
(/ci/master-15): The job is now complete. Here are the execution summary
当前用于发送通知的Groovy代码:
BUILD_TRIGGERED_BY = currentBuild.getBuildCauses().shortDescription[0] SEND_SLACK_NOTIF(BUILD_TRIGGERED_BY)
遇到的问题:定时任务失败后人工重建时,Jenkins流水线状态已显示Started by user andrea-hyong@gmail.com,但Slack通知仍显示定时器触发的内容,需要让通知优先显示操作用户名。
解决方案
修改Groovy代码,优先识别用户触发的构建原因,逻辑如下:
- 遍历所有构建原因,优先匹配用户触发的类型
- 若存在用户触发记录,直接使用操作用户信息生成通知内容
- 若没有用户触发记录,再使用定时器的触发描述
完整代码示例(遍历版)
// 获取所有构建原因集合 def buildCauses = currentBuild.getBuildCauses() def triggerDescription = "Started by unknown trigger" // 遍历原因,优先锁定用户触发的记录 for (cause in buildCauses) { // 匹配用户触发的原因类 if (cause._class == "hudson.model.Cause$UserIdCause") { triggerDescription = "Started by user ${cause.userId}" break } // 匹配定时器触发的原因类,作为备选 else if (cause._class == "hudson.triggers.TimerTrigger$TimerTriggerCause") { triggerDescription = cause.shortDescription } } // 发送Slack通知 SEND_SLACK_NOTIF(triggerDescription)
简化版代码(find方法)
// 查找是否存在用户触发的构建原因 def userCause = currentBuild.getBuildCauses().find { it._class == "hudson.model.Cause\$UserIdCause" } // 优先使用用户触发信息,否则沿用原逻辑取第一个原因 def triggerDescription = userCause ? "Started by user ${userCause.userId}" : currentBuild.getBuildCauses().shortDescription[0] SEND_SLACK_NOTIF(triggerDescription)
说明
hudson.model.Cause$UserIdCause是Jenkins中标记用户触发构建的内置原因类,可直接从中获取操作用户的userId(通常为邮箱或用户名)- 人工重建任务时,用户触发的原因会被加入构建原因列表,通过优先匹配该类型,就能让Slack通知显示正确的操作用户信息
- 定时触发的场景不受影响,仍会显示原有的定时器触发描述
内容的提问来源于stack exchange,提问作者mark_Ruff
相关产品推荐
相关产品推荐

