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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:12:15