【问题标题】:create email list of all users创建所有用户的电子邮件列表
【发布时间】:2015-06-19 20:28:07
【问题描述】:

有时我需要给所有 Jenkins 用户发送电子邮件,例如警告他们 Jenkins 将离线进行维护。下面的脚本为我提供了 Jenkins 认识的所有人的电子邮件地址,但它包括没有帐户的人,这些人已经提交了触发构建的更改。我想将他们从电子邮件列表中删除,即列表应该只包含您在 securityRealm 页面上看到的用户。我正在寻求修改脚本的帮助。谢谢。

import hudson.model.User
import hudson.tasks.Mailer

def users = User.getAll()
for (User u : users) {
    def mailAddress = u.getProperty(Mailer.UserProperty.class).getAddress()
    print(mailAddress + "; ")
}

【问题讨论】:

    标签: groovy jenkins jenkins-scriptler


    【解决方案1】:

    首先您应该知道,Jenkins 不会总是能够告诉您用户是否存在。来自Jenkins' javadoc

    例如,当安全领域位于 servlet 实现之上时,就会发生这种情况,甚至无法知道给定名称的用户是否存在。

    我找到了两个解决方案。

    解决方案 1

    HudsonPrivateSecurityRealm.html#getAllUsers() 返回所有可以登录系统的用户。这对我有用:

    import hudson.model.User
    import hudson.tasks.Mailer
    import jenkins.model.Jenkins
    
    def realm = Jenkins.getInstance().getSecurityRealm()
    def users = realm.getAllUsers()
    for (User u : users) {
        def mailAddress = u.getProperty(Mailer.UserProperty.class).getAddress()
        print(mailAddress + "; ")
    }
    

    注意:这取决于 Jenkins 配置,并且可能无法在使用另一个(不是 HudsonPrivateSecurityRealm)安全领域的系统上运行。

    解决方案 2

    SecurityRealm#loadUserByUsername如果用户存在则返回用户详细信息,否则抛出UsernameNotFoundException

    import hudson.model.User
    import hudson.tasks.Mailer
    import jenkins.model.Jenkins
    import org.acegisecurity.userdetails.UsernameNotFoundException
    
    def realm = Jenkins.getInstance().getSecurityRealm()
    def users = User.getAll()
    for (User u : users) {
        try {
            realm.loadUserByUsername(u.getId()) // throws UsernameNotFoundException
            def mailAddress = u.getProperty(Mailer.UserProperty.class).getAddress()
            print(mailAddress + "; ")
        } catch (UsernameNotFoundException e) { }
     }
    

    这是一个棘手的问题,但应该适用于所有安全领域,因为我们使用存在于顶级抽象类 (SecurityRealm) 中的方法。

    【讨论】:

    • 我尝试了解决方案 1 并且它有效,它还几乎立即生成了列表,而我的解决方案大约需要一分钟。谢谢维塔利!
    • 感谢您提供一些解决方案。为了报告我们的结果,我发现解决方案 1 不适用于用于身份验证的 Active Directory 插件(该插件没有 getAllUsers())。解决方案 2 最终在 Jenkins 面前超时了我们的 Apache httpd 反向代理,因为我相信它正在枚举 AD 中的每个用户(我们公司有数千个用户)。我想这是通过产品保留自己的用户数据库、从 AD/LDAP 缓存来解决的那种情况。
    • @jblaine 感谢您报告此事。您要解决的问题是什么?我不认为你想一次给成千上万的人发邮件......
    • @VitaliiElenhaupt 你好。我们使用 AD 进行身份验证,使用角色策略插件进行授权。内置角色“匿名”没有特权。内置角色“已验证”的权限非常小。因此,我们公司中的任何人都可以登录到我们的 Jenkins 服务器,但在他们让我们 a) 为他们创建一个 Jenkins 文件夹和 b) 为该角色定义一个角色 + 设置允许的权限之前,他们实际上什么也没做。一旦发生这种情况,我们就会将该人视为“用户”。所以在我们的例子中,我将不得不找出一些代码来查询“分配了角色的人”。
    猜你喜欢
    • 2016-09-29
    • 2023-03-14
    • 2017-04-01
    • 2016-07-21
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多