2015-06-19 5 views
5

Gelegentlich muss ich alle Jenkins-Benutzer per E-Mail benachrichtigen, z. B. sie warnen, dass Jenkins zur Wartung offline ist. Das folgende Skript gibt mir E-Mail-Adressen für alle Personen, von denen Jenkins weiß, aber es enthält auch Personen, die keine Konten haben. Dies sind Personen, die Änderungen vorgenommen haben, die Builds ausgelöst haben. Ich möchte sie aus der E-Mail-Liste entfernen, dh die Liste sollte nur die Benutzer enthalten, die Sie auf der securityRealm-Seite sehen. Ich suche nach Hilfe, um das Skript zu modifizieren. Vielen Dank.E-Mail-Liste aller Benutzer erstellen

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 + "; ") 
} 

Antwort

5

Zunächst einmal sollten Sie wissen, dass Jenkins nicht immer der Lage sein, Ihnen zu sagen, ob der Benutzer vorhanden ist oder nicht. Von Jenkins' javadoc:

Dies geschieht zum Beispiel, wenn der Sicherheitsbereich auf der Servlet-Implementierung ist, gibt es keine Möglichkeit, selbst wenn ein Benutzer von einem bestimmten Namen zu kennen existiert oder nicht.

Ich fand zwei Lösungen.

Lösung 1

HudsonPrivateSecurityRealm.html#getAllUsers() kehrt alle Benutzer, die sich am System anmelden können. Und das funktioniert für mich:

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 + "; ") 
} 

Hinweis: dies auf der Jenkins Config abhängig und kann nicht auf dem System arbeiten, in dem ein anderen (nicht HudsonPrivateSecurityRealm) Sicherheitsbereich eingesetzt.

Lösung 2

SecurityRealm#loadUserByUsername kehrt Benutzerdaten, wenn der Benutzer vorhanden ist, und wirft UsernameNotFoundException anders:

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

Diese knifflige Frage ist, sollte aber mit allen Sicherheitsbereichen arbeiten, wie wir die Methode verwenden, die vorhanden ist in der obersten abstrakten Klasse (SecurityRealm).

+0

Ich versuchte Lösung 1 und es funktionierte, es produzierte auch die Liste fast sofort, wo meine Lösung etwa eine Minute dauert. Danke Vitalii! –

+0

Vielen Dank für einige Lösungen. Um unsere Ergebnisse zu berichten, habe ich festgestellt, dass Solution 1 nicht mit dem Active Directory Plugin funktioniert, das für auth verwendet wird (das Plugin hat getAllUsers() nicht). Lösung 2 beendet schließlich unseren Apache httpd Reverse Proxy vor Jenkins, da ich glaube, dass es jeden Benutzer in AD aufzählt (viele Tausende in unserer Firma). Ich nehme an, das ist die Art von Fall, der von einem Produkt gelöst wird, das seine eigene Benutzerdatenbank beibehält, die von AD/LDAP zwischenspeichert. – jblaine

+0

@jblaine danke für das Melden. Was ist das Problem, das Sie versuchen zu lösen? Ich glaube nicht, dass du Tausende von Leuten auf einmal mailen willst ... –

Verwandte Themen