2015-06-19 9 views
5

अवसर पर मुझे सभी जेनकींस उपयोगकर्ताओं को ईमेल करने की आवश्यकता है, उदाहरण के लिए उन्हें चेतावनी दें कि जेनकींस रखरखाव के लिए ऑफ़लाइन होंगे। नीचे दी गई लिपि मुझे उन सभी लोगों के लिए ईमेल पते देती है जिनके बारे में जेनकिंस के बारे में पता है, लेकिन इसमें ऐसे लोग शामिल हैं जिनके पास खाते नहीं हैं, ये वे लोग हैं जिन्होंने निर्माण किए गए परिवर्तन किए हैं। मैं उन्हें ईमेल सूची से हटाना चाहता हूं, यह सूची केवल उन उपयोगकर्ताओं को शामिल करनी चाहिए जिन्हें आप सुरक्षा Remalm पृष्ठ पर देखेंगे। मैं स्क्रिप्ट को संशोधित करने में मदद की तलाश में हूं। धन्यवाद। सब सेसभी उपयोगकर्ताओं की ईमेल सूची बनाएं

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

उत्तर

5

सबसे पहले आपको पता होना चाहिए कि जेनकींस हमेशा में बताने के लिए उपयोगकर्ता मौजूद है या नहीं सक्षम हो नहीं होगा। Jenkins' javadoc से:

ऐसा होता है, उदाहरण के लिए, जब सुरक्षा क्षेत्र सर्वलेट कार्यान्वयन के शीर्ष पर है, वहाँ भी जानने के किसी दिए गए नाम के एक उपयोगकर्ता मौजूद है या नहीं करता है, तो का कोई रास्ता नहीं है।

मुझे दो समाधान मिले।

समाधान 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 + "; ") 
} 

नोट: इस जेनकींस config पर निर्भर करता है और जहां एक और (नहीं एक 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) { } 
} 

यह मुश्किल है, लेकिन सभी सुरक्षा लोकों साथ काम करना चाहिए जैसा कि हम विधि है कि मौजूद है का उपयोग शीर्ष स्तर अमूर्त वर्ग (SecurityRealm) में।

+0

मैंने समाधान 1 की कोशिश की और यह काम किया, इसने लगभग तुरंत सूची बनाई, जहां मेरे समाधान में लगभग एक मिनट लगते हैं। धन्यवाद Vitalii! –

+0

कुछ समाधानों के लिए धन्यवाद। हमारे परिणामों की रिपोर्ट करने के लिए, मैंने पाया कि समाधान 1 एथ के लिए उपयोग की जाने वाली सक्रिय निर्देशिका प्लगइन के साथ काम नहीं करेगा (उस प्लगइन कोAllUsers() नहीं मिला है)। समाधान 2 अंततः जेनकिन्स के सामने हमारे अपाचे httpd रिवर्स प्रॉक्सी से बाहर निकलता है क्योंकि मुझे लगता है कि यह एडी (हमारी कंपनी में कई हजार) में हर उपयोगकर्ता का आकलन कर रहा है। मुझे लगता है कि यह एडी/एलडीएपी से कैशिंग, अपने उपयोगकर्ता डेटाबेस को रखने वाले उत्पाद द्वारा हल किया गया मामला है। – jblaine

+0

@jblaine आपको इसकी रिपोर्ट करने के लिए धन्यवाद। आप जिस समस्या को हल करने की कोशिश कर रहे हैं वह क्या है? मुझे नहीं लगता कि आप एक बार में हजारों लोगों को मेल करना चाहते हैं ... –

संबंधित मुद्दे