2015-06-19 12 views
5

A volte devo inviare un'email a tutti gli utenti Jenkins, ad esempio avvertendoli che Jenkins sarà offline per manutenzione. Lo script qui sotto mi fornisce indirizzi email per tutte le persone di cui Jenkins sa, ma include persone che non hanno account, sono persone che hanno commesso cambiamenti che hanno attivato build. Mi piacerebbe rimuoverli dall'elenco delle e-mail, cioè l'elenco dovrebbe includere solo gli utenti che vedresti sulla pagina securityRealm. Sto cercando aiuto per modificare lo script. Grazie.creare l'elenco e-mail di tutti gli utenti

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

risposta

5

Prima di tutto si deve sapere che Jenkins non sarà sempre in grado di dirvi se esiste l'utente o meno. Da Jenkins' javadoc:

Questo accade, per esempio, quando il regno di sicurezza è in cima alla realizzazione servlet, non c'è modo di sapere se anche un utente di un dato nome esiste o no.

Ho trovato due soluzioni.

Soluzione 1

HudsonPrivateSecurityRealm.html#getAllUsers() restituisce tutti gli utenti che possono effettuare il login al sistema. E questo funziona per me:

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

Nota: questo dipende dalla configurazione Jenkins e potrebbe non funzionare sul sistema in cui usato un altro (non un HudsonPrivateSecurityRealm) ambito di sicurezza.

Soluzione 2

SecurityRealm#loadUserByUsername dettagli rendimenti utente se l'utente esiste e getta UsernameNotFoundException altrimenti:

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

Questa è una difficile, ma dovrebbe funzionare con tutti i regni di sicurezza, come si usa il metodo che esiste nella classe astratta di primo livello (SecurityRealm).

+0

Ho provato la soluzione 1 e ha funzionato, ha anche prodotto la lista quasi istantaneamente, dove la mia soluzione richiede circa un minuto. Grazie Vitalii! –

+0

Grazie per alcune soluzioni. Per segnalare i nostri risultati, ho trovato che la soluzione 1 non funziona con il plugin Active Directory utilizzato per auth (il plugin non ha getAllUsers()). La Soluzione 2 alla fine scade il nostro proxy inverso httpd Apache di fronte a Jenkins poiché credo che stia enumerando ogni utente in AD (molte migliaia nella nostra azienda). Suppongo che questo sia il tipo di caso risolto da un prodotto che conserva il proprio database utente, che memorizza nella cache da AD/LDAP. – jblaine

+0

@jblaine grazie per aver segnalato questo. Qual è il problema che stai cercando di risolvere? Non penso che tu voglia inviare mail a migliaia di persone contemporaneamente ... –

Problemi correlati