有时我需要向所有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 + "; ")
}
答案 0 :(得分:7)
首先,您应该知道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
)中存在的方法时,它应该适用于所有安全领域。