You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:06:27