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

如何通过API方法删除Jenkins 2.426.3用户?脚本执行异常求助

问题:Jenkins Role-Based Authorization Strategy脚本删除用户无实际效果且误报成功

执行Groovy脚本尝试删除Jenkins(2.426.3)中基于角色权限策略的用户时,脚本输出"删除成功"但实际用户未被删除,甚至用户不存在时也会输出成功提示。

原脚本如下:

import jenkins.model.Jenkins  
import com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy

def jenkins = Jenkins.getInstance()

def authStrategy = jenkins.getAuthorizationStrategy()

if (!(authStrategy instanceof RoleBasedAuthorizationStrategy)) {
    println("The current authorization strategy is not Role-based. Please configure Jenkins to use Role-based Authorization Strategy.")
    return
}

def deleteUser(authStrategy, String type, String user) {
    try {
        authStrategy.doDeleteUser(type, user)
        println("Deleted the user '$user' successfully from type '$type'.")
    } catch (Exception e) {
        println("Failed to delete user '$user' from type '$type': ${e.message}")
    }
}

deleteUser(authStrategy, "globalRoles", "cleanup_test_user1")
jenkins.save()

问题原因

  1. doDeleteUser是插件用于处理Web请求的内部方法,它依赖HTTP请求上下文才能正常工作,直接在脚本中调用不会触发实际的删除逻辑
  2. 这个方法没有内置用户存在性校验,也不会在操作失败时抛出异常,所以无论用户是否存在,都会进入成功提示分支

解决方案

改用Role Strategy插件提供的直接操作权限数据的API,先校验用户是否存在,再执行删除操作:

import jenkins.model.Jenkins  
import com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy
import com.michelin.cio.hudson.plugins.rolestrategy.RoleMap

def jenkins = Jenkins.getInstance()
def authStrategy = jenkins.getAuthorizationStrategy()

if (!(authStrategy instanceof RoleBasedAuthorizationStrategy)) {
    println("当前授权策略不是基于角色的,请先配置Jenkins使用Role-based Authorization Strategy。")
    return
}

def deleteUser(authStrategy, String type, String user) {
    try {
        RoleMap roleMap = authStrategy.getRoleMap(type)
        // 检查用户是否存在于该类型的角色映射中
        if (!roleMap.getAllUsers().contains(user)) {
            println("用户 '$user' 在 '$type' 中不存在,无需删除。")
            return
        }
        // 从该类型的所有角色中移除用户
        roleMap.removeUserFromAllRoles(user)
        println("已成功从 '$type' 中删除用户 '$user'。")
    } catch (Exception e) {
        println("删除 '$type' 中的用户 '$user' 失败: ${e.message}")
    }
}

deleteUser(authStrategy, "globalRoles", "cleanup_test_user1")
jenkins.save()

修正说明

  • 通过getRoleMap(type)获取对应权限类型(全局/项目等)的角色映射对象,这是操作权限数据的正确入口
  • 先通过getAllUsers()校验用户是否存在,避免误报成功
  • 使用removeUserFromAllRoles(user)方法从该类型下的所有角色中移除用户,这是插件提供的官方操作API,能确保修改生效
  • 操作完成后调用jenkins.save()保存配置,确保修改持久化

内容的提问来源于stack exchange,提问作者qwerty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:35:08