有时我需要向所有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 + "; ")
}
首先,您应该知道,詹金斯并不总是能够告诉您用户是否存在。从詹金斯的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配置,可能无法在使用另一个(不是a 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
)中存在的方法时,它应该可以在所有安全领域使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句