Jenkins Pipeline如何获取部署审批/拒绝操作的用户名而非用户ID
问题场景
- 基于CloudBees官方带超时逻辑的Pipeline输入审批方案搭建部署审批环节,可正常支持批准、拒绝操作
- 执行拒绝操作时,通过
err.getCauses()[0].getUser()仅能获取到操作用户的系统ID,无法读取对应的用户真实姓名 - 需落地可获取操作用户完整姓名的实现方案
核心实现原理
- 异常捕获得到的
RejectionCause类对象中,getUser()方法返回的是Jenkins系统层面的用户唯一标识ID,该方法本身不存储用户姓名属性 - 可通过Jenkins内置的用户查询API,根据拿到的用户ID关联查询对应账号的完整属性,从用户对象的fullName字段读取真实姓名
可直接复用的Pipeline实现示例
import hudson.model.User import jenkins.model.Jenkins pipeline { agent any stages { stage('部署审批') { options { timeout(time: 1, unit: 'HOURS') // 匹配官方方案的超时配置逻辑 } steps { script { def approvalParam try { approvalParam = input( message: '请确认部署操作', ok: '批准部署', submitterParameter: 'submitterId', parameters: [ choice(choices: ['预发环境', '生产环境'], description: '选择部署目标', name: 'targetEnv') ] ) // 审批通过逻辑 echo "审批通过,操作人ID:${approvalParam.submitterId},即将向${approvalParam.targetEnv}发布" } catch (err) { def cause = err.getCauses()[0] // 处理用户主动拒绝的场景 if (cause instanceof org.jenkinsci.plugins.workflow.support.steps.input.RejectionCause) { def submitterId = cause.getUser() // 根据用户ID查询账号完整信息 def submitterInfo = Jenkins.instance.getUser(submitterId) // 读取用户姓名,增加空值兜底 def submitterName = submitterInfo?.getFullName() ?: "未知用户(ID:${submitterId})" echo "审批被拒绝,操作人ID:${submitterId},操作人姓名:${submitterName}" currentBuild.result = 'ABORTED' error "部署流程已被${submitterName}终止" } // 处理超时自动终止的场景 if (cause instanceof org.jenkinsci.workflow.actions.ExecutionCause) { echo '审批超时,流程自动终止' currentBuild.result = 'TIMEOUT' error '未在限定时间内完成审批,部署流程终止' } } } } } } }
落地注意事项
- 权限配置:Pipeline关联的执行账号需要开放
Overall/Read全局权限,否则无法调用用户查询API读取账号属性 - 异常兜底:如果操作用户已被删除、或权限不足无法查询用户信息,需要保留默认值兜底逻辑,避免Pipeline抛出空指针异常
- 外部同步场景:如果用户姓名是通过LDAP、AD等外部身份系统同步到Jenkins的,只要用户详情页的“Full Name”字段可正常展示,上述方法即可直接读取到同步后的姓名值
- 匹配规则:读取到的用户ID需要和Jenkins用户管理列表中的唯一标识完全匹配,否则会返回空的用户对象
内容的提问来源于stack exchange,提问作者Aravind Krishna
相关产品推荐
相关产品推荐

