Jenkins流水线脚本中User.current()返回SYSTEM而非登录用户的原因与解决
Jenkins流水线中
User.current()返回SYSTEM的原因及解决办法 原因分析
- 脚本控制台是当前登录用户直接触发执行,运行上下文完全继承当前用户的身份,所以
User.current()能直接拿到真实登录用户。 - 流水线默认由Jenkins的内置SYSTEM用户执行:不管是谁手动触发流水线,Jenkins都会启动后台进程以SYSTEM身份代为执行脚本,运行上下文绑定的是系统用户,而非触发者的真实账号,因此直接调用
User.current()只会返回SYSTEM。
获取真实触发用户的方法
方法1:通过currentBuild变量获取(推荐)
利用流水线内置的currentBuild对象,从构建原因中提取触发用户信息:
def triggerCause = currentBuild.getBuildCauses('hudson.model.Cause$UserIdCause')[0] if (triggerCause) { println "触发流水线的用户:${triggerCause.userId}" } else { println "无明确触发用户(可能为定时任务、SCM自动触发等)" }
不同触发方式对应不同的Cause类型,比如SCM自动触发对应hudson.scm.SCMTrigger$SCMTriggerCause,这类场景本身没有真实用户,需要提前做空值判断。
方法2:通过build对象获取(适配旧版Jenkins)
def userCause = build.getCause(hudson.model.Cause$UserIdCause.class) if (userCause) { println "触发用户:${userCause.getUserId()}" } else { println "触发来源为系统操作,无真实用户" }
注意事项
- 确保流水线拥有访问构建原因的权限,部分权限受限的环境可能无法读取该信息。
- 如果流水线是通过API调用、定时任务等系统级操作触发,本身不存在真实登录用户,此时返回SYSTEM属于正常情况,需提前做分支处理。
内容的提问来源于stack exchange,提问作者arielma
相关产品推荐
相关产品推荐

