如何在Groovy中获取Jenkins邮件审批输入以执行流水线任务删除
解决Jenkins Groovy脚本获取审批人输入的问题
我来帮你搞定这个Jenkins Groovy脚本获取审批人输入的问题!你之前尝试用approveReceivedEvent没生效,大概率是没找对适配场景的方法。下面给你两种最常用的可行方案,根据你的实际需求选就行:
方案一:用Jenkins原生的input步骤(最推荐)
这是Jenkins流水线内置的功能,不需要额外插件,直接就能暂停流水线等待审批人在Jenkins界面操作,获取输入后执行对应逻辑。示例代码如下:
pipeline { agent any stages { stage('等待删除审批') { steps { script { // 弹出审批窗口,让指定人员选择操作 def approvalResult = input( message: '确认要删除该流水线任务吗?', parameters: [ choice( choices: 'Proceed\nAbort', description: '请选择操作', name: 'ACTION' ) ], submitter: '审批人用户名/用户组', // 指定能审批的人 submitterParameter: 'APPROVER' // 可选,记录审批人信息 ) // 根据审批结果执行逻辑 if (approvalResult.ACTION == 'Proceed') { // 这里写删除任务的代码,比如根据任务全名获取任务并删除 def targetJob = Jenkins.instance.getItemByFullName('你的流水线任务全名') targetJob.delete() echo '✅ 任务已成功删除' } else { echo '❌ 审批人选择终止操作,任务未删除' } } } } } }
注意事项:
- 确保你的流水线脚本有足够权限访问Jenkins内部API(在Jenkins全局安全配置里开启“允许脚本访问Jenkins内部API”)
submitter参数可以指定单个用户名,也可以用逗号分隔多个用户/组,只有指定人员能看到审批请求
方案二:邮件触发审批(适配外部邮件审批场景)
如果你必须通过邮件发送审批链接,让用户在邮件里点击完成审批,那可以结合Approval Plugin来实现,核心思路是创建审批请求、存储请求与任务的关联、监听审批通过事件来执行删除:
import jenkins.model.Jenkins import org.jenkinsci.plugins.approval.Approval import org.jenkinsci.plugins.approval.event.ApprovalGranted // 1. 注册审批通过的事件监听器 Jenkins.instance.getExtensionList(Approval.class)[0].addListener(new ApprovalGranted() { @Override void onApprovalGranted(Approval approval) { def requestId = approval.getId() // 从存储的映射中获取对应的任务名称(需要自己实现存储逻辑,比如存文件/全局变量) def targetJobName = getJobNameByRequestId(requestId) if (targetJobName) { def targetJob = Jenkins.instance.getItemByFullName(targetJobName) targetJob.delete() echo "✅ 任务${targetJobName}已通过邮件审批并删除" } } }) // 2. 创建审批请求并发送邮件 script { def targetJobName = '你的流水线任务全名' // 创建审批请求 def approvalRequest = Approval.create() approvalRequest.setSubject("请求删除流水线任务:${targetJobName}") def requestId = approvalRequest.getId() // 存储审批请求ID与任务名称的映射(比如写入Jenkins节点的文件,或者用全局变量) saveRequestMapping(requestId, targetJobName) // 发送邮件,包含审批链接(链接指向Jenkins的审批页面) def approvalUrl = "${Jenkins.instance.rootUrl}/approval/${requestId}" emailext( to: '审批人邮箱', subject: '流水线任务删除审批请求', body: "请点击链接完成审批:${approvalUrl}\n选择Proceed则删除任务,选择Abort则取消操作" ) } // 辅助方法示例(需要自己实现具体逻辑) def getJobNameByRequestId(String requestId) { // 从存储的地方读取映射关系,比如读取文件 def mappingFile = new File('/var/jenkins_home/approval_mappings.txt') return mappingFile.readLines().find { it.startsWith(requestId) }?.split(',')[1] } def saveRequestMapping(String requestId, String jobName) { def mappingFile = new File('/var/jenkins_home/approval_mappings.txt') mappingFile.append("${requestId},${jobName}\n") }
为什么你之前的approveReceivedEvent没生效?
approveReceivedEvent是Approval Plugin里的事件,但需要正确注册监听器,并且确保审批请求是通过该插件创建的。如果你的审批流程不是基于这个插件,自然不会触发事件。上面的方案二已经帮你正确注册了ApprovalGranted事件监听器,只要审批人通过插件的页面完成审批,就会触发删除逻辑。
内容的提问来源于stack exchange,提问作者merla
相关产品推荐
相关产品推荐

