如何对比Jenkins重运行(Replay)任务与原任务的BUILD_USER?
对比Jenkins重运行任务与原任务的BUILD_USER及区分执行用户的方法
一、如何对比两者的BUILD_USER
- 原任务的
BUILD_USER:是触发原构建的用户(用户A),存储在原构建的环境变量或构建原因中。 - 重运行(Replay)任务的默认
BUILD_USER:会被替换为执行重运行操作的用户(用户B),直接通过env.BUILD_USER即可获取。
要对比两者,需从原构建中提取用户A的信息,再和当前重运行任务的用户B做对比。
二、区分执行重运行的用户B与原任务用户A的实现方式
1. Pipeline脚本直接获取(推荐)
在Replay的Pipeline中,通过Jenkins内置的构建对象API获取原构建的触发用户:
// 获取原构建对象 def originalBuild = currentBuild.getPreviousBuild() if (originalBuild) { // 提取原构建的用户触发原因 def userCause = originalBuild.getCause(hudson.model.Cause.UserIdCause) if (userCause) { def originalUser = userCause.getUserId() def replayUser = env.BUILD_USER echo "原任务执行用户:${originalUser}" echo "重运行任务执行用户:${replayUser}" // 可根据需求添加对比逻辑 if (originalUser != replayUser) { echo "当前为重运行任务,执行用户与原任务不同" } } else { echo "原任务并非由用户触发(如定时构建、触发器构建)" } } else { echo "当前构建无前置原构建,不是重运行任务" }
2. 处理非用户触发的原构建
如果原构建是由其他方式触发(如定时任务、SCM触发器),Cause.UserIdCause会返回null,此时可根据实际场景处理其他类型的Cause:
def originalBuild = currentBuild.getPreviousBuild() if (originalBuild) { def causes = originalBuild.getCauses() def originalTriggerInfo = "" for (cause in causes) { originalTriggerInfo += cause.getShortDescription() + " " } echo "原任务触发方式:${originalTriggerInfo}" echo "重运行任务执行用户:${env.BUILD_USER}" }
关键说明
- Replay构建的父构建就是原构建,因此可以通过
currentBuild.getPreviousBuild()可靠获取原构建的所有信息。 - 无需额外插件即可实现核心需求,依赖Jenkins内置的构建对象API即可完成用户区分。
内容的提问来源于stack exchange,提问作者arielma
相关产品推荐
相关产品推荐

