2015-06-19 34 views
5

有时我需要给所有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 + "; ") 
} 

回答

5

首先,你应该知道,詹金斯不会总是能够告诉你的用户是否存在。从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 + "; ") 
} 

注:这依赖于詹金斯配置和其中所用另一个(非HudsonPrivateSecurityRealm)安全领域的系统可能无法正常工作。

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) { } 
} 

这是很微妙的,但应与所有安全领域的工作,因为我们使用存在的方法:

如果用户存在,并抛出UsernameNotFoundException否则解决方案2

SecurityRealm#loadUserByUsername回报用户详细信息在顶级抽象类(SecurityRealm)中。

+0

我试过解决方案1,它的工作原理,它也几乎立即生成列表,在那里我的解决方案需要大约一分钟。感谢Vitalii! –

+0

感谢您提供一些解决方案。为了报告我们的结果,我发现解决方案1不适用于用于身份验证的Active Directory插件(该插件没有getAllUsers())。解决方案2最终超出了我们在Jenkins面前的Apache httpd反向代理,因为我相信它是列举了AD中的每个用户(我们公司中有数千人)。我想这是一种通过保留自己的用户数据库,从AD/LDAP缓存的产品解决的情况。 – jblaine

+0

@jblaine谢谢你报告这个。你试图解决什么问题?我不认为你想要一次邮寄数千人...... –

相关问题