创建所有用户的电子邮件列表

Mar*_*ins 5 groovy jenkins jenkins-scriptler

有时我需要通过电子邮件向所有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 + "; ")
}
Run Code Online (Sandbox Code Playgroud)

Vit*_*upt 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 + "; ")
}
Run Code Online (Sandbox Code Playgroud)

注意:这取决于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) { }
 }
Run Code Online (Sandbox Code Playgroud)

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