创建所有用户的电子邮件列表
create email list of all users
有时我需要向所有 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 + "; ")
}
首先你应该知道 Jenkins 不会总是 能够告诉你用户是否存在。来自 Jenkins' javadoc:
This happens, for example, when the security realm is on top of the servlet implementation, there's no way of even knowing if an user of a given name exists or not.
我找到了两个解决方案。
解决方案 1
HudsonPrivateSecurityRealm.html#getAllUsers()
returns 所有可以登录系统的用户。这对我有用:
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
returns 用户详细信息如果用户存在并抛出 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) { }
}
这是一个棘手的问题,但应该适用于所有安全领域,因为我们使用存在于顶级抽象中的方法 class (SecurityRealm
)。
有时我需要向所有 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 + "; ")
}
首先你应该知道 Jenkins 不会总是 能够告诉你用户是否存在。来自 Jenkins' javadoc:
This happens, for example, when the security realm is on top of the servlet implementation, there's no way of even knowing if an user of a given name exists or not.
我找到了两个解决方案。
解决方案 1
HudsonPrivateSecurityRealm.html#getAllUsers()
returns 所有可以登录系统的用户。这对我有用:
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
returns 用户详细信息如果用户存在并抛出 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) { }
}
这是一个棘手的问题,但应该适用于所有安全领域,因为我们使用存在于顶级抽象中的方法 class (SecurityRealm
)。