2015-06-19 22 views
5

Czasami muszę wysłać wiadomość e-mail do wszystkich użytkowników Jenkins, na przykład ostrzegając ich, że Jenkins będzie w trybie offline w celu konserwacji. Poniższy skrypt podaje adresy e-mail wszystkich osób, o których wie Jenkins, ale obejmuje osoby, które nie mają kont, są to osoby, które wprowadziły zmiany, które spowodowały wygenerowanie kompilacji. Chciałbym usunąć je z listy e-mailowej, to znaczy, że lista powinna zawierać tylko tych użytkowników, którzy zobaczą na stronie securityRealm. Szukam pomocy, modyfikując skrypt. Dzięki.utworzyć listę e-mail wszystkich użytkowników

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

Odpowiedz

5

Przede wszystkim należy wiedzieć, że Jenkins nie zawsze być w stanie powiedzieć, czy użytkownik istnieje, czy nie. Od Jenkins' javadoc:

Dzieje się tak na przykład wtedy, gdy sfera bezpieczeństwa jest na szczycie wykonania serwletu, nie ma mowy o wiedząc nawet, jeśli użytkownik o podanej nazwie istnieje, czy nie.

Znalazłem dwa rozwiązania.

Rozwiązanie 1

HudsonPrivateSecurityRealm.html#getAllUsers() powraca wszystkich użytkowników, którzy mogą zalogować się do systemu. I działa to dla mnie:

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

Uwaga: zależy to od konfiguracji Jenkins i nie może pracować na systemie, w którym stosowany jest inny (nie HudsonPrivateSecurityRealm) sferę bezpieczeństwa.

Rozwiązanie 2

SecurityRealm#loadUserByUsername szczegóły powraca użytkownika, jeśli użytkownik istnieje i rzuca UsernameNotFoundException inaczej:

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

To jest podchwytliwe, ale powinien działać ze wszystkimi sfery bezpieczeństwa, używamy metody, która istnieje w klasie abstrakcyjnej najwyższego poziomu (SecurityRealm).

+0

Wypróbowałem rozwiązanie 1 i zadziałało, to także wyprodukowało listę prawie natychmiast, gdzie moje rozwiązanie zajmuje około minuty. Dzięki Vitalii! –

+0

Dziękuję za pewne rozwiązania. Ze względu na raportowanie naszych wyników stwierdziłem, że rozwiązanie 1 nie działa z wtyczką Active Directory używaną do uwierzytelniania (ta wtyczka nie ma funkcji getAllUsers()). Rozwiązanie 2 ostatecznie pomija nasze odwrotne proxy Apache'a httpd przed Jenkinsem, ponieważ uważam, że wylicza każdego użytkownika AD (wiele tysięcy w naszej firmie). Przypuszczam, że jest to przypadek rozwiązany przez produkt przechowujący własną bazę danych użytkowników, buforowanie z AD/LDAP. – jblaine

+0

@jblaine dziękuję za zgłoszenie tego. W czym problem próbujesz rozwiązać? Nie sądzę, że chcesz wysłać tysiące ludzi naraz ... –

Powiązane problemy